Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
authorLinus Torvalds <torvalds@g5.osdl.org>
Thu, 5 Jan 2006 00:36:52 +0000 (16:36 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 5 Jan 2006 00:36:52 +0000 (16:36 -0800)
1560 files changed:
Documentation/DocBook/kernel-api.tmpl
Documentation/DocBook/usb.tmpl
Documentation/SubmittingPatches
Documentation/arm/00-INDEX
Documentation/arm/VFP/release-notes.txt
Documentation/arm/memory.txt
Documentation/block/biodoc.txt
Documentation/cpu-freq/governors.txt
Documentation/dvb/README.dvb-usb
Documentation/dvb/README.flexcop
Documentation/dvb/avermedia.txt
Documentation/dvb/cards.txt
Documentation/dvb/contributors.txt
Documentation/dvb/faq.txt
Documentation/dvb/readme.txt
Documentation/filesystems/00-INDEX
Documentation/filesystems/affs.txt
Documentation/filesystems/ext2.txt
Documentation/filesystems/ext3.txt
Documentation/filesystems/vfs.txt
Documentation/floppy.txt
Documentation/ioctl-number.txt
Documentation/kernel-docs.txt
Documentation/kernel-parameters.txt
Documentation/mca.txt
Documentation/networking/driver.txt
Documentation/networking/gianfar.txt [new file with mode: 0644]
Documentation/networking/ifenslave.c
Documentation/networking/ip-sysctl.txt
Documentation/networking/iphase.txt
Documentation/networking/irda.txt
Documentation/networking/ray_cs.txt
Documentation/networking/vortex.txt
Documentation/power/pci.txt
Documentation/scsi/ChangeLog.megaraid
Documentation/scsi/ibmmca.txt
Documentation/scsi/scsi_mid_low_api.txt
Documentation/sysrq.txt
Documentation/usb/error-codes.txt
Documentation/usb/ibmcam.txt
Documentation/usb/ov511.txt
Documentation/usb/rio.txt
Documentation/video4linux/zr36120.txt
MAINTAINERS
Makefile
arch/alpha/kernel/machvec_impl.h
arch/arm/configs/corgi_defconfig
arch/arm/configs/poodle_defconfig [deleted file]
arch/arm/configs/spitz_defconfig
arch/arm/kernel/armksyms.c
arch/arm/kernel/calls.S
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-common.S
arch/arm/kernel/head.S
arch/arm/kernel/module.c
arch/arm/kernel/ptrace.c
arch/arm/kernel/signal.c
arch/arm/kernel/vmlinux.lds.S
arch/arm/lib/getuser.S
arch/arm/mach-clps7500/core.c
arch/arm/mach-ixp4xx/ixdp425-setup.c
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-pxa/pm.c
arch/arm/mach-pxa/pxa27x.c
arch/arm/mach-pxa/tosa.c
arch/arm/mach-realview/core.c
arch/arm/mach-sa1100/assabet.c
arch/arm/mm/Makefile
arch/arm/mm/blockops.c [deleted file]
arch/arm/mm/consistent.c
arch/arm/mm/flush.c
arch/arm/mm/init.c
arch/arm/mm/ioremap.c
arch/arm/tools/mach-types
arch/arm26/nwfpe/fpmodule.c
arch/frv/kernel/semaphore.c
arch/frv/mb93090-mb00/pci-irq.c
arch/frv/mm/init.c
arch/frv/mm/pgalloc.c
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c
arch/i386/kernel/cpu/cpufreq/powernow-k8.c
arch/i386/kernel/cpu/cpufreq/powernow-k8.h
arch/i386/kernel/cpu/cpufreq/speedstep-ich.c
arch/i386/kernel/cpu/cpufreq/speedstep-lib.c
arch/i386/kernel/cpu/cpufreq/speedstep-lib.h
arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
arch/i386/kernel/cpu/proc.c
arch/i386/kernel/io_apic.c
arch/i386/kernel/kprobes.c
arch/i386/kernel/mpparse.c
arch/i386/kernel/process.c
arch/i386/kernel/reboot.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/traps.c
arch/i386/mm/ioremap.c
arch/i386/pci/Makefile
arch/i386/pci/common.c
arch/i386/pci/direct.c
arch/i386/pci/i386.c
arch/i386/pci/mmconfig.c
arch/i386/pci/pci.h
arch/ia64/Kconfig
arch/ia64/configs/sn2_defconfig
arch/ia64/configs/tiger_defconfig
arch/ia64/ia32/binfmt_elf32.c
arch/ia64/ia32/ia32priv.h
arch/ia64/kernel/ia64_ksyms.c
arch/ia64/kernel/kprobes.c
arch/ia64/kernel/process.c
arch/ia64/kernel/salinfo.c
arch/ia64/kernel/setup.c
arch/ia64/kernel/time.c
arch/ia64/kernel/traps.c
arch/ia64/kernel/uncached.c
arch/ia64/kernel/vmlinux.lds.S
arch/ia64/mm/discontig.c
arch/ia64/sn/kernel/bte.c
arch/ia64/sn/kernel/io_init.c
arch/ia64/sn/kernel/sn2/ptc_deadlock.S
arch/ia64/sn/kernel/sn2/sn2_smp.c
arch/ia64/sn/kernel/sn2/sn_hwperf.c
arch/ia64/sn/pci/pcibr/pcibr_reg.c
arch/ia64/sn/pci/tioca_provider.c
arch/m32r/kernel/io_mappi3.c
arch/m32r/kernel/setup_mappi3.c
arch/m32r/kernel/sys_m32r.c
arch/mips/Kconfig
arch/mips/au1000/db1x00/board_setup.c
arch/mips/au1000/db1x00/init.c
arch/mips/configs/atlas_defconfig
arch/mips/configs/bigsur_defconfig
arch/mips/configs/capcella_defconfig
arch/mips/configs/cobalt_defconfig
arch/mips/configs/db1000_defconfig
arch/mips/configs/db1100_defconfig
arch/mips/configs/db1200_defconfig
arch/mips/configs/db1500_defconfig
arch/mips/configs/db1550_defconfig
arch/mips/configs/ddb5476_defconfig
arch/mips/configs/ddb5477_defconfig
arch/mips/configs/decstation_defconfig
arch/mips/configs/e55_defconfig
arch/mips/configs/ev64120_defconfig
arch/mips/configs/ev96100_defconfig
arch/mips/configs/ip22_defconfig
arch/mips/configs/ip27_defconfig
arch/mips/configs/ip32_defconfig
arch/mips/configs/it8172_defconfig
arch/mips/configs/ivr_defconfig
arch/mips/configs/jaguar-atx_defconfig
arch/mips/configs/jmr3927_defconfig
arch/mips/configs/lasat200_defconfig
arch/mips/configs/malta_defconfig
arch/mips/configs/mipssim_defconfig
arch/mips/configs/mpc30x_defconfig
arch/mips/configs/ocelot_3_defconfig
arch/mips/configs/ocelot_c_defconfig
arch/mips/configs/ocelot_defconfig
arch/mips/configs/ocelot_g_defconfig
arch/mips/configs/pb1100_defconfig
arch/mips/configs/pb1500_defconfig
arch/mips/configs/pb1550_defconfig
arch/mips/configs/pnx8550-jbs_defconfig
arch/mips/configs/pnx8550-v2pci_defconfig
arch/mips/configs/qemu_defconfig
arch/mips/configs/rbhma4500_defconfig
arch/mips/configs/rm200_defconfig
arch/mips/configs/sb1250-swarm_defconfig
arch/mips/configs/sead_defconfig
arch/mips/configs/tb0226_defconfig
arch/mips/configs/tb0229_defconfig
arch/mips/configs/workpad_defconfig
arch/mips/configs/yosemite_defconfig
arch/mips/defconfig
arch/mips/jmr3927/rbhma3100/irq.c
arch/mips/jmr3927/rbhma3100/setup.c
arch/mips/kernel/cpu-probe.c
arch/mips/kernel/irixsig.c
arch/mips/kernel/linux32.c
arch/mips/kernel/scall32-o32.S
arch/mips/kernel/scall64-64.S
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/mips/kernel/signal.c
arch/mips/kernel/signal32.c
arch/mips/kernel/traps.c
arch/mips/mm/init.c
arch/mips/qemu/q-firmware.c
arch/powerpc/Kconfig
arch/powerpc/Makefile
arch/powerpc/configs/cell_defconfig
arch/powerpc/configs/g5_defconfig
arch/powerpc/configs/iseries_defconfig
arch/powerpc/configs/maple_defconfig
arch/powerpc/configs/ppc64_defconfig
arch/powerpc/configs/pseries_defconfig
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/kprobes.c
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/ptrace-common.h [new file with mode: 0644]
arch/powerpc/kernel/ptrace.c
arch/powerpc/kernel/ptrace32.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/syscalls.c
arch/powerpc/kernel/vdso.c
arch/powerpc/mm/4xx_mmu.c
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/hugetlbpage.c
arch/powerpc/mm/imalloc.c
arch/powerpc/mm/init_64.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/mmu_decl.h
arch/powerpc/mm/numa.c
arch/powerpc/mm/pgtable_64.c
arch/powerpc/mm/stab.c
arch/powerpc/mm/tlb_32.c
arch/powerpc/mm/tlb_64.c
arch/powerpc/platforms/iseries/iommu.c
arch/powerpc/platforms/powermac/feature.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/platforms/pseries/iommu.c
arch/powerpc/platforms/pseries/lpar.c
arch/powerpc/platforms/pseries/xics.c
arch/powerpc/sysdev/dart.h
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/u3_iommu.c
arch/ppc/Kconfig
arch/ppc/boot/simple/Makefile
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/kernel/process.c
arch/ppc/kernel/smp.c
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
arch/ppc/platforms/pmac_feature.c
arch/ppc/syslib/m82xx_pci.c
arch/ppc/syslib/ppc4xx_dma.c
arch/sparc/Kconfig
arch/sparc/Makefile
arch/sparc/kernel/ebus.c
arch/sparc/kernel/ioport.c
arch/sparc/kernel/led.c
arch/sparc/kernel/pcic.c
arch/sparc/kernel/sys_sunos.c
arch/sparc/kernel/time.c
arch/sparc/kernel/vmlinux.lds.S
arch/sparc/lib/atomic32.c
arch/sparc/mm/generic.c
arch/sparc/mm/sun4c.c
arch/sparc64/Kconfig
arch/sparc64/Makefile
arch/sparc64/kernel/kprobes.c
arch/sparc64/kernel/sbus.c
arch/sparc64/kernel/sys_sunos32.c
arch/sparc64/kernel/vmlinux.lds.S
arch/sparc64/mm/generic.c
arch/sparc64/solaris/misc.c
arch/um/Kconfig
arch/um/Makefile
arch/um/Makefile-x86_64
arch/um/include/sysdep-i386/stub.h
arch/um/include/sysdep-x86_64/stub.h
arch/um/include/um_uaccess.h
arch/um/kernel/skas/clone.c
arch/um/kernel/skas/include/uaccess-skas.h
arch/um/os-Linux/start_up.c
arch/um/os-Linux/user_syms.c
arch/um/scripts/Makefile.rules
arch/um/sys-i386/Makefile
arch/um/sys-i386/ldt.c
arch/um/sys-i386/stub_segv.c
arch/um/sys-x86_64/Makefile
arch/um/sys-x86_64/stub_segv.c
arch/x86_64/ia32/ia32_binfmt.c
arch/x86_64/kernel/kprobes.c
arch/x86_64/kernel/process.c
arch/x86_64/kernel/setup.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/time.c
arch/x86_64/mm/init.c
arch/x86_64/mm/ioremap.c
arch/x86_64/mm/numa.c
arch/x86_64/pci/Makefile
arch/x86_64/pci/mmconfig.c
block/as-iosched.c
block/ll_rw_blk.c
block/scsi_ioctl.c
drivers/Makefile
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/pci_link.c
drivers/acpi/processor_core.c
drivers/acpi/processor_idle.c
drivers/acpi/processor_thermal.c
drivers/acpi/scan.c
drivers/acpi/thermal.c
drivers/acpi/utilities/utmisc.c
drivers/acpi/video.c
drivers/atm/Kconfig
drivers/atm/Makefile
drivers/atm/adummy.c [new file with mode: 0644]
drivers/atm/atmdev_init.c [deleted file]
drivers/atm/atmtcp.c
drivers/atm/lanai.c
drivers/base/bus.c
drivers/base/dd.c
drivers/base/memory.c
drivers/block/Kconfig
drivers/block/cciss.c
drivers/block/floppy.c
drivers/block/ub.c
drivers/bluetooth/bcm203x.c
drivers/bluetooth/bfusb.c
drivers/bluetooth/bpa10x.c
drivers/bluetooth/hci_usb.c
drivers/char/Kconfig
drivers/char/agp/amd64-agp.c
drivers/char/agp/backend.c
drivers/char/agp/via-agp.c
drivers/char/drm/drm_context.c
drivers/char/drm/drm_lock.c
drivers/char/drm/drm_memory.c
drivers/char/drm/drm_memory_debug.h
drivers/char/drm/mga_drv.c
drivers/char/drm/radeon_cp.c
drivers/char/drm/radeon_drv.h
drivers/char/ip2/i2pack.h
drivers/char/ipmi/ipmi_msghandler.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/keyboard.c
drivers/char/mwave/mwavepub.h
drivers/char/n_hdlc.c
drivers/char/pcmcia/cm4000_cs.c
drivers/char/random.c
drivers/char/vc_screen.c
drivers/char/watchdog/booke_wdt.c
drivers/char/watchdog/mpcore_wdt.c
drivers/char/watchdog/pcwd_usb.c
drivers/char/watchdog/wdrtas.c
drivers/connector/cn_proc.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_conservative.c
drivers/cpufreq/cpufreq_ondemand.c
drivers/fc4/Kconfig
drivers/firmware/Kconfig
drivers/firmware/dell_rbu.c
drivers/hwmon/hdaps.c
drivers/hwmon/it87.c
drivers/hwmon/lm78.c
drivers/hwmon/w83627hf.c
drivers/hwmon/w83792d.c
drivers/i2c/busses/i2c-ixp2000.c
drivers/i2c/busses/i2c-ixp4xx.c
drivers/i2c/busses/i2c-mv64xxx.c
drivers/ide/Kconfig
drivers/ide/ide-cd.c
drivers/ide/ide-cd.h
drivers/ide/ide-disk.c
drivers/ide/ide-dma.c
drivers/ide/ide-floppy.c
drivers/ide/ide-io.c
drivers/ide/ide-tape.c
drivers/ide/ide-taskfile.c
drivers/ide/mips/Makefile
drivers/ide/mips/au1xxx-ide.c
drivers/ide/pci/sgiioc4.c
drivers/ide/pci/sis5513.c
drivers/ide/pci/via82cxxx.c
drivers/ieee1394/hosts.h
drivers/ieee1394/nodemgr.c
drivers/ieee1394/sbp2.c
drivers/infiniband/core/mad.c
drivers/infiniband/core/user_mad.c
drivers/infiniband/core/uverbs.h
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/hw/mthca/mthca_qp.c
drivers/infiniband/hw/mthca/mthca_wqe.h
drivers/infiniband/ulp/ipoib/ipoib_ib.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/input/gameport/gameport.c
drivers/input/input.c
drivers/input/joystick/iforce/iforce-usb.c
drivers/input/joystick/warrior.c
drivers/input/keyboard/atkbd.c
drivers/input/misc/Kconfig
drivers/input/misc/Makefile
drivers/input/misc/uinput.c
drivers/input/misc/wistron_btns.c [new file with mode: 0644]
drivers/input/mouse/alps.c
drivers/input/mouse/sermouse.c
drivers/input/serio/i8042.h
drivers/input/serio/serio.c
drivers/isdn/hisax/hfc_usb.c
drivers/isdn/hisax/st5481_init.c
drivers/macintosh/therm_pm72.c
drivers/macintosh/windfarm_pm81.c
drivers/md/dm-bio-list.h
drivers/md/dm-ioctl.c
drivers/md/dm-log.c
drivers/md/dm-mpath.c
drivers/md/dm-raid1.c
drivers/md/dm-table.c
drivers/md/md.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c
drivers/md/raid6main.c
drivers/media/common/Kconfig
drivers/media/common/Makefile
drivers/media/common/ir-common.c
drivers/media/common/saa7146_core.c
drivers/media/common/saa7146_fops.c
drivers/media/common/saa7146_i2c.c
drivers/media/common/saa7146_vbi.c
drivers/media/common/saa7146_video.c
drivers/media/dvb/b2c2/flexcop-common.h
drivers/media/dvb/b2c2/flexcop-fe-tuner.c
drivers/media/dvb/b2c2/flexcop-hw-filter.c
drivers/media/dvb/b2c2/flexcop-usb.c
drivers/media/dvb/bt8xx/dst_ca.c
drivers/media/dvb/bt8xx/dvb-bt8xx.c
drivers/media/dvb/cinergyT2/cinergyT2.c
drivers/media/dvb/dvb-core/demux.h
drivers/media/dvb/dvb-core/dmxdev.c
drivers/media/dvb/dvb-core/dmxdev.h
drivers/media/dvb/dvb-core/dvb_ca_en50221.c
drivers/media/dvb/dvb-core/dvb_filter.c
drivers/media/dvb/dvb-core/dvb_filter.h
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvb_frontend.h
drivers/media/dvb/dvb-core/dvb_net.c
drivers/media/dvb/dvb-core/dvb_ringbuffer.c
drivers/media/dvb/dvb-core/dvb_ringbuffer.h
drivers/media/dvb/dvb-core/dvbdev.c
drivers/media/dvb/dvb-core/dvbdev.h
drivers/media/dvb/dvb-usb/a800.c
drivers/media/dvb/dvb-usb/cxusb.c
drivers/media/dvb/dvb-usb/dibusb-common.c
drivers/media/dvb/dvb-usb/dibusb-mb.c
drivers/media/dvb/dvb-usb/dibusb-mc.c
drivers/media/dvb/dvb-usb/digitv.c
drivers/media/dvb/dvb-usb/dtt200u.c
drivers/media/dvb/dvb-usb/dvb-usb-init.c
drivers/media/dvb/dvb-usb/nova-t-usb2.c
drivers/media/dvb/dvb-usb/umt-010.c
drivers/media/dvb/dvb-usb/vp702x-fe.c
drivers/media/dvb/dvb-usb/vp702x.c
drivers/media/dvb/dvb-usb/vp7045-fe.c
drivers/media/dvb/dvb-usb/vp7045.c
drivers/media/dvb/frontends/at76c651.c
drivers/media/dvb/frontends/bcm3510.c
drivers/media/dvb/frontends/cx22700.c
drivers/media/dvb/frontends/cx22702.c
drivers/media/dvb/frontends/cx22702.h
drivers/media/dvb/frontends/cx24110.c
drivers/media/dvb/frontends/l64781.c
drivers/media/dvb/frontends/l64781.h
drivers/media/dvb/frontends/lgdt330x.c
drivers/media/dvb/frontends/mt312.c
drivers/media/dvb/frontends/nxt2002.c
drivers/media/dvb/frontends/nxt200x.c
drivers/media/dvb/frontends/nxt6000.c
drivers/media/dvb/frontends/or51132.c
drivers/media/dvb/frontends/s5h1420.c
drivers/media/dvb/frontends/s5h1420.h
drivers/media/dvb/frontends/sp8870.c
drivers/media/dvb/frontends/sp887x.c
drivers/media/dvb/frontends/stv0299.c
drivers/media/dvb/frontends/tda10021.c
drivers/media/dvb/frontends/tda10021.h
drivers/media/dvb/frontends/tda1004x.c
drivers/media/dvb/frontends/tda8083.c
drivers/media/dvb/frontends/ves1820.c
drivers/media/dvb/ttpci/Kconfig
drivers/media/dvb/ttpci/av7110.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_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/ttpci/fdump.c
drivers/media/dvb/ttpci/ttpci-eeprom.c
drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h
drivers/media/dvb/ttusb-dec/ttusb_dec.c
drivers/media/video/Kconfig
drivers/media/video/bt832.c
drivers/media/video/bttv-cards.c
drivers/media/video/bttv-driver.c
drivers/media/video/bttvp.h
drivers/media/video/cpia_usb.c
drivers/media/video/cx25840/cx25840-core.c
drivers/media/video/cx25840/cx25840.h
drivers/media/video/cx88/Kconfig
drivers/media/video/cx88/Makefile
drivers/media/video/cx88/cx88-blackbird.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-core.c
drivers/media/video/cx88/cx88-input.c
drivers/media/video/cx88/cx88-tvaudio.c
drivers/media/video/cx88/cx88.h
drivers/media/video/em28xx/em28xx-core.c
drivers/media/video/em28xx/em28xx-i2c.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/ir-kbd-gpio.c
drivers/media/video/ir-kbd-i2c.c
drivers/media/video/msp3400.c
drivers/media/video/saa6588.c
drivers/media/video/saa7115.c
drivers/media/video/saa711x.c
drivers/media/video/saa7127.c
drivers/media/video/saa7134/Kconfig
drivers/media/video/saa7134/Makefile
drivers/media/video/saa7134/saa6752hs.c
drivers/media/video/saa7134/saa7134-alsa.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-core.c
drivers/media/video/saa7134/saa7134-empress.c
drivers/media/video/saa7134/saa7134-i2c.c
drivers/media/video/saa7134/saa7134-input.c
drivers/media/video/saa7134/saa7134-oss.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/tda9887.c
drivers/media/video/tvaudio.c
drivers/media/video/tveeprom.c
drivers/media/video/tvp5150.c
drivers/media/video/video-buf-dvb.c
drivers/media/video/video-buf.c
drivers/media/video/videodev.c
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptbase.h
drivers/message/fusion/mptctl.c
drivers/message/fusion/mptfc.c
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptscsih.c
drivers/message/fusion/mptscsih.h
drivers/message/fusion/mptspi.c
drivers/message/i2o/pci.c
drivers/mfd/ucb1x00-ts.c
drivers/mmc/mmc.c
drivers/mmc/mmc_block.c
drivers/mtd/chips/cfi_cmdset_0001.c
drivers/mtd/chips/cfi_probe.c
drivers/mtd/chips/sharp.c
drivers/mtd/devices/blkmtd.c
drivers/mtd/devices/block2mtd.c
drivers/mtd/devices/ms02-nv.c
drivers/mtd/ftl.c
drivers/mtd/maps/Kconfig
drivers/mtd/maps/Makefile
drivers/mtd/maps/ipaq-flash.c
drivers/mtd/maps/ixp2000.c
drivers/mtd/maps/ixp4xx.c
drivers/mtd/maps/nettel.c
drivers/mtd/maps/pci.c
drivers/mtd/maps/physmap.c
drivers/mtd/maps/sc520cdp.c
drivers/mtd/nand/h1910.c
drivers/mtd/nand/nandsim.c
drivers/mtd/onenand/generic.c
drivers/mtd/onenand/onenand_base.c
drivers/mtd/onenand/onenand_bbt.c
drivers/mtd/rfd_ftl.c
drivers/net/8139too.c
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/b44.c
drivers/net/bonding/Makefile
drivers/net/bonding/bond_3ad.c
drivers/net/bonding/bond_3ad.h
drivers/net/bonding/bond_alb.c
drivers/net/bonding/bond_alb.h
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_sysfs.c [new file with mode: 0644]
drivers/net/bonding/bonding.h
drivers/net/chelsio/sge.c
drivers/net/chelsio/sge.h
drivers/net/dgrs.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/forcedeth.c
drivers/net/gianfar.c
drivers/net/gianfar.h
drivers/net/gianfar_ethtool.c
drivers/net/gianfar_mii.h
drivers/net/gianfar_sysfs.c [new file with mode: 0644]
drivers/net/ibm_emac/ibm_emac_core.c
drivers/net/ibm_emac/ibm_emac_core.h
drivers/net/irda/irda-usb.c
drivers/net/irda/stir4200.c
drivers/net/ixp2000/Kconfig [new file with mode: 0644]
drivers/net/ixp2000/Makefile [new file with mode: 0644]
drivers/net/ixp2000/caleb.c [new file with mode: 0644]
drivers/net/ixp2000/caleb.h [new file with mode: 0644]
drivers/net/ixp2000/enp2611.c [new file with mode: 0644]
drivers/net/ixp2000/ixp2400-msf.c [new file with mode: 0644]
drivers/net/ixp2000/ixp2400-msf.h [new file with mode: 0644]
drivers/net/ixp2000/ixp2400_rx.uc [new file with mode: 0644]
drivers/net/ixp2000/ixp2400_rx.ucode [new file with mode: 0644]
drivers/net/ixp2000/ixp2400_tx.uc [new file with mode: 0644]
drivers/net/ixp2000/ixp2400_tx.ucode [new file with mode: 0644]
drivers/net/ixp2000/ixpdev.c [new file with mode: 0644]
drivers/net/ixp2000/ixpdev.h [new file with mode: 0644]
drivers/net/ixp2000/ixpdev_priv.h [new file with mode: 0644]
drivers/net/ixp2000/pm3386.c [new file with mode: 0644]
drivers/net/ixp2000/pm3386.h [new file with mode: 0644]
drivers/net/jazzsonic.c
drivers/net/mipsnet.h
drivers/net/ns83820.c
drivers/net/pcmcia/fmvj18x_cs.c
drivers/net/pcnet32.c
drivers/net/phy/phy_device.c
drivers/net/ppp_generic.c
drivers/net/pppoe.c
drivers/net/pppox.c
drivers/net/s2io.c
drivers/net/s2io.h
drivers/net/sis900.c
drivers/net/sis900.h
drivers/net/sk98lin/Makefile
drivers/net/sk98lin/h/skdrv2nd.h
drivers/net/sk98lin/h/skvpd.h
drivers/net/sk98lin/skcsum.c [deleted file]
drivers/net/sk98lin/skethtool.c
drivers/net/sk98lin/skge.c
drivers/net/sk98lin/skproc.c [deleted file]
drivers/net/skge.c
drivers/net/skge.h
drivers/net/sky2.c [new file with mode: 0644]
drivers/net/sky2.h [new file with mode: 0644]
drivers/net/sungem.c
drivers/net/tg3.c
drivers/net/tg3.h
drivers/net/tlan.c
drivers/net/wan/lmc/lmc_prot.h [deleted file]
drivers/net/wireless/Kconfig
drivers/net/wireless/airo.c
drivers/net/wireless/atmel.c
drivers/net/wireless/hostap/Makefile
drivers/net/wireless/hostap/hostap.c [deleted file]
drivers/net/wireless/hostap/hostap_main.c [new file with mode: 0644]
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2100.h
drivers/net/wireless/ipw2200.c
drivers/net/wireless/ipw2200.h
drivers/net/wireless/orinoco.c
drivers/net/wireless/orinoco_nortel.c
drivers/pci/Makefile
drivers/pci/hotplug/pciehp.h
drivers/pci/hotplug/pciehp_ctrl.c
drivers/pci/hotplug/pciehp_hpc.c
drivers/pci/pci-acpi.c
drivers/pci/quirks.c
drivers/pcmcia/m32r_cfc.c
drivers/s390/net/qeth_eddp.c
drivers/s390/net/qeth_main.c
drivers/s390/net/qeth_mpc.c
drivers/s390/net/qeth_mpc.h
drivers/s390/net/qeth_proc.c
drivers/s390/net/qeth_sys.c
drivers/s390/net/qeth_tso.h
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_dbf.c
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_scsi.c
drivers/sbus/char/aurora.c
drivers/sbus/char/jsflash.c
drivers/sbus/char/uctrl.c
drivers/sbus/char/vfc.h
drivers/sbus/char/vfc_dev.c
drivers/scsi/53c700.c
drivers/scsi/53c700.h
drivers/scsi/53c7xx.c
drivers/scsi/Kconfig
drivers/scsi/NCR5380.c
drivers/scsi/aacraid/linit.c
drivers/scsi/aha152x.c
drivers/scsi/ahci.c
drivers/scsi/aic7xxx/aic79xx_osm.c
drivers/scsi/aic7xxx/aic7xxx_osm.c
drivers/scsi/arm/Kconfig
drivers/scsi/arm/acornscsi.c
drivers/scsi/ata_piix.c
drivers/scsi/atari_NCR5380.c
drivers/scsi/ch.c
drivers/scsi/constants.c
drivers/scsi/dpt_i2o.c
drivers/scsi/ibmvscsi/ibmvscsi.h
drivers/scsi/ibmvscsi/iseries_vscsi.c
drivers/scsi/ibmvscsi/rpa_vscsi.c
drivers/scsi/ipr.c
drivers/scsi/ipr.h
drivers/scsi/iscsi_tcp.c
drivers/scsi/iscsi_tcp.h
drivers/scsi/libata-core.c
drivers/scsi/libata-scsi.c
drivers/scsi/libata.h
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_crtn.h
drivers/scsi/lpfc/lpfc_disc.h
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_hbadisc.c
drivers/scsi/lpfc/lpfc_hw.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_nportdisc.c
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/lpfc/lpfc_version.h
drivers/scsi/megaraid.c
drivers/scsi/megaraid/Kconfig.megaraid
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/megaraid/megaraid_mbox.h
drivers/scsi/ncr53c8xx.c
drivers/scsi/ncr53c8xx.h
drivers/scsi/pdc_adma.c
drivers/scsi/qla2xxx/Kconfig
drivers/scsi/qla2xxx/Makefile
drivers/scsi/qla2xxx/ql2400.c [new file with mode: 0644]
drivers/scsi/qla2xxx/ql2400_fw.c [new file with mode: 0644]
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/raid_class.c
drivers/scsi/sata_mv.c
drivers/scsi/sata_promise.c
drivers/scsi/sata_qstor.c
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil24.c
drivers/scsi/sata_sx4.c
drivers/scsi/scsi.c
drivers/scsi/scsi_devinfo.c
drivers/scsi/scsi_error.c
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_transport_fc.c
drivers/scsi/scsi_transport_iscsi.c
drivers/scsi/scsi_transport_spi.c
drivers/scsi/sd.c
drivers/scsi/sg.c
drivers/scsi/sr.c
drivers/scsi/sr_vendor.c
drivers/scsi/st.c
drivers/scsi/st.h
drivers/scsi/sun3_NCR5380.c
drivers/scsi/sym53c8xx_2/sym_defs.h
drivers/scsi/sym53c8xx_2/sym_fw.c
drivers/scsi/sym53c8xx_2/sym_fw.h
drivers/scsi/sym53c8xx_2/sym_fw1.h
drivers/scsi/sym53c8xx_2/sym_fw2.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_malloc.c
drivers/scsi/sym53c8xx_2/sym_nvram.c
drivers/scsi/sym53c8xx_2/sym_nvram.h
drivers/scsi/sym53c8xx_comm.h [deleted file]
drivers/scsi/sym53c8xx_defs.h [deleted file]
drivers/serial/8250.c
drivers/serial/8250_pci.c
drivers/serial/Kconfig
drivers/serial/amba-pl011.c
drivers/serial/imx.c
drivers/serial/pxa.c
drivers/serial/sa1100.c
drivers/serial/serial_core.c
drivers/serial/serial_cs.c
drivers/usb/Makefile
drivers/usb/atm/Kconfig
drivers/usb/atm/Makefile
drivers/usb/atm/cxacru.c
drivers/usb/atm/speedtch.c
drivers/usb/atm/ueagle-atm.c [new file with mode: 0644]
drivers/usb/atm/usbatm.c
drivers/usb/atm/xusbatm.c
drivers/usb/class/audio.c
drivers/usb/class/cdc-acm.c
drivers/usb/class/cdc-acm.h
drivers/usb/class/usb-midi.c
drivers/usb/class/usblp.c
drivers/usb/core/Makefile
drivers/usb/core/buffer.c
drivers/usb/core/devices.c
drivers/usb/core/devio.c
drivers/usb/core/driver.c [new file with mode: 0644]
drivers/usb/core/hcd-pci.c
drivers/usb/core/hcd.c
drivers/usb/core/hcd.h
drivers/usb/core/hub.c
drivers/usb/core/hub.h
drivers/usb/core/message.c
drivers/usb/core/usb.c
drivers/usb/core/usb.h
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/serial.c
drivers/usb/host/Makefile
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-hub.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/ehci-q.c
drivers/usb/host/ehci-sched.c
drivers/usb/host/isp116x-hcd.c
drivers/usb/host/isp116x.h
drivers/usb/host/ohci-hcd.c
drivers/usb/host/ohci-hub.c
drivers/usb/host/ohci-pci.c
drivers/usb/host/ohci-pxa27x.c
drivers/usb/host/pci-quirks.c
drivers/usb/host/sl811-hcd.c
drivers/usb/host/sl811_cs.c
drivers/usb/host/uhci-debug.c
drivers/usb/host/uhci-hcd.c
drivers/usb/host/uhci-hcd.h
drivers/usb/host/uhci-q.c
drivers/usb/image/mdc800.c
drivers/usb/image/microtek.c
drivers/usb/input/Kconfig
drivers/usb/input/Makefile
drivers/usb/input/acecad.c
drivers/usb/input/aiptek.c
drivers/usb/input/appletouch.c
drivers/usb/input/ati_remote.c
drivers/usb/input/ati_remote2.c [new file with mode: 0644]
drivers/usb/input/fixp-arith.h
drivers/usb/input/hid-core.c
drivers/usb/input/hid-input.c
drivers/usb/input/hiddev.c
drivers/usb/input/itmtouch.c
drivers/usb/input/kbtab.c
drivers/usb/input/keyspan_remote.c
drivers/usb/input/mtouchusb.c
drivers/usb/input/powermate.c
drivers/usb/input/touchkitusb.c
drivers/usb/input/usbkbd.c
drivers/usb/input/usbmouse.c
drivers/usb/input/wacom.c
drivers/usb/input/xpad.c
drivers/usb/input/yealink.c
drivers/usb/media/dabusb.c
drivers/usb/media/dsbr100.c
drivers/usb/media/ibmcam.c
drivers/usb/media/konicawc.c
drivers/usb/media/ov511.c
drivers/usb/media/pwc/pwc-ctrl.c
drivers/usb/media/pwc/pwc-if.c
drivers/usb/media/se401.c
drivers/usb/media/sn9c102_core.c
drivers/usb/media/stv680.c
drivers/usb/media/stv680.h
drivers/usb/media/usbvideo.c
drivers/usb/media/vicam.c
drivers/usb/media/w9968cf.c
drivers/usb/misc/auerswald.c
drivers/usb/misc/cytherm.c
drivers/usb/misc/emi26.c
drivers/usb/misc/emi62.c
drivers/usb/misc/idmouse.c
drivers/usb/misc/ldusb.c
drivers/usb/misc/legousbtower.c
drivers/usb/misc/phidgetkit.c
drivers/usb/misc/phidgetservo.c
drivers/usb/misc/rio500.c
drivers/usb/misc/sisusbvga/sisusb.c
drivers/usb/misc/usblcd.c
drivers/usb/misc/usbled.c
drivers/usb/misc/usbtest.c
drivers/usb/misc/uss720.c
drivers/usb/mon/mon_text.c
drivers/usb/net/asix.c
drivers/usb/net/catc.c
drivers/usb/net/cdc_ether.c
drivers/usb/net/cdc_subset.c
drivers/usb/net/gl620a.c
drivers/usb/net/kaweth.c
drivers/usb/net/net1080.c
drivers/usb/net/pegasus.c
drivers/usb/net/plusb.c
drivers/usb/net/rndis_host.c
drivers/usb/net/rtl8150.c
drivers/usb/net/zaurus.c
drivers/usb/net/zd1201.c
drivers/usb/serial/airprime.c
drivers/usb/serial/anydata.c
drivers/usb/serial/belkin_sa.c
drivers/usb/serial/cp2101.c
drivers/usb/serial/cyberjack.c
drivers/usb/serial/cypress_m8.c
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/empeg.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.h
drivers/usb/serial/garmin_gps.c
drivers/usb/serial/generic.c
drivers/usb/serial/hp4x.c
drivers/usb/serial/io_edgeport.c
drivers/usb/serial/io_edgeport.h
drivers/usb/serial/io_fw_boot2.h
drivers/usb/serial/io_ti.c
drivers/usb/serial/ipaq.c
drivers/usb/serial/ipw.c
drivers/usb/serial/ir-usb.c
drivers/usb/serial/keyspan.h
drivers/usb/serial/keyspan_pda.c
drivers/usb/serial/kl5kusb105.c
drivers/usb/serial/kobil_sct.c
drivers/usb/serial/mct_u232.c
drivers/usb/serial/omninet.c
drivers/usb/serial/option.c
drivers/usb/serial/pl2303.c
drivers/usb/serial/safe_serial.c
drivers/usb/serial/ti_usb_3410_5052.c
drivers/usb/serial/usb-serial.c
drivers/usb/serial/usb-serial.h
drivers/usb/serial/visor.c
drivers/usb/serial/whiteheat.c
drivers/usb/storage/Kconfig
drivers/usb/storage/Makefile
drivers/usb/storage/alauda.c [new file with mode: 0644]
drivers/usb/storage/alauda.h [new file with mode: 0644]
drivers/usb/storage/debug.c
drivers/usb/storage/initializers.h
drivers/usb/storage/libusual.c [new file with mode: 0644]
drivers/usb/storage/onetouch.c
drivers/usb/storage/protocol.h
drivers/usb/storage/scsiglue.c
drivers/usb/storage/sddr09.c
drivers/usb/storage/sddr09.h
drivers/usb/storage/transport.h
drivers/usb/storage/unusual_devs.h
drivers/usb/storage/usb.c
drivers/usb/storage/usb.h
drivers/usb/usb-skeleton.c
drivers/video/Kconfig
drivers/video/arcfb.c
drivers/video/aty/radeon_base.c
drivers/video/bw2.c
drivers/video/cfbcopyarea.c
drivers/video/cfbfillrect.c
drivers/video/cfbimgblt.c
drivers/video/cg14.c
drivers/video/cg3.c
drivers/video/cg6.c
drivers/video/cirrusfb.c
drivers/video/console/Kconfig
drivers/video/console/fbcon.c
drivers/video/console/fbcon_ccw.c
drivers/video/console/fbcon_rotate.h
drivers/video/console/fbcon_ud.c
drivers/video/console/vgacon.c
drivers/video/cyber2000fb.c
drivers/video/fbmem.c
drivers/video/ffb.c
drivers/video/intelfb/intelfb.h
drivers/video/intelfb/intelfbdrv.c
drivers/video/leo.c
drivers/video/logo/Kconfig
drivers/video/p9100.c
drivers/video/pxafb.c
drivers/video/sbuslib.c
drivers/video/tcx.c
drivers/w1/dscore.c
fs/9p/trans_sock.c
fs/9p/vfs_inode.c
fs/bio.c
fs/cifs/CHANGES
fs/cifs/README
fs/cifs/TODO
fs/cifs/cifs_unicode.c
fs/cifs/cifs_unicode.h
fs/cifs/cifsencrypt.c
fs/cifs/cifsfs.c
fs/cifs/cifsfs.h
fs/cifs/cifspdu.h
fs/cifs/cifssmb.c
fs/cifs/connect.c
fs/cifs/dir.c
fs/cifs/file.c
fs/cifs/inode.c
fs/cifs/misc.c
fs/cifs/netmisc.c
fs/cifs/readdir.c
fs/cifs/transport.c
fs/compat.c
fs/compat_ioctl.c
fs/dquot.c
fs/exec.c
fs/ext3/resize.c
fs/fuse/dir.c
fs/hfsplus/hfsplus_fs.h
fs/hfsplus/hfsplus_raw.h
fs/hfsplus/options.c
fs/hfsplus/super.c
fs/hostfs/hostfs_kern.c
fs/hugetlbfs/inode.c
fs/inotify.c
fs/jffs2/debug.h
fs/jffs2/fs.c
fs/jffs2/super.c
fs/lockd/clntlock.c
fs/nfs/callback.c
fs/nfs/dir.c
fs/nfs/direct.c
fs/nfs/file.c
fs/nfs/inode.c
fs/nfs/nfs4proc.c
fs/nfs/nfs4state.c
fs/nfs/proc.c
fs/nfs/write.c
fs/nfsd/nfs2acl.c
fs/nfsd/nfs3acl.c
fs/ntfs/ChangeLog
fs/partitions/Kconfig
fs/proc/generic.c
fs/proc/task_mmu.c
fs/qnx4/bitmap.c
fs/read_write.c
fs/reiserfs/inode.c
fs/reiserfs/journal.c
fs/reiserfs/xattr.c
fs/relayfs/relay.c
fs/udf/balloc.c
fs/udf/crc.c
fs/udf/dir.c
fs/udf/directory.c
fs/udf/file.c
fs/udf/fsync.c
fs/udf/ialloc.c
fs/udf/inode.c
fs/udf/lowlevel.c
fs/udf/misc.c
fs/udf/namei.c
fs/udf/partition.c
fs/udf/super.c
fs/udf/symlink.c
fs/udf/truncate.c
fs/udf/unicode.c
fs/xattr.c
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/quota/xfs_qm.c
fs/xfs/xfs_attr_leaf.c
fs/xfs/xfs_fsops.c
fs/xfs/xfs_iomap.h
fs/xfs/xfs_log_priv.h
fs/xfs/xfs_vnodeops.c
include/acpi/acglobal.h
include/asm-alpha/atomic.h
include/asm-alpha/bitops.h
include/asm-arm/arch-ebsa110/io.h
include/asm-arm/arch-iop3xx/timex.h
include/asm-arm/arch-ixp4xx/io.h
include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
include/asm-arm/arch-pxa/irq.h
include/asm-arm/arch-pxa/ohci.h [new file with mode: 0644]
include/asm-arm/arch-s3c2410/regs-gpio.h
include/asm-arm/arch-sa1100/io.h
include/asm-arm/bitops.h
include/asm-arm/elf.h
include/asm-arm/hardware/amba_serial.h
include/asm-arm/io.h
include/asm-arm/memory.h
include/asm-arm/numnodes.h
include/asm-arm/semaphore.h
include/asm-arm/spinlock.h
include/asm-arm/uaccess.h
include/asm-arm26/bitops.h
include/asm-cris/bitops.h
include/asm-frv/bitops.h
include/asm-frv/hardirq.h
include/asm-frv/ide.h
include/asm-frv/page.h
include/asm-frv/semaphore.h
include/asm-frv/thread_info.h
include/asm-generic/bitops.h
include/asm-h8300/bitops.h
include/asm-i386/bitops.h
include/asm-i386/param.h
include/asm-ia64/bitops.h
include/asm-ia64/delay.h
include/asm-ia64/ia32.h
include/asm-ia64/local.h
include/asm-ia64/page.h
include/asm-ia64/sal.h
include/asm-ia64/sn/pcidev.h
include/asm-ia64/sn/sn_sal.h
include/asm-ia64/sn/tioce.h
include/asm-ia64/sn/tioce_provider.h
include/asm-ia64/spinlock.h
include/asm-ia64/topology.h
include/asm-m32r/atomic.h
include/asm-m32r/bitops.h
include/asm-m32r/ide.h
include/asm-m32r/mappi3/mappi3_pld.h
include/asm-m32r/system.h
include/asm-m68k/bitops.h
include/asm-m68knommu/bitops.h
include/asm-mips/bitops.h
include/asm-mips/mach-au1x00/au1xxx_ide.h
include/asm-mips/mach-qemu/timex.h [new file with mode: 0644]
include/asm-parisc/bitops.h
include/asm-powerpc/bitops.h
include/asm-powerpc/dma-mapping.h [new file with mode: 0644]
include/asm-powerpc/io.h [new file with mode: 0644]
include/asm-powerpc/iommu.h
include/asm-powerpc/mmu.h [new file with mode: 0644]
include/asm-powerpc/mmu_context.h [new file with mode: 0644]
include/asm-powerpc/mmzone.h [new file with mode: 0644]
include/asm-powerpc/page_64.h
include/asm-powerpc/pci-bridge.h [new file with mode: 0644]
include/asm-powerpc/pci.h [new file with mode: 0644]
include/asm-powerpc/pgalloc.h [new file with mode: 0644]
include/asm-powerpc/pgtable-4k.h [new file with mode: 0644]
include/asm-powerpc/pgtable-64k.h [new file with mode: 0644]
include/asm-powerpc/pgtable.h [new file with mode: 0644]
include/asm-powerpc/ppc-pci.h
include/asm-powerpc/spinlock.h [new file with mode: 0644]
include/asm-powerpc/tce.h
include/asm-ppc/dma-mapping.h [deleted file]
include/asm-ppc/io.h
include/asm-ppc/ppc4xx_dma.h
include/asm-ppc64/dma-mapping.h [deleted file]
include/asm-ppc64/imalloc.h [deleted file]
include/asm-ppc64/io.h [deleted file]
include/asm-ppc64/mmu.h [deleted file]
include/asm-ppc64/mmu_context.h [deleted file]
include/asm-ppc64/mmzone.h [deleted file]
include/asm-ppc64/pci-bridge.h [deleted file]
include/asm-ppc64/pci.h [deleted file]
include/asm-ppc64/pgalloc.h [deleted file]
include/asm-ppc64/pgtable-4k.h [deleted file]
include/asm-ppc64/pgtable-64k.h [deleted file]
include/asm-ppc64/pgtable.h [deleted file]
include/asm-ppc64/ptrace-common.h [deleted file]
include/asm-ppc64/spinlock.h [deleted file]
include/asm-s390/bitops.h
include/asm-sh/bitops.h
include/asm-sh64/bitops.h
include/asm-sparc/bitops.h
include/asm-sparc/memreg.h
include/asm-sparc/pcic.h
include/asm-sparc64/atomic.h
include/asm-sparc64/bitops.h
include/asm-sparc64/pgtable.h
include/asm-um/ldt-i386.h
include/asm-um/ldt-x86_64.h [new file with mode: 0644]
include/asm-um/ldt.h [deleted file]
include/asm-v850/bitops.h
include/asm-x86_64/atomic.h
include/asm-x86_64/bitops.h
include/asm-x86_64/msr.h
include/asm-x86_64/param.h
include/asm-x86_64/rwlock.h
include/asm-x86_64/topology.h
include/asm-xtensa/bitops.h
include/linux/atmdev.h
include/linux/bio.h
include/linux/bitops.h
include/linux/blkdev.h
include/linux/cache.h
include/linux/cn_proc.h
include/linux/cpu.h
include/linux/cpufreq.h
include/linux/dccp.h
include/linux/dvb/audio.h
include/linux/dvb/ca.h
include/linux/dvb/dmx.h
include/linux/dvb/osd.h
include/linux/dvb/video.h
include/linux/etherdevice.h
include/linux/fb.h
include/linux/gfp.h
include/linux/hdreg.h
include/linux/i2c-id.h
include/linux/ide.h
include/linux/if_pppox.h
include/linux/inotify.h
include/linux/ip.h
include/linux/ipv6.h
include/linux/ipv6_route.h
include/linux/irq.h
include/linux/jbd.h
include/linux/kprobes.h
include/linux/libata.h
include/linux/list.h
include/linux/memory.h
include/linux/mm.h
include/linux/mmc/protocol.h
include/linux/mmzone.h
include/linux/mtd/cfi.h
include/linux/mtd/onenand.h
include/linux/n_r3964.h
include/linux/net.h
include/linux/netdevice.h
include/linux/netfilter_ipv4/ipt_sctp.h
include/linux/nfs_fs.h
include/linux/page-flags.h
include/linux/parport_pc.h
include/linux/pci_ids.h
include/linux/pfkeyv2.h
include/linux/pkt_sched.h
include/linux/preempt.h
include/linux/random.h
include/linux/rcupdate.h
include/linux/relayfs_fs.h
include/linux/rmap.h
include/linux/rtnetlink.h
include/linux/sched.h
include/linux/security.h
include/linux/serial_core.h
include/linux/skbuff.h
include/linux/socket.h
include/linux/swap.h
include/linux/sysctl.h
include/linux/tcp.h
include/linux/time.h
include/linux/udf_fs.h
include/linux/udf_fs_i.h
include/linux/udf_fs_sb.h
include/linux/udp.h
include/linux/uinput.h
include/linux/usb.h
include/linux/usb_usual.h [new file with mode: 0644]
include/linux/xfrm.h
include/media/saa7146.h
include/media/saa7146_vv.h
include/media/tveeprom.h
include/net/af_unix.h
include/net/atmclip.h
include/net/dn.h
include/net/dst.h
include/net/flow.h
include/net/genetlink.h
include/net/icmp.h
include/net/ieee80211_crypt.h
include/net/if_inet6.h
include/net/inet6_connection_sock.h [new file with mode: 0644]
include/net/inet6_hashtables.h
include/net/inet_common.h
include/net/inet_connection_sock.h
include/net/inet_ecn.h
include/net/inet_hashtables.h
include/net/inet_sock.h [new file with mode: 0644]
include/net/inet_timewait_sock.h
include/net/inetpeer.h
include/net/ip.h
include/net/ip_fib.h
include/net/ip_vs.h
include/net/ipv6.h
include/net/ndisc.h
include/net/neighbour.h
include/net/pkt_act.h
include/net/protocol.h
include/net/raw.h
include/net/request_sock.h
include/net/route.h
include/net/sctp/structs.h
include/net/sctp/user.h
include/net/sock.h
include/net/tcp.h
include/net/tcp_states.h
include/net/timewait_sock.h [new file with mode: 0644]
include/net/transp_v6.h
include/net/udp.h
include/net/xfrm.h
include/scsi/scsi_cmnd.h
include/scsi/scsi_dbg.h
include/scsi/scsi_device.h
include/scsi/scsi_transport_fc.h
include/scsi/scsi_transport_spi.h
init/Kconfig
init/main.c
ipc/sem.c
kernel/audit.c
kernel/configs.c
kernel/cpu.c
kernel/fork.c
kernel/futex.c
kernel/irq/manage.c
kernel/kprobes.c
kernel/params.c
kernel/posix-cpu-timers.c
kernel/power/main.c
kernel/printk.c
kernel/ptrace.c
kernel/rcupdate.c
kernel/rcutorture.c
kernel/sys.c
kernel/sysctl.c
kernel/time.c
kernel/workqueue.c
lib/genalloc.c
lib/spinlock_debug.c
lib/swiotlb.c
mm/Kconfig
mm/bootmem.c
mm/fremap.c
mm/hugetlb.c
mm/madvise.c
mm/memory.c
mm/memory_hotplug.c
mm/mempolicy.c
mm/mmap.c
mm/mprotect.c
mm/mremap.c
mm/msync.c
mm/nommu.c
mm/page_alloc.c
mm/rmap.c
mm/swap.c
mm/thrash.c
mm/truncate.c
mm/vmscan.c
net/8021q/vlan.c
net/8021q/vlan_dev.c
net/appletalk/ddp.c
net/atm/atm_misc.c
net/atm/common.c
net/atm/common.h
net/atm/pvc.c
net/atm/resources.c
net/atm/resources.h
net/atm/svc.c
net/ax25/af_ax25.c
net/bluetooth/af_bluetooth.c
net/bluetooth/bnep/sock.c
net/bluetooth/cmtp/sock.c
net/bluetooth/hci_sock.c
net/bluetooth/hidp/sock.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/bridge/br.c
net/bridge/br_device.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_if.c
net/bridge/netfilter/Kconfig
net/bridge/netfilter/ebt_log.c
net/bridge/netfilter/ebt_ulog.c
net/core/datagram.c
net/core/dev.c
net/core/filter.c
net/core/flow.c
net/core/netpoll.c
net/core/pktgen.c
net/core/skbuff.c
net/core/sock.c
net/core/stream.c
net/core/utils.c
net/dccp/Makefile
net/dccp/ackvec.c
net/dccp/ackvec.h
net/dccp/ccid.h
net/dccp/dccp.h
net/dccp/diag.c
net/dccp/input.c
net/dccp/ipv4.c
net/dccp/ipv6.c [new file with mode: 0644]
net/dccp/ipv6.h [new file with mode: 0644]
net/dccp/minisocks.c
net/dccp/output.c
net/dccp/proto.c
net/decnet/af_decnet.c
net/decnet/dn_neigh.c
net/decnet/dn_nsp_in.c
net/decnet/sysctl_net_decnet.c
net/econet/af_econet.c
net/ieee80211/Kconfig
net/ieee80211/ieee80211_rx.c
net/ipv4/Kconfig
net/ipv4/Makefile
net/ipv4/af_inet.c
net/ipv4/ah4.c
net/ipv4/arp.c
net/ipv4/devinet.c
net/ipv4/esp4.c
net/ipv4/fib_frontend.c
net/ipv4/fib_hash.c
net/ipv4/fib_rules.c
net/ipv4/fib_semantics.c
net/ipv4/fib_trie.c
net/ipv4/icmp.c
net/ipv4/igmp.c
net/ipv4/inet_connection_sock.c
net/ipv4/inet_diag.c
net/ipv4/inet_hashtables.c
net/ipv4/inet_timewait_sock.c
net/ipv4/inetpeer.c
net/ipv4/ip_fragment.c
net/ipv4/ip_gre.c
net/ipv4/ip_input.c
net/ipv4/ip_options.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/ipcomp.c
net/ipv4/ipconfig.c
net/ipv4/ipmr.c
net/ipv4/ipvs/ip_vs_app.c
net/ipv4/ipvs/ip_vs_conn.c
net/ipv4/ipvs/ip_vs_core.c
net/ipv4/ipvs/ip_vs_ctl.c
net/ipv4/ipvs/ip_vs_dh.c
net/ipv4/ipvs/ip_vs_est.c
net/ipv4/ipvs/ip_vs_lblc.c
net/ipv4/ipvs/ip_vs_lblcr.c
net/ipv4/ipvs/ip_vs_proto_ah.c
net/ipv4/ipvs/ip_vs_proto_esp.c
net/ipv4/ipvs/ip_vs_proto_tcp.c
net/ipv4/ipvs/ip_vs_proto_udp.c
net/ipv4/ipvs/ip_vs_sh.c
net/ipv4/ipvs/ip_vs_sync.c
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/Makefile
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_netlink.c
net/ipv4/netfilter/ip_conntrack_proto_gre.c
net/ipv4/netfilter/ip_conntrack_proto_icmp.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_snmp_basic.c
net/ipv4/netfilter/ip_nat_tftp.c
net/ipv4/netfilter/ip_tables.c
net/ipv4/netfilter/ipt_LOG.c
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/ipt_physdev.c
net/ipv4/netfilter/ipt_recent.c
net/ipv4/proc.c
net/ipv4/route.c
net/ipv4/syncookies.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_bic.c
net/ipv4/tcp_cong.c
net/ipv4/tcp_cubic.c [new file with mode: 0644]
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/tcp_vegas.c
net/ipv4/udp.c
net/ipv4/xfrm4_policy.c
net/ipv6/Makefile
net/ipv6/addrconf.c
net/ipv6/af_inet6.c
net/ipv6/ah6.c
net/ipv6/datagram.c
net/ipv6/esp6.c
net/ipv6/exthdrs.c
net/ipv6/icmp.c
net/ipv6/inet6_connection_sock.c [new file with mode: 0644]
net/ipv6/inet6_hashtables.c
net/ipv6/ip6_flowlabel.c
net/ipv6/ip6_output.c
net/ipv6/ipcomp6.c
net/ipv6/ipv6_sockglue.c
net/ipv6/mcast.c
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/ip6_tables.c
net/ipv6/netfilter/ip6t_LOG.c
net/ipv6/netfilter/ip6t_ah.c
net/ipv6/netfilter/ip6t_esp.c
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/ipv6/raw.c
net/ipv6/route.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/xfrm6_policy.c
net/ipx/af_ipx.c
net/irda/af_irda.c
net/irda/iriap.c
net/key/af_key.c
net/llc/af_llc.c
net/netfilter/Kconfig
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_proto_tcp.c
net/netfilter/nfnetlink.c
net/netfilter/nfnetlink_log.c
net/netfilter/nfnetlink_queue.c
net/netlink/af_netlink.c
net/netlink/genetlink.c
net/netrom/af_netrom.c
net/netrom/nr_in.c
net/nonet.c
net/packet/af_packet.c
net/rose/af_rose.c
net/sched/act_api.c
net/sched/sch_netem.c
net/sched/sch_teql.c
net/sctp/associola.c
net/sctp/input.c
net/sctp/ipv6.c
net/sctp/output.c
net/sctp/protocol.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c
net/sctp/socket.c
net/sctp/transport.c
net/socket.c
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/rpc_pipe.c
net/sunrpc/svcsock.c
net/sunrpc/xprtsock.c
net/unix/af_unix.c
net/unix/garbage.c
net/wanrouter/af_wanpipe.c
net/x25/af_x25.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
net/xfrm/xfrm_user.c
scripts/binoffset.c
scripts/checkversion.pl
scripts/kconfig/Makefile
scripts/kconfig/util.c
scripts/patch-kernel
security/Kconfig
security/dummy.c
security/keys/keyring.c
security/selinux/Makefile
security/selinux/hooks.c
security/selinux/include/av_perm_to_string.h
security/selinux/include/av_permissions.h
security/selinux/include/xfrm.h [new file with mode: 0644]
security/selinux/xfrm.c [new file with mode: 0644]
sound/core/memalloc.c
sound/oss/au1550_ac97.c
sound/sparc/Kconfig
sound/usb/usbaudio.c
sound/usb/usx2y/usbusx2y.c
sound/usb/usx2y/usx2yhwdeppcm.c

index 096aed62c326821cb7c6ab586167344ef3401ac0..767433bdbc4099ce3a2f4403f91d0e35a0a1f6f6 100644 (file)
@@ -237,8 +237,10 @@ X!Ilib/string.c
      <sect1><title>Driver Support</title>
 !Enet/core/dev.c
 !Enet/ethernet/eth.c
-!Einclude/linux/etherdevice.h
-!Enet/core/wireless.c
+!Iinclude/linux/etherdevice.h
+<!-- FIXME: Removed for now since no structured comments in source
+X!Enet/core/wireless.c
+-->
      </sect1>
      <sect1><title>Synchronous PPP</title>
 !Edrivers/net/wan/syncppp.c
index 15ce0f21e5e0c04c28e095941a21606192d8404b..320af25de3a276fd5b77aa830b08549c2c523793 100644 (file)
 !Edrivers/usb/core/urb.c
 !Edrivers/usb/core/message.c
 !Edrivers/usb/core/file.c
+!Edrivers/usb/core/driver.c
 !Edrivers/usb/core/usb.c
 !Edrivers/usb/core/hub.c
     </chapter>
index 237d54c44bc5ee504dc57f8d5f65edc389081e04..1d47e6c09dc60c7a1c2330c09b458b5af0871852 100644 (file)
@@ -158,7 +158,7 @@ Even if the maintainer did not respond in step #4, make sure to ALWAYS
 copy the maintainer when you change their code.
 
 For small patches you may want to CC the Trivial Patch Monkey
-trivial@rustcorp.com.au set up by Rusty Russell; which collects "trivial"
+trivial@kernel.org managed by Adrian Bunk; which collects "trivial"
 patches. Trivial patches must qualify for one of the following rules:
  Spelling fixes in documentation
  Spelling fixes which could break grep(1).
@@ -171,7 +171,7 @@ patches. Trivial patches must qualify for one of the following rules:
  since people copy, as long as it's trivial)
  Any fix by the author/maintainer of the file. (ie. patch monkey
  in re-transmission mode)
-URL: <http://www.kernel.org/pub/linux/kernel/people/rusty/trivial/>
+URL: <http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/>
 
 
 
index d753fe59a248df4b8953cd2ac0e8222b6222d4dc..2c6a3b38967ea74a06c4b129c85fc1c1a54dd533 100644 (file)
@@ -16,5 +16,7 @@ empeg
        - Empeg documentation
 mem_alignment
        - alignment abort handler documentation
+memory.txt
+       - description of the virtual memory layout
 nwfpe
        - NWFPE floating point emulator documentation
index f28e0222f5e5487bb171042f92b0e426fa6f9bde..28a2795705ca6954d9cb461322e02c5ca9dc8bfa 100644 (file)
@@ -12,7 +12,7 @@ This release has been validated against the SoftFloat-2b library by
 John R. Hauser using the TestFloat-2a test suite.  Details of this
 library and test suite can be found at:
 
-   http://www.cs.berkeley.edu/~jhauser/arithmetic/SoftFloat.html
+   http://www.jhauser.us/arithmetic/SoftFloat.html
 
 The operations which have been tested with this package are:
 
index 4b1c93a8177b9d6fbf447b86119e596c71e7f7cf..dc6045577a8bdcebe21980453beecbe82126f41f 100644 (file)
@@ -1,7 +1,7 @@
                Kernel Memory Layout on ARM Linux
 
                Russell King <rmk@arm.linux.org.uk>
-                       May 21, 2004 (2.6.6)
+                    November 17, 2005 (2.6.15)
 
 This document describes the virtual memory layout which the Linux
 kernel uses for ARM processors.  It indicates which regions are
@@ -37,6 +37,8 @@ ff000000      ffbfffff        Reserved for future expansion of DMA
                                mapping region.
 
 VMALLOC_END    feffffff        Free for platform use, recommended.
+                               VMALLOC_END must be aligned to a 2MB
+                               boundary.
 
 VMALLOC_START  VMALLOC_END-1   vmalloc() / ioremap() space.
                                Memory returned by vmalloc/ioremap will
index 0fe01c805480563f8544fe157ccd8064cfe2f07a..303c57a7fad95216fe6cecff723cd15cf5574d0b 100644 (file)
@@ -31,7 +31,7 @@ The following people helped with review comments and inputs for this
 document:
        Christoph Hellwig <hch@infradead.org>
        Arjan van de Ven <arjanv@redhat.com>
-       Randy Dunlap <rddunlap@osdl.org>
+       Randy Dunlap <rdunlap@xenotime.net>
        Andre Hedrick <andre@linux-ide.org>
 
 The following people helped with fixes/contributions to the bio patches
index 933fae74c3379cba1fd7d066a2ab7f6daead76a3..f4b8dc4237e6a83b6f0cf44cfc3861f924baec10 100644 (file)
@@ -27,6 +27,7 @@ Contents:
 2.2  Powersave
 2.3  Userspace
 2.4  Ondemand
+2.5  Conservative
 
 3.   The Governor Interface in the CPUfreq Core
 
@@ -110,9 +111,64 @@ directory.
 
 The CPUfreq govenor "ondemand" sets the CPU depending on the
 current usage. To do this the CPU must have the capability to
-switch the frequency very fast.
-
-
+switch the frequency very quickly.  There are a number of sysfs file
+accessible parameters:
+
+sampling_rate: measured in uS (10^-6 seconds), this is how often you
+want the kernel to look at the CPU usage and to make decisions on
+what to do about the frequency.  Typically this is set to values of
+around '10000' or more.
+
+show_sampling_rate_(min|max): the minimum and maximum sampling rates
+available that you may set 'sampling_rate' to.
+
+up_threshold: defines what the average CPU usaged between the samplings
+of 'sampling_rate' needs to be for the kernel to make a decision on
+whether it should increase the frequency.  For example when it is set
+to its default value of '80' it means that between the checking
+intervals the CPU needs to be on average more than 80% in use to then
+decide that the CPU frequency needs to be increased.  
+
+sampling_down_factor: this parameter controls the rate that the CPU
+makes a decision on when to decrease the frequency.  When set to its
+default value of '5' it means that at 1/5 the sampling_rate the kernel
+makes a decision to lower the frequency.  Five "lower rate" decisions
+have to be made in a row before the CPU frequency is actually lower.
+If set to '1' then the frequency decreases as quickly as it increases,
+if set to '2' it decreases at half the rate of the increase.
+
+ignore_nice_load: this parameter takes a value of '0' or '1', when set
+to '0' (its default) then all processes are counted towards towards the
+'cpu utilisation' value.   When set to '1' then processes that are
+run with a 'nice' value will not count (and thus be ignored) in the
+overal usage calculation.  This is useful if you are running a CPU
+intensive calculation on your laptop that you do not care how long it
+takes to complete as you can 'nice' it and prevent it from taking part
+in the deciding process of whether to increase your CPU frequency.
+
+
+2.5 Conservative
+----------------
+
+The CPUfreq governor "conservative", much like the "ondemand"
+governor, sets the CPU depending on the current usage.  It differs in
+behaviour in that it gracefully increases and decreases the CPU speed
+rather than jumping to max speed the moment there is any load on the
+CPU.  This behaviour more suitable in a battery powered environment.
+The governor is tweaked in the same manner as the "ondemand" governor
+through sysfs with the addition of:
+
+freq_step: this describes what percentage steps the cpu freq should be
+increased and decreased smoothly by.  By default the cpu frequency will
+increase in 5% chunks of your maximum cpu frequency.  You can change this
+value to anywhere between 0 and 100 where '0' will effectively lock your
+CPU at a speed regardless of its load whilst '100' will, in theory, make
+it behave identically to the "ondemand" governor.
+
+down_threshold: same as the 'up_threshold' found for the "ondemand"
+governor but for the opposite direction.  For example when set to its
+default value of '20' it means that if the CPU usage needs to be below
+20% between samples to have the frequency decreased.
 
 3. The Governor Interface in the CPUfreq Core
 =============================================
index ac0797ea646c6f2c725fe4cf8c064ee38532d654..46b78b7331c27e4f0fe131336f08c25235138ad5 100644 (file)
@@ -50,12 +50,12 @@ http://www.linuxtv.org/wiki/index.php/DVB_USB
 0. History & News:
   2005-06-30 - added support for WideView WT-220U (Thanks to Steve Chang)
   2005-05-30 - added basic isochronous support to the dvb-usb-framework
-               added support for Conexant Hybrid reference design and Nebula DigiTV USB
+              added support for Conexant Hybrid reference design and Nebula DigiTV USB
   2005-04-17 - all dibusb devices ported to make use of the dvb-usb-framework
   2005-04-02 - re-enabled and improved remote control code.
   2005-03-31 - ported the Yakumo/Hama/Typhoon DVB-T USB2.0 device to dvb-usb.
   2005-03-30 - first commit of the dvb-usb-module based on the dibusb-source. First device is a new driver for the
-               TwinhanDTV Alpha / MagicBox II USB2.0-only DVB-T device.
+              TwinhanDTV Alpha / MagicBox II USB2.0-only DVB-T device.
 
   (change from dvb-dibusb to dvb-usb)
   2005-03-28 - added support for the AVerMedia AverTV DVB-T USB2.0 device (Thanks to Glen Harris and Jiun-Kuei Jung, AVerMedia)
@@ -64,50 +64,50 @@ http://www.linuxtv.org/wiki/index.php/DVB_USB
   2005-02-02 - added support for the Hauppauge Win-TV Nova-T USB2
   2005-01-31 - distorted streaming is gone for USB1.1 devices
   2005-01-13 - moved the mirrored pid_filter_table back to dvb-dibusb
-             - first almost working version for HanfTek UMT-010
-             - found out, that Yakumo/HAMA/Typhoon are predecessors of the HanfTek UMT-010
+            - first almost working version for HanfTek UMT-010
+            - found out, that Yakumo/HAMA/Typhoon are predecessors of the HanfTek UMT-010
   2005-01-10 - refactoring completed, now everything is very delightful
-             - tuner quirks for some weird devices (Artec T1 AN2235 device has sometimes a
-               Panasonic Tuner assembled). Tunerprobing implemented. Thanks a lot to Gunnar Wittich.
+            - tuner quirks for some weird devices (Artec T1 AN2235 device has sometimes a
+              Panasonic Tuner assembled). Tunerprobing implemented. Thanks a lot to Gunnar Wittich.
   2004-12-29 - after several days of struggling around bug of no returning URBs fixed.
   2004-12-26 - refactored the dibusb-driver, splitted into separate files
-             - i2c-probing enabled
+            - i2c-probing enabled
   2004-12-06 - possibility for demod i2c-address probing
-             - new usb IDs (Compro, Artec)
+            - new usb IDs (Compro, Artec)
   2004-11-23 - merged changes from DiB3000MC_ver2.1
-             - revised the debugging
-             - possibility to deliver the complete TS for USB2.0
+            - revised the debugging
+            - possibility to deliver the complete TS for USB2.0
   2004-11-21 - first working version of the dib3000mc/p frontend driver.
   2004-11-12 - added additional remote control keys. Thanks to Uwe Hanke.
   2004-11-07 - added remote control support. Thanks to David Matthews.
   2004-11-05 - added support for a new devices (Grandtec/Avermedia/Artec)
-             - merged my changes (for dib3000mb/dibusb) to the FE_REFACTORING, because it became HEAD
-             - moved transfer control (pid filter, fifo control) from usb driver to frontend, it seems
-               better settled there (added xfer_ops-struct)
-             - created a common files for frontends (mc/p/mb)
+            - merged my changes (for dib3000mb/dibusb) to the FE_REFACTORING, because it became HEAD
+            - moved transfer control (pid filter, fifo control) from usb driver to frontend, it seems
+              better settled there (added xfer_ops-struct)
+            - created a common files for frontends (mc/p/mb)
   2004-09-28 - added support for a new device (Unkown, vendor ID is Hyper-Paltek)
   2004-09-20 - added support for a new device (Compro DVB-U2000), thanks
-               to Amaury Demol for reporting
-             - changed usb TS transfer method (several urbs, stopping transfer
-               before setting a new pid)
+              to Amaury Demol for reporting
+            - changed usb TS transfer method (several urbs, stopping transfer
+              before setting a new pid)
   2004-09-13 - added support for a new device (Artec T1 USB TVBOX), thanks
-               to Christian Motschke for reporting
+              to Christian Motschke for reporting
   2004-09-05 - released the dibusb device and dib3000mb-frontend driver
 
   (old news for vp7041.c)
   2004-07-15 - found out, by accident, that the device has a TUA6010XS for
-               PLL
+              PLL
   2004-07-12 - figured out, that the driver should also work with the
-               CTS Portable (Chinese Television System)
+              CTS Portable (Chinese Television System)
   2004-07-08 - firmware-extraction-2.422-problem solved, driver is now working
-               properly with firmware extracted from 2.422
-             - #if for 2.6.4 (dvb), compile issue
-             - changed firmware handling, see vp7041.txt sec 1.1
+              properly with firmware extracted from 2.422
+            - #if for 2.6.4 (dvb), compile issue
+            - changed firmware handling, see vp7041.txt sec 1.1
   2004-07-02 - some tuner modifications, v0.1, cleanups, first public
   2004-06-28 - now using the dvb_dmx_swfilter_packets, everything
-               runs fine now
+              runs fine now
   2004-06-27 - able to watch and switching channels (pre-alpha)
-             - no section filtering yet
+            - no section filtering yet
   2004-06-06 - first TS received, but kernel oops :/
   2004-05-14 - firmware loader is working
   2004-05-11 - start writing the driver
index a50c70f9ca7208d90df90f247cf7d38110272163..5515469de7cf6aaf2d339fd18eec62df773b70d2 100644 (file)
@@ -174,7 +174,7 @@ Debugging
 Everything which is identical in the following table, can be put into a common
 flexcop-module.
 
-                  PCI                  USB
+                 PCI                  USB
 -------------------------------------------------------------------------------
 Different:
 Register access:  accessing IO memory  USB control message
index 09020ebd202b1bfa38e2b016f3628922fea26e4e..2dc260b2b0a4a417c0e489b4713037373d1b0dd5 100644 (file)
@@ -1,6 +1,6 @@
 
 HOWTO: Get An Avermedia DVB-T working under Linux
-           ______________________________________________
+          ______________________________________________
 
    Table of Contents
    Assumptions and Introduction
index 19329cf7b09798462293f70928bca66e89b80f5a..9e10092440e1d61836481300004740ee1f89d984 100644 (file)
@@ -16,7 +16,7 @@ Hardware supported by the linuxtv.org DVB drivers
   shielding, and the whole metal box has its own part number.
 
 
-o Frontends drivers: 
+o Frontends drivers:
   - dvb_dummy_fe: for testing...
   DVB-S:
    - ves1x93           : Alps BSRV2 (ves1893 demodulator) and dbox2 (ves1993)
@@ -24,7 +24,7 @@ o Frontends drivers:
    - grundig_29504-491 : Grundig 29504-491 (Philips TDA8083 demodulator), tsa5522 PLL
    - mt312             : Zarlink mt312 or Mitel vp310 demodulator, sl1935 or tsa5059 PLL
    - stv0299           : Alps BSRU6 (tsa5059 PLL), LG TDQB-S00x (tsa5059 PLL),
-                         LG TDQF-S001F (sl1935 PLL), Philips SU1278 (tua6100 PLL), 
+                         LG TDQF-S001F (sl1935 PLL), Philips SU1278 (tua6100 PLL),
                          Philips SU1278SH (tsa5059 PLL), Samsung TBMU24112IMB
   DVB-C:
    - ves1820           : various (ves1820 demodulator, sp5659c or spXXXX PLL)
@@ -35,8 +35,8 @@ o Frontends drivers:
    - grundig_29504-401 : Grundig 29504-401 (LSI L64781 demodulator), tsa5060 PLL
    - tda1004x          : Philips tda10045h (td1344 or tdm1316l PLL)
    - nxt6000           : Alps TDME7 (MITEL SP5659 PLL), Alps TDED4 (TI ALP510 PLL),
-                                 Comtech DVBT-6k07 (SP5730 PLL)
-                                 (NxtWave Communications NXT6000 demodulator)
+                         Comtech DVBT-6k07 (SP5730 PLL)
+                         (NxtWave Communications NXT6000 demodulator)
    - sp887x            : Microtune 7202D
    - dib3000mb : DiBcom 3000-MB demodulator
   DVB-S/C/T:
index 2cbd2d0f6fdf73475d9623fbdcf9075094373d4e..4c33cced5f657fd25be698d01a25473a11c0dfd4 100644 (file)
@@ -15,7 +15,7 @@ Michael Holzt <kju@debian.org>
 
 Diego Picciani <d.picciani@novacomp.it>
   for CyberLogin for Linux which allows logging onto EON
-  (in case you are wondering where CyberLogin is, EON changed its login 
+  (in case you are wondering where CyberLogin is, EON changed its login
   procedure and CyberLogin is no longer used.)
 
 Martin Schaller <martin@smurf.franken.de>
@@ -57,7 +57,7 @@ Augusto Cardoso <augusto@carhil.net>
 Davor Emard <emard@softhome.net>
   for his work on the budget drivers, the demux code,
   the module unloading problems, ...
-  
+
 Hans-Frieder Vogt <hfvogt@arcor.de>
   for his work on calculating and checking the crc's for the
   TechnoTrend/Hauppauge DEC driver firmware
index 3bf51e45c9725d19e7cfd295ddefb3e34791c58f..a42132d60dc8889f25aea6d939e25ce0eb103128 100644 (file)
@@ -60,7 +60,6 @@ Some very frequently asked questions about linuxtv-dvb
                Metzler Bros. DVB development; alternate drivers and
                DVB utilities, include dvb-mpegtools and tuxzap.
 
-       http://www.linuxstb.org/
        http://sourceforge.net/projects/dvbtools/
                Dave Chapman's dvbtools package, including
                dvbstream and dvbtune
index 754c98c6ad942049dcb5cfcf05e48abd161738f3..f5c50b22de3b89e09bb8553854cc8452d76bc110 100644 (file)
@@ -20,7 +20,7 @@ http://linuxtv.org/downloads/
 
 What's inside this directory:
 
-"cards.txt" 
+"cards.txt"
 contains a list of supported hardware.
 
 "contributors.txt"
@@ -37,7 +37,7 @@ that require it.
 contains detailed informations about the
 TT DEC2000/DEC3000 USB DVB hardware.
 
-"bt8xx.txt" 
+"bt8xx.txt"
 contains detailed installation instructions for the
 various bt8xx based "budget" DVB cards
 (Nebula, Pinnacle PCTV, Twinhan DST)
index bcfbab899b370509175af4e9bca4f0cb68624324..7e17712f32290182f34e7a2df4db431ab4f54a5d 100644 (file)
@@ -18,8 +18,6 @@ devfs/
        - directory containing devfs documentation.
 ext2.txt
        - info, mount options and specifications for the Ext2 filesystem.
-fat_cvf.txt
-       - info on the Compressed Volume Files extension to the FAT filesystem
 hpfs.txt
        - info and mount options for the OS/2 HPFS.
 isofs.txt
index 30c9738590f42b162e3402cf718315a9aaaa2d40..2d1524469c250f019ff45883214dbbf6fb124e5a 100644 (file)
@@ -216,4 +216,4 @@ due to an incompatibility with the Amiga floppy controller.
 
 If you are interested in an Amiga Emulator for Linux, look at
 
-http://www-users.informatik.rwth-aachen.de/~crux/uae.html
+http://www.freiburg.linux.de/~uae/
index a8edb376b04191654b6ab9a868c4cb529a65176b..3dd2872416a1e338062c722da8145539153c21f4 100644 (file)
@@ -369,9 +369,8 @@ The kernel source   file:/usr/src/linux/fs/ext2/
 e2fsprogs (e2fsck)     http://e2fsprogs.sourceforge.net/
 Design & Implementation        http://e2fsprogs.sourceforge.net/ext2intro.html
 Journaling (ext3)      ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/
-Hashed Directories     http://kernelnewbies.org/~phillips/htree/
 Filesystem Resizing    http://ext2resize.sourceforge.net/
-Compression (*)                http://www.netspace.net.au/~reiter/e2compr/
+Compression (*)                http://e2compr.sourceforge.net/
 
 Implementations for:
 Windows 95/98/NT/2000  http://uranus.it.swin.edu.au/~jn/linux/Explore2fs.htm
index 9ab7f446f7adb76e1752aa4d020a9fa201fe03f1..9840d5b8d5b9997621964653f6b3d348dd08f9b7 100644 (file)
@@ -57,19 +57,19 @@ oldalloc            This disables the Orlov block allocator and enables the
                        we'd like to get some feedback if it's the contrary for
                        you.
 
-user_xattr     (*)     Enables POSIX Extended Attributes. It's enabled by
-                       default, however you need to confifure its support
-                       (CONFIG_EXT3_FS_XATTR). This is neccesary if you want
-                       to use POSIX Acces Control Lists support. You can visit
-                       http://acl.bestbits.at to know more about POSIX Extended
-                       attributes.
-
-nouser_xattr           Disables POSIX Extended Attributes.
-
-acl            (*)     Enables POSIX Access Control Lists support. This is
-                       enabled by default, however you need to configure
-                       its support (CONFIG_EXT3_FS_POSIX_ACL). If you want
-                       to know more about ACLs visit http://acl.bestbits.at
+user_xattr             Enables Extended User Attributes. Additionally, you need
+                       to have extended attribute support enabled in the kernel
+                       configuration (CONFIG_EXT3_FS_XATTR). See the attr(5)
+                       manual page and http://acl.bestbits.at to learn more
+                       about extended attributes.
+
+nouser_xattr           Disables Extended User Attributes.
+
+acl                    Enables POSIX Access Control Lists support.  Additionally,
+                       you need to have ACL support enabled in the kernel
+                       configuration (CONFIG_EXT3_FS_POSIX_ACL). See the acl(5)
+                       manual page and http://acl.bestbits.at for more
+                       information.
 
 noacl                  This option disables POSIX Access Control List support.
 
index ee4c0a8b8db7a663169fd97c57ce472a1a790398..e56e842847d3ee3e48c79b4099bc0d6040d730a1 100644 (file)
@@ -162,9 +162,8 @@ get_sb() method fills in is the "s_op" field. This is a pointer to
 a "struct super_operations" which describes the next level of the
 filesystem implementation.
 
-Usually, a filesystem uses generic one of the generic get_sb()
-implementations and provides a fill_super() method instead. The
-generic methods are:
+Usually, a filesystem uses one of the generic get_sb() implementations
+and provides a fill_super() method instead. The generic methods are:
 
   get_sb_bdev: mount a filesystem residing on a block device
 
index 6fb10fcd82fb129020eb8ebccf230f394fa610c2..6ccab88705cbae4d327c143b7608363ebc2459e0 100644 (file)
@@ -4,7 +4,7 @@ FAQ list:
 =========
 
  A FAQ list may be found in the fdutils package (see below), and also
-at http://fdutils.linux.lu/FAQ.html
+at <http://fdutils.linux.lu/faq.html>.
 
 
 LILO configuration options (Thinkpad users, read this)
@@ -217,10 +217,10 @@ It also contains additional documentation about the floppy driver.
 The latest version can be found at fdutils homepage:
  http://fdutils.linux.lu
 
-The fdutils-5.4 release can be found at:
- http://fdutils.linux.lu/fdutils-5.4.src.tar.gz
- http://www.tux.org/pub/knaff/fdutils/fdutils-5.4.src.tar.gz
- ftp://metalab.unc.edu/pub/Linux/utils/disk-management/fdutils-5.4.src.tar.gz
+The fdutils releases can be found at:
+ http://fdutils.linux.lu/download.html
+ http://www.tux.org/pub/knaff/fdutils/
+ ftp://metalab.unc.edu/pub/Linux/utils/disk-management/
 
 Reporting problems about the floppy driver
 ==========================================
index 87f4d052e39ca9adcbc35f3a0eb272dd668c1d7e..aa7ba00ec082adb2818b18bfd0026374d7412df3 100644 (file)
@@ -133,7 +133,7 @@ Code        Seq#    Include File            Comments
 'l'    00-3F   linux/tcfs_fs.h         transparent cryptographic file system
                                        <http://mikonos.dia.unisa.it/tcfs>
 'l'    40-7F   linux/udf_fs_i.h        in development:
-                                       <http://www.trylinux.com/projects/udf/>
+                                       <http://sourceforge.net/projects/linux-udf/>
 'm'    all     linux/mtio.h            conflict!
 'm'    all     linux/soundcard.h       conflict!
 'm'    all     linux/synclink.h        conflict!
index cb89fb3b61efd2862e399271ee0ee6d3f0cf8759..99d24f2943eefc1ae597c09470e00964fc8fa356 100644 (file)
        
      * Title: "Writing Linux Device Drivers"
        Author: Michael K. Johnson.
-       URL: http://people.redhat.com/johnsonm/devices.html
+       URL: http://users.evitech.fi/~tk/rtos/writing_linux_device_d.html
        Keywords: files, VFS, file operations, kernel interface, character
        vs block devices, I/O access, hardware interrupts, DMA, access to
        user memory, memory allocation, timers.
        
      * Title: "Linux Kernel Module Programming Guide"
        Author: Ori Pomerantz.
-       URL: http://www.tldp.org/LDP/lkmpg/mpg.html
+       URL: http://tldp.org/LDP/lkmpg/2.6/html/index.html
        Keywords: modules, GPL book, /proc, ioctls, system calls,
        interrupt handlers .
        Description: Very nice 92 pages GPL book on the topic of modules
        
      * Title: "Device File System (devfs) Overview"
        Author: Richard Gooch.
-       URL: http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.txt
+       URL: http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html
        Keywords: filesystem, /dev, devfs, dynamic devices, major/minor
        allocation, device management.
        Description: Document describing Richard Gooch's controversial
        
      * Title: "The Kernel Hacking HOWTO"
        Author: Various Talented People, and Rusty.
-       URL:
-       http://www.lisoleg.net/doc/Kernel-Hacking-HOWTO/kernel-hacking-HOW
-       TO.html
+       Location: in kernel tree, Documentation/DocBook/kernel-hacking/
+       (must be built as "make {htmldocs | psdocs | pdfdocs})
        Keywords: HOWTO, kernel contexts, deadlock, locking, modules,
        symbols, return conventions.
        Description: From the Introduction: "Please understand that I
        originally written for the 2.3 kernels, but nearly all of it
        applies to 2.2 too; 2.0 is slightly different".
        
-     * Title: "ALSA 0.5.0 Developer documentation"
-       Author: Stephan 'Jumpy' Bartels .
-       URL: http://www.math.TU-Berlin.de/~sbartels/alsa/
+     * Title: "Writing an ALSA Driver"
+       Author: Takashi Iwai <tiwai@suse.de>
+       URL: http://www.alsa-project.org/~iwai/writing-an-alsa-driver/index.html
        Keywords: ALSA, sound, soundcard, driver, lowlevel, hardware.
        Description: Advanced Linux Sound Architecture for developers,
-       both at kernel and user-level sides. Work in progress. ALSA is
-       supposed to be Linux's next generation sound architecture.
+       both at kernel and user-level sides. ALSA is the Linux kernel
+       sound architecture in the 2.6 kernel version.
        
      * Title: "Programming Guide for Linux USB Device Drivers"
        Author: Detlef Fliegl.
        filesystems, IPC and Networking Code.
        
      * Title: "Linux Kernel Mailing List Glossary"
-       Author: John Levon.
-       URL: http://www.movement.uklinux.net/glossary.html
+       Author: various
+       URL: http://kernelnewbies.org/glossary/
        Keywords: glossary, terms, linux-kernel.
        Description: From the introduction: "This glossary is intended as
        a brief description of some of the acronyms and terms you may hear
        
      * Title: "Linux Kernel Locking HOWTO"
        Author: Various Talented People, and Rusty.
-       URL:
-       http://netfilter.kernelnotes.org/unreliable-guides/kernel-locking-
-       HOWTO.html
+       Location: in kernel tree, Documentation/DocBook/kernel-locking/
+       (must be built as "make {htmldocs | psdocs | pdfdocs})
        Keywords: locks, locking, spinlock, semaphore, atomic, race
        condition, bottom halves, tasklets, softirqs.
        Description: The title says it all: document describing the
        
      * Title: "Get those boards talking under Linux."
        Author: Alex Ivchenko.
-       URL: http://www.ednmag.com/ednmag/reg/2000/06222000/13df2.htm
+       URL: http://www.edn.com/article/CA46968.html
        Keywords: data-acquisition boards, drivers, modules, interrupts,
        memory allocation.
        Description: Article written for people wishing to make their data
        overview on writing drivers, from the naming of functions to
        interrupt handling.
        Notes: Two-parts article. Part II is at
-       http://www.ednmag.com/ednmag/reg/2000/07062000/14df.htm
+       URL: http://www.edn.com/article/CA46998.html
        
      * Title: "Linux PCMCIA Programmer's Guide"
        Author: David Hinds.
        definitive guide for hackers, virus coders and system
        administrators."
        Author: pragmatic/THC.
-       URL: http://packetstorm.securify.com/groups/thc/LKM_HACKING.html
+       URL: http://packetstormsecurity.org/docs/hack/LKM_HACKING.html
        Keywords: syscalls, intercept, hide, abuse, symbol table.
        Description: Interesting paper on how to abuse the Linux kernel in
        order to intercept and modify syscalls, make
        write kernel modules based virus... and solutions for admins to
        avoid all those abuses.
        Notes: For 2.0.x kernels. Gives guidances to port it to 2.2.x
-       kernels. Also available in txt format at
-       http://www.blacknemesis.org/hacking/txt/cllkm.txt
+       kernels.
        
      BOOKS: (Not on-line)
    
        ISBN: 0-59600-008-1
        Notes: Further information in
        http://www.oreilly.com/catalog/linuxdrive2/
-       
+
+     * Title: "Linux Device Drivers, 3nd Edition"
+       Authors: Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman
+       Publisher: O'Reilly & Associates.
+       Date: 2005.
+       Pages: 636.
+       ISBN: 0-596-00590-3
+       Notes: Further information in
+       http://www.oreilly.com/catalog/linuxdrive3/
+       PDF format, URL: http://lwn.net/Kernel/LDD3/
+
      * Title: "Linux Kernel Internals"
        Author: Michael Beck.
        Publisher: Addison-Wesley.
        documents, FAQs...
        
      * Name: "linux-kernel mailing list archives and search engines"
+       URL: http://vger.kernel.org/vger-lists.html
        URL: http://www.uwsg.indiana.edu/hypermail/linux/kernel/index.html
-       URL: http://www.kernelnotes.org/lnxlists/linux-kernel/
-       URL: http://www.geocrawler.com
+       URL: http://marc.theaimsgroup.com/?l=linux-kernel
+       URL: http://groups.google.com/group/mlist.linux.kernel
+       URL: http://www.cs.helsinki.fi/linux/linux-kernel/
+       URL: http://www.lib.uaa.alaska.edu/linux-kernel/
        Keywords: linux-kernel, archives, search.
        Description: Some of the linux-kernel mailing list archivers. If
        you have a better/another one, please let me know.
      _________________________________________________________________
    
-   Document last updated on Thu Jun 28 15:09:39 CEST 2001
+   Document last updated on Sat 2005-NOV-19
index 5dffcfefc3c715698eca24b519df8eab6d8a799d..61a56b100c62d287e05ec52c42636c6345159f14 100644 (file)
@@ -633,6 +633,14 @@ running once the system is up.
        inport.irq=     [HW] Inport (ATI XL and Microsoft) busmouse driver
                        Format: <irq>
 
+       combined_mode=  [HW] control which driver uses IDE ports in combined
+                       mode: legacy IDE driver, libata, or both
+                       (in the libata case, libata.atapi_enabled=1 may be
+                       useful as well).  Note that using the ide or libata
+                       options may affect your device naming (e.g. by
+                       changing hdc to sdb).
+                       Format: combined (default), ide, or libata
+
        inttest=        [IA64]
 
        io7=            [HW] IO7 for Marvel based alpha systems
index 6e32c305c65a5abc84e3f0e5b13f14f4081e56f0..60913354cb7dcf898ef96f9381bb555cd9f92af4 100644 (file)
@@ -252,7 +252,7 @@ their names here, but I don't have a list handy.  Check the MCA Linux
 home page (URL below) for a perpetually out-of-date list.
 
 =====================================================================
-MCA Linux Home Page: http://glycerine.itsmm.uni.edu/mca/
+MCA Linux Home Page: http://www.dgmicro.com/mca/
 
 Christophe Beauregard
 chrisb@truespectra.com
index 11fd0ef5ff5747762670cb52ffdfcad59606c5df..a9ad58b49cc5459c82789bce189d9af51f77344e 100644 (file)
@@ -1,7 +1,4 @@
-Documents about softnet driver issues in general can be found
-at:
-
-       http://www.firstfloor.org/~andi/softnet/
+Document about softnet driver issues
 
 Transmit path guidelines:
 
diff --git a/Documentation/networking/gianfar.txt b/Documentation/networking/gianfar.txt
new file mode 100644 (file)
index 0000000..ad474ea
--- /dev/null
@@ -0,0 +1,72 @@
+The Gianfar Ethernet Driver
+Sysfs File description
+
+Author: Andy Fleming <afleming@freescale.com>
+Updated: 2005-07-28
+
+SYSFS
+
+Several of the features of the gianfar driver are controlled
+through sysfs files.  These are:
+
+bd_stash:
+To stash RX Buffer Descriptors in the L2, echo 'on' or '1' to
+bd_stash, echo 'off' or '0' to disable
+
+rx_stash_len:
+To stash the first n bytes of the packet in L2, echo the number
+of bytes to buf_stash_len.  echo 0 to disable.
+
+WARNING: You could really screw these up if you set them too low or high!
+fifo_threshold:
+To change the number of bytes the controller needs in the
+fifo before it starts transmission, echo the number of bytes to 
+fifo_thresh.  Range should be 0-511.
+
+fifo_starve:
+When the FIFO has less than this many bytes during a transmit, it
+enters starve mode, and increases the priority of TX memory
+transactions.  To change, echo the number of bytes to
+fifo_starve.  Range should be 0-511.
+
+fifo_starve_off:
+Once in starve mode, the FIFO remains there until it has this
+many bytes.  To change, echo the number of bytes to
+fifo_starve_off.  Range should be 0-511.
+
+CHECKSUM OFFLOADING
+
+The eTSEC controller (first included in parts from late 2005 like
+the 8548) has the ability to perform TCP, UDP, and IP checksums
+in hardware.  The Linux kernel only offloads the TCP and UDP
+checksums (and always performs the pseudo header checksums), so
+the driver only supports checksumming for TCP/IP and UDP/IP
+packets.  Use ethtool to enable or disable this feature for RX
+and TX.
+
+VLAN
+
+In order to use VLAN, please consult Linux documentation on
+configuring VLANs.  The gianfar driver supports hardware insertion and
+extraction of VLAN headers, but not filtering.  Filtering will be
+done by the kernel.
+
+MULTICASTING
+
+The gianfar driver supports using the group hash table on the
+TSEC (and the extended hash table on the eTSEC) for multicast
+filtering.  On the eTSEC, the exact-match MAC registers are used
+before the hash tables.  See Linux documentation on how to join
+multicast groups.
+
+PADDING
+
+The gianfar driver supports padding received frames with 2 bytes
+to align the IP header to a 16-byte boundary, when supported by
+hardware.
+
+ETHTOOL
+
+The gianfar driver supports the use of ethtool for many
+configuration options.  You must run ethtool only on currently
+open interfaces.  See ethtool documentation for details.
index f315d20d3867066a17696d3c0aeb7a7cdd48270d..545447ac503a8ac0dee22df30d27654737675faa 100644 (file)
@@ -693,13 +693,7 @@ static int enslave(char *master_ifname, char *slave_ifname)
                /* Older bonding versions would panic if the slave has no IP
                 * address, so get the IP setting from the master.
                 */
-               res = set_if_addr(master_ifname, slave_ifname);
-               if (res) {
-                       fprintf(stderr,
-                               "Slave '%s': Error: set address failed\n",
-                               slave_ifname);
-                       return res;
-               }
+               set_if_addr(master_ifname, slave_ifname);
        } else {
                res = clear_if_addr(slave_ifname);
                if (res) {
@@ -1085,7 +1079,6 @@ static int set_if_addr(char *master_ifname, char *slave_ifname)
                                slave_ifname, ifra[i].req_name,
                                strerror(saved_errno));
 
-                       return res;
                }
 
                ipaddr = ifr.ifr_addr.sa_data;
index ebc09a159f6220d995ab39c3bbff812291f4659d..2b7cf19a06adc03435b84a04ae1dee46aae7e9a1 100644 (file)
@@ -46,6 +46,29 @@ ipfrag_secret_interval - INTEGER
        for the hash secret) for IP fragments.
        Default: 600
 
+ipfrag_max_dist - INTEGER
+       ipfrag_max_dist is a non-negative integer value which defines the 
+       maximum "disorder" which is allowed among fragments which share a 
+       common IP source address. Note that reordering of packets is 
+       not unusual, but if a large number of fragments arrive from a source 
+       IP address while a particular fragment queue remains incomplete, it 
+       probably indicates that one or more fragments belonging to that queue 
+       have been lost. When ipfrag_max_dist is positive, an additional check 
+       is done on fragments before they are added to a reassembly queue - if 
+       ipfrag_max_dist (or more) fragments have arrived from a particular IP 
+       address between additions to any IP fragment queue using that source 
+       address, it's presumed that one or more fragments in the queue are 
+       lost. The existing fragment queue will be dropped, and a new one 
+       started. An ipfrag_max_dist value of zero disables this check.
+
+       Using a very small value, e.g. 1 or 2, for ipfrag_max_dist can
+       result in unnecessarily dropping fragment queues when normal
+       reordering of packets occurs, which could lead to poor application 
+       performance. Using a very large value, e.g. 50000, increases the 
+       likelihood of incorrectly reassembling IP fragments that originate 
+       from different IP datagrams, which could result in data corruption.
+       Default: 64
+
 INET peer storage:
 
 inet_peer_threshold - INTEGER
index 39ccb8595bf15c8aec5639ae082717d533b066c4..493203a080a8baf1690bbd1ac8654e23c195f397 100644 (file)
@@ -22,7 +22,7 @@ The features and limitations of this driver are as follows:
     - All variants of Interphase ATM PCI (i)Chip adapter cards are supported, 
       including x575 (OC3, control memory 128K , 512K and packet memory 128K, 
       512K and 1M), x525 (UTP25) and x531 (DS3 and E3). See 
-           http://www.iphase.com/products/ClassSheet.cfm?ClassID=ATM 
+      http://www.iphase.com/site/iphase-web/?epi_menuItemID=e196f04b4b3b40502f150882e21046a0
       for details.
     - Only x86 platforms are supported.
     - SMP is supported.
index 9e5b8e66d6a54a792296122ed35bbe13942e895e..bff26c138be6a093e672299ab625d55a6c2617f0 100644 (file)
@@ -3,12 +3,8 @@ of the IrDA Utilities. More detailed information about these and associated
 programs can be found on http://irda.sourceforge.net/
 
 For more information about how to use the IrDA protocol stack, see the
-Linux Infared HOWTO (http://www.tuxmobil.org/Infrared-HOWTO/Infrared-HOWTO.html)
-by Werner Heuser <wehe@tuxmobil.org>
+Linux Infrared HOWTO by Werner Heuser <wehe@tuxmobil.org>:
+<http://www.tuxmobil.org/Infrared-HOWTO/Infrared-HOWTO.html>
 
 There is an active mailing list for discussing Linux-IrDA matters called
     irda-users@lists.sourceforge.net
-
-
-
-
index b1def00bc4a3b21ec875b73d7849c2607308842e..5427f8c7df95c9ed18885b664bffb8406bbe05f8 100644 (file)
@@ -29,8 +29,7 @@ with nondefault parameters, they can be edited in
 will find them all.
 
 Information on card services is available at:
-       ftp://hyper.stanford.edu/pub/pcmcia/doc
-        http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html
+       http://pcmcia-cs.sourceforge.net/
 
 
 Card services user programs are still required for PCMCIA devices.
index 80e1cb19609f552e958f7bd2259279e1a678e1cd..3759acf95b2919ddf646b25f1d937e218c79aa8a 100644 (file)
@@ -11,7 +11,7 @@ The driver was written by Donald Becker <becker@scyld.com>
 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>
+  Andrew Morton <akpm@osdl.org>
   Netdev mailing list <netdev@vger.kernel.org>
   Linux kernel mailing list <linux-kernel@vger.kernel.org>
 
@@ -274,24 +274,24 @@ Details of the device driver implementation are at the top of the source file.
 
 Additional documentation is available at Don Becker's Linux Drivers site:
 
-  http://www.scyld.com/network/vortex.html
+     http://www.scyld.com/vortex.html
 
 Donald Becker's driver development site:
 
-     http://www.scyld.com/network
+     http://www.scyld.com/network.html
 
 Donald's vortex-diag program is useful for inspecting the NIC's state:
 
-     http://www.scyld.com/diag/#pci-diags
+     http://www.scyld.com/ethercard_diag.html
 
 Donald's mii-diag program may be used for inspecting and manipulating
 the NIC's Media Independent Interface subsystem:
 
-     http://www.scyld.com/diag/#mii-diag
+     http://www.scyld.com/ethercard_diag.html#mii-diag
 
 Donald's wake-on-LAN page:
 
-     http://www.scyld.com/expert/wake-on-lan.html
+     http://www.scyld.com/wakeonlan.html
 
 3Com's documentation for many NICs, including the ones supported by
 this driver is available at 
@@ -305,7 +305,7 @@ this driver is available at
 Driver updates and a detailed changelog for the modifications which
 were made for the 2.3/2,4 series kernel is available at
 
-     http://www.uow.edu.au/~andrewm/linux/#3c59x-2.3
+     http://www.zip.com.au/~akpm/linux/#3c59x-bc
 
 
 Autonegotiation notes
@@ -434,8 +434,8 @@ steps you should take:
          send all logs to the maintainer.
 
       3) Download you card's diagnostic tool from Donald
-         Backer's website http://www.scyld.com/diag.  Download
-         mii-diag.c as well.  Build these.
+         Becker's website <http://www.scyld.com/ethercard_diag.html>.
+         Download mii-diag.c as well.  Build these.
 
          a) Run 'vortex-diag -aaee' and 'mii-diag -v' when the card is
             working correctly.  Save the output.
@@ -443,8 +443,8 @@ steps you should take:
          b) Run the above commands when the card is malfunctioning.  Send
             both sets of output.
 
-Finally, please be patient and be prepared to do some work.  You may end up working on
-this problem for a week or more as the maintainer asks more questions, asks for more
-tests, asks for patches to be applied, etc.  At the end of it all, the problem may even
-remain unresolved.
-
+Finally, please be patient and be prepared to do some work.  You may
+end up working on this problem for a week or more as the maintainer
+asks more questions, asks for more tests, asks for patches to be
+applied, etc.  At the end of it all, the problem may even remain
+unresolved.
index 6fc9d511fc39ef01af4b88492b4b2edea5ffb623..73fc87e5dc382013207ccbf5c2989eb0e1240abf 100644 (file)
@@ -335,5 +335,5 @@ this on the whole.
 PCI Local Bus Specification 
 PCI Bus Power Management Interface Specification
 
-  http://pcisig.org
+  http://www.pcisig.com
 
index 5331d91432c76cb7d598165ee89db51236f27e75..09f6300eda4bef7262c5955abbe9e0bc5b41f905 100644 (file)
@@ -1,3 +1,38 @@
+Release Date   : Fri Nov 11 12:27:22 EST 2005 - Seokmann Ju <sju@lsil.com>
+Current Version : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module)
+Older Version  : 2.20.4.6 (scsi module), 2.20.2.6 (cmm module)
+
+1.     Sorted out PCI IDs to remove megaraid support overlaps.
+       Based on the patch from Daniel, sorted out PCI IDs along with
+       charactor node name change from 'megadev' to 'megadev_legacy' to avoid
+       conflict.
+       ---
+       Hopefully we'll be getting the build restriction zapped much sooner, 
+       but we should also be thinking about totally removing the hardware 
+       support overlap in the megaraid drivers.
+
+       This patch pencils in a date of Feb 06 for this, and performs some 
+       printk abuse in hope that existing legacy users might pick up on what's
+       going on.
+
+       Signed-off-by: Daniel Drake <dsd@gentoo.org>
+       ---
+
+2.     Fixed a issue: megaraid always fails to reset handler.
+       ---
+       I found that the megaraid driver always fails to reset the
+       adapter with the following message:
+               megaraid: resetting the host...
+               megaraid mbox: reset sequence completed successfully
+               megaraid: fast sync command timed out
+               megaraid: reservation reset failed
+       when the "Cluster mode" of the adapter BIOS is enabled.
+       So, whenever the reset occurs, the adapter goes to
+       offline and just become unavailable.
+
+       Jun'ichi Nomura [mailto:jnomura@mtc.biglobe.ne.jp]
+       ---
+
 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)
index 2ffb3ae0ef4d1d8fa7c27aa1ecb5238d4c8d9878..d16ce5b540f469cdcc5ebc9681e4e608967e1590 100644 (file)
      A: You have to activate MCA bus support, first.
      Q: Where can I find the latest info about this driver?
      A: See the file MAINTAINERS for the current WWW-address, which offers
-        updates, info and Q/A lists. At this files' origin, the webaddress
+        updates, info and Q/A lists. At this file's origin, the webaddress
        was: http://www.uni-mainz.de/~langm000/linux.html
      Q: My SCSI-adapter is not recognized by the driver, what can I do?
      A: Just force it to be recognized by kernel parameters. See section 5.1.
    --------------------
    The address of the IBM SCSI-subsystem supporting WWW-page is:
    
-        http://www.uni-mainz.de/~langm000/linux.html
+        http://www.staff.uni-mainz.de/mlang/linux.html
        
    Here you can find info about the background of this driver, patches,
    troubleshooting support, news and a bugreport form. Please check that
index 66565d42288fc446ad08930b8839a7285dee37e6..8bbae3e1abdfa1c1a35f9c00f4b118cae9afdbf2 100644 (file)
@@ -150,7 +150,8 @@ scsi devices of which only the first 2 respond:
 LLD                   mid level                    LLD
 ===-------------------=========--------------------===------
 scsi_host_alloc()  -->
-scsi_add_host()  --------+
+scsi_add_host()  ---->
+scsi_scan_host()  -------+
                          |
                     slave_alloc()
                     slave_configure() -->  scsi_adjust_queue_depth()
@@ -196,7 +197,7 @@ of the issues involved. See the section on reference counting below.
 
 
 The hotplug concept may be extended to SCSI devices. Currently, when an
-HBA is added, the scsi_add_host() function causes a scan for SCSI devices
+HBA is added, the scsi_scan_host() function causes a scan for SCSI devices
 attached to the HBA's SCSI transport. On newer SCSI transports the HBA
 may become aware of a new SCSI device _after_ the scan has completed.
 An LLD can use this sequence to make the mid level aware of a SCSI device:
@@ -372,7 +373,7 @@ names all start with "scsi_".
 Summary:
    scsi_activate_tcq - turn on tag command queueing
    scsi_add_device - creates new scsi device (lu) instance
-   scsi_add_host - perform sysfs registration and SCSI bus scan.
+   scsi_add_host - perform sysfs registration and set up transport class
    scsi_adjust_queue_depth - change the queue depth on a SCSI device
    scsi_assign_lock - replace default host_lock with given lock
    scsi_bios_ptable - return copy of block device's partition table
@@ -386,6 +387,7 @@ Summary:
    scsi_remove_device - detach and remove a SCSI device
    scsi_remove_host - detach and remove all SCSI devices owned by host
    scsi_report_bus_reset - report scsi _bus_ reset observed
+   scsi_scan_host - scan SCSI bus
    scsi_track_queue_full - track successive QUEUE_FULL events 
    scsi_unblock_requests - allow further commands to be queued to given host
    scsi_unregister - [calls scsi_host_put()]
@@ -425,10 +427,10 @@ void scsi_activate_tcq(struct scsi_device *sdev, int depth)
  *      Might block: yes
  *
  *      Notes: This call is usually performed internally during a scsi
- *      bus scan when an HBA is added (i.e. scsi_add_host()). So it
+ *      bus scan when an HBA is added (i.e. scsi_scan_host()). So it
  *      should only be called if the HBA becomes aware of a new scsi
- *      device (lu) after scsi_add_host() has completed. If successful
- *      this call we lead to slave_alloc() and slave_configure() callbacks
+ *      device (lu) after scsi_scan_host() has completed. If successful
+ *      this call can lead to slave_alloc() and slave_configure() callbacks
  *      into the LLD.
  *
  *      Defined in: drivers/scsi/scsi_scan.c
@@ -439,7 +441,7 @@ struct scsi_device * scsi_add_device(struct Scsi_Host *shost,
 
 
 /**
- * scsi_add_host - perform sysfs registration and SCSI bus scan.
+ * scsi_add_host - perform sysfs registration and set up transport class
  * @shost:   pointer to scsi host instance
  * @dev:     pointer to struct device of type scsi class
  *
@@ -448,7 +450,11 @@ struct scsi_device * scsi_add_device(struct Scsi_Host *shost,
  *      Might block: no
  *
  *      Notes: Only required in "hotplug initialization model" after a
- *      successful call to scsi_host_alloc().
+ *      successful call to scsi_host_alloc().  This function does not
+ *     scan the bus; this can be done by calling scsi_scan_host() or
+ *     in some other transport-specific way.  The LLD must set up
+ *     the transport template before calling this function and may only
+ *     access the transport class data after this function has been called.
  *
  *      Defined in: drivers/scsi/hosts.c
  **/
@@ -559,7 +565,7 @@ void scsi_deactivate_tcq(struct scsi_device *sdev, int depth)
  *      area for the LLD's exclusive use.
  *      Both associated refcounting objects have their refcount set to 1.
  *      Full registration (in sysfs) and a bus scan are performed later when
- *      scsi_add_host() is called.
+ *      scsi_add_host() and scsi_scan_host() are called.
  *
  *      Defined in: drivers/scsi/hosts.c .
  **/
@@ -698,6 +704,19 @@ int scsi_remove_host(struct Scsi_Host *shost)
 void scsi_report_bus_reset(struct Scsi_Host * shost, int channel)
 
 
+/**
+ * scsi_scan_host - scan SCSI bus
+ * @shost: a pointer to a scsi host instance
+ *
+ *     Might block: yes
+ *
+ *     Notes: Should be called after scsi_add_host()
+ *
+ *     Defined in: drivers/scsi/scsi_scan.c
+ **/
+void scsi_scan_host(struct Scsi_Host *shost)
+
+
 /**
  * scsi_track_queue_full - track successive QUEUE_FULL events on given
  *                      device to determine if and when there is a need
@@ -1433,7 +1452,7 @@ The following people have contributed to this document:
         Christoph Hellwig <hch at infradead dot org>
         Doug Ledford <dledford at redhat dot com>
         Andries Brouwer <Andries dot Brouwer at cwi dot nl>
-        Randy Dunlap <rddunlap at osdl dot org>
+        Randy Dunlap <rdunlap at xenotime dot net>
         Alan Stern <stern at rowland dot harvard dot edu>
 
 
index baf17b381588d0899512b0e65b29adda91aa49bc..ad0bedf678b39cbddfb00d23523f4a3e02a851df 100644 (file)
@@ -202,17 +202,13 @@ you must call __handle_sysrq_nolock instead.
 
 *  I have more questions, who can I ask?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-You may feel free to send email to myrdraal@deathsdoor.com, and I will
-respond as soon as possible.
- -Myrdraal
-
 And I'll answer any questions about the registration system you got, also
 responding as soon as possible.
  -Crutcher
 
 *  Credits
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Written by Mydraal <myrdraal@deathsdoor.com>
+Written by Mydraal <vulpyne@vulpyne.net>
 Updated by Adam Sulmicki <adam@cfar.umd.edu>
 Updated by Jeremy M. Dolan <jmd@turbogeek.org> 2001/01/28 10:15:59
 Added to by Crutcher Dunnavant <crutcher+kernel@datastacks.com>
index 1e36f1661cd0a6409a00defea1407162a9bdfa61..867f4c38f3564ae8fcfa8aa92df2b8eb41cfa31a 100644 (file)
@@ -46,8 +46,9 @@ USB-specific:
 
 -EMSGSIZE      (a) endpoint maxpacket size is zero; it is not usable
                    in the current interface altsetting.
-               (b) ISO packet is biger than endpoint maxpacket
-               (c) requested data transfer size is invalid (negative)
+               (b) ISO packet is larger than the endpoint maxpacket.
+               (c) requested data transfer length is invalid: negative
+                   or too large for the host controller.
 
 -ENOSPC                This request would overcommit the usb bandwidth reserved
                for periodic transfers (interrupt, isochronous).
index ce2f21a3eac4b035cc854130c3e57160f923bae0..c250036441311db261a17dff7d6ebad69ec47370 100644 (file)
@@ -28,8 +28,8 @@ SUPPORTED CAMERAS:
 Xirlink "C-It" camera, also known as "IBM PC Camera".
 The device uses proprietary ASIC (and compression method);
 it is manufactured by Xirlink. See http://www.xirlink.com/
-http://www.ibmpccamera.com or http://www.c-itnow.com/ for
-details and pictures.
+(renamed to http://www.veo.com), http://www.ibmpccamera.com,
+or http://www.c-itnow.com/ for details and pictures.
 
 This very chipset ("X Chip", as marked at the factory)
 is used in several other cameras, and they are supported
index e1974ec8217e159a3588bf6bba421660fe0aa58f..a7fc0432bff1a406b1dc385a4d4912b96d567a3d 100644 (file)
@@ -22,8 +22,8 @@ WHAT YOU NEED:
   http://www.ovt.com/omniusbp.html
 
 - A Video4Linux compatible frame grabber program (I recommend vidcat and xawtv)
-    vidcat is part of the w3cam package:  http://www.hdk-berlin.de/~rasca/w3cam/
-    xawtv is available at:  http://www.in-berlin.de/User/kraxel/xawtv.html
+    vidcat is part of the w3cam package:  http://mpx.freeshell.net/
+    xawtv is available at:  http://linux.bytesex.org/xawtv/
 
 HOW TO USE IT:
 
index 0aa79ab0088c0739626f326d57683391c191fa8f..ab21db454694a603b31bdbecb627cd6b17d2d8a1 100644 (file)
@@ -46,9 +46,9 @@ Contact information:
 --------------------
 
    The main page for the project is hosted at sourceforge.net in the following
-   address: http://rio500.sourceforge.net You can also go to the sourceforge
-   project page at: http://sourceforge.net/project/?group_id=1944 There is 
-   also a mailing list: rio500-users@lists.sourceforge.net
+   URL: <http://rio500.sourceforge.net>. You can also go to the project's
+   sourceforge home page at: <http://sourceforge.net/projects/rio500/>.
+   There is also a mailing list: rio500-users@lists.sourceforge.net
 
 Authors:
 -------
index 4af6c52595ebc710349663eb33fd0acaa65a3b59..5d6357eefde4ce15f3d2dd0a23c231da9a9a4361 100644 (file)
@@ -76,8 +76,11 @@ activates the GRAB bit. A few ms later the VSYNC (re-)rises and
 the zoran starts to work on a new and freshly broadcasted frame....
 
 For pointers I used the specs of both chips. Below are the URLs:
-       http://www.zoran.com/ftp/download/devices/pci/ZR36120/36120data.pdf
-       http://www-us.semiconductor.philips.com/acrobat/datasheets/SAA_7110_A_1.pdf
+  http://www.zoran.com/ftp/download/devices/pci/ZR36120/36120data.pdf
+  http://www-us.semiconductor.philips.com/acrobat/datasheets/SAA_7110_A_1.pdf
+Some alternatives for the Philips SAA 7110 datasheet are:
+  http://www.datasheetcatalog.com/datasheets_pdf/S/A/A/7/SAA7110.shtml
+  http://www.datasheetarchive.com/search.php?search=SAA7110&sType=part
 
 The documentation has very little on absolute numbers or timings
 needed for the various modes/resolutions, but there are other
index f239ac4762ddb4565954c49135dff2adb1a364b5..b524ca363081a167e82cab87b6da596d16f51ac4 100644 (file)
@@ -58,7 +58,7 @@ P: Person
 M: Mail patches to
 L: Mailing list that is relevant to this area
 W: Web-page with status/info
-T: SCM tree type and URL.  Type is one of: git, hg, quilt.
+T: SCM tree type and location.  Type is one of: git, hg, quilt.
 S: Status, one of the following:
 
        Supported:      Someone is actually paid to look after this.
@@ -227,6 +227,7 @@ AGPGART DRIVER
 P:     Dave Jones
 M:     davej@codemonkey.org.uk
 W:     http://www.codemonkey.org.uk/projects/agp/
+T:     git kernel.org:/pub/scm/linux/kernel/git/davej/agpgart.git
 S:     Maintained
 
 AHA152X SCSI DRIVER
@@ -384,6 +385,7 @@ P:  David Woodhouse
 M:     dwmw2@infradead.org
 L:     linux-audit@redhat.com
 W:     http://people.redhat.com/sgrubb/audit/
+T:     git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
 S:     Maintained
 
 AX.25 NETWORK LAYER
@@ -432,6 +434,7 @@ L:  bluez-devel@lists.sf.net
 W:     http://bluez.sf.net
 W:     http://www.bluez.org
 W:     http://www.holtmann.org/linux/bluetooth/
+T:     git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
 S:     Maintained
 
 BLUETOOTH RFCOMM LAYER
@@ -533,6 +536,7 @@ P:  Mauro Carvalho Chehab
 M:     mchehab@brturbo.com.br
 L:     video4linux-list@redhat.com
 W:     http://linuxtv.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
 S:     Maintained
 
 BUSLOGIC SCSI DRIVER
@@ -547,6 +551,7 @@ P:  Steve French
 M:     sfrench@samba.org
 L:     samba-technical@lists.samba.org
 W:     http://us1.samba.org/samba/Linux_CIFS_client.html
+T:     git kernel.org:/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
 S:     Supported       
 
 CIRRUS LOGIC GENERIC FBDEV DRIVER
@@ -608,6 +613,7 @@ P:  Dave Jones
 M:     davej@codemonkey.org.uk
 L:     cpufreq@lists.linux.org.uk
 W:     http://www.codemonkey.org.uk/projects/cpufreq/
+T:     git kernel.org/pub/scm/linux/kernel/davej/cpufreq.git
 S:     Maintained
 
 CPUID/MSR DRIVER
@@ -641,6 +647,7 @@ M:  herbert@gondor.apana.org.au
 P:     David S. Miller
 M:     davem@davemloft.net
 L:     linux-crypto@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6.git
 S:     Maintained
 
 CYBERPRO FB DRIVER
@@ -827,6 +834,7 @@ P:  LinuxTV.org Project
 M:     linux-dvb-maintainer@linuxtv.org
 L:     linux-dvb@linuxtv.org (subscription required)
 W:     http://linuxtv.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
 S:     Supported
 
 EATA-DMA SCSI DRIVER
@@ -1185,6 +1193,7 @@ P:        Bartlomiej Zolnierkiewicz
 M:     B.Zolnierkiewicz@elka.pw.edu.pl
 L:     linux-kernel@vger.kernel.org
 L:     linux-ide@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git
 S:     Maintained
 
 IDE/ATAPI CDROM DRIVER
@@ -1275,10 +1284,11 @@ T:      git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
 S:     Supported
 
 INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS
-P:     Vojtech Pavlik
-M:     vojtech@suse.cz
+P:     Dmitry Torokhov
+M:     dtor_core@ameritech.net
 L:     linux-input@atrey.karlin.mff.cuni.cz
 L:     linux-joystick@atrey.karlin.mff.cuni.cz
+T:     git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git
 S:     Maintained
 
 INOTIFY
@@ -1392,6 +1402,7 @@ P:        Kai Germaschewski
 M:     kai.germaschewski@gmx.de
 L:     isdn4linux@listserv.isdn4linux.de
 W:     http://www.isdn4linux.de
+T:     git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git
 S:     Maintained
 
 ISDN SUBSYSTEM (Eicon active card driver)
@@ -1420,6 +1431,7 @@ P:        Dave Kleikamp
 M:     shaggy@austin.ibm.com
 L:     jfs-discussion@lists.sourceforge.net
 W:     http://jfs.sourceforge.net/
+T:     git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
 S:     Supported
 
 KCONFIG
@@ -1453,7 +1465,6 @@ P:        Several
 L:     kernel-janitors@osdl.org
 W:     http://www.kerneljanitors.org/
 W:     http://sf.net/projects/kernel-janitor/
-W:     http://developer.osdl.org/rddunlap/kj-patches/
 S:     Maintained
 
 KERNEL NFSD
@@ -1474,7 +1485,7 @@ KEXEC
 P:     Eric Biederman
 P:     Randy Dunlap
 M:     ebiederm@xmission.com
-M:     rddunlap@osdl.org
+M:     rdunlap@xenotime.net
 W:     http://www.xmission.com/~ebiederm/files/kexec/
 L:     linux-kernel@vger.kernel.org
 L:     fastboot@osdl.org
@@ -1534,6 +1545,7 @@ P:        Paul Mackerras
 M:     paulus@samba.org
 W:     http://www.penguinppc.org/
 L:     linuxppc-dev@ozlabs.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
 S:     Supported
 
 LINUX FOR POWER MACINTOSH
@@ -1601,6 +1613,7 @@ P:        Chris Wright
 M:     chrisw@osdl.org
 L:     linux-security-module@wirex.com
 W:     http://lsm.immunix.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
 S:     Supported
 
 LM83 HARDWARE MONITOR DRIVER
@@ -1622,6 +1635,15 @@ L:       ldm-devel@lists.sourceforge.net
 W:     http://ldm.sourceforge.net
 S:     Maintained
 
+LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
+P:     Eric Moore
+M:     Eric.Moore@lsil.com
+M:     support@lsil.com
+L:     mpt_linux_developer@lsil.com
+L:     linux-scsi@vger.kernel.org
+W:     http://www.lsilogic.com/support
+S:     Supported
+
 LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers
 P:     Matthew Wilcox
 M:     matthew@wil.cx
@@ -1695,6 +1717,7 @@ P:        David Woodhouse
 M:     dwmw2@infradead.org
 W:     http://www.linux-mtd.infradead.org/
 L:     linux-mtd@lists.infradead.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/tglx/mtd-2.6.git
 S:     Maintained
 
 MICROTEK X6 SCANNER
@@ -1815,6 +1838,7 @@ M:        yoshfuji@linux-ipv6.org
 P:     Patrick McHardy
 M:     kaber@coreworks.de
 L:     netdev@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/davem/net-2.6.git
 S:     Maintained
 
 IPVS
@@ -1866,6 +1890,7 @@ M:        aia21@cantab.net
 L:     linux-ntfs-dev@lists.sourceforge.net
 L:     linux-kernel@vger.kernel.org
 W:     http://linux-ntfs.sf.net/
+T:     git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git
 S:     Maintained
 
 NVIDIA (RIVA) FRAMEBUFFER DRIVER
@@ -2389,6 +2414,7 @@ P:        Anton Blanchard
 M:     anton@samba.org
 L:     sparclinux@vger.kernel.org
 L:     ultralinux@vger.kernel.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
 S:     Maintained
 
 SHARP LH SUPPORT (LH7952X & LH7A40X)
@@ -2527,6 +2553,7 @@ P:      Adrian Bunk
 M:      trivial@kernel.org
 L:      linux-kernel@vger.kernel.org
 W:      http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
+T:      git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git
 S:      Maintained
 
 TMS380 TOKEN-RING NETWORK DRIVER
@@ -2559,7 +2586,6 @@ S:        Maintained
 UDF FILESYSTEM
 P:     Ben Fennema
 M:     bfennema@falcon.csc.calpoly.edu
-L:     linux_udf@hpesjro.fc.hp.com
 W:     http://linux-udf.sourceforge.net
 S:     Maintained
 
@@ -2612,6 +2638,12 @@ L:       linux-usb-users@lists.sourceforge.net
 L:     linux-usb-devel@lists.sourceforge.net
 S:     Maintained
 
+USB ISP116X DRIVER
+P:     Olav Kongas
+M:     ok@artecdesign.ee
+L:     linux-usb-devel@lists.sourceforge.net
+S:     Maintained
+
 USB KAWASAKI LSI DRIVER
 P:     Oliver Neukum
 M:     oliver@neukum.name
@@ -2623,7 +2655,7 @@ USB MASS STORAGE DRIVER
 P:     Matthew Dharm
 M:     mdharm-usb@one-eyed-alien.net
 L:     linux-usb-users@lists.sourceforge.net
-L:     linux-usb-devel@lists.sourceforge.net
+L:     usb-storage@lists.one-eyed-alien.net
 S:     Maintained
 W:     http://www.one-eyed-alien.net/~mdharm/linux-usb/
 
@@ -2860,6 +2892,7 @@ P:      Latchesar Ionkov
 M:      lucho@ionkov.net
 L:      v9fs-developer@lists.sourceforge.net
 W:      http://v9fs.sf.net
+T:      git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs-devel.git
 S:      Maintained
 
 VIDEO FOR LINUX
@@ -2867,6 +2900,7 @@ P:        Mauro Carvalho Chehab
 M:     mchehab@brturbo.com.br
 L:     video4linux-list@redhat.com
 W:     http://linuxtv.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
 S:     Maintained
 
 W1 DALLAS'S 1-WIRE BUS
@@ -2907,6 +2941,11 @@ M:       zaga@fly.cc.fer.hr
 L:     linux-scsi@vger.kernel.org
 S:     Maintained
 
+WISTRON LAPTOP BUTTON DRIVER
+P:     Miloslav Trmac
+M:     mitr@volny.cz
+S:     Maintained
+
 WL3501 WIRELESS PCMCIA CARD DRIVER
 P:     Arnaldo Carvalho de Melo
 M:     acme@conectiva.com.br
index d3598ef3c777ada6e4ac95ca34c2920f2ae65509..599e744d3e33d0156e3060cb8c05b76f294d7166 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 15
-EXTRAVERSION =-rc1
-NAME=Affluent Albatross
+EXTRAVERSION =
+NAME=Sliding Snow Leopard
 
 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
@@ -404,7 +404,7 @@ outputmakefile:
 # of make so .config is not included in this case either (for *config).
 
 no-dot-config-targets := clean mrproper distclean \
-                        cscope TAGS tags help %docs check% kernelrelease
+                        cscope TAGS tags help %docs check%
 
 config-targets := 0
 mixed-targets  := 0
index 4959b7a3e1e6be0e3038949a9f95ea90c481c555..11f996f24fde5aa48a9775223b2d183a49886128 100644 (file)
@@ -41,7 +41,7 @@
 #define CAT1(x,y)  x##y
 #define CAT(x,y)   CAT1(x,y)
 
-#define DO_DEFAULT_RTC rtc_port: 0x70
+#define DO_DEFAULT_RTC .rtc_port = 0x70
 
 #define DO_EV4_MMU                                                     \
        .max_asn =                      EV4_MAX_ASN,                    \
index 24987c89609ae29530f806d322caa003e7dfc157..06229026f78bf7b450bfe2f7b6122f3d0aa59b33 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc3
-# Sun Oct  9 15:46:42 2005
+# Linux kernel version: 2.6.15-rc2
+# Mon Nov 28 10:30:09 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -63,6 +63,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -85,6 +102,7 @@ CONFIG_ARCH_PXA=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -98,12 +116,14 @@ CONFIG_ARCH_PXA=y
 CONFIG_PXA_SHARPSL=y
 CONFIG_PXA_SHARPSL_25x=y
 # CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
+CONFIG_MACH_POODLE=y
 CONFIG_MACH_CORGI=y
 CONFIG_MACH_SHEPHERD=y
 CONFIG_MACH_HUSKY=y
+CONFIG_MACH_TOSA=y
 CONFIG_PXA25x=y
 CONFIG_PXA_SHARP_C7xx=y
+CONFIG_PXA_SSP=y
 
 #
 # Processor Type
@@ -155,6 +175,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -235,6 +256,10 @@ CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
 
 #
@@ -356,6 +381,10 @@ CONFIG_IP6_NF_RAW=m
 # 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=y
 
@@ -413,6 +442,7 @@ CONFIG_IRCOMM=m
 # CONFIG_SMC_IRCC_FIR is not set
 # CONFIG_ALI_FIR is not set
 # CONFIG_VIA_FIR is not set
+CONFIG_PXA_FICP=m
 CONFIG_BT=m
 CONFIG_BT_L2CAP=m
 CONFIG_BT_SCO=m
@@ -431,7 +461,6 @@ CONFIG_BT_HCIUSB=m
 CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_H4=y
 CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_BCSP_TXCRC=y
 CONFIG_BT_HCIBCM203X=m
 CONFIG_BT_HCIBPA10X=m
 CONFIG_BT_HCIBFUSB=m
@@ -458,6 +487,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -477,6 +511,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -531,6 +566,11 @@ CONFIG_MTD_NAND_IDS=y
 CONFIG_MTD_NAND_SHARPSL=y
 # CONFIG_MTD_NAND_NANDSIM is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -551,14 +591,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
 # 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
 
 #
@@ -625,6 +657,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
 
@@ -748,6 +781,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 # CONFIG_PPP_DEFLATE is not set
 CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPP_MPPE is not set
 # CONFIG_PPPOE is not set
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -850,11 +884,15 @@ CONFIG_UNIX98_PTYS=y
 # PCMCIA character devices
 #
 # CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -889,6 +927,7 @@ CONFIG_I2C_PXA=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -957,7 +996,10 @@ CONFIG_VIDEO_DEV=m
 # CONFIG_VIDEO_SAA5246A is not set
 # CONFIG_VIDEO_SAA5249 is not set
 # CONFIG_TUNER_3036 is not set
+# CONFIG_VIDEO_EM28XX is not set
 # CONFIG_VIDEO_OVCAMCHIP is not set
+# CONFIG_VIDEO_AUDIO_DECODER is not set
+# CONFIG_VIDEO_DECODER is not set
 
 #
 # Radio Adapters
@@ -976,13 +1018,12 @@ 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 is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_PXA is not set
 CONFIG_FB_W100=y
-# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -991,6 +1032,7 @@ CONFIG_FB_W100=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
 CONFIG_FONTS=y
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -1087,15 +1129,15 @@ CONFIG_USB_SL811_CS=m
 # USB Device Class drivers
 #
 # CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
 
 #
-# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
 #
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=m
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1107,7 +1149,6 @@ CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_SDDR09 is not set
 # CONFIG_USB_STORAGE_SDDR55 is not set
 # CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ONETOUCH is not set
 
 #
 # USB Input Devices
@@ -1185,6 +1226,7 @@ CONFIG_USB_MON=y
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 # CONFIG_USB_SERIAL_AIRPRIME is not set
+# CONFIG_USB_SERIAL_ANYDATA is not set
 CONFIG_USB_SERIAL_BELKIN=m
 # CONFIG_USB_SERIAL_WHITEHEAT is not set
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
@@ -1340,6 +1382,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
 CONFIG_JFFS2_COMPRESSION_OPTIONS=y
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -1466,7 +1509,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_DEBUG_USER is not set
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
diff --git a/arch/arm/configs/poodle_defconfig b/arch/arm/configs/poodle_defconfig
deleted file mode 100644 (file)
index 7282290..0000000
+++ /dev/null
@@ -1,1015 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc3
-# Sun Oct  9 17:04:29 2005
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_UID16=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-# CONFIG_IKCONFIG is not set
-CONFIG_INITRAMFS_SOURCE=""
-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
-# 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=y
-CONFIG_OBSOLETE_MODPARM=y
-CONFIG_MODVERSIONS=y
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# System Type
-#
-# CONFIG_ARCH_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_CAMELOT is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 is not set
-CONFIG_ARCH_PXA=y
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-CONFIG_MACH_POODLE=y
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-CONFIG_PXA25x=y
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_XSCALE=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5T=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_TLB_V4WBI=y
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-CONFIG_ISA_DMA_API=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-CONFIG_PCMCIA_LOAD_CIS=y
-CONFIG_PCMCIA_IOCTL=y
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-# CONFIG_NO_IDLE_HZ is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   debug"
-# CONFIG_XIP_KERNEL is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
-# CONFIG_FPE_FASTFPE is not set
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_AOUT=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-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_FIB_HASH=y
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE 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_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# 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
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# 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 is not set
-# CONFIG_MTD_CMDLINE_PARTS is not set
-# CONFIG_MTD_AFS_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
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# CONFIG_MTD_PLATRAM 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# CONFIG_MTD_NAND_NANDSIM is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# 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 is not set
-CONFIG_BLK_DEV_RAM_COUNT=16
-# 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=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 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_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_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-
-#
-# Wireless 802.11 Frequency Hopping cards support
-#
-# CONFIG_PCMCIA_RAYCS is not set
-
-#
-# Wireless 802.11b ISA/PCI cards support
-#
-# CONFIG_HERMES is not set
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_HOSTAP is not set
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=y
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
-CONFIG_PPP_ASYNC=m
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_BSDCOMP=m
-# CONFIG_PPPOE is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_JOYDEV is not set
-CONFIG_INPUT_TSDEV=y
-CONFIG_INPUT_TSDEV_SCREEN_X=240
-CONFIG_INPUT_TSDEV_SCREEN_Y=320
-CONFIG_INPUT_EVDEV=y
-CONFIG_INPUT_EVBUG=y
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-CONFIG_KEYBOARD_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# 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
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_PXA=y
-CONFIG_SERIAL_PXA_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
-
-#
-# I2C support
-#
-CONFIG_I2C=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-# CONFIG_I2C_PXA is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_PCA_ISA is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_RTC8564 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-CONFIG_I2C_DEBUG_CORE=y
-CONFIG_I2C_DEBUG_ALGO=y
-CONFIG_I2C_DEBUG_BUS=y
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# Hardware Monitoring support
-#
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID 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_ADM9240 is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 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_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-
-#
-# Video For Linux
-#
-
-#
-# Video Adapters
-#
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# 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 is not set
-CONFIG_FB_MODE_HELPERS=y
-# CONFIG_FB_TILEBLITTING is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_W100 is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FONTS=y
-CONFIG_FONT_8x8=y
-# CONFIG_FONT_8x16 is not set
-# CONFIG_FONT_6x11 is not set
-# CONFIG_FONT_7x14 is not set
-# CONFIG_FONT_PEARL_8x8 is not set
-# CONFIG_FONT_ACORN_8x8 is not set
-# CONFIG_FONT_MINI_4x6 is not set
-# CONFIG_FONT_SUN8x16 is not set
-# CONFIG_FONT_SUN12x22 is not set
-# CONFIG_FONT_10x18 is not set
-
-#
-# Logo configuration
-#
-# CONFIG_LOGO is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB is not set
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=y
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_NET2280 is not set
-CONFIG_USB_GADGET_PXA2XX=y
-CONFIG_USB_PXA2XX=y
-# CONFIG_USB_PXA2XX_SMALL is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-# CONFIG_USB_GADGET_DUALSPEED is not set
-# CONFIG_USB_ZERO is not set
-CONFIG_USB_ETH=y
-CONFIG_USB_ETH_RNDIS=y
-# CONFIG_USB_GADGETFS is not set
-# CONFIG_USB_FILE_STORAGE is not set
-# CONFIG_USB_G_SERIAL is not set
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-CONFIG_MMC_DEBUG=y
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-# CONFIG_MMC_WBSD is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD is not set
-CONFIG_FS_MBCACHE=y
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-# 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 is not set
-# CONFIG_NFSD is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="cp437"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 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=y
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-CONFIG_NLS_UTF8=y
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-CONFIG_DEBUG_PREEMPT=y
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
index 900e04f8e38c909226851ffed3638ff33a2cf27a..9895539533d6676bcbe84e772fa175f15fdb41ba 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc3
-# Sun Oct  9 17:11:19 2005
+# Linux kernel version: 2.6.15-rc2
+# Mon Nov 28 10:26:52 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -63,6 +63,23 @@ CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -85,6 +102,7 @@ CONFIG_ARCH_PXA=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -98,10 +116,13 @@ CONFIG_ARCH_PXA=y
 CONFIG_PXA_SHARPSL=y
 # CONFIG_PXA_SHARPSL_25x is not set
 CONFIG_PXA_SHARPSL_27x=y
+CONFIG_MACH_AKITA=y
 CONFIG_MACH_SPITZ=y
 CONFIG_MACH_BORZOI=y
 CONFIG_PXA27x=y
+CONFIG_IWMMXT=y
 CONFIG_PXA_SHARP_Cxx00=y
+CONFIG_PXA_SSP=y
 
 #
 # Processor Type
@@ -153,6 +174,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -233,6 +255,10 @@ CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
 
 #
@@ -354,6 +380,10 @@ CONFIG_IP6_NF_RAW=m
 # 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=y
 
@@ -411,6 +441,7 @@ CONFIG_IRCOMM=m
 # CONFIG_SMC_IRCC_FIR is not set
 # CONFIG_ALI_FIR is not set
 # CONFIG_VIA_FIR is not set
+CONFIG_PXA_FICP=m
 CONFIG_BT=m
 CONFIG_BT_L2CAP=m
 CONFIG_BT_SCO=m
@@ -429,7 +460,6 @@ CONFIG_BT_HCIUSB=m
 CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_H4=y
 CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_BCSP_TXCRC=y
 CONFIG_BT_HCIBCM203X=m
 CONFIG_BT_HCIBPA10X=m
 CONFIG_BT_HCIBFUSB=m
@@ -456,6 +486,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -475,6 +510,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -529,6 +565,11 @@ CONFIG_MTD_NAND_IDS=y
 CONFIG_MTD_NAND_SHARPSL=y
 # CONFIG_MTD_NAND_NANDSIM is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -549,14 +590,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_RAM is not set
 CONFIG_BLK_DEV_RAM_COUNT=16
 # 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
 
 #
@@ -623,6 +656,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
 
@@ -746,6 +780,7 @@ CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 # CONFIG_PPP_DEFLATE is not set
 CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPP_MPPE is not set
 # CONFIG_PPPOE is not set
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -771,6 +806,7 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_TSDEV is not set
 CONFIG_INPUT_EVDEV=y
 # CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_POWER is not set
 
 #
 # Input Device Drivers
@@ -848,16 +884,37 @@ CONFIG_UNIX98_PTYS=y
 # PCMCIA character devices
 #
 # CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
 #
-# CONFIG_I2C is not set
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# 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_PXA=y
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_PCA_ISA is not set
 
 #
 # Hardware Monitoring support
@@ -891,14 +948,13 @@ 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 is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
 CONFIG_FB_PXA=y
-# CONFIG_FB_W100 is not set
 # CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_W100 is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -907,6 +963,7 @@ CONFIG_FB_PXA=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
 CONFIG_FONTS=y
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -965,15 +1022,15 @@ CONFIG_USB_SL811_CS=m
 #
 # USB Device Class drivers
 #
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
 
 #
-# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
 #
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=m
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -985,7 +1042,6 @@ CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_SDDR09 is not set
 # CONFIG_USB_STORAGE_SDDR55 is not set
 # CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ONETOUCH is not set
 
 #
 # USB Input Devices
@@ -1058,6 +1114,7 @@ CONFIG_USB_MON=y
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 # CONFIG_USB_SERIAL_AIRPRIME is not set
+# CONFIG_USB_SERIAL_ANYDATA is not set
 CONFIG_USB_SERIAL_BELKIN=m
 # CONFIG_USB_SERIAL_WHITEHEAT is not set
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
@@ -1218,6 +1275,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
 CONFIG_JFFS2_COMPRESSION_OPTIONS=y
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -1344,7 +1402,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_DEBUG_USER is not set
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
index 7a3261f0bf79012e158e81eab69e7f633d56b4c6..9997098009a9941ff63c025c23be09aa56b6ccbf 100644 (file)
@@ -120,7 +120,6 @@ EXPORT_SYMBOL(__arch_strncpy_from_user);
 EXPORT_SYMBOL(__get_user_1);
 EXPORT_SYMBOL(__get_user_2);
 EXPORT_SYMBOL(__get_user_4);
-EXPORT_SYMBOL(__get_user_8);
 
 EXPORT_SYMBOL(__put_user_1);
 EXPORT_SYMBOL(__put_user_2);
index 2ad4aa2a1536c1ca22e1843352cdd9d2ac9cfbb7..55076a75e5bf3794de942c7f7abe3e1993bfb18e 100644 (file)
@@ -131,7 +131,7 @@ __syscall_start:
                .long   sys_wait4
 /* 115 */      .long   sys_swapoff
                .long   sys_sysinfo
-               .long   sys_ipc_wrapper
+               .long   sys_ipc
                .long   sys_fsync
                .long   sys_sigreturn_wrapper
 /* 120 */      .long   sys_clone_wrapper
@@ -254,7 +254,7 @@ __syscall_start:
                .long   sys_fremovexattr
                .long   sys_tkill
                .long   sys_sendfile64
-/* 240 */      .long   sys_futex_wrapper
+/* 240 */      .long   sys_futex
                .long   sys_sched_setaffinity
                .long   sys_sched_getaffinity
                .long   sys_io_setup
@@ -284,7 +284,7 @@ __syscall_start:
                .long   sys_fstatfs64
                .long   sys_tgkill
                .long   sys_utimes
-/* 270 */      .long   sys_arm_fadvise64_64_wrapper
+/* 270 */      .long   sys_arm_fadvise64_64
                .long   sys_pciconfig_iobase
                .long   sys_pciconfig_read
                .long   sys_pciconfig_write
@@ -333,7 +333,7 @@ __syscall_start:
                .long   sys_inotify_init
                .long   sys_inotify_add_watch
                .long   sys_inotify_rm_watch
-               .long   sys_mbind_wrapper
+               .long   sys_mbind
 /* 320 */      .long   sys_get_mempolicy
                .long   sys_set_mempolicy
 __syscall_end:
index d9fb819bf7cc3960aedb4b9836451371458a4893..2a8d27e18fa7765c13229cbb91f31a113c1b113d 100644 (file)
@@ -611,6 +611,47 @@ ENTRY(__switch_to)
        .globl  __kuser_helper_start
 __kuser_helper_start:
 
+/*
+ * Reference prototype:
+ *
+ *     void __kernel_memory_barrier(void)
+ *
+ * Input:
+ *
+ *     lr = return address
+ *
+ * Output:
+ *
+ *     none
+ *
+ * Clobbered:
+ *
+ *     the Z flag might be lost
+ *
+ * Definition and user space usage example:
+ *
+ *     typedef void (__kernel_dmb_t)(void);
+ *     #define __kernel_dmb (*(__kernel_dmb_t *)0xffff0fa0)
+ *
+ * Apply any needed memory barrier to preserve consistency with data modified
+ * manually and __kuser_cmpxchg usage.
+ *
+ * This could be used as follows:
+ *
+ * #define __kernel_dmb() \
+ *         asm volatile ( "mov r0, #0xffff0fff; mov lr, pc; sub pc, r0, #95" \
+ *             : : : "lr","cc" )
+ */
+
+__kuser_memory_barrier:                                @ 0xffff0fa0
+
+#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_SMP)
+       mcr     p15, 0, r0, c7, c10, 5  @ dmb
+#endif
+       mov     pc, lr
+
+       .align  5
+
 /*
  * Reference prototype:
  *
@@ -642,6 +683,8 @@ __kuser_helper_start:
  * The C flag is also set if *ptr was changed to allow for assembly
  * optimization in the calling code.
  *
+ * Note: this routine already includes memory barriers as needed.
+ *
  * For example, a user space atomic_add implementation could look like this:
  *
  * #define atomic_add(ptr, val) \
@@ -698,10 +741,16 @@ __kuser_cmpxchg:                          @ 0xffff0fc0
 
 #else
 
+#ifdef CONFIG_SMP
+       mcr     p15, 0, r0, c7, c10, 5  @ dmb
+#endif
        ldrex   r3, [r2]
        subs    r3, r3, r0
        strexeq r3, r1, [r2]
        rsbs    r0, r3, #0
+#ifdef CONFIG_SMP
+       mcr     p15, 0, r0, c7, c10, 5  @ dmb
+#endif
        mov     pc, lr
 
 #endif
index 066597f4345a6716bf0284200076303f6a85602b..e2b42997ad33ee0f1da6ec4a75440d16ce3c3b06 100644 (file)
@@ -48,8 +48,7 @@ work_pending:
        mov     r0, sp                          @ 'regs'
        mov     r2, why                         @ 'syscall'
        bl      do_notify_resume
-       disable_irq                             @ disable interrupts
-       b       no_work_pending
+       b       ret_slow_syscall                @ Check work again
 
 work_resched:
        bl      schedule
@@ -146,7 +145,7 @@ ENTRY(vector_swi)
 #endif
        enable_irq
 
-       str     r4, [sp, #-S_OFF]!              @ push fifth arg
+       stmdb   sp!, {r4, r5}                   @ push fifth and sixth args
 
        get_thread_info tsk
        ldr     ip, [tsk, #TI_FLAGS]            @ check for syscall tracing
@@ -205,7 +204,7 @@ ENTRY(sys_call_table)
  * Special system call wrappers
  */
 @ r0 = syscall number
-@ r5 = syscall table
+@ r8 = syscall table
                .type   sys_syscall, #function
 sys_syscall:
                eor     scno, r0, #__NR_SYSCALL_BASE
@@ -256,22 +255,6 @@ sys_sigaltstack_wrapper:
                ldr     r2, [sp, #S_OFF + S_SP]
                b       do_sigaltstack
 
-sys_futex_wrapper:
-               str     r5, [sp, #4]            @ push sixth arg
-               b       sys_futex
-
-sys_arm_fadvise64_64_wrapper:
-               str     r5, [sp, #4]            @ push r5 to stack
-               b       sys_arm_fadvise64_64
-
-sys_mbind_wrapper:
-               str     r5, [sp, #4]
-               b       sys_mbind
-
-sys_ipc_wrapper:
-               str     r5, [sp, #4]            @ push sixth arg
-               b       sys_ipc
-
 /*
  * Note: off_4k (r5) is always units of 4K.  If we can't do the requested
  * offset, we return EINVAL.
index 8d8748407cbe0073026ecb54b92cccfc9485a793..d7d69fd7039f342fd458bf6577dbc2cd55372ad0 100644 (file)
@@ -17,7 +17,6 @@
 
 #include <asm/assembler.h>
 #include <asm/domain.h>
-#include <asm/mach-types.h>
 #include <asm/procinfo.h>
 #include <asm/ptrace.h>
 #include <asm/asm-offsets.h>
@@ -83,7 +82,7 @@ ENTRY(stext)
                                                @ and irqs disabled
        bl      __lookup_processor_type         @ r5=procinfo r9=cpuid
        movs    r10, r5                         @ invalid processor (r5=0)?
-       beq     __error_p                               @ yes, error 'p'
+       beq     __error_p                       @ yes, error 'p'
        bl      __lookup_machine_type           @ r5=machinfo
        movs    r8, r5                          @ invalid machine (r5=0)?
        beq     __error_a                       @ yes, error 'a'
@@ -343,16 +342,12 @@ __create_page_tables:
        bne     1b
 #if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)
        /*
-        * If we're using the NetWinder, we need to map in
-        * the 16550-type serial port for the debug messages
+        * If we're using the NetWinder or CATS, we also need to map
+        * in the 16550-type serial port for the debug messages
         */
-       teq     r1, #MACH_TYPE_NETWINDER
-       teqne   r1, #MACH_TYPE_CATS
-       bne     1f
        add     r0, r4, #0xff000000 >> 18
        orr     r3, r7, #0x7c000000
        str     r3, [r0]
-1:
 #endif
 #ifdef CONFIG_ARCH_RPC
        /*
index 6055e1427ba35819132623b297583cb2484215c6..055bf5d28894097849b9014cdafe65389cf77370 100644 (file)
@@ -101,6 +101,8 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
                        break;
 
                case R_ARM_PC24:
+               case R_ARM_CALL:
+               case R_ARM_JUMP24:
                        offset = (*(u32 *)loc & 0x00ffffff) << 2;
                        if (offset & 0x02000000)
                                offset -= 0x04000000;
index 9a340e790da52a9b801857c2da22226f89c91d66..2b84f78d7b0f78585698e54bf137f3cde7634205 100644 (file)
@@ -242,6 +242,15 @@ get_branch_address(struct task_struct *child, unsigned long pc, unsigned long in
                 */
                long aluop1, aluop2, ccbit;
 
+               if ((insn & 0x0fffffd0) == 0x012fff10) {
+                       /*
+                        * bx or blx
+                        */
+                       alt = get_user_reg(child, insn & 15);
+                       break;
+               }
+
+
                if ((insn & 0xf000) != 0xf000)
                        break;
 
index a917e3dd366611b2bb7d017f3b74c31d7a95fd64..765922bcf9e7c2f37b0bf606ad57a6ac3cd8d7dd 100644 (file)
@@ -595,23 +595,22 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
         */
        ret |= !valid_user_regs(regs);
 
-       /*
-        * Block the signal if we were unsuccessful.
-        */
        if (ret != 0) {
-               spin_lock_irq(&tsk->sighand->siglock);
-               sigorsets(&tsk->blocked, &tsk->blocked,
-                         &ka->sa.sa_mask);
-               if (!(ka->sa.sa_flags & SA_NODEFER))
-                       sigaddset(&tsk->blocked, sig);
-               recalc_sigpending();
-               spin_unlock_irq(&tsk->sighand->siglock);
+               force_sigsegv(sig, tsk);
+               return;
        }
 
-       if (ret == 0)
-               return;
+       /*
+        * Block the signal if we were successful.
+        */
+       spin_lock_irq(&tsk->sighand->siglock);
+       sigorsets(&tsk->blocked, &tsk->blocked,
+                 &ka->sa.sa_mask);
+       if (!(ka->sa.sa_flags & SA_NODEFER))
+               sigaddset(&tsk->blocked, sig);
+       recalc_sigpending();
+       spin_unlock_irq(&tsk->sighand->siglock);
 
-       force_sigsegv(sig, tsk);
 }
 
 /*
index 80c8e4c8cefa078650b7180f7581eeac93296ebf..9a47770114d49db0663b6f611ab7872cd0ab2755 100644 (file)
@@ -172,6 +172,10 @@ SECTIONS
        .comment 0 : { *(.comment) }
 }
 
-/* those must never be empty */
+/*
+ * These must never be empty
+ * If you have to comment these two assert statements out, your
+ * binutils is too old (for other reasons as well)
+ */
 ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
 ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
index d204018070a49bde08c2c32b610c8b9edef37b5b..c03ea8e666ba1906544fba96a62d58ce3e526ecf 100644 (file)
@@ -54,15 +54,6 @@ __get_user_4:
        mov     r0, #0
        mov     pc, lr
 
-       .global __get_user_8
-__get_user_8:
-5:     ldrt    r2, [r0], #4
-6:     ldrt    r3, [r0]
-       mov     r0, #0
-       mov     pc, lr
-
-__get_user_bad_8:
-       mov     r3, #0
 __get_user_bad:
        mov     r2, #0
        mov     r0, #-EFAULT
@@ -73,6 +64,4 @@ __get_user_bad:
        .long   2b, __get_user_bad
        .long   3b, __get_user_bad
        .long   4b, __get_user_bad
-       .long   5b, __get_user_bad_8
-       .long   6b, __get_user_bad_8
 .previous
index 0364ba4b539e075e5ecf893a6a141948fd4fa998..d869af0023f8e906da3312cf6576aa8507a41092 100644 (file)
@@ -260,7 +260,7 @@ static void __init clps7500_init_irq(void)
 
 static struct map_desc cl7500_io_desc[] __initdata = {
        {       /* IO space     */
-               .virtual        = IO_BASE,
+               .virtual        = (unsigned long)IO_BASE,
                .pfn            = __phys_to_pfn(IO_START),
                .length         = IO_SIZE,
                .type           = MT_DEVICE
index 0a41080d2266c27083503f55384bce245cfb8a07..3a22d84e10478de8581b6d0eeb8d2c4287170eb9 100644 (file)
@@ -85,7 +85,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
        {
                .mapbase        = IXP4XX_UART2_BASE_PHYS,
                .membase        = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
-               .irq            = IRQ_IXP4XX_UART1,
+               .irq            = IRQ_IXP4XX_UART2,
                .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
                .iotype         = UPIO_MEM,
                .regshift       = 2,
index cd506646801a4d576dad1de3f4f08b613534843c..2a58499c0968793001e7b4827cea8238091fdf0e 100644 (file)
@@ -44,6 +44,7 @@ config PXA_SHARPSL_25x
 config PXA_SHARPSL_27x
        bool "Sharp PXA270 models (SL-Cxx00)"
        select PXA27x
+       select IWMMXT
 
 endchoice
 
@@ -60,7 +61,6 @@ config MACH_CORGI
        bool "Enable Sharp SL-C700 (Corgi) Support"
        depends PXA_SHARPSL_25x
        select PXA_SHARP_C7xx
-       select PXA_SSP
 
 config MACH_SHEPHERD
        bool "Enable Sharp SL-C750 (Shepherd) Support"
@@ -77,6 +77,8 @@ config MACH_AKITA
        depends PXA_SHARPSL_27x
        select PXA_SHARP_Cxx00
        select MACH_SPITZ
+       select I2C
+       select I2C_PXA
 
 config MACH_SPITZ
        bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
@@ -90,7 +92,7 @@ config MACH_BORZOI
 
 config MACH_TOSA
        bool "Enable Sharp SL-6000x (Tosa) Support"
-       depends PXA_SHARPSL
+       depends PXA_SHARPSL_25x
 
 config PXA25x
        bool
index 07892f4012d8a2cd5d2bbddddc9ab203d78207f0..277498ae5b6c12d4911564ee4d4d999853c9c283 100644 (file)
@@ -43,6 +43,7 @@
 #include <asm/arch/pxafb.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/irda.h>
+#include <asm/arch/ohci.h>
 
 #include "generic.h"
 
@@ -393,6 +394,25 @@ static struct platform_device *platform_devices[] __initdata = {
        &mst_flash_device[1],
 };
 
+static int mainstone_ohci_init(struct device *dev)
+{
+       /* setup Port1 GPIO pin. */
+       pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN);  /* USBHPWR1 */
+       pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */
+
+       /* Set the Power Control Polarity Low and Power Sense
+          Polarity Low to active low. */
+       UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
+               ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
+
+       return 0;
+}
+
+static struct pxaohci_platform_data mainstone_ohci_platform_data = {
+       .port_mode      = PMM_PERPORT_MODE,
+       .init           = mainstone_ohci_init,
+};
+
 static void __init mainstone_init(void)
 {
        int SW7 = 0;  /* FIXME: get from SCR (Mst doc section 3.2.1.1) */
@@ -424,6 +444,7 @@ static void __init mainstone_init(void)
 
        pxa_set_mci_info(&mainstone_mci_platform_data);
        pxa_set_ficp_info(&mainstone_ficp_platform_data);
+       pxa_set_ohci_info(&mainstone_ohci_platform_data);
 }
 
 
index f74b9af112dcbefdb7c05456465b6bb766ba31a7..852ea72d8c80bfbc87a2b9741a1a53c371f60a04 100644 (file)
@@ -155,19 +155,20 @@ int pxa_pm_enter(suspend_state_t state)
        PSPR = 0;
 
        /* restore registers */
+       RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
+       RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
        RESTORE(GAFR0_L); RESTORE(GAFR0_U);
        RESTORE(GAFR1_L); RESTORE(GAFR1_U);
        RESTORE(GAFR2_L); RESTORE(GAFR2_U);
-       RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
-       RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
        RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2);
        RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
        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_GPLEVEL(3); RESTORE(GPDR3);
+       RESTORE(GAFR3_L); RESTORE(GAFR3_U);
+       RESTORE(GRER3); RESTORE(GFER3); RESTORE(PGSR3);
        RESTORE(PWER); RESTORE(PCFR); RESTORE(PRER);
        RESTORE(PFER); RESTORE(PKWR);
 #endif
index c722a9a91fcce243b9fce9a77f2c15f3e50b939a..b41b1efaa2cf9088e30fe8fe9ee1d4dda6fd46c7 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/hardware.h>
 #include <asm/irq.h>
 #include <asm/arch/pxa-regs.h>
+#include <asm/arch/ohci.h>
 
 #include "generic.h"
 
@@ -194,6 +195,11 @@ static struct platform_device ohci_device = {
        .resource       = pxa27x_ohci_resources,
 };
 
+void __init pxa_set_ohci_info(struct pxaohci_platform_data *info)
+{
+       ohci_device.dev.platform_data = info;
+}
+
 static struct platform_device *devices[] __initdata = {
        &ohci_device,
 };
index c312054dfb8872b3e2af9a1065fdd227488af969..e4f92efc616e58e038b4c649ef911163692b1169 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 #include <linux/major.h>
 #include <linux/fs.h>
 #include <linux/interrupt.h>
index e2c6fa23d3cd5815b1480660099db8e48bba8a1e..af6580f1ceb8e583404218ad65afcbb8d396f9d0 100644 (file)
@@ -30,7 +30,6 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
-#include <asm/mach-types.h>
 #include <asm/hardware/amba.h>
 #include <asm/hardware/amba_clcd.h>
 #include <asm/hardware/arm_timer.h>
index 75efb5da5b6d2874867cd83c58fd37b82e456bde..a66ac61233a2f088e2e666ded4b59afaab03ab52 100644 (file)
@@ -293,7 +293,8 @@ static void __init get_assabet_scr(void)
        GPDR |= 0x3fc;                  /* Configure GPIO 9:2 as outputs */
        GPSR = 0x3fc;                   /* Write 0xFF to GPIO 9:2 */
        GPDR &= ~(0x3fc);               /* Configure GPIO 9:2 as inputs */
-       for(i = 100; i--; scr = GPLR);  /* Read GPIO 9:2 */
+       for(i = 100; i--; )             /* Read GPIO 9:2 */
+               scr = GPLR;
        GPDR |= 0x3fc;                  /*  restore correct pin direction */
        scr &= 0x3fc;                   /* save as system configuration byte. */
        SCR_value = scr;
index 59f47d4c2dfe6edf22560b861d6a3d554104dbf1..ffe73ba2bf174d857738d986d1c30240d49bcf50 100644 (file)
@@ -51,4 +51,4 @@ obj-$(CONFIG_CPU_ARM1026)     += proc-arm1026.o
 obj-$(CONFIG_CPU_SA110)                += proc-sa110.o
 obj-$(CONFIG_CPU_SA1100)       += proc-sa1100.o
 obj-$(CONFIG_CPU_XSCALE)       += proc-xscale.o
-obj-$(CONFIG_CPU_V6)           += proc-v6.o blockops.o
+obj-$(CONFIG_CPU_V6)           += proc-v6.o
diff --git a/arch/arm/mm/blockops.c b/arch/arm/mm/blockops.c
deleted file mode 100644 (file)
index 4f5ee2d..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-
-#include <asm/memory.h>
-#include <asm/ptrace.h>
-#include <asm/cacheflush.h>
-#include <asm/traps.h>
-
-extern struct cpu_cache_fns blk_cache_fns;
-
-#define HARVARD_CACHE
-
-/*
- *     blk_flush_kern_dcache_page(kaddr)
- *
- *     Ensure that the data held in the page kaddr is written back
- *     to the page in question.
- *
- *     - kaddr   - kernel address (guaranteed to be page aligned)
- */
-static void __attribute__((naked))
-blk_flush_kern_dcache_page(void *kaddr)
-{
-       asm(
-       "add    r1, r0, %0                                                      \n\
-       sub     r1, r1, %1                                                      \n\
-1:     .word   0xec401f0e      @ mcrr  p15, 0, r0, r1, c14, 0  @ blocking      \n\
-       mov     r0, #0                                                          \n\
-       mcr     p15, 0, r0, c7, c5, 0                                           \n\
-       mcr     p15, 0, r0, c7, c10, 4                                          \n\
-       mov     pc, lr"
-       :
-       : "I" (PAGE_SIZE), "I" (L1_CACHE_BYTES));
-}
-
-/*
- *     blk_dma_inv_range(start,end)
- *
- *     Invalidate the data cache within the specified region; we will
- *     be performing a DMA operation in this region and we want to
- *     purge old data in the cache.
- *
- *     - start   - virtual start address of region
- *     - end     - virtual end address of region
- */
-static void __attribute__((naked))
-blk_dma_inv_range_unified(unsigned long start, unsigned long end)
-{
-       asm(
-       "tst    r0, %0                                                          \n\
-       mcrne   p15, 0, r0, c7, c11, 1          @ clean unified line            \n\
-       tst     r1, %0                                                          \n\
-       mcrne   p15, 0, r1, c7, c15, 1          @ clean & invalidate unified line\n\
-       .word   0xec401f06      @ mcrr  p15, 0, r1, r0, c6, 0   @ blocking      \n\
-       mov     r0, #0                                                          \n\
-       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer            \n\
-       mov     pc, lr"
-       :
-       : "I" (L1_CACHE_BYTES - 1));
-}
-
-static void __attribute__((naked))
-blk_dma_inv_range_harvard(unsigned long start, unsigned long end)
-{
-       asm(
-       "tst    r0, %0                                                          \n\
-       mcrne   p15, 0, r0, c7, c10, 1          @ clean D line                  \n\
-       tst     r1, %0                                                          \n\
-       mcrne   p15, 0, r1, c7, c14, 1          @ clean & invalidate D line     \n\
-       .word   0xec401f06      @ mcrr  p15, 0, r1, r0, c6, 0   @ blocking      \n\
-       mov     r0, #0                                                          \n\
-       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer            \n\
-       mov     pc, lr"
-       :
-       : "I" (L1_CACHE_BYTES - 1));
-}
-
-/*
- *     blk_dma_clean_range(start,end)
- *     - start   - virtual start address of region
- *     - end     - virtual end address of region
- */
-static void __attribute__((naked))
-blk_dma_clean_range(unsigned long start, unsigned long end)
-{
-       asm(
-       ".word  0xec401f0c      @ mcrr  p15, 0, r1, r0, c12, 0  @ blocking      \n\
-       mov     r0, #0                                                          \n\
-       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer            \n\
-       mov     pc, lr");
-}
-
-/*
- *     blk_dma_flush_range(start,end)
- *     - start   - virtual start address of region
- *     - end     - virtual end address of region
- */
-static void __attribute__((naked))
-blk_dma_flush_range(unsigned long start, unsigned long end)
-{
-       asm(
-       ".word  0xec401f0e      @ mcrr  p15, 0, r1, r0, c14, 0  @ blocking      \n\
-       mov     pc, lr");
-}
-
-static int blockops_trap(struct pt_regs *regs, unsigned int instr)
-{
-       regs->ARM_r4 |= regs->ARM_r2;
-       regs->ARM_pc += 4;
-       return 0;
-}
-
-static char *func[] = {
-       "Prefetch data range",
-       "Clean+Invalidate data range",
-       "Clean data range",
-       "Invalidate data range",
-       "Invalidate instr range"
-};
-
-static struct undef_hook blockops_hook __initdata = {
-       .instr_mask     = 0x0fffffd0,
-       .instr_val      = 0x0c401f00,
-       .cpsr_mask      = PSR_T_BIT,
-       .cpsr_val       = 0,
-       .fn             = blockops_trap,
-};
-
-static int __init blockops_check(void)
-{
-       register unsigned int err asm("r4") = 0;
-       unsigned int err_pos = 1;
-       unsigned int cache_type;
-       int i;
-
-       asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_type));
-
-       printk("Checking V6 block cache operations:\n");
-       register_undef_hook(&blockops_hook);
-
-       __asm__ ("mov   r0, %0\n\t"
-               "mov    r1, %1\n\t"
-               "mov    r2, #1\n\t"
-               ".word  0xec401f2c @ mcrr p15, 0, r1, r0, c12, 2\n\t"
-               "mov    r2, #2\n\t"
-               ".word  0xec401f0e @ mcrr p15, 0, r1, r0, c14, 0\n\t"
-               "mov    r2, #4\n\t"
-               ".word  0xec401f0c @ mcrr p15, 0, r1, r0, c12, 0\n\t"
-               "mov    r2, #8\n\t"
-               ".word  0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0\n\t"
-               "mov    r2, #16\n\t"
-               ".word  0xec401f05 @ mcrr p15, 0, r1, r0, c5, 0\n\t"
-               :
-               : "r" (PAGE_OFFSET), "r" (PAGE_OFFSET + 128)
-               : "r0", "r1", "r2");
-
-       unregister_undef_hook(&blockops_hook);
-
-       for (i = 0; i < ARRAY_SIZE(func); i++, err_pos <<= 1)
-               printk("%30s: %ssupported\n", func[i], err & err_pos ? "not " : "");
-
-       if ((err & 8) == 0) {
-               printk(" --> Using %s block cache invalidate\n",
-                       cache_type & (1 << 24) ? "harvard" : "unified");
-               if (cache_type & (1 << 24))
-                       cpu_cache.dma_inv_range = blk_dma_inv_range_harvard;
-               else
-                       cpu_cache.dma_inv_range = blk_dma_inv_range_unified;
-       }
-       if ((err & 4) == 0) {
-               printk(" --> Using block cache clean\n");
-               cpu_cache.dma_clean_range        = blk_dma_clean_range;
-       }
-       if ((err & 2) == 0) {
-               printk(" --> Using block cache clean+invalidate\n");
-               cpu_cache.dma_flush_range        = blk_dma_flush_range;
-               cpu_cache.flush_kern_dcache_page = blk_flush_kern_dcache_page;
-       }
-
-       return 0;
-}
-
-__initcall(blockops_check);
index 47b0b767f080ef78a2ca50da6d432525eb406360..dbfe9e891f015a87f3efb5b31349d8c1baca20c8 100644 (file)
@@ -66,6 +66,7 @@ struct vm_region {
        unsigned long           vm_start;
        unsigned long           vm_end;
        struct page             *vm_pages;
+       int                     vm_active;
 };
 
 static struct vm_region consistent_head = {
@@ -104,6 +105,7 @@ vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp)
        list_add_tail(&new->vm_list, &c->vm_list);
        new->vm_start = addr;
        new->vm_end = addr + size;
+       new->vm_active = 1;
 
        spin_unlock_irqrestore(&consistent_lock, flags);
        return new;
@@ -120,7 +122,7 @@ static struct vm_region *vm_region_find(struct vm_region *head, unsigned long ad
        struct vm_region *c;
        
        list_for_each_entry(c, &head->vm_list, vm_list) {
-               if (c->vm_start == addr)
+               if (c->vm_active && c->vm_start == addr)
                        goto out;
        }
        c = NULL;
@@ -319,6 +321,7 @@ EXPORT_SYMBOL(dma_mmap_writecombine);
 
 /*
  * free a page as defined by the above mapping.
+ * Must not be called with IRQs disabled.
  */
 void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle)
 {
@@ -326,14 +329,18 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr
        unsigned long flags, addr;
        pte_t *ptep;
 
+       WARN_ON(irqs_disabled());
+
        size = PAGE_ALIGN(size);
 
        spin_lock_irqsave(&consistent_lock, flags);
-
        c = vm_region_find(&consistent_head, (unsigned long)cpu_addr);
        if (!c)
                goto no_area;
 
+       c->vm_active = 0;
+       spin_unlock_irqrestore(&consistent_lock, flags);
+
        if ((c->vm_end - c->vm_start) != size) {
                printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n",
                       __func__, c->vm_end - c->vm_start, size);
@@ -372,8 +379,8 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr
 
        flush_tlb_kernel_range(c->vm_start, c->vm_end);
 
+       spin_lock_irqsave(&consistent_lock, flags);
        list_del(&c->vm_list);
-
        spin_unlock_irqrestore(&consistent_lock, flags);
 
        kfree(c);
index c9a03981b785895a0d2379706e780847ccef1ed6..330695b6b19d09cc7e871b140604e66ad30cf3b1 100644 (file)
@@ -155,14 +155,19 @@ static void __flush_dcache_aliases(struct address_space *mapping, struct page *p
  *  space mappings, we can be lazy and remember that we may have dirty
  *  kernel cache lines for later.  Otherwise, we assume we have
  *  aliasing mappings.
+ *
+ * Note that we disable the lazy flush for SMP.
  */
 void flush_dcache_page(struct page *page)
 {
        struct address_space *mapping = page_mapping(page);
 
+#ifndef CONFIG_SMP
        if (mapping && !mapping_mapped(mapping))
                set_bit(PG_dcache_dirty, &page->flags);
-       else {
+       else
+#endif
+       {
                __flush_dcache_page(mapping, page);
                if (mapping && cache_is_vivt())
                        __flush_dcache_aliases(mapping, page);
index c168f322ef8c80d91fcdbded23a56d76856162c3..8b276ee38acfabdb65b35e6b07903716b9db100d 100644 (file)
@@ -420,7 +420,8 @@ static void __init bootmem_init(struct meminfo *mi)
  * Set up device the mappings.  Since we clear out the page tables for all
  * mappings above VMALLOC_END, we will remove any debug device mappings.
  * This means you have to be careful how you debug this function, or any
- * called function.  (Do it by code inspection!)
+ * called function.  This means you can't use any function or debugging
+ * method which may touch any device, otherwise the kernel _will_ crash.
  */
 static void __init devicemaps_init(struct machine_desc *mdesc)
 {
@@ -428,6 +429,12 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
        unsigned long addr;
        void *vectors;
 
+       /*
+        * Allocate the vector page early.
+        */
+       vectors = alloc_bootmem_low_pages(PAGE_SIZE);
+       BUG_ON(!vectors);
+
        for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
                pmd_clear(pmd_off_k(addr));
 
@@ -461,12 +468,6 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
        create_mapping(&map);
 #endif
 
-       flush_cache_all();
-       local_flush_tlb_all();
-
-       vectors = alloc_bootmem_low_pages(PAGE_SIZE);
-       BUG_ON(!vectors);
-
        /*
         * Create a mapping for the machine vectors at the high-vectors
         * location (0xffff0000).  If we aren't using high-vectors, also
@@ -491,12 +492,13 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
                mdesc->map_io();
 
        /*
-        * Finally flush the tlb again - this ensures that we're in a
-        * consistent state wrt the writebuffer if the writebuffer needs
-        * draining.  After this point, we can start to touch devices
-        * again.
+        * Finally flush the caches and tlb to ensure that we're in a
+        * consistent state wrt the writebuffer.  This also ensures that
+        * any write-allocated cache lines in the vector page are written
+        * back.  After this point, we can start to touch devices again.
         */
        local_flush_tlb_all();
+       flush_cache_all();
 }
 
 /*
index 0f128c28fee43d620dd788a726f4af17e2a4967a..10901398e4a28787abd2392f19a1b109ab070706 100644 (file)
@@ -130,8 +130,7 @@ remap_area_pages(unsigned long start, unsigned long phys_addr,
  * mapping.  See include/asm-arm/proc-armv/pgtable.h for more information.
  */
 void __iomem *
-__ioremap(unsigned long phys_addr, size_t size, unsigned long flags,
-         unsigned long align)
+__ioremap(unsigned long phys_addr, size_t size, unsigned long flags)
 {
        void * addr;
        struct vm_struct * area;
index 048c9c19aa4fa508bb7e9f12831845a0202c205a..465487470d0e2494025f32edd9a41eee92a4ad84 100644 (file)
@@ -12,7 +12,7 @@
 #
 #   http://www.arm.linux.org.uk/developer/machines/?action=new
 #
-# Last update: Fri Nov 11 21:55:04 2005
+# Last update: Fri Nov 25 14:43:04 2005
 #
 # machine_is_xxx       CONFIG_xxxx             MACH_TYPE_xxx           number
 #
@@ -857,12 +857,12 @@ osiris                    MACH_OSIRIS             OSIRIS                  842
 maestro                        MACH_MAESTRO            MAESTRO                 843
 tunge2                 MACH_TUNGE2             TUNGE2                  844
 ixbbm                  MACH_IXBBM              IXBBM                   845
-mx27                   MACH_MX27               MX27                    846
+mx27ads                        MACH_MX27               MX27                    846
 ax8004                 MACH_AX8004             AX8004                  847
 at91sam9261ek          MACH_AT91SAM9261EK      AT91SAM9261EK           848
 loft                   MACH_LOFT               LOFT                    849
 magpie                 MACH_MAGPIE             MAGPIE                  850
-mx21                   MACH_MX21               MX21                    851
+mx21ads                        MACH_MX21               MX21                    851
 mb87m3400              MACH_MB87M3400          MB87M3400               852
 mguard_delta           MACH_MGUARD_DELTA       MGUARD_DELTA            853
 davinci_dvdp           MACH_DAVINCI_DVDP       DAVINCI_DVDP            854
@@ -897,10 +897,16 @@ omi_board         MACH_OMI_BOARD          OMI_BOARD               882
 mx21civ                        MACH_MX21CIV            MX21CIV                 883
 mahi_cdac              MACH_MAHI_CDAC          MAHI_CDAC               884
 xscale_palmtx          MACH_XSCALE_PALMTX      XSCALE_PALMTX           885
-arch_s3c2413           MACH_ARCH_S3C2413       ARCH_S3C2413            886
 s3c2413                        MACH_S3C2413            S3C2413                 887
 samsys_ep0             MACH_SAMSYS_EP0         SAMSYS_EP0              888
 wg302v1                        MACH_WG302V1            WG302V1                 889
 wg302v2                        MACH_WG302V2            WG302V2                 890
 eb42x                  MACH_EB42X              EB42X                   891
 iq331es                        MACH_IQ331ES            IQ331ES                 892
+cosydsp                        MACH_COSYDSP            COSYDSP                 893
+uplat7d                        MACH_UPLAT7D            UPLAT7D                 894
+ptdavinci              MACH_PTDAVINCI          PTDAVINCI               895
+mbus                   MACH_MBUS               MBUS                    896
+nadia2vb               MACH_NADIA2VB           NADIA2VB                897
+r1000                  MACH_R1000              R1000                   898
+hw90250                        MACH_HW90250            HW90250                 899
index 528fa710aa3464cd6bc6ba1f11f9ea36f70bb836..5258c6096fb9b5551da66d1fe5f3b43b07636e12 100644 (file)
@@ -46,10 +46,9 @@ typedef struct task_struct*  PTASK;
 
 #ifdef MODULE
 void fp_send_sig(unsigned long sig, PTASK p, int priv);
-#if LINUX_VERSION_CODE > 0x20115
+
 MODULE_AUTHOR("Scott Bambrough <scottb@rebel.com>");
 MODULE_DESCRIPTION("NWFPE floating point emulator");
-#endif
 
 #else
 #define fp_send_sig    send_sig
index 5cba9c1f2b3dcf2c01579528f878f44ce88fbc90..7971d680ae298bbe6ef5cacf09de735527633109 100644 (file)
@@ -20,7 +20,7 @@ struct sem_waiter {
        struct task_struct      *task;
 };
 
-#if SEM_DEBUG
+#if SEMAPHORE_DEBUG
 void semtrace(struct semaphore *sem, const char *str)
 {
        if (sem->debug)
index af981bda015cb719db418a71410236c45871f42d..24622d89b1ca4d01c6257943eea7e9a877c22708 100644 (file)
@@ -60,7 +60,7 @@ void __init pcibios_fixup_irqs(void)
        }
 }
 
-void __init pcibios_penalize_isa_irq(int irq, int active)
+void __init pcibios_penalize_isa_irq(int irq)
 {
 }
 
index 79433159b5f05a7bbb3022c5a89b6555247f3090..765088ea8a505844649258d9f2dd7cb60904e047 100644 (file)
@@ -108,7 +108,7 @@ void __init paging_init(void)
 
        memset((void *) empty_zero_page, 0, PAGE_SIZE);
 
-#if CONFIG_HIGHMEM
+#ifdef CONFIG_HIGHMEM
        if (num_physpages - num_mappedpages) {
                pgd_t *pge;
                pud_t *pue;
index 2c67dfe5a6b366d6e16e4569d86028593c17ff24..f76dd03ddd99a3505ba250b2b5d55c15b24c0372 100644 (file)
@@ -85,7 +85,7 @@ static inline void pgd_list_add(pgd_t *pgd)
        struct page *page = virt_to_page(pgd);
        page->index = (unsigned long) pgd_list;
        if (pgd_list)
-               pgd_list->private = (unsigned long) &page->index;
+               set_page_private(pgd_list, (unsigned long) &page->index);
        pgd_list = page;
        set_page_private(page, (unsigned long)&pgd_list);
 }
@@ -94,10 +94,10 @@ static inline void pgd_list_del(pgd_t *pgd)
 {
        struct page *next, **pprev, *page = virt_to_page(pgd);
        next = (struct page *) page->index;
-       pprev = (struct page **)page_private(page);
+       pprev = (struct page **) page_private(page);
        *pprev = next;
        if (next)
-               next->private = (unsigned long) pprev;
+               set_page_private(next, (unsigned long) pprev);
 }
 
 void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
index f36677241ecd528527528cc779ee6fb067de7926..447fa9e33ffbeaaca7bbee58621900cbf0ba2b1e 100644 (file)
@@ -248,9 +248,7 @@ acpi_parse_lapic(acpi_table_entry_header * header, const unsigned long end)
 
        acpi_table_print_madt_entry(header);
 
-       /* no utility in registering a disabled processor */
-       if (processor->flags.enabled == 0)
-               return 0;
+       /* Register even disabled CPUs for cpu hotplug */
 
        x86_acpiid_to_apicid[processor->acpi_id] = processor->id;
 
@@ -640,6 +638,13 @@ static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
                        return 0;
 
                pmtmr_ioport = fadt->xpm_tmr_blk.address;
+               /*
+                * "X" fields are optional extensions to the original V1.0
+                * fields, so we must selectively expand V1.0 fields if the
+                * corresponding X field is zero.
+                */
+               if (!pmtmr_ioport)
+                       pmtmr_ioport = fadt->V1_pm_tmr_blk;
        } else {
                /* FADT rev. 1 */
                pmtmr_ioport = fadt->V1_pm_tmr_blk;
index 04a405345203424388d15b050310642b723f00aa..2b62dee35c6c83299105b46ffc5e00b8969b3c5d 100644 (file)
@@ -177,9 +177,10 @@ static unsigned int nforce2_fsb_read(int bootfsb)
  */
 static int nforce2_set_fsb(unsigned int fsb)
 {
-       u32 pll, temp = 0;
+       u32 temp = 0;
        unsigned int tfsb;
        int diff;
+       int pll = 0;
 
        if ((fsb > max_fsb) || (fsb < NFORCE2_MIN_FSB)) {
                printk(KERN_ERR "cpufreq: FSB %d is out of range!\n", fsb);
index 68a1fc87f4cabb6cb63b71a9c84bc0132494365a..0fbbd4c1072e6c19045d513af0acc9af9ad82a22 100644 (file)
@@ -45,7 +45,7 @@
 
 #define PFX "powernow-k8: "
 #define BFX PFX "BIOS error: "
-#define VERSION "version 1.50.4"
+#define VERSION "version 1.60.0"
 #include "powernow-k8.h"
 
 /* serialize freq changes  */
@@ -216,10 +216,10 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid)
 
        do {
                wrmsr(MSR_FIDVID_CTL, lo, STOP_GRANT_5NS);
-                if (i++ > 100) {
-                        printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n");
-                        return 1;
-                }
+               if (i++ > 100) {
+                       printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n");
+                       return 1;
+               }
        } while (query_current_values_with_pending_wait(data));
 
        if (savefid != data->currfid) {
@@ -336,7 +336,7 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
 /* Phase 2 - core frequency transition */
 static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
 {
-       u32 vcoreqfid, vcocurrfid, vcofiddiff, savevid = data->currvid;
+       u32 vcoreqfid, vcocurrfid, vcofiddiff, fid_interval, savevid = data->currvid;
 
        if ((reqfid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
                printk(KERN_ERR PFX "ph2: illegal lo-lo transition 0x%x 0x%x\n",
@@ -359,9 +359,11 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
            : vcoreqfid - vcocurrfid;
 
        while (vcofiddiff > 2) {
+               (data->currfid & 1) ? (fid_interval = 1) : (fid_interval = 2);
+
                if (reqfid > data->currfid) {
                        if (data->currfid > LO_FID_TABLE_TOP) {
-                               if (write_new_fid(data, data->currfid + 2)) {
+                               if (write_new_fid(data, data->currfid + fid_interval)) {
                                        return 1;
                                }
                        } else {
@@ -371,7 +373,7 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
                                }
                        }
                } else {
-                       if (write_new_fid(data, data->currfid - 2))
+                       if (write_new_fid(data, data->currfid - fid_interval))
                                return 1;
                }
 
@@ -464,7 +466,7 @@ static int check_supported_cpu(unsigned int cpu)
        set_cpus_allowed(current, cpumask_of_cpu(cpu));
 
        if (smp_processor_id() != cpu) {
-               printk(KERN_ERR "limiting to cpu %u failed\n", cpu);
+               printk(KERN_ERR PFX "limiting to cpu %u failed\n", cpu);
                goto out;
        }
 
@@ -474,7 +476,7 @@ static int check_supported_cpu(unsigned int cpu)
        eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
        if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
            ((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
-           ((eax & CPUID_XMOD) > CPUID_XMOD_REV_F)) {
+           ((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) {
                printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
                goto out;
        }
@@ -517,22 +519,24 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8
                        printk(KERN_ERR BFX "maxvid exceeded with pstate %d\n", j);
                        return -ENODEV;
                }
-               if ((pst[j].fid > MAX_FID)
-                   || (pst[j].fid & 1)
-                   || (j && (pst[j].fid < HI_FID_TABLE_BOTTOM))) {
+               if (pst[j].fid > MAX_FID) {
+                       printk(KERN_ERR BFX "maxfid exceeded with pstate %d\n", j);
+                       return -ENODEV;
+               }
+               if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
                        /* Only first fid is allowed to be in "low" range */
-                       printk(KERN_ERR PFX "two low fids - %d : 0x%x\n", j, pst[j].fid);
+                       printk(KERN_ERR BFX "two low fids - %d : 0x%x\n", j, pst[j].fid);
                        return -EINVAL;
                }
                if (pst[j].fid < lastfid)
                        lastfid = pst[j].fid;
        }
        if (lastfid & 1) {
-               printk(KERN_ERR PFX "lastfid invalid\n");
+               printk(KERN_ERR BFX "lastfid invalid\n");
                return -EINVAL;
        }
        if (lastfid > LO_FID_TABLE_TOP)
-               printk(KERN_INFO PFX  "first fid not from lo freq table\n");
+               printk(KERN_INFO BFX  "first fid not from lo freq table\n");
 
        return 0;
 }
@@ -631,7 +635,7 @@ static int find_psb_table(struct powernow_k8_data *data)
 
                dprintk("table vers: 0x%x\n", psb->tableversion);
                if (psb->tableversion != PSB_VERSION_1_4) {
-                       printk(KERN_INFO BFX "PSB table is not v1.4\n");
+                       printk(KERN_ERR BFX "PSB table is not v1.4\n");
                        return -ENODEV;
                }
 
@@ -689,7 +693,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_INFO PFX "BIOS error - no PSB or ACPI _PSS objects\n");
+       printk(KERN_ERR PFX "BIOS error - no PSB or ACPI _PSS objects\n");
        return -ENODEV;
 }
 
@@ -912,7 +916,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
        set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
 
        if (smp_processor_id() != pol->cpu) {
-               printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu);
+               printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu);
                goto err_out;
        }
 
@@ -982,6 +986,9 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
        cpumask_t oldmask = CPU_MASK_ALL;
        int rc, i;
 
+       if (!cpu_online(pol->cpu))
+               return -ENODEV;
+
        if (!check_supported_cpu(pol->cpu))
                return -ENODEV;
 
@@ -1021,7 +1028,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
        set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
 
        if (smp_processor_id() != pol->cpu) {
-               printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu);
+               printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu);
                goto err_out;
        }
 
@@ -1162,10 +1169,9 @@ static void __exit powernowk8_exit(void)
        cpufreq_unregister_driver(&cpufreq_amd64_driver);
 }
 
-MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@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 b1e85bb36396578fe8402dd2365277b32fb6e7e0..d0de37d58e9a2abe2839dd57206e5598745c54e0 100644 (file)
@@ -42,7 +42,7 @@ struct powernow_k8_data {
 #define CPUID_XFAM                     0x0ff00000      /* extended family */
 #define CPUID_XFAM_K8                  0
 #define CPUID_XMOD                     0x000f0000      /* extended model */
-#define CPUID_XMOD_REV_F               0x00040000
+#define CPUID_XMOD_REV_G               0x00060000
 #define CPUID_USE_XFAM_XMOD            0x00000f00
 #define CPUID_GET_MAX_CAPABILITIES     0x80000000
 #define CPUID_FREQ_VOLT_CAPABILITIES   0x80000007
@@ -86,13 +86,14 @@ struct powernow_k8_data {
  *   low fid table
  * - lowest entry in the high fid table must be a <= 200MHz + 2 * the entry
  *   in the low fid table
- * - the parts can only step at 200 MHz intervals, so 1.9 GHz is never valid
+ * - the parts can only step at <= 200 MHz intervals, odd fid values are
+ *   supported in revision G and later revisions.
  * - lowest frequency must be >= interprocessor hypertransport link speed
  *   (only applies to MP systems obviously)
  */
 
 /* fids (frequency identifiers) are arranged in 2 tables - lo and hi */
-#define LO_FID_TABLE_TOP     6 /* fid values marking the boundary    */
+#define LO_FID_TABLE_TOP     7 /* fid values marking the boundary    */
 #define HI_FID_TABLE_BOTTOM  8 /* between the low and high tables    */
 
 #define LO_VCOFREQ_TABLE_TOP    1400   /* corresponding vco frequency values */
@@ -106,7 +107,7 @@ struct powernow_k8_data {
 #define MIN_FREQ 800   /* Min and max freqs, per spec */
 #define MAX_FREQ 5000
 
-#define INVALID_FID_MASK 0xffffffc1  /* not a valid fid if these bits are set */
+#define INVALID_FID_MASK 0xffffffc0  /* not a valid fid if these bits are set */
 #define INVALID_VID_MASK 0xffffffc0  /* not a valid vid if these bits are set */
 
 #define VID_OFF 0x3f
index 5b7d18a06afaeee09b090c20d3bb6b7c7016f0f4..b425cd3d1838377aee89ad50411b2f51b6d40306 100644 (file)
@@ -40,6 +40,7 @@ static struct pci_dev *speedstep_chipset_dev;
  */
 static unsigned int speedstep_processor = 0;
 
+static u32 pmbase;
 
 /*
  *   There are only two frequency states for each processor. Values
@@ -56,34 +57,47 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
 
 
 /**
- * speedstep_set_state - set the SpeedStep state
- * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
+ * speedstep_find_register - read the PMBASE address
  *
- *   Tries to change the SpeedStep state.
+ * Returns: -ENODEV if no register could be found
  */
-static void speedstep_set_state (unsigned int state)
+static int speedstep_find_register (void)
 {
-       u32 pmbase;
-       u8 pm2_blk;
-       u8 value;
-       unsigned long flags;
-
-       if (!speedstep_chipset_dev || (state > 0x1))
-               return;
+       if (!speedstep_chipset_dev)
+               return -ENODEV;
 
        /* get PMBASE */
        pci_read_config_dword(speedstep_chipset_dev, 0x40, &pmbase);
        if (!(pmbase & 0x01)) {
                printk(KERN_ERR "speedstep-ich: could not find speedstep register\n");
-               return;
+               return -ENODEV;
        }
 
        pmbase &= 0xFFFFFFFE;
        if (!pmbase) {
                printk(KERN_ERR "speedstep-ich: could not find speedstep register\n");
-               return;
+               return -ENODEV;
        }
 
+       dprintk("pmbase is 0x%x\n", pmbase);
+       return 0;
+}
+
+/**
+ * speedstep_set_state - set the SpeedStep state
+ * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
+ *
+ *   Tries to change the SpeedStep state.
+ */
+static void speedstep_set_state (unsigned int state)
+{
+       u8 pm2_blk;
+       u8 value;
+       unsigned long flags;
+
+       if (state > 0x1)
+               return;
+
        /* Disable IRQs */
        local_irq_save(flags);
 
@@ -315,10 +329,11 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
        cpus_allowed = current->cpus_allowed;
        set_cpus_allowed(current, policy->cpus);
 
-       /* detect low and high frequency */
+       /* detect low and high frequency and transition latency */
        result = speedstep_get_freqs(speedstep_processor,
                                     &speedstep_freqs[SPEEDSTEP_LOW].frequency,
                                     &speedstep_freqs[SPEEDSTEP_HIGH].frequency,
+                                    &policy->cpuinfo.transition_latency,
                                     &speedstep_set_state);
        set_cpus_allowed(current, cpus_allowed);
        if (result)
@@ -335,7 +350,6 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
 
        /* cpuinfo and default policy values */
        policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
-       policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
        policy->cur = speed;
 
        result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs);
@@ -400,6 +414,9 @@ static int __init speedstep_init(void)
                return -EINVAL;
        }
 
+       if (speedstep_find_register())
+               return -ENODEV;
+
        return cpufreq_register_driver(&speedstep_driver);
 }
 
index d368b3f5fce85397e9e139eb4f5b0314ac15c178..7c47005a1805c41dec67157c18c103dd6720f3c3 100644 (file)
@@ -320,11 +320,13 @@ EXPORT_SYMBOL_GPL(speedstep_detect_processor);
 unsigned int speedstep_get_freqs(unsigned int processor,
                                  unsigned int *low_speed,
                                  unsigned int *high_speed,
+                                 unsigned int *transition_latency,
                                  void (*set_state) (unsigned int state))
 {
        unsigned int prev_speed;
        unsigned int ret = 0;
        unsigned long flags;
+       struct timeval tv1, tv2;
 
        if ((!processor) || (!low_speed) || (!high_speed) || (!set_state))
                return -EINVAL;
@@ -337,7 +339,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
                return -EIO;
 
        dprintk("previous speed is %u\n", prev_speed);
-       
+
        local_irq_save(flags);
 
        /* switch to low state */
@@ -350,8 +352,17 @@ unsigned int speedstep_get_freqs(unsigned int processor,
 
        dprintk("low speed is %u\n", *low_speed);
 
+       /* start latency measurement */
+       if (transition_latency)
+               do_gettimeofday(&tv1);
+
        /* switch to high state */
        set_state(SPEEDSTEP_HIGH);
+
+       /* end latency measurement */
+       if (transition_latency)
+               do_gettimeofday(&tv2);
+
        *high_speed = speedstep_get_processor_frequency(processor);
        if (!*high_speed) {
                ret = -EIO;
@@ -369,6 +380,25 @@ unsigned int speedstep_get_freqs(unsigned int processor,
        if (*high_speed != prev_speed)
                set_state(SPEEDSTEP_LOW);
 
+       if (transition_latency) {
+               *transition_latency = (tv2.tv_sec - tv1.tv_sec) * USEC_PER_SEC +
+                       tv2.tv_usec - tv1.tv_usec;
+               dprintk("transition latency is %u uSec\n", *transition_latency);
+
+               /* convert uSec to nSec and add 20% for safety reasons */
+               *transition_latency *= 1200;
+
+               /* check if the latency measurement is too high or too low
+                * and set it to a safe value (500uSec) in that case
+                */
+               if (*transition_latency > 10000000 || *transition_latency < 50000) {
+                       printk (KERN_WARNING "speedstep: frequency transition measured seems out of "
+                                       "range (%u nSec), falling back to a safe one of %u nSec.\n",
+                                       *transition_latency, 500000);
+                       *transition_latency = 500000;
+               }
+       }
+
  out:
        local_irq_restore(flags);
        return (ret);
index 261a2c9b7f6b875bbded0143ba87011660a4c0c1..6a727fd3a77e099e863bc982309cd1028fd2e55e 100644 (file)
@@ -44,4 +44,5 @@ extern unsigned int speedstep_get_processor_frequency(unsigned int processor);
 extern unsigned int speedstep_get_freqs(unsigned int processor,
          unsigned int *low_speed,
          unsigned int *high_speed,
+         unsigned int *transition_latency,
          void (*set_state) (unsigned int state));
index 2718fb6f6aba89467467e48f1dd24fba465fae08..28cc5d524afcd18a2dce1ee4f5ccb3d2c737faf1 100644 (file)
@@ -269,6 +269,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
                result = speedstep_get_freqs(speedstep_processor,
                                &speedstep_freqs[SPEEDSTEP_LOW].frequency,
                                &speedstep_freqs[SPEEDSTEP_HIGH].frequency,
+                               NULL,
                                &speedstep_set_state);
 
                if (result) {
index e7921315ae9d8fe5df562cc745f908b6081ed1ab..6d91b274589c7fff2bef8e0d35aaa90c41de71a6 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/string.h>
 #include <asm/semaphore.h>
 #include <linux/seq_file.h>
+#include <linux/cpufreq.h>
 
 /*
  *     Get CPU information for use by the procfs.
@@ -86,8 +87,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                seq_printf(m, "stepping\t: unknown\n");
 
        if ( cpu_has(c, X86_FEATURE_TSC) ) {
+               unsigned int freq = cpufreq_quick_get(n);
+               if (!freq)
+                       freq = cpu_khz;
                seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
-                       cpu_khz / 1000, (cpu_khz % 1000));
+                       freq / 1000, (freq % 1000));
        }
 
        /* Cache size */
index cc5d7ac5b2e7dfa5a157bb0dffe57971bc037ed4..22c8675c79f4e5391dc1d72a3f1df1e0b7df974e 100644 (file)
@@ -2009,7 +2009,7 @@ static void ack_edge_ioapic_vector(unsigned int vector)
 {
        int irq = vector_to_irq(vector);
 
-       move_irq(vector);
+       move_native_irq(vector);
        ack_edge_ioapic_irq(irq);
 }
 
@@ -2024,7 +2024,7 @@ static void end_level_ioapic_vector (unsigned int vector)
 {
        int irq = vector_to_irq(vector);
 
-       move_irq(vector);
+       move_native_irq(vector);
        end_level_ioapic_irq(irq);
 }
 
index 32b0c24ab9a6dcca721414a7027635aa06d2c828..19edcd526ba4800f9c71c66ef7ad18da5eb1b7bc 100644 (file)
@@ -191,7 +191,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
                         */
                        save_previous_kprobe(kcb);
                        set_current_kprobe(p, regs, kcb);
-                       p->nmissed++;
+                       kprobes_inc_nmissed_count(p);
                        prepare_singlestep(p, regs);
                        kcb->kprobe_status = KPROBE_REENTER;
                        return 1;
index 8f767d9aa45d73286af9f8a8a92b2fe901b33608..1ca5269b1e863c8d9b7d9792e1b796a6cb7d8b4e 100644 (file)
@@ -220,8 +220,9 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
        num_processors++;
 
        if ((num_processors > 8) &&
-           APIC_XAPIC(ver) &&
-           (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL))
+           ((APIC_XAPIC(ver) &&
+            (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)) ||
+            (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)))
                def_to_bigsmp = 1;
        else
                def_to_bigsmp = 0;
index 1cb261f225d580939785c0b9fc94859dcf92a8a0..2333aead0563a829b4bf7a4f26326657d2b19428 100644 (file)
@@ -393,13 +393,6 @@ void flush_thread(void)
 {
        struct task_struct *tsk = current;
 
-       /*
-        * Remove function-return probe instances associated with this task
-        * and put them back on the free list. Do not insert an exit probe for
-        * this function, it will be disabled by kprobe_flush_task if you do.
-        */
-       kprobe_flush_task(tsk);
-
        memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
        memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));        
        /*
@@ -561,7 +554,9 @@ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
        struct pt_regs ptregs;
        
        ptregs = *(struct pt_regs *)
-               ((unsigned long)tsk->thread_info+THREAD_SIZE - sizeof(ptregs));
+               ((unsigned long)tsk->thread_info +
+               /* see comments in copy_thread() about -8 */
+               THREAD_SIZE - sizeof(ptregs) - 8);
        ptregs.xcs &= 0xffff;
        ptregs.xds &= 0xffff;
        ptregs.xes &= 0xffff;
index 350ea6680f63782dcfb237480f83c42b9229005a..2afe0f8d555adf4b67130421e1750449f7f1c92a 100644 (file)
@@ -111,6 +111,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
                },
        },
+       {       /* Handle problems with rebooting on HP nc6120 */
+               .callback = set_bios_reboot,
+               .ident = "HP Compaq nc6120",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nc6120"),
+               },
+       },
        { }
 };
 
index d16520da4550e6d1b5d318a56a2f1ba1b852728c..9ed449af8e9fdd350a42ff2c606c0af154dad875 100644 (file)
@@ -1338,8 +1338,7 @@ int __cpu_disable(void)
        if (cpu == 0)
                return -EBUSY;
 
-       /* We enable the timer again on the exit path of the death loop */
-       disable_APIC_timer();
+       clear_local_APIC();
        /* Allow any queued timer interrupts to get serviced */
        local_irq_enable();
        mdelay(1);
index c34d1bfc51619b0ee978740d34ffad9d6dd499bb..f0dffa03fbbaec9d1efec46f02441b0427eb92f8 100644 (file)
@@ -650,13 +650,6 @@ fastcall void do_nmi(struct pt_regs * regs, long error_code)
 
        cpu = smp_processor_id();
 
-#ifdef CONFIG_HOTPLUG_CPU
-       if (!cpu_online(cpu)) {
-               nmi_exit();
-               return;
-       }
-#endif
-
        ++nmi_count(cpu);
 
        if (!rcu_dereference(nmi_callback)(regs, cpu))
index 5d09de8d1c6b17e2048f485aa940f53589ec94e1..247fde76aaeddaf0c81215917a015bda7ea648ae 100644 (file)
@@ -223,9 +223,15 @@ void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
 }
 EXPORT_SYMBOL(ioremap_nocache);
 
+/**
+ * iounmap - Free a IO remapping
+ * @addr: virtual address from ioremap_*
+ *
+ * Caller must ensure there is only one unmapping for the same pointer.
+ */
 void iounmap(volatile void __iomem *addr)
 {
-       struct vm_struct *p;
+       struct vm_struct *p, *o;
 
        if ((void __force *)addr <= high_memory)
                return;
@@ -239,22 +245,37 @@ void iounmap(volatile void __iomem *addr)
                        addr < phys_to_virt(ISA_END_ADDRESS))
                return;
 
-       write_lock(&vmlist_lock);
-       p = __remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr));
-       if (!p) { 
-               printk(KERN_WARNING "iounmap: bad address %p\n", addr);
+       addr = (volatile void __iomem *)(PAGE_MASK & (unsigned long __force)addr);
+
+       /* Use the vm area unlocked, assuming the caller
+          ensures there isn't another iounmap for the same address
+          in parallel. Reuse of the virtual address is prevented by
+          leaving it in the global lists until we're done with it.
+          cpa takes care of the direct mappings. */
+       read_lock(&vmlist_lock);
+       for (p = vmlist; p; p = p->next) {
+               if (p->addr == addr)
+                       break;
+       }
+       read_unlock(&vmlist_lock);
+
+       if (!p) {
+               printk("iounmap: bad address %p\n", addr);
                dump_stack();
-               goto out_unlock;
+               return;
        }
 
+       /* Reset the direct mapping. Can block */
        if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) {
                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);
+
+       /* Finally remove it */
+       o = remove_vm_area((void *)addr);
+       BUG_ON(p != o || o == NULL);
        kfree(p); 
 }
 EXPORT_SYMBOL(iounmap);
index ead6122dd06da24b956e689f61f620535689b5e1..5461d4d5ea1e414b1e607b9a5066d183831a1fa1 100644 (file)
@@ -1,7 +1,7 @@
 obj-y                          := i386.o
 
 obj-$(CONFIG_PCI_BIOS)         += pcbios.o
-obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig.o
+obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig.o direct.o
 obj-$(CONFIG_PCI_DIRECT)       += direct.o
 
 pci-y                          := fixup.o
index c96bea14b98f51301c0ec5a2be83d6142a1b646c..f6bc48da4d2a08b4bb48da2ccd32ae228e12a926 100644 (file)
@@ -132,7 +132,7 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum)
                }
        }
 
-       printk("PCI: Probing PCI hardware (bus %02x)\n", busnum);
+       printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum);
 
        return pci_scan_bus_parented(NULL, busnum, &pci_root_ops, NULL);
 }
@@ -144,7 +144,7 @@ static int __init pcibios_init(void)
        struct cpuinfo_x86 *c = &boot_cpu_data;
 
        if (!raw_pci_ops) {
-               printk("PCI: System does not support PCI\n");
+               printk(KERN_WARNING "PCI: System does not support PCI\n");
                return 0;
        }
 
index 30b7e9b4f6a20368b27253a1cfb2db5edac50b7f..e3ac502bf2fbac541cf57f52bef2a5a7300b881f 100644 (file)
@@ -13,7 +13,7 @@
 #define PCI_CONF1_ADDRESS(bus, devfn, reg) \
        (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3))
 
-static int pci_conf1_read(unsigned int seg, unsigned int bus,
+int pci_conf1_read(unsigned int seg, unsigned int bus,
                          unsigned int devfn, int reg, int len, u32 *value)
 {
        unsigned long flags;
@@ -42,7 +42,7 @@ static int pci_conf1_read(unsigned int seg, unsigned int bus,
        return 0;
 }
 
-static int pci_conf1_write(unsigned int seg, unsigned int bus,
+int pci_conf1_write(unsigned int seg, unsigned int bus,
                           unsigned int devfn, int reg, int len, u32 value)
 {
        unsigned long flags;
@@ -201,7 +201,7 @@ static int __init pci_sanity_check(struct pci_raw_ops *o)
                        return 1;
        }
 
-       DBG("PCI: Sanity check failed\n");
+       DBG(KERN_WARNING "PCI: Sanity check failed\n");
        return 0;
 }
 
index 6d6338500c3cac7d0b2a8ae4f32c746346bcc383..ed2c8c899bd37b6bad02568d65d036fcad8770c0 100644 (file)
@@ -221,6 +221,11 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask)
                        continue;
 
                r = &dev->resource[idx];
+               if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
+                       continue;
+               if ((idx == PCI_ROM_RESOURCE) &&
+                               (!(r->flags & IORESOURCE_ROM_ENABLE)))
+                       continue;
                if (!r->start && r->end) {
                        printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
                        return -EINVAL;
@@ -230,8 +235,6 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask)
                if (r->flags & IORESOURCE_MEM)
                        cmd |= PCI_COMMAND_MEMORY;
        }
-       if (dev->resource[PCI_ROM_RESOURCE].start)
-               cmd |= PCI_COMMAND_MEMORY;
        if (cmd != old_cmd) {
                printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
                pci_write_config_word(dev, PCI_COMMAND, cmd);
index dfbf80cff8346af0504df3601e6e251becc7de06..4bb4d4b0f73ad00ce6e66e50a29ad877a2102c24 100644 (file)
 /* The base address of the last MMCONFIG device accessed */
 static u32 mmcfg_last_accessed_device;
 
+static DECLARE_BITMAP(fallback_slots, 32);
+
 /*
  * Functions for accessing PCI configuration space with MMCONFIG accesses
  */
-static u32 get_base_addr(unsigned int seg, int bus)
+static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
 {
        int cfg_num = -1;
        struct acpi_table_mcfg_config *cfg;
 
+       if (seg == 0 && bus == 0 &&
+           test_bit(PCI_SLOT(devfn), fallback_slots))
+               return 0;
+
        while (1) {
                ++cfg_num;
                if (cfg_num >= pci_mmcfg_config_num) {
-                       /* something bad is going on, no cfg table is found. */
-                       /* so we fall back to the old way we used to do this */
-                       /* and just rely on the first entry to be correct. */
-                       return pci_mmcfg_config[0].base_address;
+                       /* Not found - fallback to type 1 */
+                       return 0;
                }
                cfg = &pci_mmcfg_config[cfg_num];
                if (cfg->pci_segment_group_number != seg)
@@ -44,9 +48,9 @@ static u32 get_base_addr(unsigned int seg, int bus)
        }
 }
 
-static inline void pci_exp_set_dev_base(unsigned int seg, int bus, int devfn)
+static inline void pci_exp_set_dev_base(unsigned int base, int bus, int devfn)
 {
-       u32 dev_base = get_base_addr(seg, bus) | (bus << 20) | (devfn << 12);
+       u32 dev_base = base | (bus << 20) | (devfn << 12);
        if (dev_base != mmcfg_last_accessed_device) {
                mmcfg_last_accessed_device = dev_base;
                set_fixmap_nocache(FIX_PCIE_MCFG, dev_base);
@@ -57,13 +61,18 @@ static int pci_mmcfg_read(unsigned int seg, unsigned int bus,
                          unsigned int devfn, int reg, int len, u32 *value)
 {
        unsigned long flags;
+       u32 base;
 
        if (!value || (bus > 255) || (devfn > 255) || (reg > 4095))
                return -EINVAL;
 
+       base = get_base_addr(seg, bus, devfn);
+       if (!base)
+               return pci_conf1_read(seg,bus,devfn,reg,len,value);
+
        spin_lock_irqsave(&pci_config_lock, flags);
 
-       pci_exp_set_dev_base(seg, bus, devfn);
+       pci_exp_set_dev_base(base, bus, devfn);
 
        switch (len) {
        case 1:
@@ -86,13 +95,18 @@ static int pci_mmcfg_write(unsigned int seg, unsigned int bus,
                           unsigned int devfn, int reg, int len, u32 value)
 {
        unsigned long flags;
+       u32 base;
 
        if ((bus > 255) || (devfn > 255) || (reg > 4095)) 
                return -EINVAL;
 
+       base = get_base_addr(seg, bus, devfn);
+       if (!base)
+               return pci_conf1_write(seg,bus,devfn,reg,len,value);
+
        spin_lock_irqsave(&pci_config_lock, flags);
 
-       pci_exp_set_dev_base(seg, bus, devfn);
+       pci_exp_set_dev_base(base, bus, devfn);
 
        switch (len) {
        case 1:
@@ -116,6 +130,37 @@ static struct pci_raw_ops pci_mmcfg = {
        .write =        pci_mmcfg_write,
 };
 
+/* K8 systems have some devices (typically in the builtin northbridge)
+   that are only accessible using type1
+   Normally this can be expressed in the MCFG by not listing them
+   and assigning suitable _SEGs, but this isn't implemented in some BIOS.
+   Instead try to discover all devices on bus 0 that are unreachable using MM
+   and fallback for them.
+   We only do this for bus 0/seg 0 */
+static __init void unreachable_devices(void)
+{
+       int i;
+       unsigned long flags;
+
+       for (i = 0; i < 32; i++) {
+               u32 val1;
+               u32 addr;
+
+               pci_conf1_read(0, 0, PCI_DEVFN(i, 0), 0, 4, &val1);
+               if (val1 == 0xffffffff)
+                       continue;
+
+               /* Locking probably not needed, but safer */
+               spin_lock_irqsave(&pci_config_lock, flags);
+               addr = get_base_addr(0, 0, PCI_DEVFN(i, 0));
+               if (addr != 0)
+                       pci_exp_set_dev_base(addr, 0, PCI_DEVFN(i, 0));
+               if (addr == 0 || readl((u32 __iomem *)mmcfg_virt_addr) != val1)
+                       set_bit(i, fallback_slots);
+               spin_unlock_irqrestore(&pci_config_lock, flags);
+       }
+}
+
 static int __init pci_mmcfg_init(void)
 {
        if ((pci_probe & PCI_PROBE_MMCONF) == 0)
@@ -131,6 +176,8 @@ static int __init pci_mmcfg_init(void)
        raw_pci_ops = &pci_mmcfg;
        pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
 
+       unreachable_devices();
+
  out:
        return 0;
 }
index 127d53ad16bef02f65cd8011cbd1c5ec6fd70e7a..f550781ec3105f48d517b2ed09fcc80ddc5cba24 100644 (file)
@@ -74,3 +74,10 @@ extern spinlock_t pci_config_lock;
 
 extern int (*pcibios_enable_irq)(struct pci_dev *dev);
 extern void (*pcibios_disable_irq)(struct pci_dev *dev);
+
+extern int pci_conf1_write(unsigned int seg, unsigned int bus,
+                          unsigned int devfn, int reg, int len, u32 value);
+extern int pci_conf1_read(unsigned int seg, unsigned int bus,
+                         unsigned int devfn, int reg, int len, u32 *value);
+
+
index b76ce1fe2e7f31c04858901fac13dd66e7efff29..199eeaf0f4e3829267b6de3ebf4efdedbaa4d68c 100644 (file)
@@ -58,7 +58,7 @@ config IA64_UNCACHED_ALLOCATOR
        bool
        select GENERIC_ALLOCATOR
 
-config ZONE_DMA_IS_DMA32
+config DMA_IS_DMA32
        bool
        default y
 
index 87cfd31a4a3932a401d6e69d5dd0c86bd843112d..ff8bb3770c9da0487c91bfa96261ced45d68e43a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc6
-# Tue Aug 16 14:40:41 2005
+# Linux kernel version: 2.6.15-rc4
+# Fri Dec  2 10:33:48 2005
 #
 
 #
@@ -16,6 +16,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
@@ -26,6 +27,7 @@ CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
 CONFIG_CPUSETS=y
+CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
@@ -55,12 +57,30 @@ CONFIG_OBSOLETE_MODPARM=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Processor type and features
 #
 CONFIG_IA64=y
 CONFIG_64BIT=y
 CONFIG_MMU=y
+CONFIG_SWIOTLB=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_TIME_INTERPOLATION=y
@@ -68,6 +88,7 @@ CONFIG_EFI=y
 CONFIG_GENERIC_IOMAP=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 CONFIG_IA64_UNCACHED_ALLOCATOR=y
+CONFIG_ZONE_DMA_IS_DMA32=y
 # CONFIG_IA64_GENERIC is not set
 # CONFIG_IA64_DIG is not set
 # CONFIG_IA64_HP_ZX1 is not set
@@ -87,16 +108,12 @@ CONFIG_HZ_250=y
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
 CONFIG_IA64_L1_CACHE_SHIFT=7
-CONFIG_NUMA=y
-CONFIG_VIRTUAL_MEM_MAP=y
-CONFIG_HOLES_IN_ZONE=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
 # CONFIG_IA64_CYCLONE is not set
 CONFIG_IOSAPIC=y
 CONFIG_IA64_SGI_SN_XP=m
-CONFIG_FORCE_MAX_ZONEORDER=18
+CONFIG_FORCE_MAX_ZONEORDER=17
 CONFIG_SMP=y
-CONFIG_NR_CPUS=512
+CONFIG_NR_CPUS=1024
 # CONFIG_HOTPLUG_CPU is not set
 CONFIG_SCHED_SMT=y
 CONFIG_PREEMPT=y
@@ -107,7 +124,17 @@ CONFIG_DISCONTIGMEM_MANUAL=y
 CONFIG_DISCONTIGMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_NEED_MULTIPLE_NODES=y
-CONFIG_HAVE_DEC_LOCK=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
+CONFIG_NUMA=y
+CONFIG_VIRTUAL_MEM_MAP=y
+CONFIG_HOLES_IN_ZONE=y
+CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
 CONFIG_IA64_MCA_RECOVERY=y
@@ -126,20 +153,28 @@ CONFIG_BINFMT_ELF=y
 # Power management and ACPI
 #
 CONFIG_PM=y
-CONFIG_ACPI=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
 
 #
 # ACPI (Advanced Configuration and Power Interface) Support
 #
+CONFIG_ACPI=y
 # CONFIG_ACPI_BUTTON is not set
 # CONFIG_ACPI_FAN is not set
 # CONFIG_ACPI_PROCESSOR is not set
 CONFIG_ACPI_NUMA=y
+CONFIG_ACPI_BLACKLIST_YEAR=0
 # CONFIG_ACPI_DEBUG is not set
 CONFIG_ACPI_POWER=y
 CONFIG_ACPI_SYSTEM=y
 # CONFIG_ACPI_CONTAINER is not set
 
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
 #
 # Bus options (PCI, PCMCIA)
 #
@@ -147,7 +182,6 @@ CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 # CONFIG_PCI_MSI is not set
 CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
 # CONFIG_PCI_DEBUG is not set
 
 #
@@ -191,8 +225,8 @@ CONFIG_SYN_COOKIES=y
 # 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_INET_DIAG=m
+CONFIG_INET_TCP_DIAG=m
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_BIC=y
 CONFIG_IPV6=m
@@ -204,6 +238,11 @@ CONFIG_IPV6=m
 # CONFIG_IPV6_TUNNEL is not set
 # CONFIG_NETFILTER is not set
 
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
@@ -220,8 +259,11 @@ CONFIG_IPV6=m
 # 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
@@ -230,6 +272,7 @@ CONFIG_IPV6=m
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -243,6 +286,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -275,16 +323,7 @@ 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=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 CONFIG_ATA_OVER_ETH=m
 
 #
@@ -349,6 +388,7 @@ CONFIG_IDEDMA_AUTO=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=y
 CONFIG_SCSI_PROC_FS=y
 
@@ -375,11 +415,13 @@ CONFIG_SCSI_CONSTANTS=y
 #
 CONFIG_SCSI_SPI_ATTRS=y
 CONFIG_SCSI_FC_ATTRS=y
-# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_ISCSI_ATTRS=m
+CONFIG_SCSI_SAS_ATTRS=y
 
 #
 # SCSI low-level drivers
 #
+CONFIG_ISCSI_TCP=m
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -389,15 +431,19 @@ CONFIG_SCSI_FC_ATTRS=y
 # CONFIG_SCSI_AIC79XX is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 CONFIG_SCSI_SATA=y
 # CONFIG_SCSI_SATA_AHCI is not set
 # CONFIG_SCSI_SATA_SVW is not set
 # CONFIG_SCSI_ATA_PIIX is not set
+# CONFIG_SCSI_SATA_MV is not set
 # CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
+# CONFIG_SCSI_PDC_ADMA is not set
 # CONFIG_SCSI_SATA_QSTOR is not set
+# CONFIG_SCSI_SATA_PROMISE is not set
 # CONFIG_SCSI_SATA_SX4 is not set
 # CONFIG_SCSI_SATA_SIL is not set
+# CONFIG_SCSI_SATA_SIL24 is not set
 # CONFIG_SCSI_SATA_SIS is not set
 # CONFIG_SCSI_SATA_ULI is not set
 # CONFIG_SCSI_SATA_VIA is not set
@@ -411,7 +457,6 @@ CONFIG_SCSI_SATA_VITESSE=y
 # CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 CONFIG_SCSI_QLOGIC_1280=y
-# CONFIG_SCSI_QLOGIC_1280_1040 is not set
 CONFIG_SCSI_QLA2XXX=y
 # CONFIG_SCSI_QLA21XX is not set
 CONFIG_SCSI_QLA22XX=y
@@ -451,6 +496,7 @@ CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_FUSION=y
 CONFIG_FUSION_SPI=y
 CONFIG_FUSION_FC=y
+CONFIG_FUSION_SAS=y
 CONFIG_FUSION_MAX_SGE=128
 CONFIG_FUSION_CTL=m
 
@@ -478,6 +524,10 @@ CONFIG_NETDEVICES=y
 #
 # CONFIG_ARCNET is not set
 
+#
+# PHY device support
+#
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -493,6 +543,7 @@ CONFIG_NETDEVICES=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 CONFIG_TIGON3=y
@@ -501,10 +552,10 @@ CONFIG_TIGON3=y
 #
 # Ethernet (10000 Mbit)
 #
+CONFIG_CHELSIO_T1=m
 # CONFIG_IXGB is not set
 CONFIG_S2IO=m
 # CONFIG_S2IO_NAPI is not set
-# CONFIG_2BUFF_MODE is not set
 
 #
 # Token Ring devices
@@ -583,6 +634,7 @@ CONFIG_HW_CONSOLE=y
 CONFIG_SERIAL_NONSTANDARD=y
 # CONFIG_ROCKETPORT is not set
 # CONFIG_CYCLADES is not set
+# CONFIG_DIGIEPCA is not set
 # CONFIG_MOXA_SMARTIO is not set
 # CONFIG_ISI is not set
 # CONFIG_SYNCLINKMP is not set
@@ -629,7 +681,8 @@ CONFIG_EFI_RTC=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_AGP is not set
+CONFIG_AGP=y
+CONFIG_AGP_SGI_TIOCA=y
 # CONFIG_DRM is not set
 CONFIG_RAW_DRIVER=m
 # CONFIG_HPET is not set
@@ -641,12 +694,12 @@ CONFIG_MMTIMER=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
-# CONFIG_I2C_SENSOR is not set
 
 #
 # Dallas's 1-wire bus
@@ -657,11 +710,16 @@ CONFIG_MMTIMER=y
 # Hardware Monitoring support
 #
 # CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
 
 #
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -721,12 +779,15 @@ CONFIG_USB_UHCI_HCD=m
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 # CONFIG_USB_STORAGE is not set
 
@@ -751,9 +812,11 @@ CONFIG_USB_HIDINPUT=y
 # CONFIG_USB_MTOUCH is not set
 # CONFIG_USB_ITMTOUCH is not set
 # CONFIG_USB_EGALAX is not set
+# CONFIG_USB_YEALINK is not set
 # CONFIG_USB_XPAD is not set
 # CONFIG_USB_ATI_REMOTE is not set
 # CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
 
 #
 # USB Imaging devices
@@ -824,11 +887,13 @@ CONFIG_USB_MON=y
 # InfiniBand support
 #
 CONFIG_INFINIBAND=m
-CONFIG_INFINIBAND_USER_VERBS=m
+# CONFIG_INFINIBAND_USER_MAD is not set
+CONFIG_INFINIBAND_USER_ACCESS=m
 CONFIG_INFINIBAND_MTHCA=m
 # CONFIG_INFINIBAND_MTHCA_DEBUG is not set
 CONFIG_INFINIBAND_IPOIB=m
 # CONFIG_INFINIBAND_IPOIB_DEBUG is not set
+CONFIG_INFINIBAND_SRP=m
 
 #
 # SN Devices
@@ -858,16 +923,12 @@ CONFIG_REISERFS_FS_POSIX_ACL=y
 CONFIG_REISERFS_FS_SECURITY=y
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-
-#
-# XFS support
-#
 CONFIG_XFS_FS=y
 CONFIG_XFS_EXPORT=y
-CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=y
 # CONFIG_XFS_SECURITY is not set
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_XFS_RT=y
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_INOTIFY=y
@@ -878,6 +939,7 @@ CONFIG_QUOTACTL=y
 CONFIG_DNOTIFY=y
 CONFIG_AUTOFS_FS=m
 CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
 
 #
 # CD-ROM/DVD Filesystems
@@ -904,13 +966,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 CONFIG_SYSFS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-CONFIG_TMPFS_XATTR=y
-CONFIG_TMPFS_SECURITY=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_RELAYFS_FS=m
 
 #
 # Miscellaneous filesystems
@@ -959,6 +1019,7 @@ CONFIG_CIFS=m
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -1028,18 +1089,21 @@ CONFIG_NLS_UTF8=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+CONFIG_CRC16=m
 CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
+CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=m
 CONFIG_ZLIB_DEFLATE=m
 CONFIG_GENERIC_ALLOCATOR=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_PENDING_IRQ=y
 
 #
-# Profiling support
+# Instrumentation Support
 #
 # CONFIG_PROFILING is not set
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -1048,6 +1112,7 @@ CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_LOG_BUF_SHIFT=20
+CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 CONFIG_DEBUG_PREEMPT=y
@@ -1056,7 +1121,8 @@ CONFIG_DEBUG_PREEMPT=y
 # CONFIG_DEBUG_KOBJECT is not set
 CONFIG_DEBUG_INFO=y
 # CONFIG_DEBUG_FS is not set
-# CONFIG_KPROBES is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_IA64_GRANULE_16MB=y
 # CONFIG_IA64_GRANULE_64MB is not set
 # CONFIG_IA64_PRINT_HAZARDS is not set
@@ -1097,7 +1163,7 @@ CONFIG_CRYPTO_DES=m
 # CONFIG_CRYPTO_ANUBIS is not set
 CONFIG_CRYPTO_DEFLATE=m
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_CRC32C is not set
+CONFIG_CRYPTO_CRC32C=m
 # CONFIG_CRYPTO_TEST is not set
 
 #
index 9bc8bcafc9050ffd5f70f55caeeb8b0d1cef2a99..b1e8f09e9fd5654f46b3736156741b397bf8a2a9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc1
-# Wed Sep 14 15:17:57 2005
+# Linux kernel version: 2.6.15-rc4
+# Fri Dec  2 16:06:32 2005
 #
 
 #
@@ -58,18 +58,37 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Processor type and features
 #
 CONFIG_IA64=y
 CONFIG_64BIT=y
 CONFIG_MMU=y
+CONFIG_SWIOTLB=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_TIME_INTERPOLATION=y
 CONFIG_EFI=y
 CONFIG_GENERIC_IOMAP=y
 CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ZONE_DMA_IS_DMA32=y
 # CONFIG_IA64_GENERIC is not set
 CONFIG_IA64_DIG=y
 # CONFIG_IA64_HP_ZX1 is not set
@@ -82,18 +101,16 @@ CONFIG_MCKINLEY=y
 # CONFIG_IA64_PAGE_SIZE_8KB is not set
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
+CONFIG_PGTABLE_3=y
+# CONFIG_PGTABLE_4 is not set
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
 CONFIG_IA64_L1_CACHE_SHIFT=7
-# CONFIG_NUMA is not set
-CONFIG_VIRTUAL_MEM_MAP=y
-CONFIG_HOLES_IN_ZONE=y
 CONFIG_IA64_CYCLONE=y
 CONFIG_IOSAPIC=y
-# CONFIG_IA64_SGI_SN_XP is not set
-CONFIG_FORCE_MAX_ZONEORDER=18
+CONFIG_FORCE_MAX_ZONEORDER=17
 CONFIG_SMP=y
 CONFIG_NR_CPUS=4
 CONFIG_HOTPLUG_CPU=y
@@ -106,7 +123,13 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_HAVE_DEC_LOCK=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_VIRTUAL_MEM_MAP=y
+CONFIG_HOLES_IN_ZONE=y
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
 CONFIG_IA64_MCA_RECOVERY=y
@@ -118,7 +141,6 @@ CONFIG_IA64_PALINFO=y
 #
 CONFIG_EFI_VARS=y
 CONFIG_EFI_PCDP=y
-# CONFIG_DELL_RBU is not set
 CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=m
 
@@ -126,6 +148,7 @@ CONFIG_BINFMT_MISC=m
 # Power management and ACPI
 #
 CONFIG_PM=y
+CONFIG_PM_LEGACY=y
 # CONFIG_PM_DEBUG is not set
 
 #
@@ -226,14 +249,16 @@ CONFIG_TCP_CONG_BIC=y
 # 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_NETFILTER_NETLINK is not set
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
@@ -295,14 +320,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 CONFIG_BLK_DEV_INITRD=y
 # 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
 
 #
@@ -400,6 +417,7 @@ CONFIG_SCSI_FC_ATTRS=y
 #
 # SCSI low-level drivers
 #
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_ACARD is not set
@@ -409,6 +427,7 @@ CONFIG_SCSI_FC_ATTRS=y
 # CONFIG_SCSI_AIC79XX is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
 # CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -424,7 +443,6 @@ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 CONFIG_SCSI_QLOGIC_FC=y
 # CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
 CONFIG_SCSI_QLOGIC_1280=y
-# CONFIG_SCSI_QLOGIC_1280_1040 is not set
 CONFIG_SCSI_QLA2XXX=y
 CONFIG_SCSI_QLA21XX=m
 CONFIG_SCSI_QLA22XX=m
@@ -463,6 +481,7 @@ CONFIG_DM_ZERO=m
 CONFIG_FUSION=y
 CONFIG_FUSION_SPI=y
 CONFIG_FUSION_FC=y
+# CONFIG_FUSION_SAS is not set
 CONFIG_FUSION_MAX_SGE=128
 CONFIG_FUSION_CTL=y
 
@@ -503,6 +522,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=m
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 
 #
@@ -727,6 +747,7 @@ CONFIG_MAX_RAW_DEVS=256
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -812,12 +833,15 @@ CONFIG_USB_UHCI_HCD=y
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_BLUETOOTH_TTY is not set
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
 #
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
@@ -1123,9 +1147,10 @@ CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_PENDING_IRQ=y
 
 #
-# Profiling support
+# Instrumentation Support
 #
 # CONFIG_PROFILING is not set
+# CONFIG_KPROBES is not set
 
 #
 # Kernel hacking
@@ -1142,7 +1167,8 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
-# CONFIG_KPROBES is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_IA64_GRANULE_16MB=y
 # CONFIG_IA64_GRANULE_64MB is not set
 # CONFIG_IA64_PRINT_HAZARDS is not set
index a7280d9f6c1634d80cdd7b1b48a90d6eb3a138f4..4e7a6a1ec6c7c3f9c542483cbef4071e33ef972d 100644 (file)
@@ -261,8 +261,6 @@ elf32_set_personality (void)
 {
        set_personality(PER_LINUX32);
        current->thread.map_base  = IA32_PAGE_OFFSET/3;
-       current->thread.task_size = IA32_PAGE_OFFSET;   /* use what Linux/x86 uses... */
-       set_fs(USER_DS);                                /* set addr limit for new TASK_SIZE */
 }
 
 static unsigned long
index e3e9290e3ff2f433f649daa418a2c35a0c00ed5e..68ceb4e690c7a63a91960f750ab6282094938246 100644 (file)
@@ -305,7 +305,6 @@ struct old_linux32_dirent {
 #define ELF_DATA       ELFDATA2LSB
 #define ELF_ARCH       EM_386
 
-#define IA32_PAGE_OFFSET       0xc0000000
 #define IA32_STACK_TOP         IA32_PAGE_OFFSET
 #define IA32_GATE_OFFSET       IA32_PAGE_OFFSET
 #define IA32_GATE_END          IA32_PAGE_OFFSET + PAGE_SIZE
index 01572814abe42bfefff13b134c58bfe3ebd38e07..5db9d3bcbbcbe262b85352e3c8fb3be7d1ff8597 100644 (file)
@@ -42,6 +42,7 @@ EXPORT_SYMBOL(clear_page);
 
 #ifdef CONFIG_VIRTUAL_MEM_MAP
 #include <linux/bootmem.h>
+EXPORT_SYMBOL(min_low_pfn);    /* defined by bootmem.c, but not exported by generic code */
 EXPORT_SYMBOL(max_low_pfn);    /* defined by bootmem.c, but not exported by generic code */
 #endif
 
index 801eeaeaf3de6c760905361ec61b9ad7eb8ebaf5..89a70400c4f638efa3ed6face511777cf90bb5b4 100644 (file)
@@ -630,7 +630,7 @@ static int __kprobes pre_kprobes_handler(struct die_args *args)
                         */
                        save_previous_kprobe(kcb);
                        set_current_kprobe(p, kcb);
-                       p->nmissed++;
+                       kprobes_inc_nmissed_count(p);
                        prepare_ss(p, regs);
                        kcb->kprobe_status = KPROBE_REENTER;
                        return 1;
@@ -740,7 +740,7 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
        switch(val) {
        case DIE_BREAK:
                /* err is break number from ia64_bad_break() */
-               if (args->err == 0x80200 || args->err == 0x80300)
+               if (args->err == 0x80200 || args->err == 0x80300 || args->err == 0)
                        if (pre_kprobes_handler(args))
                                ret = NOTIFY_STOP;
                break;
index 4305d2ba76f6c61e6301c4df94823c819b30ee52..e9904c74d2ba617679131802ce1f68858e3b2826 100644 (file)
@@ -718,18 +718,16 @@ kernel_thread_helper (int (*fn)(void *), void *arg)
 void
 flush_thread (void)
 {
-       /*
-        * Remove function-return probe instances associated with this task
-        * and put them back on the free list. Do not insert an exit probe for
-        * this function, it will be disabled by kprobe_flush_task if you do.
-        */
-       kprobe_flush_task(current);
-
        /* drop floating-point and debug-register state if it exists: */
        current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
        ia64_drop_fpu(current);
-       if (IS_IA32_PROCESS(ia64_task_regs(current)))
+#ifdef CONFIG_IA32_SUPPORT
+       if (IS_IA32_PROCESS(ia64_task_regs(current))) {
                ia32_drop_partial_page_list(current);
+               current->thread.task_size = IA32_PAGE_OFFSET;
+               set_fs(USER_DS);
+       }
+#endif
 }
 
 /*
index ca68e6e44a7272275602b8914cd87166a70f5d3e..1461dc660b43af305b6b0687518f0e771b7d8dfe 100644 (file)
@@ -293,7 +293,7 @@ retry:
                if (file->f_flags & O_NONBLOCK)
                        return -EAGAIN;
                if (down_interruptible(&data->sem))
-                       return -ERESTARTSYS;
+                       return -EINTR;
        }
 
        n = data->cpu_check;
index 5add0bcf87a7a338974d39fbff41fe68ce3d6956..088e5dded8dc1c2be9706ffd5819499b433f8513 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/initrd.h>
 #include <linux/platform.h>
 #include <linux/pm.h>
+#include <linux/cpufreq.h>
 
 #include <asm/ia32.h>
 #include <asm/machvec.h>
@@ -517,6 +518,7 @@ show_cpuinfo (struct seq_file *m, void *v)
        char family[32], features[128], *cp, sep;
        struct cpuinfo_ia64 *c = v;
        unsigned long mask;
+       unsigned int proc_freq;
        int i;
 
        mask = c->features;
@@ -549,6 +551,10 @@ show_cpuinfo (struct seq_file *m, void *v)
                sprintf(cp, " 0x%lx", mask);
        }
 
+       proc_freq = cpufreq_quick_get(cpunum);
+       if (!proc_freq)
+               proc_freq = c->proc_freq / 1000;
+
        seq_printf(m,
                   "processor  : %d\n"
                   "vendor     : %s\n"
@@ -565,7 +571,7 @@ show_cpuinfo (struct seq_file *m, void *v)
                   "BogoMIPS   : %lu.%02lu\n",
                   cpunum, c->vendor, family, c->model, c->revision, c->archrev,
                   features, c->ppn, c->number,
-                  c->proc_freq / 1000000, c->proc_freq % 1000000,
+                  proc_freq / 1000, proc_freq % 1000,
                   c->itc_freq / 1000000, c->itc_freq % 1000000,
                   lpj*HZ/500000, (lpj*HZ/5000) % 100);
 #ifdef CONFIG_SMP
index 5b7e736f3b4924beb5e779a92b3c93a7f2a606f2..028a2b95936c1fa48ca316921c65b1023b9e1585 100644 (file)
@@ -249,3 +249,32 @@ time_init (void)
         */
        set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
 }
+
+#define SMALLUSECS 100
+
+void
+udelay (unsigned long usecs)
+{
+       unsigned long start;
+       unsigned long cycles;
+       unsigned long smallusecs;
+
+       /*
+        * Execute the non-preemptible delay loop (because the ITC might
+        * not be synchronized between CPUS) in relatively short time
+        * chunks, allowing preemption between the chunks.
+        */
+       while (usecs > 0) {
+               smallusecs = (usecs > SMALLUSECS) ? SMALLUSECS : usecs;
+               preempt_disable();
+               cycles = smallusecs*local_cpu_data->cyc_per_usec;
+               start = ia64_get_itc();
+
+               while (ia64_get_itc() - start < cycles)
+                       cpu_relax();
+
+               preempt_enable();
+               usecs -= smallusecs;
+       }
+}
+EXPORT_SYMBOL(udelay);
index fba5fdd1f9689351dda3adf028e864ff8c05c0bf..d3e0ecb56d627c0a0514f9bfdefefd1467df0a59 100644 (file)
@@ -132,24 +132,6 @@ __kprobes 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;
index c6d40446c2c4a37a1347b464ecf1b340c5f832d7..b631cf86ed445b60d4417b2ad37f8cfec506744d 100644 (file)
@@ -53,7 +53,7 @@ static void uncached_ipi_visibility(void *data)
        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());
+                      "CPU %i\n", status, raw_smp_processor_id());
 }
 
 
@@ -63,7 +63,7 @@ static void uncached_ipi_mc_drain(void *data)
        status = ia64_pal_mc_drain();
        if (status)
                printk(KERN_WARNING "ia64_pal_mc_drain() failed with %i on "
-                      "CPU %i\n", status, get_cpu());
+                      "CPU %i\n", status, raw_smp_processor_id());
 }
 
 
@@ -105,7 +105,7 @@ uncached_get_new_chunk(struct gen_pool *poolp)
        status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
 
        dprintk(KERN_INFO "pal_prefetch_visibility() returns %i on cpu %i\n",
-               status, get_cpu());
+               status, raw_smp_processor_id());
 
        if (!status) {
                status = smp_call_function(uncached_ipi_visibility, NULL, 0, 1);
index 30d8564e96032bd9b7cc9735721457627db9ff7d..73af6267d2efa52d32d0d019089f22b99b659de9 100644 (file)
@@ -177,6 +177,9 @@ SECTIONS
        }
   . = ALIGN(PAGE_SIZE);                /* make sure the gate page doesn't expose kernel data */
 
+  .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET)
+        { *(.data.read_mostly) }
+
   .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET)
         { *(.data.cacheline_aligned) }
 
index 0f776b032d31355da25f2bdbb47982e3560301cb..c87d6d1d58130411828e2daef886398ced41d93d 100644 (file)
@@ -50,8 +50,10 @@ static nodemask_t memory_less_mask __initdata;
  * To prevent cache aliasing effects, align per-node structures so that they
  * start at addresses that are strided by node number.
  */
+#define MAX_NODE_ALIGN_OFFSET  (32 * 1024 * 1024)
 #define NODEDATA_ALIGN(addr, node)                                             \
-       ((((addr) + 1024*1024-1) & ~(1024*1024-1)) + (node)*PERCPU_PAGE_SIZE)
+       ((((addr) + 1024*1024-1) & ~(1024*1024-1)) +                            \
+            (((node)*PERCPU_PAGE_SIZE) & (MAX_NODE_ALIGN_OFFSET - 1)))
 
 /**
  * build_node_maps - callback to setup bootmem structs for each node
index d71f4de44f79a1074ee3c614735576cf3b9a8369..dd73c0cb754b4051214f113bf0bad237b684148a 100644 (file)
@@ -137,6 +137,7 @@ retry_bteop:
                        bte = bte_if_on_node(nasid_to_try[nasid_index],bte_if_index);
 
                        if (bte == NULL) {
+                               nasid_index++;
                                continue;
                        }
 
index 05e4ea8899818f8bc06cff895246a3cd55906bbe..318087e35b66c2ad2cef6114469d4e873d5fe6b1 100644 (file)
@@ -3,7 +3,7 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 1992 - 1997, 2000-2004 Silicon Graphics, Inc. All rights reserved.
+ * Copyright (C) 1992 - 1997, 2000-2005 Silicon Graphics, Inc. All rights reserved.
  */
 
 #include <linux/bootmem.h>
@@ -146,6 +146,24 @@ sal_get_pcidev_info(u64 segment, u64 bus_number, u64 devfn, u64 pci_dev,
        return ret_stuff.v0;
 }
 
+/*
+ * sn_pcidev_info_get() - Retrieve the pcidev_info struct for the specified
+ *                       device.
+ */
+inline struct pcidev_info *
+sn_pcidev_info_get(struct pci_dev *dev)
+{
+       struct pcidev_info *pcidev;
+
+       list_for_each_entry(pcidev,
+                           &(SN_PCI_CONTROLLER(dev)->pcidev_info), pdi_list) {
+               if (pcidev->pdi_linux_pcidev == dev) {
+                       return pcidev;
+               }
+       }
+       return NULL;
+}
+
 /*
  * sn_fixup_ionodes() - This routine initializes the HUB data strcuture for 
  *     each node in the system.
@@ -229,6 +247,50 @@ static void sn_fixup_ionodes(void)
 
 }
 
+/*
+ * sn_pci_window_fixup() - Create a pci_window for each device resource.
+ *                        Until ACPI support is added, we need this code
+ *                        to setup pci_windows for use by
+ *                        pcibios_bus_to_resource(),
+ *                        pcibios_resource_to_bus(), etc.
+ */
+static void
+sn_pci_window_fixup(struct pci_dev *dev, unsigned int count,
+                   int64_t * pci_addrs)
+{
+       struct pci_controller *controller = PCI_CONTROLLER(dev->bus);
+       unsigned int i;
+       unsigned int idx;
+       unsigned int new_count;
+       struct pci_window *new_window;
+
+       if (count == 0)
+               return;
+       idx = controller->windows;
+       new_count = controller->windows + count;
+       new_window = kcalloc(new_count, sizeof(struct pci_window), GFP_KERNEL);
+       if (new_window == NULL)
+               BUG();
+       if (controller->window) {
+               memcpy(new_window, controller->window,
+                      sizeof(struct pci_window) * controller->windows);
+               kfree(controller->window);
+       }
+
+       /* Setup a pci_window for each device resource. */
+       for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
+               if (pci_addrs[i] == -1)
+                       continue;
+
+               new_window[idx].offset = dev->resource[i].start - pci_addrs[i];
+               new_window[idx].resource = dev->resource[i];
+               idx++;
+       }
+
+       controller->windows = new_count;
+       controller->window = new_window;
+}
+
 void sn_pci_unfixup_slot(struct pci_dev *dev)
 {
        struct pci_dev *host_pci_dev = SN_PCIDEV_INFO(dev)->host_pci_dev;
@@ -246,21 +308,23 @@ void sn_pci_unfixup_slot(struct pci_dev *dev)
  */
 void sn_pci_fixup_slot(struct pci_dev *dev)
 {
+       unsigned int count = 0;
        int idx;
        int segment = pci_domain_nr(dev->bus);
        int status = 0;
        struct pcibus_bussoft *bs;
        struct pci_bus *host_pci_bus;
        struct pci_dev *host_pci_dev;
+       struct pcidev_info *pcidev_info;
+       int64_t pci_addrs[PCI_ROM_RESOURCE + 1];
        struct sn_irq_info *sn_irq_info;
        unsigned long size;
        unsigned int bus_no, devfn;
 
        pci_dev_get(dev); /* for the sysdata pointer */
-       dev->sysdata = kmalloc(sizeof(struct pcidev_info), GFP_KERNEL);
-       if (SN_PCIDEV_INFO(dev) <= 0)
+       pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
+       if (pcidev_info <= 0)
                BUG();          /* Cannot afford to run out of memory */
-       memset(SN_PCIDEV_INFO(dev), 0, sizeof(struct pcidev_info));
 
        sn_irq_info = kmalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
        if (sn_irq_info <= 0)
@@ -270,22 +334,34 @@ void sn_pci_fixup_slot(struct pci_dev *dev)
        /* Call to retrieve pci device information needed by kernel. */
        status = sal_get_pcidev_info((u64) segment, (u64) dev->bus->number, 
                                     dev->devfn,
-                                    (u64) __pa(SN_PCIDEV_INFO(dev)),
+                                    (u64) __pa(pcidev_info),
                                     (u64) __pa(sn_irq_info));
        if (status)
                BUG(); /* Cannot get platform pci device information */
 
+       /* Add pcidev_info to list in sn_pci_controller struct */
+       list_add_tail(&pcidev_info->pdi_list,
+                     &(SN_PCI_CONTROLLER(dev->bus)->pcidev_info));
+
        /* Copy over PIO Mapped Addresses */
        for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) {
                unsigned long start, end, addr;
 
-               if (!SN_PCIDEV_INFO(dev)->pdi_pio_mapped_addr[idx])
+               if (!pcidev_info->pdi_pio_mapped_addr[idx]) {
+                       pci_addrs[idx] = -1;
                        continue;
+               }
 
                start = dev->resource[idx].start;
                end = dev->resource[idx].end;
                size = end - start;
-               addr = SN_PCIDEV_INFO(dev)->pdi_pio_mapped_addr[idx];
+               if (size == 0) {
+                       pci_addrs[idx] = -1;
+                       continue;
+               }
+               pci_addrs[idx] = start;
+               count++;
+               addr = pcidev_info->pdi_pio_mapped_addr[idx];
                addr = ((addr << 4) >> 4) | __IA64_UNCACHED_OFFSET;
                dev->resource[idx].start = addr;
                dev->resource[idx].end = addr + size;
@@ -294,23 +370,27 @@ void sn_pci_fixup_slot(struct pci_dev *dev)
                else
                        dev->resource[idx].parent = &iomem_resource;
        }
+       /* Create a pci_window in the pci_controller struct for
+        * each device resource.
+        */
+       if (count > 0)
+               sn_pci_window_fixup(dev, count, pci_addrs);
 
        /*
         * Using the PROMs values for the PCI host bus, get the Linux
         * PCI host_pci_dev struct and set up host bus linkages
         */
 
-       bus_no = (SN_PCIDEV_INFO(dev)->pdi_slot_host_handle >> 32) & 0xff;
-       devfn = SN_PCIDEV_INFO(dev)->pdi_slot_host_handle & 0xffffffff;
+       bus_no = (pcidev_info->pdi_slot_host_handle >> 32) & 0xff;
+       devfn = pcidev_info->pdi_slot_host_handle & 0xffffffff;
        host_pci_bus = pci_find_bus(segment, bus_no);
        host_pci_dev = pci_get_slot(host_pci_bus, devfn);
 
-       SN_PCIDEV_INFO(dev)->host_pci_dev = host_pci_dev;
-       SN_PCIDEV_INFO(dev)->pdi_host_pcidev_info =
-                                               SN_PCIDEV_INFO(host_pci_dev);
-       SN_PCIDEV_INFO(dev)->pdi_linux_pcidev = dev;
+       pcidev_info->host_pci_dev = host_pci_dev;
+       pcidev_info->pdi_linux_pcidev = dev;
+       pcidev_info->pdi_host_pcidev_info = SN_PCIDEV_INFO(host_pci_dev);
        bs = SN_PCIBUS_BUSSOFT(dev->bus);
-       SN_PCIDEV_INFO(dev)->pdi_pcibus_info = bs;
+       pcidev_info->pdi_pcibus_info = bs;
 
        if (bs && bs->bs_asic_type < PCIIO_ASIC_MAX_TYPES) {
                SN_PCIDEV_BUSPROVIDER(dev) = sn_pci_provider[bs->bs_asic_type];
@@ -320,11 +400,11 @@ void sn_pci_fixup_slot(struct pci_dev *dev)
 
        /* Only set up IRQ stuff if this device has a host bus context */
        if (bs && sn_irq_info->irq_irq) {
-               SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = sn_irq_info;
-               dev->irq = SN_PCIDEV_INFO(dev)->pdi_sn_irq_info->irq_irq;
+               pcidev_info->pdi_sn_irq_info = sn_irq_info;
+               dev->irq = pcidev_info->pdi_sn_irq_info->irq_irq;
                sn_irq_fixup(dev, sn_irq_info);
        } else {
-               SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = NULL;
+               pcidev_info->pdi_sn_irq_info = NULL;
                kfree(sn_irq_info);
        }
 }
@@ -338,6 +418,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
        int status = 0;
        int nasid, cnode;
        struct pci_controller *controller;
+       struct sn_pci_controller *sn_controller;
        struct pcibus_bussoft *prom_bussoft_ptr;
        struct hubdev_info *hubdev_info;
        void *provider_soft = NULL;
@@ -349,10 +430,15 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
                return;         /*bus # does not exist */
        prom_bussoft_ptr = __va(prom_bussoft_ptr);
 
-       controller = kzalloc(sizeof(struct pci_controller), GFP_KERNEL);
+       /* Allocate a sn_pci_controller, which has a pci_controller struct
+        * as the first member.
+        */
+       sn_controller = kzalloc(sizeof(struct sn_pci_controller), GFP_KERNEL);
+       if (!sn_controller)
+               BUG();
+       INIT_LIST_HEAD(&sn_controller->pcidev_info);
+       controller = &sn_controller->pci_controller;
        controller->segment = segment;
-       if (!controller)
-               BUG();
 
        if (bus == NULL) {
                bus = pci_scan_bus(busnum, &pci_root_ops, controller);
@@ -389,6 +475,29 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
                goto error_return;
        }
 
+       /*
+        * Setup pci_windows for legacy IO and MEM space.
+        * (Temporary until ACPI support is in place.)
+        */
+       controller->window = kcalloc(2, sizeof(struct pci_window), GFP_KERNEL);
+       if (controller->window == NULL)
+               BUG();
+       controller->window[0].offset = prom_bussoft_ptr->bs_legacy_io;
+       controller->window[0].resource.name = "legacy_io";
+       controller->window[0].resource.flags = IORESOURCE_IO;
+       controller->window[0].resource.start = prom_bussoft_ptr->bs_legacy_io;
+       controller->window[0].resource.end =
+           controller->window[0].resource.start + 0xffff;
+       controller->window[0].resource.parent = &ioport_resource;
+       controller->window[1].offset = prom_bussoft_ptr->bs_legacy_mem;
+       controller->window[1].resource.name = "legacy_mem";
+       controller->window[1].resource.flags = IORESOURCE_MEM;
+       controller->window[1].resource.start = prom_bussoft_ptr->bs_legacy_mem;
+       controller->window[1].resource.end =
+           controller->window[1].resource.start + (1024 * 1024) - 1;
+       controller->window[1].resource.parent = &iomem_resource;
+       controller->windows = 2;
+
        /*
         * Generic bus fixup goes here.  Don't reference prom_bussoft_ptr
         * after this point.
@@ -421,7 +530,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
 
 error_return:
 
-       kfree(controller);
+       kfree(sn_controller);
        return;
 }
 
@@ -434,7 +543,7 @@ void sn_bus_store_sysdata(struct pci_dev *dev)
                dev_dbg(dev, "%s: out of memory!\n", __FUNCTION__);
                return;
        }
-       element->sysdata = dev->sysdata;
+       element->sysdata = SN_PCIDEV_INFO(dev);
        list_add(&element->entry, &sn_sysdata_list);
 }
 
index 3fa95065a4460e618a4cb4d4e1979ed830fc6cee..bebbcc4f8dd408df200a3a7f330a78a04a6cc26a 100644 (file)
@@ -39,9 +39,13 @@ sn2_ptc_deadlock_recovery_core:
        mov     r8=r0
 
 1:
+       cmp.ne  p8,p9=r0,ptc1           // Test for shub type (ptc1 non-null on shub1)
+                                       // p8 = 1 if shub1, p9 = 1 if shub2
+
        add     scr2=ALIAS_OFFSET,piowc // Address of WRITE_STATUS alias register 
-       ;;
-       ld8.acq scr1=[scr2];;
+       mov     scr1=7;;                // Clear DEADLOCK, WRITE_ERROR, MULTI_WRITE_ERROR
+(p8)   st8.rel [scr2]=scr1;;
+(p9)   ld8.acq scr1=[scr2];;
 
 5:     ld8.acq scr1=[piowc];;          // Wait for PIOs to complete.
        hint    @pause
index 49b530c39a423d99ff59cf55d2ccdac4650705c6..471bbaa65d1b66b2762d0882aab345764bf0cdc7 100644 (file)
@@ -202,7 +202,7 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
                     unsigned long end, unsigned long nbits)
 {
        int i, opt, shub1, cnode, mynasid, cpu, lcpu = 0, nasid, flushed = 0;
-       int mymm = (mm == current->active_mm);
+       int mymm = (mm == current->active_mm && current->mm);
        volatile unsigned long *ptc0, *ptc1;
        unsigned long itc, itc2, flags, data0 = 0, data1 = 0, rr_value;
        short nasids[MAX_NUMNODES], nix;
@@ -492,6 +492,9 @@ static struct proc_dir_entry *proc_sn2_ptc;
 
 static int __init sn2_ptc_init(void)
 {
+       if (!ia64_platform_is("sn2"))
+               return -ENOSYS;
+
        if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) {
                printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME);
                return -EINVAL;
index 6c6fbca3229c9625964c1801c8ba480d7ab5c492..19b54fbcd7eaf790c7136571b81f79e2ae1dc1a0 100644 (file)
@@ -743,13 +743,14 @@ sn_hwperf_ioctl(struct inode *in, struct file *fp, u32 op, u64 arg)
                if ((r = sn_hwperf_enum_objects(&nobj, &objs)) == 0) {
                        memset(p, 0, a.sz);
                        for (i = 0; i < nobj; i++) {
+                               int cpuobj_index = 0;
                                if (!SN_HWPERF_IS_NODE(objs + i))
                                        continue;
                                node = sn_hwperf_obj_to_cnode(objs + i);
                                for_each_online_cpu(j) {
                                        if (node != cpu_to_node(j))
                                                continue;
-                                       cpuobj = (struct sn_hwperf_object_info *) p + j;
+                                       cpuobj = (struct sn_hwperf_object_info *) p + cpuobj_index++;
                                        slice = 'a' + cpuid_to_slice(j);
                                        cdata = cpu_data(j);
                                        cpuobj->id = j;
index 5d534091262c9f8a4a545a8e748e8defa38ab488..79fdb91d7259f96895120e21074d6ae74e4bcc5f 100644 (file)
@@ -25,7 +25,7 @@ union br_ptr {
  */
 void pcireg_control_bit_clr(struct pcibus_info *pcibus_info, uint64_t bits)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -38,14 +38,14 @@ void pcireg_control_bit_clr(struct pcibus_info *pcibus_info, uint64_t bits)
                default:
                        panic
                            ("pcireg_control_bit_clr: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
 
 void pcireg_control_bit_set(struct pcibus_info *pcibus_info, uint64_t bits)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -58,7 +58,7 @@ void pcireg_control_bit_set(struct pcibus_info *pcibus_info, uint64_t bits)
                default:
                        panic
                            ("pcireg_control_bit_set: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
@@ -68,7 +68,7 @@ void pcireg_control_bit_set(struct pcibus_info *pcibus_info, uint64_t bits)
  */
 uint64_t pcireg_tflush_get(struct pcibus_info *pcibus_info)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
        uint64_t ret = 0;
 
        if (pcibus_info) {
@@ -82,7 +82,7 @@ uint64_t pcireg_tflush_get(struct pcibus_info *pcibus_info)
                default:
                        panic
                            ("pcireg_tflush_get: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 
@@ -98,7 +98,7 @@ uint64_t pcireg_tflush_get(struct pcibus_info *pcibus_info)
  */
 uint64_t pcireg_intr_status_get(struct pcibus_info * pcibus_info)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
        uint64_t ret = 0;
 
        if (pcibus_info) {
@@ -112,7 +112,7 @@ uint64_t pcireg_intr_status_get(struct pcibus_info * pcibus_info)
                default:
                        panic
                            ("pcireg_intr_status_get: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
        return ret;
@@ -123,7 +123,7 @@ uint64_t pcireg_intr_status_get(struct pcibus_info * pcibus_info)
  */
 void pcireg_intr_enable_bit_clr(struct pcibus_info *pcibus_info, uint64_t bits)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -136,14 +136,14 @@ void pcireg_intr_enable_bit_clr(struct pcibus_info *pcibus_info, uint64_t bits)
                default:
                        panic
                            ("pcireg_intr_enable_bit_clr: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
 
 void pcireg_intr_enable_bit_set(struct pcibus_info *pcibus_info, uint64_t bits)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -156,7 +156,7 @@ void pcireg_intr_enable_bit_set(struct pcibus_info *pcibus_info, uint64_t bits)
                default:
                        panic
                            ("pcireg_intr_enable_bit_set: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
@@ -167,7 +167,7 @@ void pcireg_intr_enable_bit_set(struct pcibus_info *pcibus_info, uint64_t bits)
 void pcireg_intr_addr_addr_set(struct pcibus_info *pcibus_info, int int_n,
                               uint64_t addr)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -186,7 +186,7 @@ void pcireg_intr_addr_addr_set(struct pcibus_info *pcibus_info, int int_n,
                default:
                        panic
                            ("pcireg_intr_addr_addr_get: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
@@ -196,7 +196,7 @@ void pcireg_intr_addr_addr_set(struct pcibus_info *pcibus_info, int int_n,
  */
 void pcireg_force_intr_set(struct pcibus_info *pcibus_info, int int_n)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -209,7 +209,7 @@ void pcireg_force_intr_set(struct pcibus_info *pcibus_info, int int_n)
                default:
                        panic
                            ("pcireg_force_intr_set: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
@@ -219,7 +219,7 @@ void pcireg_force_intr_set(struct pcibus_info *pcibus_info, int int_n)
  */
 uint64_t pcireg_wrb_flush_get(struct pcibus_info *pcibus_info, int device)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
        uint64_t ret = 0;
 
        if (pcibus_info) {
@@ -233,7 +233,7 @@ uint64_t pcireg_wrb_flush_get(struct pcibus_info *pcibus_info, int device)
                            __sn_readq_relaxed(&ptr->pic.p_wr_req_buf[device]);
                        break;
                default:
-                     panic("pcireg_wrb_flush_get: unknown bridgetype bridge 0x%p", (void *)ptr);
+                     panic("pcireg_wrb_flush_get: unknown bridgetype bridge 0x%p", ptr);
                }
 
        }
@@ -244,7 +244,7 @@ uint64_t pcireg_wrb_flush_get(struct pcibus_info *pcibus_info, int device)
 void pcireg_int_ate_set(struct pcibus_info *pcibus_info, int ate_index,
                        uint64_t val)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -257,15 +257,15 @@ void pcireg_int_ate_set(struct pcibus_info *pcibus_info, int ate_index,
                default:
                        panic
                            ("pcireg_int_ate_set: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
 }
 
-uint64_t *pcireg_int_ate_addr(struct pcibus_info *pcibus_info, int ate_index)
+uint64_t __iomem *pcireg_int_ate_addr(struct pcibus_info *pcibus_info, int ate_index)
 {
-       union br_ptr *ptr = (union br_ptr *)pcibus_info->pbi_buscommon.bs_base;
-       uint64_t *ret = (uint64_t *) 0;
+       union br_ptr __iomem *ptr = (union br_ptr __iomem *)pcibus_info->pbi_buscommon.bs_base;
+       uint64_t __iomem *ret = NULL;
 
        if (pcibus_info) {
                switch (pcibus_info->pbi_bridge_type) {
@@ -278,7 +278,7 @@ uint64_t *pcireg_int_ate_addr(struct pcibus_info *pcibus_info, int ate_index)
                default:
                        panic
                            ("pcireg_int_ate_addr: unknown bridgetype bridge 0x%p",
-                            (void *)ptr);
+                            ptr);
                }
        }
        return ret;
index 46b646a6d3459b228adbab5124b0d8580e7e71b5..27aa1842daccb038a85c0fb2346cbf9ebe60dc5f 100644 (file)
@@ -38,10 +38,10 @@ tioca_gart_init(struct tioca_kernel *tioca_kern)
        uint64_t offset;
        struct page *tmp;
        struct tioca_common *tioca_common;
-       struct tioca *ca_base;
+       struct tioca __iomem *ca_base;
 
        tioca_common = tioca_kern->ca_common;
-       ca_base = (struct tioca *)tioca_common->ca_common.bs_base;
+       ca_base = (struct tioca __iomem *)tioca_common->ca_common.bs_base;
 
        if (list_empty(tioca_kern->ca_devices))
                return 0;
@@ -215,7 +215,7 @@ tioca_fastwrite_enable(struct tioca_kernel *tioca_kern)
 {
        int cap_ptr;
        uint32_t reg;
-       struct tioca *tioca_base;
+       struct tioca __iomem *tioca_base;
        struct pci_dev *pdev;
        struct tioca_common *common;
 
@@ -257,7 +257,7 @@ tioca_fastwrite_enable(struct tioca_kernel *tioca_kern)
         * Set ca's fw to match
         */
 
-       tioca_base = (struct tioca *)common->ca_common.bs_base;
+       tioca_base = (struct tioca __iomem*)common->ca_common.bs_base;
        __sn_setq_relaxed(&tioca_base->ca_control1, CA_AGP_FW_ENABLE);
 }
 
@@ -322,7 +322,7 @@ static uint64_t
 tioca_dma_d48(struct pci_dev *pdev, uint64_t paddr)
 {
        struct tioca_common *tioca_common;
-       struct tioca *ca_base;
+       struct tioca __iomem *ca_base;
        uint64_t ct_addr;
        dma_addr_t bus_addr;
        uint32_t node_upper;
@@ -330,7 +330,7 @@ tioca_dma_d48(struct pci_dev *pdev, uint64_t paddr)
        struct pcidev_info *pcidev_info = SN_PCIDEV_INFO(pdev);
 
        tioca_common = (struct tioca_common *)pcidev_info->pdi_pcibus_info;
-       ca_base = (struct tioca *)tioca_common->ca_common.bs_base;
+       ca_base = (struct tioca __iomem *)tioca_common->ca_common.bs_base;
 
        ct_addr = PHYS_TO_TIODMA(paddr);
        if (!ct_addr)
index 6716ffea769a17b9d4423acfd79ccbea81c060ca..f80321a58764c71b882c50e5f509259314bdacdf 100644 (file)
@@ -36,12 +36,13 @@ static inline void *_port2addr(unsigned long port)
        return (void *)(port + NONCACHE_OFFSET);
 }
 
-#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
+#if defined(CONFIG_IDE)
 static inline void *__port2addr_ata(unsigned long port)
 {
        static int      dummy_reg;
 
        switch (port) {
+         /* IDE0 CF */
        case 0x1f0:     return (void *)0xb4002000;
        case 0x1f1:     return (void *)0xb4012800;
        case 0x1f2:     return (void *)0xb4012002;
@@ -51,6 +52,17 @@ static inline void *__port2addr_ata(unsigned long port)
        case 0x1f6:     return (void *)0xb4012006;
        case 0x1f7:     return (void *)0xb4012806;
        case 0x3f6:     return (void *)0xb401200e;
+         /* IDE1 IDE */
+       case 0x170:     return (void *)0xb4810000;  /* Data 16bit */
+       case 0x171:     return (void *)0xb4810002;  /* Features / Error */
+       case 0x172:     return (void *)0xb4810004;  /* Sector count */
+       case 0x173:     return (void *)0xb4810006;  /* Sector number */
+       case 0x174:     return (void *)0xb4810008;  /* Cylinder low */
+       case 0x175:     return (void *)0xb481000a;  /* Cylinder high */
+       case 0x176:     return (void *)0xb481000c;  /* Device head */
+       case 0x177:     return (void *)0xb481000e;  /* Command     */
+       case 0x376:     return (void *)0xb480800c;  /* Device control / Alt status */
+
        default:        return (void *)&dummy_reg;
        }
 }
@@ -108,8 +120,9 @@ 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) {
+#if defined(CONFIG_IDE)
+       else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                return *(volatile unsigned char *)__port2addr_ata(port);
        }
 #endif
@@ -127,8 +140,9 @@ 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) {
+#if defined(CONFIG_IDE)
+       else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                return *(volatile unsigned short *)__port2addr_ata(port);
        }
 #endif
@@ -185,8 +199,9 @@ 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) {
+#if defined(CONFIG_IDE)
+       if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                *(volatile unsigned char *)__port2addr_ata(port) = b;
        } else
 #endif
@@ -203,8 +218,9 @@ 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) {
+#if defined(CONFIG_IDE)
+       if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                *(volatile unsigned short *)__port2addr_ata(port) = w;
        } else
 #endif
@@ -253,8 +269,9 @@ 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) {
+#if defined(CONFIG_IDE)
+       else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                unsigned char *buf = addr;
                unsigned char *portp = __port2addr_ata(port);
                while (count--)
@@ -289,8 +306,9 @@ void _insw(unsigned int port, void * addr, unsigned long count)
                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) {
+#if defined(CONFIG_IDE)
+       } else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                portp = __port2addr_ata(port);
                while (count--)
                        *buf++ = *(volatile unsigned short *)portp;
@@ -321,8 +339,9 @@ void _outsb(unsigned int port, const void * addr, unsigned long count)
                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) {
+#if defined(CONFIG_IDE)
+       } else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                portp = __port2addr_ata(port);
                while (count--)
                        *(volatile unsigned char *)portp = *buf++;
@@ -348,8 +367,9 @@ void _outsw(unsigned int port, const void * addr, unsigned long count)
                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) {
+#if defined(CONFIG_IDE)
+       } else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) ||
+                 ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){
                portp = __port2addr_ata(port);
                while (count--)
                        *(volatile unsigned short *)portp = *buf++;
index 9c79341a7b455711c165da735893f61cad8cef37..f6ecdf7f555ceb4ba2e04805398db3cb0e5e67a5 100644 (file)
@@ -151,7 +151,7 @@ void __init init_IRQ(void)
        disable_mappi3_irq(M32R_IRQ_INT1);
 #endif /* CONFIG_USB */
 
-       /* ICUCR40: CFC IREQ */
+       /* 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;
@@ -160,7 +160,7 @@ void __init init_IRQ(void)
        disable_mappi3_irq(PLD_IRQ_CFIREQ);
 
 #if defined(CONFIG_M32R_CFC)
-       /* ICUCR41: CFC Insert */
+       /* ICUCR41: CFC Insert & eject */
        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;
@@ -168,14 +168,16 @@ void __init init_IRQ(void)
        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 */
+
+       /* IDE IREQ */
+       irq_desc[PLD_IRQ_IDEIREQ].status = IRQ_DISABLED;
+       irq_desc[PLD_IRQ_IDEIREQ].handler = &mappi3_irq_type;
+       irq_desc[PLD_IRQ_IDEIREQ].action = 0;
+       irq_desc[PLD_IRQ_IDEIREQ].depth = 1;    /* disable nested irq */
+       icu_data[PLD_IRQ_IDEIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
+       disable_mappi3_irq(PLD_IRQ_IDEIREQ);
+
 }
 
 #if defined(CONFIG_SMC91X)
index e0500e12c5fbbb934c7debc9dc84dd1d7d1300dc..fe55b28d3725b48ed48e5fcdab52902592aa2d4e 100644 (file)
@@ -41,7 +41,8 @@ asmlinkage int sys_tas(int *addr)
                return -EFAULT;
        local_irq_save(flags);
        oldval = *addr;
-       *addr = 1;
+       if (!oldval)
+               *addr = 1;
        local_irq_restore(flags);
        return oldval;
 }
@@ -59,7 +60,8 @@ asmlinkage int sys_tas(int *addr)
 
        _raw_spin_lock(&tas_lock);
        oldval = *addr;
-       *addr = 1;
+       if (!oldval)
+               *addr = 1;
        _raw_spin_unlock(&tas_lock);
 
        return oldval;
index e380a8322a94f922a65959b75f5f2f49b985c658..b50be449d3f5997f87c3466fc062509f4424154c 100644 (file)
@@ -6,8 +6,6 @@ config MIPS
 
 mainmenu "Linux/MIPS Kernel Configuration"
 
-source "init/Kconfig"
-
 menu "Machine selection"
 
 choice
@@ -1643,6 +1641,8 @@ config RWSEM_GENERIC_SPINLOCK
        bool
        default y
 
+source "init/Kconfig"
+
 menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)"
 
 config HW_HAS_EISA
index ac05ba0ff63f3db9ea05b9f82f9b3a1c099a1591..f00ec3b175d8e46fcebb0e81eabb1afec75daa58 100644 (file)
 #include <asm/mach-au1x00/au1000.h>
 #include <asm/mach-db1x00/db1x00.h>
 
-/* not correct for db1550 */
-static BCSR * const bcsr = (BCSR *)0xAE000000;
+static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
 
 void board_reset (void)
 {
        /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
-       au_writel(0x00000000, 0xAE00001C);
+       bcsr->swreset = 0x0000;
 }
 
 void __init board_setup(void)
@@ -75,7 +74,7 @@ void __init board_setup(void)
        bcsr->resets |= BCSR_RESETS_IRDA_MODE_OFF;
        au_sync();
 #endif
-       au_writel(0, 0xAE000010); /* turn off pcmcia power */
+       bcsr->pcmcia = 0x0000; /* turn off PCMCIA power */
 
 #ifdef CONFIG_MIPS_MIRAGE
        /* enable GPIO[31:0] inputs */
index 4b9d5e46edbbc42133fdbd268967c2ddc213adc0..41e0522f3cf1583b2eabf89da16bca3ff06db0f2 100644 (file)
@@ -61,7 +61,17 @@ void __init prom_init(void)
        prom_envp = (char **) fw_arg2;
 
        mips_machgroup = MACH_GROUP_ALCHEMY;
-       mips_machtype = MACH_DB1000;    /* set the platform # */
+
+       /* Set the platform # */
+#if    defined (CONFIG_MIPS_DB1550)
+       mips_machtype = MACH_DB1550;
+#elif  defined (CONFIG_MIPS_DB1500)
+       mips_machtype = MACH_DB1500;
+#elif  defined (CONFIG_MIPS_DB1100)
+       mips_machtype = MACH_DB1100;
+#else
+       mips_machtype = MACH_DB1000;
+#endif
 
        prom_init_cmdline();
 
index 74990758154b24171f4a472361332b9095e0db4a..89c21572a59cf94a480167466d615b6f453d2eb1 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 12:14:02 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:05:52 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -214,6 +145,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
index ea4b75604c2301ff336e994aae2a344888d82be0..069f9d14983e036e24d6237322bb8a29f745a526 100644 (file)
@@ -1,82 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:04:36 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:05:54 2005
 #
 CONFIG_MIPS=y
 
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_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=y
-CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
-CONFIG_INITRAMFS_SOURCE=""
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -223,6 +151,78 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT is not set
 # CONFIG_PREEMPT_BKL is not set
 
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_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=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
+CONFIG_INITRAMFS_SOURCE=""
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -318,7 +318,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index a86cc9d9bdaeeed3028994074986ef0c12a53003..5261e29ccf3794ae69c64d70c9c028887b19f584 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:04:39 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:05:55 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -205,6 +136,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -294,7 +294,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 3558c79b0eb79df0e6c8e59d5ceca9c839ec39f1..216f4023a81b01cbbb1bc546602be1db6282ea8c 100644 (file)
@@ -1,73 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:04:42 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:05:57 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -195,6 +132,69 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -280,7 +280,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 3b103fec7b86a05b4b765f75b5131a2155fa426e..18ac7926c05895a8b2541d505755d5c8994c5426 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:11:04 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:05:59 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -201,6 +132,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -320,7 +320,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -668,6 +667,7 @@ CONFIG_SYNCLINK_CS=m
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 79cdd940c6a8a35c3f4f7382215f19f29f18561b..4f55f7414c9cd32af09763edc982459c89a312f2 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:11:07 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:00 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -201,6 +132,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -309,7 +309,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -636,6 +635,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index b6bad69398e1b3ecf8f52dc7a38380a03d587e50..0e5de7d05f23c538b12ea088cf6c22c94df6c629 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:11:10 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:03 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -202,6 +132,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -314,7 +314,6 @@ CONFIG_NETFILTER=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -475,7 +474,6 @@ CONFIG_IDE_GENERIC=y
 CONFIG_BLK_DEV_IDE_AU1XXX=y
 CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA=y
 # CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA is not set
-# CONFIG_BLK_DEV_IDE_AU1XXX_BURSTABLE_ON is not set
 CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ=128
 # CONFIG_IDE_ARM is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
@@ -709,6 +707,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index dbaf189fc9c0e3d663dc5ae734084b2eba86181a..86e7be8412f3dc2566b04d2d97e9204c2ce810b6 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:11:15 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:05 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -203,6 +134,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -328,7 +328,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 59c1ef214fc0bbd2460edfedd8b846ea996addcd..ea5ab0ca5774f7d31b69df26f67833a6ac912c40 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:11:18 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:07 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -202,6 +133,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -327,7 +327,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 4ba29e612bdf8409f2a6b063716ca843e4291ac4..bea00a9e9269ccf1532835bb22bcd01dcf39979c 100644 (file)
@@ -1,73 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:04 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:09 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -196,6 +133,69 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -285,7 +285,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index ea4e9046bbeebe271b4c2d088645fe6f3fef0386..61f7171ca7edd867b792eb1f33d88266faa83ea0 100644 (file)
@@ -1,73 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:08 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:11 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -196,6 +133,69 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -284,7 +284,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 1ac6c9b7ef963c4e5fa929084b11d727413ec3a0..08a4de6ec4a69056a7ecfe21a08c59d5d9f84ecf 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Fri Nov 11 13:29:30 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:13 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-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
-# 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=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -201,6 +131,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+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
+# 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=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -286,7 +286,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -531,6 +530,7 @@ CONFIG_RTC=y
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index a89d2f66cdfa5d22adf35d7190db2cf2fc950ea2..c9070cef08b1b9db010adcdbbd4b59416eb43403 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:15 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:14 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -203,6 +134,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -286,7 +286,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -577,6 +576,7 @@ CONFIG_GPIO_VR41XX=y
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index e6c3c27f41fef5432b63c47633797bb79b0c28ac..14e3815f11e6fb885c8e967397b00b2e9ec5ab7d 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Wed Nov  9 11:05:12 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:16 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-# CONFIG_KMOD is not set
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -204,6 +135,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -291,7 +291,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 52ca6bf5be66f74ad7a737c7369518f6764e7939..510819581d8aacf89a84ffeb230d54bb6a8a6fb3 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:22 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:18 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-# CONFIG_KMOD is not set
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -208,6 +139,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -293,7 +293,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -531,6 +530,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 79e3fe7e2d54a576b35850f473e39c42c68d98a9..67979e3e606e645ce383237b60baead9933cbd9b 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 13:38:41 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:20 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -210,6 +140,76 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -779,6 +779,7 @@ CONFIG_MAX_RAW_DEVS=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 72998ec35b0b4c730e059e603b8cbb249e17aaa2..03af44d1d846cc490e43d3f5a9552ff2bdb9ad23 100644 (file)
@@ -1,81 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Sun Nov 13 23:56:52 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:21 2005
 #
 CONFIG_MIPS=y
 
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-# 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=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -212,6 +141,77 @@ CONFIG_PREEMPT_NONE=y
 CONFIG_PREEMPT_BKL=y
 # CONFIG_MIPS_INSANE_LARGE is not set
 
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+# 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=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
index 955e30f1b1add9a9076f9ea8b27c9f53dae39876..cba2a49cceb1bd7816b425c2f14fcdeca517c096 100644 (file)
@@ -1,73 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:32 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:24 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-# CONFIG_IKCONFIG is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -201,6 +138,69 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -294,7 +294,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index f631385217db94b177397c9cfe677fbdfd19d53a..e7ee1679af9060fc9602a30b9c9564e12f68f021 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 13:42:45 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:26 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -204,6 +134,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -290,7 +290,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -628,6 +627,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 8d94ac753e7898bb86845a7cacce799605331082..138c8a60a4dc054a78c1f8a070699279ae5a7364 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:38 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:27 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-# CONFIG_IKCONFIG is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -201,6 +131,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -289,7 +289,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index a8b4c9a9a63b008c6fd2b7c0aa0080027b2eb2c8..6238e0d6a43051d96c8f2fa254416f3820ec9f70 100644 (file)
@@ -1,77 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:41 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:29 2005
 #
 CONFIG_MIPS=y
 
-#
-# Code maturity level options
-#
-# CONFIG_EXPERIMENTAL is not set
-CONFIG_CLEAN_COMPILE=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# 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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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_OBSOLETE_MODPARM=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -208,6 +141,73 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# Code maturity level options
+#
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# 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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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_OBSOLETE_MODPARM=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -283,7 +283,6 @@ CONFIG_IPV6_TUNNEL=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index c0ac5c793ec7478a92b93fdd607ff51f3c3de869..a8ded3d74152dd7bff901867d9d7d4e763e6498e 100644 (file)
@@ -1,73 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:44 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:31 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -192,6 +129,69 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT is not set
 CONFIG_RTC_DS1742=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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -280,7 +280,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index f2bd620ff0fa3979d998240ad5bd6e56fb666865..a7ad99b12fe5bcf47302e209f21109163d6e45c5 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:47 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:33 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -207,6 +138,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -291,7 +291,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index e48e1de442b433348d0c63aee90b967c6f2d6f55..d1c44216f1c11d2443e74fd13d5fb09007de584b 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 13:42:55 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:35 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -220,6 +151,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
index 04abd1b3202b5087d120ed34ad3dbdfba778fbc4..ac39ab7feeb78d774ebd7154671927e9813e4785 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:05:55 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:37 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -207,6 +137,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -558,6 +558,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 46814be0ac38a2e79c9910dd4ef9cea2cfa18a94..2b5ea37484e449dcf9b3fa005a908d68d12fc5bd 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:12:01 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:39 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -205,6 +136,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -304,7 +304,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index e12118c30db4d19a8d65809a6a7bd496db74cee0..9081ea5a9dbd202f3663ae5d89606653b232b0a7 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 14:01:36 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:41 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -211,6 +141,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -333,7 +333,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 99f0c980aee77f33c939a6afcf2fdacb66e52f23..570fc4d18166383624fb1817386f45a2de8b8536 100644 (file)
@@ -1,72 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:05 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:43 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -198,6 +136,68 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -290,7 +290,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 11c7d74ee1e5e55398ba1dbaf216b67c1a872558..6634ab24715c62ba320254f4c058332a0543aac6 100644 (file)
@@ -1,73 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:08 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:44 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -204,6 +141,69 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -289,7 +289,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -527,6 +526,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 9ced1a9029d4d37f5bf817350bce8984c8165cd2..4c396e1e2f0aa3629e875a638d4a26875c734625 100644 (file)
@@ -1,72 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:11 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:46 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -201,6 +139,68 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -293,7 +293,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index dbcaa77add7cd3023cd418aca2c3f286c8a79cab..883626afc47d77904cb6c282326d0fc3c44fab5a 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:12:31 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:48 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -203,6 +134,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -322,7 +322,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -662,6 +661,7 @@ CONFIG_SYNCLINK_CS=m
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 5b685ceb6fded5fefd89bcfa944f1b4273916dab..f8fbc77f924ed75f98c155460a4dca0477c888eb 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:14:25 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:50 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -202,6 +133,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -328,7 +328,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index f8f32e99f72d675239e971f28c1922aebc252282..3d694cd68d38841df4e4fe6feed2a9fb50583bfc 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:15:34 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:52 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -202,6 +133,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -328,7 +328,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 5820e5f2295ec44fe8b88b13158ebf19d9858c36..fba624a792a914eea4d2c30dcd2c3707595fb235 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:25 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:54 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_INITRAMFS_SOURCE=""
-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
-# 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 is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -202,6 +132,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INITRAMFS_SOURCE=""
+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
+# 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 is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -289,7 +289,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index a4ebb538e15c4fa4f05cb49cc6c7ced99bdfbf76..d9a0d2fdba4f68a2d44d819f9812681aa656e939 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 14:02:38 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:06:58 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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 is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -203,6 +134,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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 is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -321,7 +321,6 @@ CONFIG_NETFILTER=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 5d39162077f4dc56e0aaeef29c158cf5de6ca1c1..dee44606164c85e86b67a1892ba842b9563a3981 100644 (file)
@@ -1,72 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:31 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:00 2005
 #
 CONFIG_MIPS=y
 
-#
-# Code maturity level options
-#
-# CONFIG_EXPERIMENTAL is not set
-CONFIG_CLEAN_COMPILE=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-# CONFIG_SWAP is not set
-# CONFIG_SYSVIPC is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_SYSCTL is not set
-# CONFIG_AUDIT is not set
-# CONFIG_HOTPLUG is not set
-CONFIG_KOBJECT_UEVENT=y
-# CONFIG_IKCONFIG is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_PRINTK=y
-# CONFIG_BUG is not set
-# CONFIG_BASE_FULL is not set
-# CONFIG_FUTEX is not set
-# CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_SHMEM is not set
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-CONFIG_TINY_SHMEM=y
-CONFIG_BASE_SMALL=1
-
-#
-# Loadable module support
-#
-# CONFIG_MODULES is not set
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-CONFIG_DEFAULT_NOOP=y
-CONFIG_DEFAULT_IOSCHED="noop"
-
 #
 # Machine selection
 #
@@ -191,6 +129,68 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# Code maturity level options
+#
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SWAP is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_SYSCTL is not set
+# CONFIG_AUDIT is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+# CONFIG_BUG is not set
+# CONFIG_BASE_FULL is not set
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+# CONFIG_SHMEM is not set
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=1
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -258,7 +258,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 047e0b4236f8298cd7de207e153d889ff8b30d66..1cc145023584312f7992609fad7892bc9db394ed 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 14:02:45 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:03 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS 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 is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -211,6 +142,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS 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 is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -333,7 +333,6 @@ CONFIG_NETFILTER_NETLINK_LOG=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 55458062352e27c76267134fc891a5b6fc9bd039..30975b305ae55daacfc031b68ec464d95756f0c1 100644 (file)
@@ -1,81 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 14:02:50 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:06 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -213,6 +142,77 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -1199,6 +1199,7 @@ CONFIG_USB_USS720=m
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 CONFIG_USB_SERIAL_AIRPRIME=m
+CONFIG_USB_SERIAL_ANYDATA=m
 CONFIG_USB_SERIAL_BELKIN=m
 CONFIG_USB_SERIAL_WHITEHEAT=m
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
@@ -1230,7 +1231,6 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
 CONFIG_USB_SERIAL_KLSI=m
 CONFIG_USB_SERIAL_KOBIL_SCT=m
 CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NOKIA_DKU2 is not set
 CONFIG_USB_SERIAL_PL2303=m
 CONFIG_USB_SERIAL_HP4X=m
 CONFIG_USB_SERIAL_SAFE=m
index dc453a1e4806fe13ee5408a008a2223e1c52a66c..63f1be18e9bf66bd62119b6c4cc1e867bef10d41 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:43 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:09 2005
 #
 CONFIG_MIPS=y
 
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_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 is not set
-CONFIG_CPUSETS=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -225,6 +155,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT is not set
 CONFIG_PREEMPT_BKL=y
 
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_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 is not set
+CONFIG_CPUSETS=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -318,7 +318,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index aa27d583162dd05617f13e7fa578b81ed007a776..41dd7082497606f6359a526b8f8ae38ec21fc848 100644 (file)
@@ -1,70 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:45 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:10 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-# CONFIG_SWAP is not set
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-# CONFIG_HOTPLUG is not set
-# CONFIG_IKCONFIG is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -196,6 +136,66 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_HOTPLUG is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -363,6 +363,7 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index ddc7e45996f28f0cc192728485cd4da341e14b64..83969466ecf67dc844c4aaf8873df82c0210ebe6 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:49 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:12 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -206,6 +137,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -301,7 +301,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index e8c82f011e989b6d637ec82df39e14cfb261ae23..ce7b9ed44432258b1423a868ec9aee12743057dc 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Wed Nov  9 11:11:47 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:15 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -206,6 +137,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -302,7 +302,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index 125b2997abfe6054b68e5369969b7fb7fa536142..02b2551023d468b8536a529d26051e33cf1f5696 100644 (file)
@@ -1,79 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 11:17:02 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:17 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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 is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -203,6 +134,75 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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 is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -297,7 +297,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -609,6 +608,7 @@ CONFIG_WATCHDOG=y
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index d90790b2ab30bcb18feec62aa7d2fb33c6cbc32b..d51d5d16297c0f1ab2c852ae2c3e341fb27f2690 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Mon Nov  7 23:06:59 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:07:19 2005
 #
 CONFIG_MIPS=y
 
-#
-# Code maturity level options
-#
-# CONFIG_EXPERIMENTAL is not set
-CONFIG_CLEAN_COMPILE=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_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_INITRAMFS_SOURCE=""
-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
-# 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_OBSOLETE_MODPARM=y
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -207,6 +137,76 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT is not set
 CONFIG_PREEMPT_BKL=y
 
+#
+# Code maturity level options
+#
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_CLEAN_COMPILE=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_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_INITRAMFS_SOURCE=""
+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
+# 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_OBSOLETE_MODPARM=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -284,7 +284,6 @@ CONFIG_IPV6_TUNNEL=m
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
index e9086da02e48cd694a150ce5662cb623d4658d2a..2a1b844da43f8e76d21ddcfb1a980ce92da37fbd 100644 (file)
@@ -1,80 +1,10 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Thu Nov 10 12:13:58 2005
+# Linux kernel version: 2.6.15-rc2
+# Thu Nov 24 01:05:49 2005
 #
 CONFIG_MIPS=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_LOCALVERSION_AUTO=y
-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=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-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
-# 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=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
 #
 # Machine selection
 #
@@ -210,6 +140,76 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
 
+#
+# 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_LOCALVERSION_AUTO=y
+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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+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
+# 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=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
@@ -779,6 +779,7 @@ CONFIG_MAX_RAW_DEVS=256
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
 
 #
index 7cbe14483f13dcbaaf8e5e2ea8bb84878c91db34..2810727f1d4e64312708827e6f8c88c4f5fab4e6 100644 (file)
@@ -113,7 +113,8 @@ static void jmr3927_irq_ack(unsigned int irq)
 
 static void jmr3927_irq_end(unsigned int irq)
 {
-       jmr3927_irq_enable(irq);
+       if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
+               jmr3927_irq_enable(irq);
 }
 
 static void jmr3927_irq_disable(unsigned int irq_nr)
@@ -121,7 +122,7 @@ static void jmr3927_irq_disable(unsigned int irq_nr)
        struct tb_irq_space* sp;
        unsigned long flags;
 
-       spinlock_irqsave(&jmr3927_irq_lock, flags);
+       spin_lock_irqsave(&jmr3927_irq_lock, flags);
        for (sp = tb_irq_spaces; sp; sp = sp->next) {
                if (sp->start_irqno <= irq_nr &&
                    irq_nr < sp->start_irqno + sp->nr_irqs) {
@@ -131,7 +132,7 @@ static void jmr3927_irq_disable(unsigned int irq_nr)
                        break;
                }
        }
-       spinlock_irqrestore(&jmr3927_irq_lock, flags);
+       spin_unlock_irqrestore(&jmr3927_irq_lock, flags);
 }
 
 static void jmr3927_irq_enable(unsigned int irq_nr)
@@ -139,7 +140,7 @@ static void jmr3927_irq_enable(unsigned int irq_nr)
        struct tb_irq_space* sp;
        unsigned long flags;
 
-       spinlock_irqsave(&jmr3927_irq_lock, flags);
+       spin_lock_irqsave(&jmr3927_irq_lock, flags);
        for (sp = tb_irq_spaces; sp; sp = sp->next) {
                if (sp->start_irqno <= irq_nr &&
                    irq_nr < sp->start_irqno + sp->nr_irqs) {
@@ -149,7 +150,7 @@ static void jmr3927_irq_enable(unsigned int irq_nr)
                        break;
                }
        }
-       spinlock_irqrestore(&jmr3927_irq_lock, flags);
+       spin_unlock_irqrestore(&jmr3927_irq_lock, flags);
 }
 
 /*
@@ -205,7 +206,10 @@ static void mask_irq_irc(int irq_nr, int space_id)
        /* update IRCSR */
        tx3927_ircptr->imr = 0;
        tx3927_ircptr->imr = irc_elevel;
+       /* flush write buffer */
+       (void)tx3927_ircptr->ssr;
 }
+
 static void unmask_irq_irc(int irq_nr, int space_id)
 {
        volatile unsigned long *ilrp = &tx3927_ircptr->ilr[irq_nr / 2];
@@ -276,7 +280,7 @@ void jmr3927_irc_irqdispatch(struct pt_regs *regs)
        do_IRQ(irq + JMR3927_IRQ_IRC, regs);
 }
 
-static void jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
        unsigned char istat = jmr3927_ioc_reg_in(JMR3927_IOC_INTS2_ADDR);
        int i;
@@ -287,13 +291,14 @@ static void jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        do_IRQ(irq, regs);
                }
        }
+       return IRQ_HANDLED;
 }
 
 static struct irqaction ioc_action = {
        jmr3927_ioc_interrupt, 0, CPU_MASK_NONE, "IOC", NULL, NULL,
 };
 
-static void jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
        unsigned char istat = jmr3927_isac_reg_in(JMR3927_ISAC_INTS2_ADDR);
        int i;
@@ -304,6 +309,7 @@ static void jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        do_IRQ(irq, regs);
                }
        }
+       return IRQ_HANDLED;
 }
 
 static struct irqaction isac_action = {
@@ -311,19 +317,23 @@ static struct irqaction isac_action = {
 };
 
 
-static void jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
+static irqreturn_t jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
 {
        printk(KERN_WARNING "ISA error interrupt (irq 0x%x).\n", irq);
+
+       return IRQ_HANDLED;
 }
 static struct irqaction isaerr_action = {
        jmr3927_isaerr_interrupt, 0, CPU_MASK_NONE, "ISA error", NULL, NULL,
 };
 
-static void jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
+static irqreturn_t jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
 {
        printk(KERN_WARNING "PCI error interrupt (irq 0x%x).\n", irq);
        printk(KERN_WARNING "pcistat:%02x, lbstat:%04lx\n",
               tx3927_pcicptr->pcistat, tx3927_pcicptr->lbstat);
+
+       return IRQ_HANDLED;
 }
 static struct irqaction pcierr_action = {
        jmr3927_pcierr_interrupt, 0, CPU_MASK_NONE, "PCI error", NULL, NULL,
index 55ad0a578794a510d7a158b470b832b88e6c315e..4763957df8fc8d5a23e2e98bd89eecc6343f8d1d 100644 (file)
@@ -60,6 +60,8 @@
 #include <asm/mipsregs.h>
 #include <asm/traps.h>
 
+extern void puts(unsigned char *cp);
+
 /* Tick Timer divider */
 #define JMR3927_TIMER_CCD      0       /* 1/2 */
 #define JMR3927_TIMER_CLK      (JMR3927_IMCLK / (2 << JMR3927_TIMER_CCD))
index a263fb7a39715aa9e4dd8014cdb8ca9631617d9f..5e1b08b00a33912f4567beb6c8463e4476f1c1d0 100644 (file)
@@ -417,7 +417,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
        case PRID_IMP_R10000:
                c->cputype = CPU_R10000;
                c->isa_level = MIPS_CPU_ISA_IV;
-               c->options = MIPS_CPU_TLB | MIPS_CPU_4KEX |
+               c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
                             MIPS_CPU_FPU | MIPS_CPU_32FPR |
                             MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
                             MIPS_CPU_LLSC;
@@ -426,7 +426,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
        case PRID_IMP_R12000:
                c->cputype = CPU_R12000;
                c->isa_level = MIPS_CPU_ISA_IV;
-               c->options = MIPS_CPU_TLB | MIPS_CPU_4KEX |
+               c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
                             MIPS_CPU_FPU | MIPS_CPU_32FPR |
                             MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
                             MIPS_CPU_LLSC;
index dd118c60bcd0676f69c6a841de91cf4f7ee96a23..08273a2a501d5ca1b837a80bbf1826d269b90113 100644 (file)
@@ -279,8 +279,6 @@ irix_sigreturn(struct pt_regs *regs)
        /*
         * Don't let your children do this ...
         */
-       if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
-               do_syscall_trace(regs, 1);
        __asm__ __volatile__(
                "move\t$29,%0\n\t"
                "j\tsyscall_exit"
@@ -783,8 +781,6 @@ asmlinkage void irix_setcontext(struct pt_regs *regs)
        /*
         * Don't let your children do this ...
         */
-       if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
-               do_syscall_trace(regs, 1);
        __asm__ __volatile__(
                "move\t$29,%0\n\t"
                "j\tsyscall_exit"
index 330cf84d21feaf298636fe09b6d9be10d2637d03..60353f5acc48a42794bc9f5d19635a507e638176 100644 (file)
@@ -420,7 +420,7 @@ asmlinkage ssize_t sys32_pread(unsigned int fd, char * buf,
                goto out;
        pos = merge_64(a4, a5);
        ret = rw_verify_area(READ, file, &pos, count);
-       if (ret)
+       if (ret < 0)
                goto out;
        ret = -EINVAL;
        if (!file->f_op || !(read = file->f_op->read))
@@ -455,7 +455,7 @@ asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char * buf,
                goto out;
        pos = merge_64(a4, a5);
        ret = rw_verify_area(WRITE, file, &pos, count);
-       if (ret)
+       if (ret < 0)
                goto out;
        ret = -EINVAL;
        if (!file->f_op || !(write = file->f_op->write))
index 4dd8e8b4fbc217094312bc5d637238fd8724ff10..a42e0e8caa7b229292954bd2e1a33fb1865ce307 100644 (file)
@@ -94,11 +94,13 @@ syscall_trace_entry:
        li      a1, 0
        jal     do_syscall_trace
 
+       move    t0, s0
+       RESTORE_STATIC
        lw      a0, PT_R4(sp)           # Restore argument registers
        lw      a1, PT_R5(sp)
        lw      a2, PT_R6(sp)
        lw      a3, PT_R7(sp)
-       jalr    s0
+       jalr    t0
 
        li      t0, -EMAXERRNO - 1      # error?
        sltu    t0, t0, v0
@@ -241,19 +243,7 @@ illegal_syscall:
        sw      zero, PT_R7(sp)         # success
        sw      v0, PT_R2(sp)           # result
 
-       /* Success, so skip usual error handling garbage.  */
-       lw      a2, TI_FLAGS($28)       # syscall tracing enabled?
-       li      t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
-       and     t0, a2, t0
-       bnez    t0, 1f
-
-       j       o32_syscall_exit
-
-1:     SAVE_STATIC
-       move    a0, sp
-       li      a1, 1
-       jal     do_syscall_trace
-       j       syscall_exit
+       j       o32_syscall_exit        # continue like a normal syscall
 
 no_mem:        li      v0, -ENOMEM
        jr      ra
index 9085838d6ce3c5546694865d6761ae0653cb3e76..47bfbd416709cadb1e4fa96a0b32c20b026e80be 100644 (file)
@@ -93,13 +93,15 @@ syscall_trace_entry:
        li      a1, 0
        jal     do_syscall_trace
 
+       move    t0, s0
+       RESTORE_STATIC
        ld      a0, PT_R4(sp)           # Restore argument registers
        ld      a1, PT_R5(sp)
        ld      a2, PT_R6(sp)
        ld      a3, PT_R7(sp)
        ld      a4, PT_R8(sp)
        ld      a5, PT_R9(sp)
-       jalr    s0
+       jalr    t0
 
        li      t0, -EMAXERRNO - 1      # error?
        sltu    t0, t0, v0
@@ -174,19 +176,7 @@ illegal_syscall:
        sd      zero, PT_R7(sp)         # success
        sd      v0, PT_R2(sp)           # result
 
-       /* Success, so skip usual error handling garbage.  */
-       li      t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
-       LONG_L  a2, TI_FLAGS($28)       # syscall tracing enabled?
-       and     t0, a2, t0
-       bnez    t0, 1f
-
-       j       n64_syscall_exit
-
-1:     SAVE_STATIC
-       move    a0, sp
-       li      a1, 1
-       jal     do_syscall_trace
-       j       syscall_exit
+       j       n64_syscall_exit        # continue like a normal syscall
 
 no_mem:        li      v0, -ENOMEM
        jr      ra
index 7e66eb823bf6a4c4d05a5776b1dd5dad8ba3f77b..b465ced1758f7a49f35cd085b2289162a7fa3037 100644 (file)
@@ -90,13 +90,15 @@ n32_syscall_trace_entry:
        li      a1, 0
        jal     do_syscall_trace
 
+       move    t0, s0
+       RESTORE_STATIC
        ld      a0, PT_R4(sp)           # Restore argument registers
        ld      a1, PT_R5(sp)
        ld      a2, PT_R6(sp)
        ld      a3, PT_R7(sp)
        ld      a4, PT_R8(sp)
        ld      a5, PT_R9(sp)
-       jalr    s0
+       jalr    t0
 
        li      t0, -EMAXERRNO - 1      # error?
        sltu    t0, t0, v0
index 5a16401e443a3c8b8103357a9c79a91fd5e4ca52..3d338ca7eeeb1ca82529f03268cb0f6bf54999ce 100644 (file)
@@ -124,6 +124,8 @@ trace_a_syscall:
        li      a1, 0
        jal     do_syscall_trace
 
+       move    t0, s0
+       RESTORE_STATIC
        ld      a0, PT_R4(sp)           # Restore argument registers
        ld      a1, PT_R5(sp)
        ld      a2, PT_R6(sp)
@@ -132,7 +134,7 @@ trace_a_syscall:
        ld      a5, PT_R9(sp)
        ld      a6, PT_R10(sp)
        ld      a7, PT_R11(sp)          # For indirect syscalls
-       jalr    s0
+       jalr    t0
 
        li      t0, -EMAXERRNO - 1      # error?
        sltu    t0, t0, v0
index 05e09eedabffb015bd24bf83a589d25647fa5158..7d1800fe70382dbb37650bf00b65c4cf5a86c1fe 100644 (file)
@@ -220,8 +220,6 @@ _sys_sigreturn(nabi_no_regargs struct pt_regs regs)
        /*
         * Don't let your children do this ...
         */
-       if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
-               do_syscall_trace(&regs, 1);
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
index e315d3f6aa6e57ccf33e018eb32ea647a3d949b1..c856dbc52abbe68d7a9434ac202c78696548b238 100644 (file)
@@ -497,8 +497,6 @@ _sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
        /*
         * Don't let your children do this ...
         */
-       if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
-               do_syscall_trace(&regs, 1);
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
index 6f3ff96906864e29244670df11a05e509820bd91..7058893d5ad2227259746895558f47644e6d66bd 100644 (file)
@@ -534,13 +534,14 @@ static inline int simulate_rdhwr(struct pt_regs *regs)
                switch (rd) {
                        case 29:
                                regs->regs[rt] = ti->tp_value;
-                               break;
+                               return 0;
                        default:
                                return -EFAULT;
                }
        }
 
-       return 0;
+       /* Not ours.  */
+       return -EFAULT;
 }
 
 asmlinkage void do_ov(struct pt_regs *regs)
index f75ab748e8cd3dc86dc1886f8858bb37958a7e56..4ee91c9a556fed7f53dfb534cfc8d474392952a7 100644 (file)
@@ -67,8 +67,8 @@ unsigned long setup_zero_pages(void)
 
        page = virt_to_page(empty_zero_page);
        while (page < virt_to_page(empty_zero_page + (PAGE_SIZE << order))) {
-               set_bit(PG_reserved, &page->flags);
-               set_page_count(page, 0);
+               SetPageReserved(page);
+               set_page_count(page, 1);
                page++;
        }
 
index 5980f02b2df9d1ac4df4bab2865cada707bc1d65..fb2a8673a6bf5c0b1d8ef9f150f8531a7f48c360 100644 (file)
@@ -1,7 +1,18 @@
 #include <linux/init.h>
+#include <linux/string.h>
+#include <asm/addrspace.h>
 #include <asm/bootinfo.h>
 
 void __init prom_init(void)
 {
-       add_memory_region(0x0<<20, 0x10<<20, BOOT_MEM_RAM);
+       int *cmdline;
+
+       cmdline = (int *) (CKSEG0 + (0x10 << 20) - 260);
+       if (*cmdline == 0x12345678) {
+               if (*(char *)(cmdline + 1))
+                       strcpy (arcs_cmdline, (char *)(cmdline + 1));
+               add_memory_region(0x0<<20, cmdline[-1], BOOT_MEM_RAM);
+       } else {
+               add_memory_region(0x0<<20, 0x10<<20, BOOT_MEM_RAM);
+       }
 }
index bb2efdd566a9d590d64184b10b097e4b7ed17e95..db93dbc0e21a9896ee25c8dcc1c517f8f330d5cd 100644 (file)
@@ -227,7 +227,7 @@ config SMP
          If you don't know what to do here, say N.
 
 config NR_CPUS
-       int "Maximum number of CPUs (2-32)"
+       int "Maximum number of CPUs (2-128)"
        range 2 128
        depends on SMP
        default "32" if PPC64
index 98f67c78d1bd9ad191b6fe9a97849e0f0bf68b70..a13eb575f834c2520d30276aba3e5545ac66f310 100644 (file)
@@ -61,15 +61,17 @@ endif
 LDFLAGS_vmlinux        := -Bstatic
 
 # The -Iarch/$(ARCH)/include is temporary while we are merging
-CPPFLAGS       += -Iarch/$(ARCH) -Iarch/$(ARCH)/include
-AFLAGS         += -Iarch/$(ARCH)
-CFLAGS         += -Iarch/$(ARCH) -msoft-float -pipe
+CPPFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH) -Iarch/$(ARCH)/include
+AFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH)
 CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=none  -mcall-aixdesc
-CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple
-CFLAGS         += $(CFLAGS-y)
+CFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH) -ffixed-r2 -mmultiple
+CPPFLAGS       += $(CPPFLAGS-y)
+AFLAGS         += $(AFLAGS-y)
+CFLAGS         += -msoft-float -pipe $(CFLAGS-y)
 CPP            = $(CC) -E $(CFLAGS)
 # Temporary hack until we have migrated to asm-powerpc
-LINUXINCLUDE    += -Iarch/$(ARCH)/include
+LINUXINCLUDE-$(CONFIG_PPC32)   := -Iarch/$(ARCH)/include
+LINUXINCLUDE    += $(LINUXINCLUDE-y)
 
 CHECKFLAGS     += -m$(SZ) -D__powerpc__ -D__powerpc$(SZ)__
 
@@ -173,11 +175,13 @@ archclean:
 
 archprepare: checkbin
 
+ifeq ($(CONFIG_PPC32),y)
 # Temporary hack until we have migrated to asm-powerpc
 include/asm: arch/$(ARCH)/include/asm
 arch/$(ARCH)/include/asm: FORCE
        $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
        $(Q)ln -fsn $(srctree)/include/asm-$(OLDARCH) arch/$(ARCH)/include/asm
+endif
 
 # Use the file '.tmp_gas_check' for binutils tests, as gas won't output
 # to stdout and these checks are run even on install targets.
index 4b433411b9e3e435f6a1a9e00b7db8aaa3a44d04..b657f7e447624b28424dbf35d6fb342a6d1e8a9d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 14:36:20 2005
+# Linux kernel version: 2.6.15-rc5
+# Tue Dec 20 15:59:26 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -53,6 +53,7 @@ CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
 # CONFIG_CPUSETS is not set
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -151,7 +152,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PPC_64K_PAGES is not set
 CONFIG_SCHED_SMT=y
 CONFIG_PROC_DEVICETREE=y
index e7c23e3902b8b0ea0545bb55e09f5bf37c57f9be..3c22ccb185194bbb782e6645fdad164658312fc9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 14:39:20 2005
+# Linux kernel version: 2.6.15-rc5
+# Tue Dec 20 15:59:30 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -53,6 +53,7 @@ CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 # CONFIG_CPUSETS is not set
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -162,7 +163,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
 CONFIG_PROC_DEVICETREE=y
@@ -1203,6 +1204,7 @@ CONFIG_USB_MON=y
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 # CONFIG_USB_SERIAL_AIRPRIME is not set
+# CONFIG_USB_SERIAL_ANYDATA is not set
 CONFIG_USB_SERIAL_BELKIN=m
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
 # CONFIG_USB_SERIAL_CP2101 is not set
@@ -1233,7 +1235,6 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
 CONFIG_USB_SERIAL_KLSI=m
 CONFIG_USB_SERIAL_KOBIL_SCT=m
 CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NOKIA_DKU2 is not set
 CONFIG_USB_SERIAL_PL2303=m
 # CONFIG_USB_SERIAL_HP4X is not set
 CONFIG_USB_SERIAL_SAFE=m
index 5d0866707a75190a26014de2b242b078bc1310b9..751a622fb7a787db68ab68f8a8c7df308218324a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 14:38:09 2005
+# Linux kernel version: 2.6.15-rc5
+# Tue Dec 20 15:59:32 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -55,6 +55,7 @@ CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 # CONFIG_CPUSETS is not set
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -144,7 +145,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
 CONFIG_PROC_DEVICETREE=y
index 92e42613ef0683cff8368b51faca83a5128aa562..07b6d3d23360a1828a9e64f0ea0932d1a0f09140 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 14:38:58 2005
+# Linux kernel version: 2.6.15-rc5
+# Tue Dec 20 15:59:36 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -53,6 +53,7 @@ CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 # CONFIG_CPUSETS is not set
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
@@ -149,7 +150,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
 CONFIG_PROC_DEVICETREE=y
@@ -242,7 +243,6 @@ CONFIG_TCP_CONG_BIC=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
@@ -794,6 +794,7 @@ 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_ANYDATA 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
@@ -824,7 +825,6 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
 # CONFIG_USB_SERIAL_KLSI is not set
 # CONFIG_USB_SERIAL_KOBIL_SCT is not set
 # CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_NOKIA_DKU2 is not set
 # CONFIG_USB_SERIAL_PL2303 is not set
 # CONFIG_USB_SERIAL_HP4X is not set
 # CONFIG_USB_SERIAL_SAFE is not set
index b5ba3bbd96fbd30fc6b4268265ac0a677e5b314e..509399eab6f58e8717587916799ad13719fc4a25 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Fri Nov 18 16:23:24 2005
+# Linux kernel version: 2.6.15-rc5
+# Tue Dec 20 15:59:38 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -54,6 +54,7 @@ CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_CPUSETS=y
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
@@ -176,7 +177,7 @@ CONFIG_HAVE_MEMORY_PRESENT=y
 # CONFIG_SPARSEMEM_STATIC is not set
 CONFIG_SPARSEMEM_EXTREME=y
 # CONFIG_MEMORY_HOTPLUG is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_SCHED_SMT is not set
 CONFIG_PROC_DEVICETREE=y
index b589b196eb3f2824a6840d68ef1afa710a24f0f9..a50ce0fa9243862c2facd9709348042eed8a5250 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1
-# Tue Nov 15 14:36:55 2005
+# Linux kernel version: 2.6.15-rc5
+# Tue Dec 20 15:59:40 2005
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -55,6 +55,7 @@ CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_CPUSETS=y
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
@@ -163,7 +164,7 @@ CONFIG_HAVE_MEMORY_PRESENT=y
 # CONFIG_SPARSEMEM_STATIC is not set
 CONFIG_SPARSEMEM_EXTREME=y
 # CONFIG_MEMORY_HOTPLUG is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
 # CONFIG_PPC_64K_PAGES is not set
 CONFIG_SCHED_SMT=y
index 2d22bf03484ee2b47ab46b19d5209b579fcfd17f..bce33a38399fb41f04a12157a154aca99a8c82e9 100644 (file)
@@ -183,8 +183,8 @@ syscall_exit_trace_cont:
        ld      r13,GPR13(r1)           /* returning to usermode */
 1:     ld      r2,GPR2(r1)
        li      r12,MSR_RI
-       andc    r10,r10,r12
-       mtmsrd  r10,1                   /* clear MSR.RI */
+       andc    r11,r10,r12
+       mtmsrd  r11,1                   /* clear MSR.RI */
        ld      r1,GPR1(r1)
        mtlr    r4
        mtcr    r5
index 511af54e6230ca13eeba65dd7765dcb9f7c8947c..5368f9c2e6bff7707c040812f1260c8269d1373d 100644 (file)
@@ -177,7 +177,7 @@ static inline int kprobe_handler(struct pt_regs *regs)
                        save_previous_kprobe(kcb);
                        set_current_kprobe(p, regs, kcb);
                        kcb->kprobe_saved_msr = regs->msr;
-                       p->nmissed++;
+                       kprobes_inc_nmissed_count(p);
                        prepare_singlestep(p, regs);
                        kcb->kprobe_status = KPROBE_REENTER;
                        return 1;
index 5a5b246850817984436aa8ee4e957fecaf017f3f..8b6008ab217d4f1d4b481defbeb3b1b871115aeb 100644 (file)
@@ -40,7 +40,7 @@
 #endif
 
 unsigned long pci_probe_only = 1;
-unsigned long pci_assign_all_buses = 0;
+int pci_assign_all_buses = 0;
 
 /*
  * legal IO pages under MAX_ISA_PORT.  This is to ensure we don't touch
@@ -55,11 +55,6 @@ static void fixup_resource(struct resource *res, struct pci_dev *dev);
 static void do_bus_setup(struct pci_bus *bus);
 #endif
 
-unsigned int pcibios_assign_all_busses(void)
-{
-       return pci_assign_all_buses;
-}
-
 /* pci_io_base -- the base address from which io bars are offsets.
  * This is the lowest I/O base address (so bar values are always positive),
  * and it *must* be the start of ISA space if an ISA bus exists because
@@ -1186,17 +1181,6 @@ void phbs_remap_io(void)
                remap_bus_range(hose->bus);
 }
 
-/*
- * ppc64 can have multifunction devices that do not respond to function 0.
- * In this case we must scan all functions.
- * XXX this can go now, we use the OF device tree in all the
- * cases that caused problems. -- paulus
- */
-int pcibios_scan_all_fns(struct pci_bus *bus, int devfn)
-{
-       return 0;
-}
-
 static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
index 59846b40d5216ebe16489e3074a36755083671e6..94db25708456857995cbe42c1a41a1936442617f 100644 (file)
@@ -146,9 +146,6 @@ EXPORT_SYMBOL(pci_bus_io_base);
 EXPORT_SYMBOL(pci_bus_io_base_phys);
 EXPORT_SYMBOL(pci_bus_mem_base_phys);
 EXPORT_SYMBOL(pci_bus_to_hose);
-EXPORT_SYMBOL(pci_resource_to_bus);
-EXPORT_SYMBOL(pci_phys_to_bus);
-EXPORT_SYMBOL(pci_bus_to_phys);
 #endif /* CONFIG_PCI */
 
 #ifdef CONFIG_NOT_COHERENT_CACHE
@@ -166,15 +163,13 @@ EXPORT_SYMBOL(giveup_altivec);
 EXPORT_SYMBOL(giveup_spe);
 #endif /* CONFIG_SPE */
 
-#ifdef CONFIG_PPC64
-EXPORT_SYMBOL(__flush_icache_range);
-#else
+#ifndef CONFIG_PPC64
 EXPORT_SYMBOL(flush_instruction_cache);
-EXPORT_SYMBOL(flush_icache_range);
 EXPORT_SYMBOL(flush_tlb_kernel_range);
 EXPORT_SYMBOL(flush_tlb_page);
 EXPORT_SYMBOL(_tlbie);
 #endif
+EXPORT_SYMBOL(__flush_icache_range);
 EXPORT_SYMBOL(flush_dcache_range);
 
 #ifdef CONFIG_SMP
index de69fb37c7313ce83d450bdbd6f5a15eb621bdd0..105d5609ff572dc63c2919808fffd2c89f019dbc 100644 (file)
@@ -201,6 +201,28 @@ int dump_spe(struct pt_regs *regs, elf_vrregset_t *evrregs)
 }
 #endif /* CONFIG_SPE */
 
+/*
+ * If we are doing lazy switching of CPU state (FP, altivec or SPE),
+ * and the current task has some state, discard it.
+ */
+static inline void discard_lazy_cpu_state(void)
+{
+#ifndef CONFIG_SMP
+       preempt_disable();
+       if (last_task_used_math == current)
+               last_task_used_math = NULL;
+#ifdef CONFIG_ALTIVEC
+       if (last_task_used_altivec == current)
+               last_task_used_altivec = NULL;
+#endif /* CONFIG_ALTIVEC */
+#ifdef CONFIG_SPE
+       if (last_task_used_spe == current)
+               last_task_used_spe = NULL;
+#endif
+       preempt_enable();
+#endif /* CONFIG_SMP */
+}
+
 int set_dabr(unsigned long dabr)
 {
        if (ppc_md.set_dabr)
@@ -434,19 +456,7 @@ void show_regs(struct pt_regs * regs)
 void exit_thread(void)
 {
        kprobe_flush_task(current);
-
-#ifndef CONFIG_SMP
-       if (last_task_used_math == current)
-               last_task_used_math = NULL;
-#ifdef CONFIG_ALTIVEC
-       if (last_task_used_altivec == current)
-               last_task_used_altivec = NULL;
-#endif /* CONFIG_ALTIVEC */
-#ifdef CONFIG_SPE
-       if (last_task_used_spe == current)
-               last_task_used_spe = NULL;
-#endif
-#endif /* CONFIG_SMP */
+       discard_lazy_cpu_state();
 }
 
 void flush_thread(void)
@@ -457,20 +467,8 @@ void flush_thread(void)
        if (t->flags & _TIF_ABI_PENDING)
                t->flags ^= (_TIF_ABI_PENDING | _TIF_32BIT);
 #endif
-       kprobe_flush_task(current);
 
-#ifndef CONFIG_SMP
-       if (last_task_used_math == current)
-               last_task_used_math = NULL;
-#ifdef CONFIG_ALTIVEC
-       if (last_task_used_altivec == current)
-               last_task_used_altivec = NULL;
-#endif /* CONFIG_ALTIVEC */
-#ifdef CONFIG_SPE
-       if (last_task_used_spe == current)
-               last_task_used_spe = NULL;
-#endif
-#endif /* CONFIG_SMP */
+       discard_lazy_cpu_state();
 
 #ifdef CONFIG_PPC64    /* for now */
        if (current->thread.dabr) {
@@ -636,18 +634,7 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
        }
 #endif
 
-#ifndef CONFIG_SMP
-       if (last_task_used_math == current)
-               last_task_used_math = NULL;
-#ifdef CONFIG_ALTIVEC
-       if (last_task_used_altivec == current)
-               last_task_used_altivec = NULL;
-#endif
-#ifdef CONFIG_SPE
-       if (last_task_used_spe == current)
-               last_task_used_spe = NULL;
-#endif
-#endif /* CONFIG_SMP */
+       discard_lazy_cpu_state();
        memset(current->thread.fpr, 0, sizeof(current->thread.fpr));
        current->thread.fpscr.val = 0;
 #ifdef CONFIG_ALTIVEC
index 4ce0105c308ea04b7be7fd88524b4c8b25fdef73..bcdc209dca8525b5337678a1fdb80ac09f58871f 100644 (file)
@@ -265,7 +265,7 @@ static int __init call_prom_ret(const char *service, int nargs, int nret,
        va_end(list);
 
        for (i = 0; i < nret; i++)
-               rets[nargs+i] = 0;
+               args.args[nargs+i] = 0;
 
        if (enter_prom(&args, RELOC(prom_entry)) < 0)
                return PROM_ERROR;
diff --git a/arch/powerpc/kernel/ptrace-common.h b/arch/powerpc/kernel/ptrace-common.h
new file mode 100644 (file)
index 0000000..b1babb7
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ *  linux/arch/ppc64/kernel/ptrace-common.h
+ *
+ *    Copyright (c) 2002 Stephen Rothwell, IBM Coproration
+ *    Extracted from ptrace.c and ptrace32.c
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License.  See the file README.legal in the main directory of
+ * this archive for more details.
+ */
+
+#ifndef _PPC64_PTRACE_COMMON_H
+#define _PPC64_PTRACE_COMMON_H
+
+#include <linux/config.h>
+#include <asm/system.h>
+
+/*
+ * Set of msr bits that gdb can change on behalf of a process.
+ */
+#define MSR_DEBUGCHANGE        (MSR_FE0 | MSR_SE | MSR_BE | MSR_FE1)
+
+/*
+ * Get contents of register REGNO in task TASK.
+ */
+static inline unsigned long get_reg(struct task_struct *task, int regno)
+{
+       unsigned long tmp = 0;
+
+       /*
+        * Put the correct FP bits in, they might be wrong as a result
+        * of our lazy FP restore.
+        */
+       if (regno == PT_MSR) {
+               tmp = ((unsigned long *)task->thread.regs)[PT_MSR];
+               tmp |= task->thread.fpexc_mode;
+       } else if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) {
+               tmp = ((unsigned long *)task->thread.regs)[regno];
+       }
+
+       return tmp;
+}
+
+/*
+ * Write contents of register REGNO in task TASK.
+ */
+static inline int put_reg(struct task_struct *task, int regno,
+                         unsigned long data)
+{
+       if (regno < PT_SOFTE) {
+               if (regno == PT_MSR)
+                       data = (data & MSR_DEBUGCHANGE)
+                               | (task->thread.regs->msr & ~MSR_DEBUGCHANGE);
+               ((unsigned long *)task->thread.regs)[regno] = data;
+               return 0;
+       }
+       return -EIO;
+}
+
+static inline void set_single_step(struct task_struct *task)
+{
+       struct pt_regs *regs = task->thread.regs;
+       if (regs != NULL)
+               regs->msr |= MSR_SE;
+       set_ti_thread_flag(task->thread_info, TIF_SINGLESTEP);
+}
+
+static inline void clear_single_step(struct task_struct *task)
+{
+       struct pt_regs *regs = task->thread.regs;
+       if (regs != NULL)
+               regs->msr &= ~MSR_SE;
+       clear_ti_thread_flag(task->thread_info, TIF_SINGLESTEP);
+}
+
+#ifdef CONFIG_ALTIVEC
+/*
+ * Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go.
+ * The transfer totals 34 quadword.  Quadwords 0-31 contain the
+ * corresponding vector registers.  Quadword 32 contains the vscr as the
+ * last word (offset 12) within that quadword.  Quadword 33 contains the
+ * vrsave as the first word (offset 0) within the quadword.
+ *
+ * This definition of the VMX state is compatible with the current PPC32
+ * ptrace interface.  This allows signal handling and ptrace to use the
+ * same structures.  This also simplifies the implementation of a bi-arch
+ * (combined (32- and 64-bit) gdb.
+ */
+
+/*
+ * Get contents of AltiVec register state in task TASK
+ */
+static inline int get_vrregs(unsigned long __user *data,
+                            struct task_struct *task)
+{
+       unsigned long regsize;
+
+       /* copy AltiVec registers VR[0] .. VR[31] */
+       regsize = 32 * sizeof(vector128);
+       if (copy_to_user(data, task->thread.vr, regsize))
+               return -EFAULT;
+       data += (regsize / sizeof(unsigned long));
+
+       /* copy VSCR */
+       regsize = 1 * sizeof(vector128);
+       if (copy_to_user(data, &task->thread.vscr, regsize))
+               return -EFAULT;
+       data += (regsize / sizeof(unsigned long));
+
+       /* copy VRSAVE */
+       if (put_user(task->thread.vrsave, (u32 __user *)data))
+               return -EFAULT;
+
+       return 0;
+}
+
+/*
+ * Write contents of AltiVec register state into task TASK.
+ */
+static inline int set_vrregs(struct task_struct *task,
+                            unsigned long __user *data)
+{
+       unsigned long regsize;
+
+       /* copy AltiVec registers VR[0] .. VR[31] */
+       regsize = 32 * sizeof(vector128);
+       if (copy_from_user(task->thread.vr, data, regsize))
+               return -EFAULT;
+       data += (regsize / sizeof(unsigned long));
+
+       /* copy VSCR */
+       regsize = 1 * sizeof(vector128);
+       if (copy_from_user(&task->thread.vscr, data, regsize))
+               return -EFAULT;
+       data += (regsize / sizeof(unsigned long));
+
+       /* copy VRSAVE */
+       if (get_user(task->thread.vrsave, (u32 __user *)data))
+               return -EFAULT;
+
+       return 0;
+}
+#endif
+
+static inline int ptrace_set_debugreg(struct task_struct *task,
+                                     unsigned long addr, unsigned long data)
+{
+       /* We only support one DABR and no IABRS at the moment */
+       if (addr > 0)
+               return -EINVAL;
+
+       /* The bottom 3 bits are flags */
+       if ((data & ~0x7UL) >= TASK_SIZE)
+               return -EIO;
+
+       /* Ensure translation is on */
+       if (data && !(data & DABR_TRANSLATION))
+               return -EIO;
+
+       task->thread.dabr = data;
+       return 0;
+}
+
+#endif /* _PPC64_PTRACE_COMMON_H */
index 3d2abd95c7aea05b23cfb8e9cc8db69ffd9e9838..400793c7130466bc535f02fff0acc32db9b833c2 100644 (file)
@@ -36,8 +36,9 @@
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
+
 #ifdef CONFIG_PPC64
-#include <asm/ptrace-common.h>
+#include "ptrace-common.h"
 #endif
 
 #ifdef CONFIG_PPC32
index 91eb952e0293c63d40580f0b82cde0068a60b140..61762640b8775ea1d1bfb7acb9f22c5b865708b5 100644 (file)
@@ -33,7 +33,8 @@
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
-#include <asm/ptrace-common.h>
+
+#include "ptrace-common.h"
 
 /*
  * does not yet catch signals sent when the child dies.
index 608fee7c7e20621dcf829507e893cbaee4ea05da..e3fb78397dc6d2b84e1f6fd8d0b7e9fc89e92ffe 100644 (file)
@@ -102,7 +102,15 @@ int boot_cpuid_phys = 0;
 dev_t boot_dev;
 u64 ppc64_pft_size;
 
-struct ppc64_caches ppc64_caches;
+/* Pick defaults since we might want to patch instructions
+ * before we've read this from the device tree.
+ */
+struct ppc64_caches ppc64_caches = {
+       .dline_size = 0x80,
+       .log_dline_size = 7,
+       .iline_size = 0x80,
+       .log_iline_size = 7
+};
 EXPORT_SYMBOL_GPL(ppc64_caches);
 
 /*
index f72ced11212d500a70e7569568f61e449fb72b24..91b93d917b64aea53aa5ccc54ff8bdfb9c2441b9 100644 (file)
@@ -247,7 +247,7 @@ long ppc64_personality(unsigned long personality)
 #define OVERRIDE_MACHINE    0
 #endif
 
-static inline int override_machine(char *mach)
+static inline int override_machine(char __user *mach)
 {
        if (OVERRIDE_MACHINE) {
                /* change ppc64 to ppc */
index 0d4d8bec0df4b4bc94419954fc2471216b710dbb..f0c47dab09030266d799bbf2544e94a6a2c0e872 100644 (file)
@@ -145,8 +145,7 @@ static void dump_vdso_pages(struct vm_area_struct * vma)
                        struct page *pg = virt_to_page(vdso32_kbase +
                                                       i*PAGE_SIZE);
                        struct page *upg = (vma && vma->vm_mm) ?
-                               follow_page(vma->vm_mm, vma->vm_start +
-                                           i*PAGE_SIZE, 0)
+                               follow_page(vma, vma->vm_start + i*PAGE_SIZE, 0)
                                : NULL;
                        dump_one_vdso_page(pg, upg);
                }
@@ -157,8 +156,7 @@ static void dump_vdso_pages(struct vm_area_struct * vma)
                        struct page *pg = virt_to_page(vdso64_kbase +
                                                       i*PAGE_SIZE);
                        struct page *upg = (vma && vma->vm_mm) ?
-                               follow_page(vma->vm_mm, vma->vm_start +
-                                           i*PAGE_SIZE, 0)
+                               follow_page(vma, vma->vm_start + i*PAGE_SIZE, 0)
                                : NULL;
                        dump_one_vdso_page(pg, upg);
                }
@@ -285,8 +283,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
         * It's fine to use that for setting breakpoints in the vDSO code
         * pages though
         */
-       vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE |
-               VM_MAYEXEC | VM_RESERVED;
+       vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
        vma->vm_flags |= mm->def_flags;
        vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
        vma->vm_ops = &vdso_vmops;
index b7bcbc232f394cfc891c255716af34ff3657b8c8..4d006aa1a0d19c69ae7f129cb39192552e8aa705 100644 (file)
@@ -110,13 +110,11 @@ unsigned long __init mmu_mapin_ram(void)
                pmd_t *pmdp;
                unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE;
 
-               spin_lock(&init_mm.page_table_lock);
                pmdp = pmd_offset(pgd_offset_k(v), v);
                pmd_val(*pmdp++) = val;
                pmd_val(*pmdp++) = val;
                pmd_val(*pmdp++) = val;
                pmd_val(*pmdp++) = val;
-               spin_unlock(&init_mm.page_table_lock);
 
                v += LARGE_PAGE_SIZE_16M;
                p += LARGE_PAGE_SIZE_16M;
@@ -127,10 +125,8 @@ unsigned long __init mmu_mapin_ram(void)
                pmd_t *pmdp;
                unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE;
 
-               spin_lock(&init_mm.page_table_lock);
                pmdp = pmd_offset(pgd_offset_k(v), v);
                pmd_val(*pmdp) = val;
-               spin_unlock(&init_mm.page_table_lock);
 
                v += LARGE_PAGE_SIZE_4M;
                p += LARGE_PAGE_SIZE_4M;
index 706e8a63ced93218334a227b62f5303595c27790..a606504678bd5aa318d3af992c4a117d96e41c66 100644 (file)
@@ -514,7 +514,7 @@ void __init htab_initialize(void)
 #undef KB
 #undef MB
 
-void __init htab_initialize_secondary(void)
+void htab_initialize_secondary(void)
 {
        if (!platform_is_lpar())
                mtspr(SPRN_SDR1, _SDR1);
@@ -601,7 +601,7 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
        /* Handle hugepage regions */
        if (unlikely(in_hugepage_area(mm->context, ea))) {
                DBG_LOW(" -> huge page !\n");
-               return hash_huge_page(mm, access, ea, vsid, local);
+               return hash_huge_page(mm, access, ea, vsid, local, trap);
        }
 
        /* Get PTE and page size from page tables */
index 426c269e552eec77bbee18cb086f900716cffb4a..54131b877da36cb3a827000d802ca76ce82507ad 100644 (file)
@@ -148,43 +148,63 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len)
        return 0;
 }
 
+struct slb_flush_info {
+       struct mm_struct *mm;
+       u16 newareas;
+};
+
 static void flush_low_segments(void *parm)
 {
-       u16 areas = (unsigned long) parm;
+       struct slb_flush_info *fi = parm;
        unsigned long i;
 
-       asm volatile("isync" : : : "memory");
+       BUILD_BUG_ON((sizeof(fi->newareas)*8) != NUM_LOW_AREAS);
+
+       if (current->active_mm != fi->mm)
+               return;
+
+       /* Only need to do anything if this CPU is working in the same
+        * mm as the one which has changed */
 
-       BUILD_BUG_ON((sizeof(areas)*8) != NUM_LOW_AREAS);
+       /* update the paca copy of the context struct */
+       get_paca()->context = current->active_mm->context;
 
+       asm volatile("isync" : : : "memory");
        for (i = 0; i < NUM_LOW_AREAS; i++) {
-               if (! (areas & (1U << i)))
+               if (! (fi->newareas & (1U << i)))
                        continue;
                asm volatile("slbie %0"
                             : : "r" ((i << SID_SHIFT) | SLBIE_C));
        }
-
        asm volatile("isync" : : : "memory");
 }
 
 static void flush_high_segments(void *parm)
 {
-       u16 areas = (unsigned long) parm;
+       struct slb_flush_info *fi = parm;
        unsigned long i, j;
 
-       asm volatile("isync" : : : "memory");
 
-       BUILD_BUG_ON((sizeof(areas)*8) != NUM_HIGH_AREAS);
+       BUILD_BUG_ON((sizeof(fi->newareas)*8) != NUM_HIGH_AREAS);
 
+       if (current->active_mm != fi->mm)
+               return;
+
+       /* Only need to do anything if this CPU is working in the same
+        * mm as the one which has changed */
+
+       /* update the paca copy of the context struct */
+       get_paca()->context = current->active_mm->context;
+
+       asm volatile("isync" : : : "memory");
        for (i = 0; i < NUM_HIGH_AREAS; i++) {
-               if (! (areas & (1U << i)))
+               if (! (fi->newareas & (1U << i)))
                        continue;
                for (j = 0; j < (1UL << (HTLB_AREA_SHIFT-SID_SHIFT)); j++)
                        asm volatile("slbie %0"
                                     :: "r" (((i << HTLB_AREA_SHIFT)
-                                            + (j << SID_SHIFT)) | SLBIE_C));
+                                             + (j << SID_SHIFT)) | SLBIE_C));
        }
-
        asm volatile("isync" : : : "memory");
 }
 
@@ -229,6 +249,7 @@ static int prepare_high_area_for_htlb(struct mm_struct *mm, unsigned long area)
 static int open_low_hpage_areas(struct mm_struct *mm, u16 newareas)
 {
        unsigned long i;
+       struct slb_flush_info fi;
 
        BUILD_BUG_ON((sizeof(newareas)*8) != NUM_LOW_AREAS);
        BUILD_BUG_ON((sizeof(mm->context.low_htlb_areas)*8) != NUM_LOW_AREAS);
@@ -244,19 +265,20 @@ static int open_low_hpage_areas(struct mm_struct *mm, u16 newareas)
 
        mm->context.low_htlb_areas |= newareas;
 
-       /* update the paca copy of the context struct */
-       get_paca()->context = mm->context;
-
        /* the context change must make it to memory before the flush,
         * so that further SLB misses do the right thing. */
        mb();
-       on_each_cpu(flush_low_segments, (void *)(unsigned long)newareas, 0, 1);
+
+       fi.mm = mm;
+       fi.newareas = newareas;
+       on_each_cpu(flush_low_segments, &fi, 0, 1);
 
        return 0;
 }
 
 static int open_high_hpage_areas(struct mm_struct *mm, u16 newareas)
 {
+       struct slb_flush_info fi;
        unsigned long i;
 
        BUILD_BUG_ON((sizeof(newareas)*8) != NUM_HIGH_AREAS);
@@ -280,22 +302,25 @@ static int open_high_hpage_areas(struct mm_struct *mm, u16 newareas)
        /* the context change must make it to memory before the flush,
         * so that further SLB misses do the right thing. */
        mb();
-       on_each_cpu(flush_high_segments, (void *)(unsigned long)newareas, 0, 1);
+
+       fi.mm = mm;
+       fi.newareas = newareas;
+       on_each_cpu(flush_high_segments, &fi, 0, 1);
 
        return 0;
 }
 
 int prepare_hugepage_range(unsigned long addr, unsigned long len)
 {
-       int err;
+       int err = 0;
 
        if ( (addr+len) < addr )
                return -EINVAL;
 
-       if ((addr + len) < 0x100000000UL)
+       if (addr < 0x100000000UL)
                err = open_low_hpage_areas(current->mm,
                                          LOW_ESID_MASK(addr, len));
-       else
+       if ((addr + len) > 0x100000000UL)
                err = open_high_hpage_areas(current->mm,
                                            HTLB_AREA_MASK(addr, len));
        if (err) {
@@ -639,8 +664,36 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
        return -ENOMEM;
 }
 
+/*
+ * Called by asm hashtable.S for doing lazy icache flush
+ */
+static unsigned int hash_huge_page_do_lazy_icache(unsigned long rflags,
+                                                 pte_t pte, int trap)
+{
+       struct page *page;
+       int i;
+
+       if (!pfn_valid(pte_pfn(pte)))
+               return rflags;
+
+       page = pte_page(pte);
+
+       /* page is dirty */
+       if (!test_bit(PG_arch_1, &page->flags) && !PageReserved(page)) {
+               if (trap == 0x400) {
+                       for (i = 0; i < (HPAGE_SIZE / PAGE_SIZE); i++)
+                               __flush_dcache_icache(page_address(page+i));
+                       set_bit(PG_arch_1, &page->flags);
+               } else {
+                       rflags |= HPTE_R_N;
+               }
+       }
+       return rflags;
+}
+
 int hash_huge_page(struct mm_struct *mm, unsigned long access,
-                  unsigned long ea, unsigned long vsid, int local)
+                  unsigned long ea, unsigned long vsid, int local,
+                  unsigned long trap)
 {
        pte_t *ptep;
        unsigned long old_pte, new_pte;
@@ -691,6 +744,11 @@ int hash_huge_page(struct mm_struct *mm, unsigned long access,
        rflags = 0x2 | (!(new_pte & _PAGE_RW));
        /* _PAGE_EXEC -> HW_NO_EXEC since it's inverted */
        rflags |= ((new_pte & _PAGE_EXEC) ? 0 : HPTE_R_N);
+       if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
+               /* No CPU has hugepages but lacks no execute, so we
+                * don't need to worry about that case */
+               rflags = hash_huge_page_do_lazy_icache(rflags, __pte(old_pte),
+                                                      trap);
 
        /* Check if pte already has an hpte (case 2) */
        if (unlikely(old_pte & _PAGE_HASHPTE)) {
@@ -703,7 +761,8 @@ int hash_huge_page(struct mm_struct *mm, unsigned long access,
                slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
                slot += (old_pte & _PAGE_F_GIX) >> 12;
 
-               if (ppc_md.hpte_updatepp(slot, rflags, va, 1, local) == -1)
+               if (ppc_md.hpte_updatepp(slot, rflags, va, mmu_huge_psize,
+                                        local) == -1)
                        old_pte &= ~_PAGE_HPTEFLAGS;
        }
 
@@ -754,9 +813,7 @@ repeat:
        }
 
        /*
-        * No need to use ldarx/stdcx here because all who
-        * might be updating the pte will hold the
-        * page_table_lock
+        * No need to use ldarx/stdcx here
         */
        *ptep = __pte(new_pte & ~_PAGE_BUSY);
 
index f4ca29cf53649b6c35941b1c942c9cecac7c6439..f9587bcc6a48f89f375269db28f4d827174e1e38 100644 (file)
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/semaphore.h>
-#include <asm/imalloc.h>
 #include <asm/cacheflush.h>
 
+#include "mmu_decl.h"
+
 static DECLARE_MUTEX(imlist_sem);
 struct vm_struct * imlist = NULL;
 
index 1134f70f231d43bc57d61cd208d791a34f0e4fbd..81cfb0c2ec58bf5bd1d056b48206b551b1aad935 100644 (file)
@@ -64,7 +64,8 @@
 #include <asm/iommu.h>
 #include <asm/abs_addr.h>
 #include <asm/vdso.h>
-#include <asm/imalloc.h>
+
+#include "mmu_decl.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) printk(fmt)
index 4bd7b0a70996a6e569790ef8652241d61edb37ba..ed6ed2e30daccaf09ff4967468fff97a312f5a02 100644 (file)
@@ -495,7 +495,7 @@ EXPORT_SYMBOL(flush_icache_user_range);
  * We use it to preload an HPTE into the hash table corresponding to
  * the updated linux PTE.
  * 
- * This must always be called with the mm->page_table_lock held
+ * This must always be called with the pte lock held.
  */
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
                      pte_t pte)
index a4d7a327c0e52bc409e8890a3b91bee4799dda32..bea2d21ac6f789eb642890d2fc086b8ec27e08dd 100644 (file)
@@ -33,7 +33,6 @@ extern void invalidate_tlbcam_entry(int index);
 
 extern int __map_without_bats;
 extern unsigned long ioremap_base;
-extern unsigned long ioremap_bot;
 extern unsigned int rtas_data, rtas_size;
 
 extern PTE *Hash, *Hash_end;
@@ -42,6 +41,7 @@ extern unsigned long Hash_size, Hash_mask;
 extern unsigned int num_tlbcam_entries;
 #endif
 
+extern unsigned long ioremap_bot;
 extern unsigned long __max_low_memory;
 extern unsigned long __initial_memory_limit;
 extern unsigned long total_memory;
@@ -84,4 +84,16 @@ static inline void flush_HPTE(unsigned context, unsigned long va,
        else
                _tlbie(va);
 }
+#else /* CONFIG_PPC64 */
+/* imalloc region types */
+#define IM_REGION_UNUSED       0x1
+#define IM_REGION_SUBSET       0x2
+#define IM_REGION_EXISTS       0x4
+#define IM_REGION_OVERLAP      0x8
+#define IM_REGION_SUPERSET     0x10
+
+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);
+extern void im_free(void *addr);
 #endif
index f72cf87364cb29d9953131fc1f0ef46d5a407087..ba7a3055a9fc42f20b70f80b7bc298f40137a559 100644 (file)
@@ -125,7 +125,7 @@ void __init get_region(unsigned int nid, unsigned long *start_pfn,
 
        /* We didnt find a matching region, return start/end as 0 */
        if (*start_pfn == -1UL)
-               start_pfn = 0;
+               *start_pfn = 0;
 }
 
 static inline void map_cpu_to_node(int cpu, int node)
index c7f7bb6f30b3698769951d6ba63141de9ae82074..2ffca63602c507ba1a201005e7441aee85ccfd3d 100644 (file)
@@ -64,7 +64,8 @@
 #include <asm/iommu.h>
 #include <asm/abs_addr.h>
 #include <asm/vdso.h>
-#include <asm/imalloc.h>
+
+#include "mmu_decl.h"
 
 unsigned long ioremap_bot = IMALLOC_BASE;
 static unsigned long phbs_io_bot = PHBS_IO_BASE;
index cfbb4e1f966b3331e7e89dda329ae925841616d1..51e7951414e5ca561b1d51257be70efe52a84139 100644 (file)
@@ -288,11 +288,6 @@ void stab_initialize(unsigned long stab)
                return;
        }
 #endif /* CONFIG_PPC_ISERIES */
-#ifdef CONFIG_PPC_PSERIES
-       if (platform_is_lpar()) {
-               plpar_hcall_norets(H_SET_ASR, stabreal);
-               return;
-       }
-#endif
+
        mtspr(SPRN_ASR, stabreal);
 }
index 6c3dc3c44c86da012cafde5b0ddc54b93ebef019..ad580f3742e5cf187bfe65cf6f7c1f948d3ff558 100644 (file)
@@ -149,6 +149,12 @@ void flush_tlb_mm(struct mm_struct *mm)
                return;
        }
 
+       /*
+        * It is safe to go down the mm's list of vmas when called
+        * from dup_mmap, holding mmap_sem.  It would also be safe from
+        * unmap_region or exit_mmap, but not from vmtruncate on SMP -
+        * but it seems dup_mmap is the only SMP case which gets here.
+        */
        for (mp = mm->mmap; mp != NULL; mp = mp->vm_next)
                flush_range(mp->vm_mm, mp->vm_start, mp->vm_end);
        FINISH_FLUSH;
index 53e31b834ace00f75dbc686321d9ddbeeab8eff7..859d29a0cac5c58c53752efd0df59477c14ea2ef 100644 (file)
@@ -95,7 +95,7 @@ static void pte_free_submit(struct pte_freelist_batch *batch)
 
 void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf)
 {
-       /* This is safe as we are holding page_table_lock */
+       /* This is safe since tlb_gather_mmu has disabled preemption */
         cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id());
        struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
 
@@ -206,7 +206,7 @@ void __flush_tlb_pending(struct ppc64_tlb_batch *batch)
 
 void pte_free_finish(void)
 {
-       /* This is safe as we are holding page_table_lock */
+       /* This is safe since tlb_gather_mmu has disabled preemption */
        struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
 
        if (*batchp == NULL)
index bf081b3458201deef96b0b9bd59216cd666ee985..2b54eeb2c8997c5f6c540c137824aea64513aec7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Rewrite, cleanup:
  *
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation
  *
  * Dynamic DMA mapping support, iSeries-specific parts.
  *
index 0d7fa00fcb00cd8d608b5045557a6f6f5128bb72..f6e22da2a5daa8dd27a2bcade5b12ff19599b60f 100644 (file)
@@ -1650,11 +1650,19 @@ void pmac_tweak_clock_spreading(int enable)
         */
 
        if (macio->type == macio_intrepid) {
-               if (enable)
-                       UN_OUT(UNI_N_CLOCK_SPREADING, 2);
-               else
-                       UN_OUT(UNI_N_CLOCK_SPREADING, 0);
-               mdelay(40);
+               struct device_node *clock =
+                       of_find_node_by_path("/uni-n@f8000000/hw-clock");
+               if (clock && get_property(clock, "platform-do-clockspreading",
+                                         NULL)) {
+                       printk(KERN_INFO "%sabling clock spreading on Intrepid"
+                              " ASIC\n", enable ? "En" : "Dis");
+                       if (enable)
+                               UN_OUT(UNI_N_CLOCK_SPREADING, 2);
+                       else
+                               UN_OUT(UNI_N_CLOCK_SPREADING, 0);
+                       mdelay(40);
+               }
+               of_node_put(clock);
        }
 
        while (machine_is_compatible("PowerBook5,2") ||
@@ -1724,6 +1732,9 @@ void pmac_tweak_clock_spreading(int enable)
                        pmac_low_i2c_close(ui2c);
                        break;
                }
+               printk(KERN_INFO "%sabling clock spreading on i2c clock chip\n",
+                      enable ? "En" : "Dis");
+
                pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_stdsub);
                rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_write, 0x80, buffer, 9);
                DBG("write result: %d,", rc);
index 957b091034220553fc6d48545d88e256350a2ef7..fb2a7c798e8278c51e8019e844f5600c134006e2 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/errno.h>
 #include <linux/hardirq.h>
 #include <linux/cpu.h>
+#include <linux/compiler.h>
 
 #include <asm/ptrace.h>
 #include <asm/atomic.h>
@@ -631,8 +632,9 @@ void smp_core99_give_timebase(void)
        mb();
 
        /* wait for the secondary to have taken it */
-       for (t = 100000; t > 0 && sec_tb_reset; --t)
-               udelay(10);
+       /* note: can't use udelay here, since it needs the timebase running */
+       for (t = 10000000; t > 0 && sec_tb_reset; --t)
+               barrier();
        if (sec_tb_reset)
                /* XXX BUG_ON here? */
                printk(KERN_WARNING "Timeout waiting sync(2) on second CPU\n");
index 97ba5214417f856a7371652e0df54a6863ab5085..2043659ea7b19cfb4fcde1ea7d2ce8ddd4768a3b 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Rewrite, cleanup: 
  *
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation
  *
  * Dynamic DMA mapping support, pSeries-specific parts, both SMP and LPAR.
  *
@@ -109,6 +109,9 @@ static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum,
        u64 rc;
        union tce_entry tce;
 
+       tcenum <<= TCE_PAGE_FACTOR;
+       npages <<= TCE_PAGE_FACTOR;
+
        tce.te_word = 0;
        tce.te_rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT;
        tce.te_rdwr = 1;
@@ -143,10 +146,7 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
        union tce_entry tce, *tcep;
        long l, limit;
 
-       tcenum <<= TCE_PAGE_FACTOR;
-       npages <<= TCE_PAGE_FACTOR;
-
-       if (npages == 1)
+       if (TCE_PAGE_FACTOR == 0 && npages == 1)
                return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr,
                                           direction);
 
@@ -164,6 +164,9 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
                __get_cpu_var(tce_page) = tcep;
        }
 
+       tcenum <<= TCE_PAGE_FACTOR;
+       npages <<= TCE_PAGE_FACTOR;
+
        tce.te_word = 0;
        tce.te_rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT;
        tce.te_rdwr = 1;
index a50e5f3f396dc177da02deea3cbad714d01be4ce..cf1bc11b334685264c296363f0a0dd06ca1b38cf 100644 (file)
@@ -298,18 +298,6 @@ long pSeries_lpar_hpte_insert(unsigned long hpte_group,
        if (!(vflags & HPTE_V_BOLTED))
                DBG_LOW(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r);
 
-#if 1
-       {
-               int i;
-               for (i=0;i<8;i++) {
-                       unsigned long w0, w1;
-                       plpar_pte_read(0, hpte_group, &w0, &w1);
-                       BUG_ON (HPTE_V_COMPARE(hpte_v, w0)
-                               && (w0 & HPTE_V_VALID));
-               }
-       }
-#endif
-
        /* Now fill in the actual HPTE */
        /* Set CEC cookie to 0         */
        /* Zero page = 0               */
index 72ac18067ecef58c4af36c49502e387be119d3fd..0377decc07190a4f6b7629f41ad73a43a82e921a 100644 (file)
@@ -48,11 +48,6 @@ static struct hw_interrupt_type xics_pic = {
        .set_affinity = xics_set_affinity
 };
 
-static struct hw_interrupt_type xics_8259_pic = {
-       .typename = " XICS/8259",
-       .ack = xics_mask_and_ack_irq,
-};
-
 /* This is used to map real irq numbers to virtual */
 static struct radix_tree_root irq_map = RADIX_TREE_INIT(GFP_ATOMIC);
 
@@ -367,12 +362,7 @@ int xics_get_irq(struct pt_regs *regs)
        /* for sanity, this had better be < NR_IRQS - 16 */
        if (vec == xics_irq_8259_cascade_real) {
                irq = i8259_irq(regs);
-               if (irq == -1) {
-                       /* Spurious cascaded interrupt.  Still must ack xics */
-                       xics_end_irq(irq_offset_up(xics_irq_8259_cascade));
-
-                       irq = -1;
-               }
+               xics_end_irq(irq_offset_up(xics_irq_8259_cascade));
        } else if (vec == XICS_IRQ_SPURIOUS) {
                irq = -1;
        } else {
@@ -542,6 +532,7 @@ nextnode:
                xics_irq_8259_cascade_real = *ireg;
                xics_irq_8259_cascade
                        = virt_irq_create_mapping(xics_irq_8259_cascade_real);
+               i8259_init(0, 0);
                of_node_put(np);
        }
 
@@ -565,12 +556,7 @@ nextnode:
 #endif /* CONFIG_SMP */
        }
 
-       xics_8259_pic.enable = i8259_pic.enable;
-       xics_8259_pic.disable = i8259_pic.disable;
-       xics_8259_pic.end = i8259_pic.end;
-       for (i = 0; i < 16; ++i)
-               get_irq_desc(i)->handler = &xics_8259_pic;
-       for (; i < NR_IRQS; ++i)
+       for (i = irq_offset_value(); i < NR_IRQS; ++i)
                get_irq_desc(i)->handler = &xics_pic;
 
        xics_setup_cpu();
@@ -590,7 +576,6 @@ static int __init xics_setup_i8259(void)
                                no_action, 0, "8259 cascade", NULL))
                        printk(KERN_ERR "xics_setup_i8259: couldn't get 8259 "
                                        "cascade\n");
-               i8259_init(0, 0);
        }
        return 0;
 }
index ea8f0d9eed8a14b752d6eb6eac7089f0fbf35ac3..33ed9ed7fc1e35f693d41d0369d47c8658d613af 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, 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
index 105f05341a414bdd3920857b2a0075a75fc33a87..58d1cc2023c843df763db2b4b3d11aa753172b05 100644 (file)
@@ -361,7 +361,8 @@ static void mpic_enable_irq(unsigned int irq)
        DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
 
        mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI,
-                      mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) & ~MPIC_VECPRI_MASK);
+                      mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) &
+                      ~MPIC_VECPRI_MASK);
 
        /* make sure mask gets to controller before we return to user */
        do {
@@ -381,7 +382,8 @@ static void mpic_disable_irq(unsigned int irq)
        DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
 
        mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI,
-                      mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) | MPIC_VECPRI_MASK);
+                      mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) |
+                      MPIC_VECPRI_MASK);
 
        /* make sure mask gets to controller before we return to user */
        do {
@@ -735,12 +737,13 @@ void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
 
        spin_lock_irqsave(&mpic_lock, flags);
        if (is_ipi) {
-               reg = mpic_ipi_read(irq - mpic->ipi_offset) & MPIC_VECPRI_PRIORITY_MASK;
+               reg = mpic_ipi_read(irq - mpic->ipi_offset) &
+                       ~MPIC_VECPRI_PRIORITY_MASK;
                mpic_ipi_write(irq - mpic->ipi_offset,
                               reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
        } else {
-               reg = mpic_irq_read(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI)
-                       & MPIC_VECPRI_PRIORITY_MASK;
+               reg = mpic_irq_read(irq - mpic->irq_offset,MPIC_IRQ_VECTOR_PRI)
+                       & ~MPIC_VECPRI_PRIORITY_MASK;
                mpic_irq_write(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI,
                               reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
        }
index f32baf7f4693eb0980c3a42ba366492fb9c0517e..5c1a26a6d00c3cd28e4ec1937e3824d62da4c0f5 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * arch/powerpc/sysdev/u3_iommu.c
  *
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation
  *
  * Based on pSeries_iommu.c:
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, IBM Corporation
  *
  * Dynamic DMA mapping support, Apple U3 & IBM CPC925 "DART" iommu.
  *
index 8fa51b0a32d2d5390450d6478117ec1e7410a804..cc3f64c084c5e886b29eadd081c77edc5bcace91 100644 (file)
@@ -767,14 +767,14 @@ config CPM2
          on it (826x, 827x, 8560).
 
 config PPC_CHRP
-       bool "  Common Hardware Reference Platform (CHRP) based machines"
+       bool
        depends on PPC_MULTIPLATFORM
        select PPC_I8259
        select PPC_INDIRECT_PCI
        default y
 
 config PPC_PMAC
-       bool "  Apple PowerMac based machines"
+       bool
        depends on PPC_MULTIPLATFORM
        select PPC_INDIRECT_PCI
        default y
@@ -785,7 +785,7 @@ config PPC_PMAC64
        default y
 
 config PPC_PREP
-       bool "  PowerPC Reference Platform (PReP) based machines"
+       bool
        depends on PPC_MULTIPLATFORM
        select PPC_I8259
        select PPC_INDIRECT_PCI
index 82df88b01bbe5a7e4c9c6679328674e5f418628e..f3e9c534aa823156e6208e61fc0da14c3d858697 100644 (file)
@@ -262,11 +262,11 @@ $(images)/zImage.initrd-STRIPELF: $(obj)/zvmlinux.initrd
                skip=64 bs=1k
 
 $(images)/zImage-TREE: $(obj)/zvmlinux $(MKTREE)
-       $(MKTREE) $(obj)/zvmlinux $(images)/zImage.$(end-y) $(ENTRYPOINT)
+       $(MKTREE) $(obj)/zvmlinux $(images)/zImage.$(end-y) $(entrypoint-y)
 
 $(images)/zImage.initrd-TREE: $(obj)/zvmlinux.initrd $(MKTREE)
        $(MKTREE) $(obj)/zvmlinux.initrd $(images)/zImage.initrd.$(end-y) \
-               $(ENTRYPOINT)
+               $(entrypoint-y)
 
 $(images)/zImage-PPLUS: $(obj)/zvmlinux $(MKPREP) $(MKBUGBOOT)
        $(MKPREP) -pbp $(obj)/zvmlinux $(images)/zImage.$(end-y)
index 66073f775193d2084ef7b629cf130f9e744c3bd3..bb6a5c6a64bee18e1a94ec0968aada425bbd7aa1 100644 (file)
@@ -184,7 +184,7 @@ EXPORT_SYMBOL(kernel_thread);
 
 EXPORT_SYMBOL(flush_instruction_cache);
 EXPORT_SYMBOL(giveup_fpu);
-EXPORT_SYMBOL(flush_icache_range);
+EXPORT_SYMBOL(__flush_icache_range);
 EXPORT_SYMBOL(flush_dcache_range);
 EXPORT_SYMBOL(flush_icache_user_range);
 EXPORT_SYMBOL(flush_dcache_page);
index cb1c7b92f8c60111e7c3b86607082372e4bd03c3..25cbdc8d2941a9ccd7c2e315889cabf4d2a8c0bd 100644 (file)
@@ -417,6 +417,7 @@ void show_regs(struct pt_regs * regs)
 
 void exit_thread(void)
 {
+       preempt_disable();
        if (last_task_used_math == current)
                last_task_used_math = NULL;
        if (last_task_used_altivec == current)
@@ -425,10 +426,12 @@ void exit_thread(void)
        if (last_task_used_spe == current)
                last_task_used_spe = NULL;
 #endif
+       preempt_enable();
 }
 
 void flush_thread(void)
 {
+       preempt_disable();
        if (last_task_used_math == current)
                last_task_used_math = NULL;
        if (last_task_used_altivec == current)
@@ -437,6 +440,7 @@ void flush_thread(void)
        if (last_task_used_spe == current)
                last_task_used_spe = NULL;
 #endif
+       preempt_enable();
 }
 
 void
@@ -535,6 +539,7 @@ void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp)
        regs->nip = nip;
        regs->gpr[1] = sp;
        regs->msr = MSR_USER;
+       preempt_disable();
        if (last_task_used_math == current)
                last_task_used_math = NULL;
        if (last_task_used_altivec == current)
@@ -543,6 +548,7 @@ void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp)
        if (last_task_used_spe == current)
                last_task_used_spe = NULL;
 #endif
+       preempt_enable();
        memset(current->thread.fpr, 0, sizeof(current->thread.fpr));
        current->thread.fpscr.val = 0;
 #ifdef CONFIG_ALTIVEC
index 43b8fc2ca591c86388427c4b822eababd6991e11..becbfa397556a378c87aea3c05e8418073072fb4 100644 (file)
@@ -301,6 +301,10 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 
        /* Probe platform for CPUs: always linear. */
        num_cpus = smp_ops->probe();
+       
+       if (num_cpus < 2)
+               smp_tb_synchronized = 1;
+       
        for (i = 0; i < num_cpus; ++i)
                cpu_set(i, cpu_possible_map);
 
index d8991b88dc9c531692584548fc601eafe898a7c0..5e8cc5ec6ab5dc11512c0c333c2e65c1db815053 100644 (file)
@@ -130,10 +130,11 @@ mpc85xx_cds_show_cpuinfo(struct seq_file *m)
 }
 
 #ifdef CONFIG_CPM2
-static void cpm2_cascade(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t cpm2_cascade(int irq, void *dev_id, struct pt_regs *regs)
 {
        while((irq = cpm2_get_irq(regs)) >= 0)
                __do_IRQ(irq, regs);
+       return IRQ_HANDLED;
 }
 
 static struct irqaction cpm2_irqaction = {
index 1e69b05931620a2f1420adea43a27cac67644f6b..6b7b3a150631485cbf7ce43fe763f2ab8f55748a 100644 (file)
@@ -1606,11 +1606,19 @@ void pmac_tweak_clock_spreading(int enable)
         */
 
        if (macio->type == macio_intrepid) {
-               if (enable)
-                       UN_OUT(UNI_N_CLOCK_SPREADING, 2);
-               else
-                       UN_OUT(UNI_N_CLOCK_SPREADING, 0);
-               mdelay(40);
+               struct device_node *clock =
+                       of_find_node_by_path("/uni-n@f8000000/hw-clock");
+               if (clock && get_property(clock, "platform-do-clockspreading",
+                                         NULL)) {
+                       printk(KERN_INFO "%sabling clock spreading on Intrepid"
+                              " ASIC\n", enable ? "En" : "Dis");
+                       if (enable)
+                               UN_OUT(UNI_N_CLOCK_SPREADING, 2);
+                       else
+                               UN_OUT(UNI_N_CLOCK_SPREADING, 0);
+                       mdelay(40);
+               }
+               of_node_put(clock);
        }
 
        while (machine_is_compatible("PowerBook5,2") ||
@@ -1680,6 +1688,8 @@ void pmac_tweak_clock_spreading(int enable)
                        pmac_low_i2c_close(ui2c);
                        break;
                }
+               printk(KERN_INFO "%sabling clock spreading on i2c clock chip\n",
+                      enable ? "En" : "Dis");
                pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_stdsub);
                rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_write, 0x80, buffer, 9);
                DBG("write result: %d,", rc);
index 1d1c3956c1ae2d4eec586db59e13feba0ed01ed2..1941a8c7ca9a3dbd851b619c6e55ea7b39bc5dcf 100644 (file)
@@ -248,7 +248,8 @@ pq2ads_setup_pci(struct pci_controller *hose)
        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;
+       time = (int)66666666/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,
index f15e64285f9628e25465a55426cc3e88d3d5d737..05ccd598dd4ec717da856ca6b12eaef4df555851 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <asm/system.h>
 #include <asm/io.h>
+#include <asm/dma.h>
 #include <asm/ppc4xx_dma.h>
 
 ppc_dma_ch_t dma_channels[MAX_PPC4xx_DMA_CHANNELS];
index 3cfb8be3ff6d0f9fe5be0c600a9f035787f767d4..56c34e7fd4ee8f6b0bd7481c438eaa19f66b6eb9 100644 (file)
@@ -55,6 +55,10 @@ config NR_CPUS
        depends on SMP
        default "32"
 
+config SPARC
+       bool
+       default y
+
 # Identify this as a Sparc32 build
 config SPARC32
        bool
index dea48f6cff38be962d2c9f6cb7a12d251d4317fb..4cdbb2d59ed0a3e04c5e1d10a5bcf308c8ee7f22 100644 (file)
@@ -34,7 +34,7 @@ libs-y += arch/sparc/prom/ arch/sparc/lib/
 # Renaming is done to avoid confusing pattern matching rules in 2.5.45 (multy-)
 INIT_Y         := $(patsubst %/, %/built-in.o, $(init-y))
 CORE_Y         := $(core-y)
-CORE_Y         += kernel/ mm/ fs/ ipc/ security/ crypto/
+CORE_Y         += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
 CORE_Y         := $(patsubst %/, %/built-in.o, $(CORE_Y))
 DRIVERS_Y      := $(patsubst %/, %/built-in.o, $(drivers-y))
 NET_Y          := $(patsubst %/, %/built-in.o, $(net-y))
index 1754192c69d0db7df3ad4ebdde7bb94e4e77c4a5..5c3529ceb5d60151704d1b8f92c381f485d32503 100644 (file)
@@ -22,7 +22,7 @@
 #include <asm/oplib.h>
 #include <asm/bpp.h>
 
-struct linux_ebus *ebus_chain = 0;
+struct linux_ebus *ebus_chain = NULL;
 
 /* We are together with pcic.c under CONFIG_PCI. */
 extern unsigned int pcic_pin_to_irq(unsigned int, char *name);
@@ -46,7 +46,7 @@ static struct ebus_device_irq je1_1[] = {
        { "SUNW,CS4231",         0 },
        { "parallel",            0 },
        { "se",                  2 },
-       { 0, 0 }
+       { NULL, 0 }
 };
 
 /*
@@ -55,7 +55,7 @@ static struct ebus_device_irq je1_1[] = {
  */
 static struct ebus_system_entry ebus_blacklist[] = {
        { "SUNW,JavaEngine1", je1_1 },
-       { 0, 0 }
+       { NULL, NULL }
 };
 
 static struct ebus_device_irq *ebus_blackp = NULL;
@@ -233,7 +233,7 @@ void __init fill_ebus_device(int node, struct linux_ebus_device *dev)
                        ebus_alloc(sizeof(struct linux_ebus_child));
 
                child = dev->children;
-               child->next = 0;
+               child->next = NULL;
                child->parent = dev;
                child->bus = dev->bus;
                fill_ebus_child(node, &regs[0], child);
@@ -243,7 +243,7 @@ void __init fill_ebus_device(int node, struct linux_ebus_device *dev)
                                ebus_alloc(sizeof(struct linux_ebus_child));
 
                        child = child->next;
-                       child->next = 0;
+                       child->next = NULL;
                        child->parent = dev;
                        child->bus = dev->bus;
                        fill_ebus_child(node, &regs[0], child);
@@ -275,7 +275,7 @@ void __init ebus_init(void)
                }
        }
 
-       pdev = pci_get_device(PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_EBUS, 0);
+       pdev = pci_get_device(PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_EBUS, NULL);
        if (!pdev) {
                return;
        }
@@ -284,7 +284,7 @@ void __init ebus_init(void)
 
        ebus_chain = ebus = (struct linux_ebus *)
                        ebus_alloc(sizeof(struct linux_ebus));
-       ebus->next = 0;
+       ebus->next = NULL;
 
        while (ebusnd) {
 
@@ -325,8 +325,8 @@ void __init ebus_init(void)
                                ebus_alloc(sizeof(struct linux_ebus_device));
 
                dev = ebus->devices;
-               dev->next = 0;
-               dev->children = 0;
+               dev->next = NULL;
+               dev->children = NULL;
                dev->bus = ebus;
                fill_ebus_device(nd, dev);
 
@@ -335,8 +335,8 @@ void __init ebus_init(void)
                                ebus_alloc(sizeof(struct linux_ebus_device));
 
                        dev = dev->next;
-                       dev->next = 0;
-                       dev->children = 0;
+                       dev->next = NULL;
+                       dev->children = NULL;
                        dev->bus = ebus;
                        fill_ebus_device(nd, dev);
                }
@@ -353,7 +353,7 @@ void __init ebus_init(void)
                ebus->next = (struct linux_ebus *)
                        ebus_alloc(sizeof(struct linux_ebus));
                ebus = ebus->next;
-               ebus->next = 0;
+               ebus->next = NULL;
                ++num_ebus;
        }
        if (pdev)
index d0f2bd227c4ca8161d1babd6f14bad3e9b61e263..d39c9f2062717c84c7ec4ae5b7b31d8afca33d54 100644 (file)
@@ -252,7 +252,7 @@ void *sbus_alloc_consistent(struct sbus_dev *sdev, long len, u32 *dma_addrp)
        }
 
        order = get_order(len_total);
-       if ((va = __get_free_pages(GFP_KERNEL, order)) == 0)
+       if ((va = __get_free_pages(GFP_KERNEL|__GFP_COMP, order)) == 0)
                goto err_nopages;
 
        if ((res = kmalloc(sizeof(struct resource), GFP_KERNEL)) == NULL)
index 2a3afca453c9ec4b94caf91ab378d0d2e7f55d4d..313d1620ae8ec65b3ce43c1ee8b180ec7abdeb68 100644 (file)
@@ -55,7 +55,7 @@ static int led_read_proc(char *buf, char **start, off_t offset, int count,
        return len;
 }
 
-static int led_write_proc(struct file *file, const char *buffer,
+static int led_write_proc(struct file *file, const char __user *buffer,
                          unsigned long count, void *data)
 {
        char *buf = NULL;
index cccfc12802ed77aa35f68f295c8eaf7bf0eb660c..42002b742debe7a1e995e65c448f16a8f0a1ca7e 100644 (file)
@@ -161,7 +161,7 @@ static struct pcic_sn2list pcic_known_sysnames[] = {
 static int pcic0_up;
 static struct linux_pcic pcic0;
 
-void * __iomem pcic_regs;
+void __iomem *pcic_regs;
 volatile int pcic_speculative;
 volatile int pcic_trapped;
 
index 81c894acd0db617be71e0f37ddc1a618405b7ee8..d07ae02101add23f16aae1209d4a569ce9edb3e2 100644 (file)
@@ -894,7 +894,7 @@ asmlinkage long sunos_sysconf (int name)
                ret = ARG_MAX;
                break;
        case _SC_CHILD_MAX:
-               ret = CHILD_MAX;
+               ret = -1; /* no limit */
                break;
        case _SC_CLK_TCK:
                ret = HZ;
index 24814d58f9e10363569ac0a8e3a254c3de111288..7dadcdb4ca42540b6dfef30afef9d3957bdec44d 100644 (file)
@@ -49,7 +49,7 @@ DEFINE_SPINLOCK(rtc_lock);
 enum sparc_clock_type sp_clock_typ;
 DEFINE_SPINLOCK(mostek_lock);
 void __iomem *mstk48t02_regs = NULL;
-static struct mostek48t08 *mstk48t08_regs = NULL;
+static struct mostek48t08 __iomem *mstk48t08_regs = NULL;
 static int set_rtc_mmss(unsigned long);
 static int sbus_do_settimeofday(struct timespec *tv);
 
@@ -342,7 +342,7 @@ static __inline__ void clock_probe(void)
                /* XXX r/o attribute is somewhere in r.flags */
                r.flags = clk_reg[0].which_io;
                r.start = clk_reg[0].phys_addr;
-               mstk48t08_regs = (struct mostek48t08 *) sbus_ioremap(&r, 0,
+               mstk48t08_regs = sbus_ioremap(&r, 0,
                    sizeof(struct mostek48t08), "mk48t08");
 
                mstk48t02_regs = &mstk48t08_regs->regs;
index 38938d2e63aa2352edfda6e16043f0c6c53298b5..346c19a949fd0245c2ca29fe3d9f0f72e7a2219f 100644 (file)
@@ -85,19 +85,9 @@ SECTIONS
   }
   _end = . ;
   PROVIDE (end = .);
-  /* Stabs debugging sections.  */
-  .stab 0 : { *(.stab) }
-  .stabstr 0 : { *(.stabstr) }
-  .stab.excl 0 : { *(.stab.excl) }
-  .stab.exclstr 0 : { *(.stab.exclstr) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-  .debug          0 : { *(.debug) }
-  .debug_srcinfo  0 : { *(.debug_srcinfo) }
-  .debug_aranges  0 : { *(.debug_aranges) }
-  .debug_pubnames 0 : { *(.debug_pubnames) }
-  .debug_sfnames  0 : { *(.debug_sfnames) }
-  .line           0 : { *(.line) }
   /DISCARD/ : { *(.exit.text) *(.exit.data) *(.exitcall.exit) }
+
+  STABS_DEBUG
+
+  DWARF_DEBUG
 }
index cb3cf0f228221154a2dd5e658b8550733a966866..de84f8534bacd24d310a635bc1769ed3c6fd06d1 100644 (file)
@@ -66,7 +66,6 @@ int atomic_add_unless(atomic_t *v, int a, int u)
        return ret != u;
 }
 
-static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
 /* Atomic operations are already serializing */
 void atomic_set(atomic_t *v, int i)
 {
index 9604893ffdbd020955ec7d0a1e1bbdd6ac942afe..2cb0728cee052012c7856b017f7499fa5638ce82 100644 (file)
@@ -32,9 +32,7 @@ static inline void io_remap_pte_range(struct mm_struct *mm, pte_t * pte, unsigne
        if (end > PMD_SIZE)
                end = PMD_SIZE;
        do {
-               pte_t oldpage = *pte;
-               pte_clear(mm, address, pte);
-               set_pte(pte, mk_pte_io(offset, prot, space));
+               set_pte_at(mm, address, pte, mk_pte_io(offset, prot, space));
                address += PAGE_SIZE;
                offset += PAGE_SIZE;
                pte++;
@@ -63,7 +61,7 @@ static inline int io_remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned
 }
 
 int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
-                       unsigned long pfn, unsigned long size, pgprot_t prot)
+                      unsigned long pfn, unsigned long size, pgprot_t prot)
 {
        int error = 0;
        pgd_t * dir;
@@ -74,7 +72,9 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
        unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
 
        /* See comment in mm/memory.c remap_pfn_range */
-       vma->vm_flags |= VM_IO | VM_RESERVED;
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
+       vma->vm_pgoff = (offset >> PAGE_SHIFT) |
+               ((unsigned long)space << 28UL);
 
        prot = __pgprot(pg_iobits);
        offset -= from;
index 1d560390e28212346bae398e3c87e8e619aa253d..731f19603cad719951c7a180fd3c9ca136b55fd6 100644 (file)
@@ -497,7 +497,7 @@ static void __init sun4c_probe_mmu(void)
        patch_kernel_fault_handler();
 }
 
-volatile unsigned long *sun4c_memerr_reg = NULL;
+volatile unsigned long __iomem *sun4c_memerr_reg = NULL;
 
 void __init sun4c_probe_memerr_reg(void)
 {
index 3fded69b19228ca4a81013149b638d97b554143d..c4b7ad70cd7c5d1b756d46987ae90c5e536324ac 100644 (file)
@@ -5,6 +5,10 @@
 
 mainmenu "Linux/UltraSPARC Kernel Configuration"
 
+config SPARC
+       bool
+       default y
+
 config SPARC64
        bool
        default y
index 43fe382da078926c1c0c5dbbc77a1ff1d35b207b..cad10c5b83d341b1f36d3ebe2f31ab59a33f6824 100644 (file)
@@ -17,7 +17,6 @@ CC            := $(shell if $(CC) -m64 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then
 NEW_GCC := $(call cc-option-yn, -m64 -mcmodel=medlow)
 NEW_GAS := $(shell if $(LD) -V 2>&1 | grep 'elf64_sparc' > /dev/null; then echo y; else echo n; fi)
 UNDECLARED_REGS := $(shell if $(CC) -c -x assembler /dev/null -Wa,--help | grep undeclared-regs > /dev/null; then echo y; else echo n; fi; )
-INLINE_LIMIT := $(call cc-option-yn, -m64 -finline-limit=100000)
 
 export NEW_GCC
 
@@ -49,10 +48,6 @@ else
   AFLAGS += -m64 -mcpu=ultrasparc $(CC_UNDECL)
 endif
 
-ifeq ($(INLINE_LIMIT),y)
-  CFLAGS := $(CFLAGS) -finline-limit=100000
-endif
-
 ifeq ($(CONFIG_MCOUNT),y)
   CFLAGS := $(CFLAGS) -pg
 endif
index 96bd09b098f431876c87778594983f0bf514f85d..a97b0f0727ab15be8ee7678848b5d81ebf282ded 100644 (file)
@@ -138,7 +138,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
                         */
                        save_previous_kprobe(kcb);
                        set_current_kprobe(p, regs, kcb);
-                       p->nmissed++;
+                       kprobes_inc_nmissed_count(p);
                        kcb->kprobe_status = KPROBE_REENTER;
                        prepare_singlestep(p, regs, kcb);
                        return 1;
index 96b825055668cf57d400157fe3e0ca87ff937c98..d95a1bcf163d86f3f86e4505c3bff1faf937b341 100644 (file)
@@ -327,7 +327,7 @@ void *sbus_alloc_consistent(struct sbus_dev *sdev, size_t size, dma_addr_t *dvma
        order = get_order(size);
        if (order >= 10)
                return NULL;
-       first_page = __get_free_pages(GFP_KERNEL, order);
+       first_page = __get_free_pages(GFP_KERNEL|__GFP_COMP, order);
        if (first_page == 0UL)
                return NULL;
        memset((char *)first_page, 0, PAGE_SIZE << order);
index d0592ed54ea5699c77251e09d23fc595bc865d93..bfa4aa68312dcabd6d4c080c5ea4dbf14e117a46 100644 (file)
@@ -854,7 +854,7 @@ asmlinkage s32 sunos_sysconf (int name)
                ret = ARG_MAX;
                break;
        case _SC_CHILD_MAX:
-               ret = CHILD_MAX;
+               ret = -1; /* no limit */
                break;
        case _SC_CLK_TCK:
                ret = HZ;
index 2af0cf0a86409fbc288f61061ebd953c19d91950..467d13a0d5c1314fa99c645ac62f5699ee7cb3d3 100644 (file)
@@ -90,19 +90,9 @@ SECTIONS
   }
   _end = . ;
   PROVIDE (end = .);
-  /* Stabs debugging sections.  */
-  .stab 0 : { *(.stab) }
-  .stabstr 0 : { *(.stabstr) }
-  .stab.excl 0 : { *(.stab.excl) }
-  .stab.exclstr 0 : { *(.stab.exclstr) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-  .debug          0 : { *(.debug) }
-  .debug_srcinfo  0 : { *(.debug_srcinfo) }
-  .debug_aranges  0 : { *(.debug_aranges) }
-  .debug_pubnames 0 : { *(.debug_pubnames) }
-  .debug_sfnames  0 : { *(.debug_sfnames) }
-  .line           0 : { *(.line) }
   /DISCARD/ : { *(.exit.text) *(.exit.data) *(.exitcall.exit) }
+
+  STABS_DEBUG
+
+  DWARF_DEBUG
 }
index 112c316e7cd213e6b59cc1284a49d7fc05aae898..580b63da836bcee565fb435b6f833ac6f1eb9b70 100644 (file)
 #include <asm/page.h>
 #include <asm/tlbflush.h>
 
+static inline pte_t mk_pte_io(unsigned long page, pgprot_t prot, int space)
+{
+       pte_t pte;
+       pte_val(pte) = (((page) | pgprot_val(prot) | _PAGE_E) &
+                       ~(unsigned long)_PAGE_CACHE);
+       pte_val(pte) |= (((unsigned long)space) << 32);
+       return pte;
+}
+
 /* Remap IO memory, the same way as remap_pfn_range(), but use
  * the obio memory space.
  *
@@ -68,6 +77,7 @@ static inline void io_remap_pte_range(struct mm_struct *mm, pte_t * pte,
                        BUG_ON(!pte_none(*pte));
                        set_pte_at(mm, address, pte, entry);
                        address += PAGE_SIZE;
+                       pte_val(entry) += PAGE_SIZE;
                        pte++;
                } while (address < curend);
        } while (address < end);
@@ -126,9 +136,13 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
        struct mm_struct *mm = vma->vm_mm;
        int space = GET_IOSPACE(pfn);
        unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
+       unsigned long phys_base;
+
+       phys_base = offset | (((unsigned long) space) << 32UL);
 
        /* See comment in mm/memory.c remap_pfn_range */
-       vma->vm_flags |= VM_IO | VM_RESERVED;
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
+       vma->vm_pgoff = phys_base >> PAGE_SHIFT;
 
        prot = __pgprot(pg_iobits);
        offset -= from;
index 302efbcba70e85208d1fa8ba7387da963b8f8181..3ab4677395f217d9c637339fea1efce426f1f867 100644 (file)
@@ -353,7 +353,7 @@ asmlinkage int solaris_sysconf(int id)
 {
        switch (id) {
        case SOLARIS_CONFIG_NGROUPS:    return NGROUPS_MAX;
-       case SOLARIS_CONFIG_CHILD_MAX:  return CHILD_MAX;
+       case SOLARIS_CONFIG_CHILD_MAX:  return -1; /* no limit */
        case SOLARIS_CONFIG_OPEN_FILES: return OPEN_MAX;
        case SOLARIS_CONFIG_POSIX_VER:  return 199309;
        case SOLARIS_CONFIG_PAGESIZE:   return PAGE_SIZE;
index 563301fe5df8bbfb4bfd5680e5489d23b91e0ba4..1eb21de9d1b5c8809f02dd7f86fc51208c7b440f 100644 (file)
@@ -289,6 +289,8 @@ source "arch/um/Kconfig.net"
 
 source "drivers/net/Kconfig"
 
+source "drivers/connector/Kconfig"
+
 source "fs/Kconfig"
 
 source "security/Kconfig"
index e55d32e903bc1a4095a3f44123f2fb22ccd40abc..1b12feeba368bac33c3aecefb822c051ff2615c7 100644 (file)
@@ -17,7 +17,7 @@ core-y                        += $(ARCH_DIR)/kernel/          \
 
 # Have to precede the include because the included Makefiles reference them.
 SYMLINK_HEADERS := archparam.h system.h sigcontext.h processor.h ptrace.h \
-       module.h vm-flags.h elf.h
+       module.h vm-flags.h elf.h ldt.h
 SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header))
 
 # XXX: The "os" symlink is only used by arch/um/include/os.h, which includes
index 4f118d5cc2ee177c381b3b3d2522071f76025498..38df311e75dc49f672e95ed22fdc9d7f7447259d 100644 (file)
@@ -12,3 +12,7 @@ CHECKFLAGS  += -m64
 
 ELF_ARCH := i386:x86-64
 ELF_FORMAT := elf64-x86-64
+
+# Not on all 64-bit distros /lib is a symlink to /lib64. PLD is an example.
+
+LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64
index a49ceb199ee57e2c5150f93373dc994fe7d00f30..b492b12b4a1054c6d4c69ceb51cabdbc41c713ce 100644 (file)
@@ -6,8 +6,12 @@
 #ifndef __SYSDEP_STUB_H
 #define __SYSDEP_STUB_H
 
+#include <sys/mman.h>
 #include <asm/ptrace.h>
 #include <asm/unistd.h>
+#include "stub-data.h"
+#include "kern_constants.h"
+#include "uml-config.h"
 
 extern void stub_segv_handler(int sig);
 extern void stub_clone_handler(void);
@@ -16,6 +20,15 @@ extern void stub_clone_handler(void);
 #define STUB_MMAP_NR __NR_mmap2
 #define MMAP_OFFSET(o) ((o) >> PAGE_SHIFT)
 
+static inline long stub_syscall0(long syscall)
+{
+       long ret;
+
+       __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall));
+
+       return ret;
+}
+
 static inline long stub_syscall1(long syscall, long arg1)
 {
        long ret;
@@ -67,23 +80,22 @@ static inline long stub_syscall5(long syscall, long arg1, long arg2, long arg3,
        return ret;
 }
 
-static inline long stub_syscall6(long syscall, long arg1, long arg2, long arg3,
-                                long arg4, long arg5, long arg6)
+static inline void trap_myself(void)
 {
-       long ret;
-
-       __asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; "
-                       "int $0x80 ; pop %%ebp"
-                       : "=a" (ret)
-                       : "g" (syscall), "b" (arg1), "c" (arg2), "d" (arg3),
-                         "S" (arg4), "D" (arg5), "0" (arg6));
-
-       return ret;
+       __asm("int3");
 }
 
-static inline void trap_myself(void)
+static inline void remap_stack(int fd, unsigned long offset)
 {
-       __asm("int3");
+       __asm__ volatile ("movl %%eax,%%ebp ; movl %0,%%eax ; int $0x80 ;"
+                         "movl %7, %%ebx ; movl %%eax, (%%ebx)"
+                         : : "g" (STUB_MMAP_NR), "b" (UML_CONFIG_STUB_DATA), 
+                           "c" (UM_KERN_PAGE_SIZE), 
+                           "d" (PROT_READ | PROT_WRITE),
+                           "S" (MAP_FIXED | MAP_SHARED), "D" (fd), 
+                           "a" (offset), 
+                           "i" (&((struct stub_data *) UML_CONFIG_STUB_DATA)->err) 
+                         : "memory");
 }
 
 #endif
index 2bd6e7a972866c0d8130101a3a78679af0b91f13..92e989f81761d64f0616fc5be6aa6da18fd2676e 100644 (file)
@@ -6,9 +6,12 @@
 #ifndef __SYSDEP_STUB_H
 #define __SYSDEP_STUB_H
 
-#include <asm/ptrace.h>
+#include <sys/mman.h>
 #include <asm/unistd.h>
 #include <sysdep/ptrace_user.h>
+#include "stub-data.h"
+#include "kern_constants.h"
+#include "uml-config.h"
 
 extern void stub_segv_handler(int sig);
 extern void stub_clone_handler(void);
@@ -20,6 +23,17 @@ extern void stub_clone_handler(void);
 #define __syscall_clobber "r11","rcx","memory"
 #define __syscall "syscall"
 
+static inline long stub_syscall0(long syscall)
+{
+       long ret;
+
+       __asm__ volatile (__syscall
+               : "=a" (ret)
+               : "0" (syscall) : __syscall_clobber );
+
+       return ret;
+}
+
 static inline long stub_syscall2(long syscall, long arg1, long arg2)
 {
        long ret;
@@ -71,23 +85,23 @@ static inline long stub_syscall5(long syscall, long arg1, long arg2, long arg3,
        return ret;
 }
 
-static inline long stub_syscall6(long syscall, long arg1, long arg2, long arg3,
-                                long arg4, long arg5, long arg6)
+static inline void trap_myself(void)
 {
-       long ret;
-
-       __asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; "
-               "movq %7, %%r9; " __syscall : "=a" (ret)
-               : "0" (syscall), "D" (arg1), "S" (arg2), "d" (arg3),
-                 "g" (arg4), "g" (arg5), "g" (arg6)
-               : __syscall_clobber, "r10", "r8", "r9" );
-
-       return ret;
+       __asm("int3");
 }
 
-static inline void trap_myself(void)
+static inline void remap_stack(long fd, unsigned long offset)
 {
-       __asm("int3");
+       __asm__ volatile ("movq %4,%%r10 ; movq %5,%%r8 ; "
+                         "movq %6, %%r9; " __syscall "; movq %7, %%rbx ; "
+                         "movq %%rax, (%%rbx)": 
+                         : "a" (STUB_MMAP_NR), "D" (UML_CONFIG_STUB_DATA), 
+                           "S" (UM_KERN_PAGE_SIZE), 
+                           "d" (PROT_READ | PROT_WRITE), 
+                            "g" (MAP_FIXED | MAP_SHARED), "g" (fd), 
+                           "g" (offset),
+                           "i" (&((struct stub_data *) UML_CONFIG_STUB_DATA)->err)
+                         : __syscall_clobber, "r10", "r8", "r9" );
 }
 
 #endif
index f8760a3f43b0f0f6e0402f21089d87e56ba62c29..4567f1eeb4a7d25f8d079aa846a752514e7d6340 100644 (file)
@@ -17,6 +17,8 @@
 #include "uaccess-skas.h"
 #endif
 
+#include "asm/fixmap.h"
+
 #define __under_task_size(addr, size) \
        (((unsigned long) (addr) < TASK_SIZE) && \
          (((unsigned long) (addr) + (size)) < TASK_SIZE))
index 4dc55f10cd182af2e6366c15d71954b1eb4e1ed3..47b812b3bca88b965b48563de658db9ada72fd81 100644 (file)
@@ -9,18 +9,23 @@
 #include "stub-data.h"
 #include "uml-config.h"
 #include "sysdep/stub.h"
+#include "kern_constants.h"
 
 /* This is in a separate file because it needs to be compiled with any
  * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled
+ *
+ * Use UM_KERN_PAGE_SIZE instead of PAGE_SIZE because that calls getpagesize
+ * on some systems.
  */
+
 void __attribute__ ((__section__ (".__syscall_stub")))
 stub_clone_handler(void)
 {
+       struct stub_data *data = (struct stub_data *) UML_CONFIG_STUB_DATA;
        long err;
-       struct stub_data *from = (struct stub_data *) UML_CONFIG_STUB_DATA;
 
        err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD,
-                           UML_CONFIG_STUB_DATA + PAGE_SIZE / 2 -
+                           UML_CONFIG_STUB_DATA + UM_KERN_PAGE_SIZE / 2 -
                            sizeof(void *));
        if(err != 0)
                goto out;
@@ -29,16 +34,21 @@ stub_clone_handler(void)
        if(err)
                goto out;
 
-       err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL,
-                           (long) &from->timer, 0);
+       err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL, 
+                           (long) &data->timer, 0);
        if(err)
                goto out;
 
-       err = stub_syscall6(STUB_MMAP_NR, UML_CONFIG_STUB_DATA, PAGE_SIZE,
-                           PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED,
-                           from->fd, from->offset);
+       remap_stack(data->fd, data->offset);
+       goto done;
+
  out:
-       /* save current result. Parent: pid; child: retcode of mmap */
-       from->err = err;
+       /* save current result. 
+        * Parent: pid; 
+        * child: retcode of mmap already saved and it jumps around this 
+        * assignment
+        */
+       data->err = err;
+ done:
        trap_myself();
 }
index f611f83ad4ff815397f1746a10ba2e5656c3d9bc..64516c556cdf98a425b14d4d7c961babc224125d 100644 (file)
@@ -7,7 +7,6 @@
 #define __SKAS_UACCESS_H
 
 #include "asm/errno.h"
-#include "asm/fixmap.h"
 
 /* No SKAS-specific checking. */
 #define access_ok_skas(type, addr, size) 0
index 37517d49c4aea948054a70a17ec36c8f6b255b57..29a9e3f4376368caa56610e423d9e189eec79e4d 100644 (file)
@@ -116,16 +116,16 @@ static int stop_ptraced_child(int pid, void *stack, int exitcode,
        if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
                int exit_with = WEXITSTATUS(status);
                if (exit_with == 2)
-                       printk("check_ptrace : child exited with status 2. "
+                       printf("check_ptrace : child exited with status 2. "
                               "Serious trouble happening! Try updating your "
                               "host skas patch!\nDisabling SYSEMU support.");
-               printk("check_ptrace : child exited with exitcode %d, while "
+               printf("check_ptrace : child exited with exitcode %d, while "
                      "expecting %d; status 0x%x", exit_with,
                      exitcode, status);
                if (mustpanic)
                        panic("\n");
                else
-                       printk("\n");
+                       printf("\n");
                ret = -1;
        }
 
@@ -183,7 +183,7 @@ static void __init check_sysemu(void)
        void *stack;
        int pid, n, status, count=0;
 
-       printk("Checking syscall emulation patch for ptrace...");
+       printf("Checking syscall emulation patch for ptrace...");
        sysemu_supported = 0;
        pid = start_ptraced_child(&stack);
 
@@ -207,10 +207,10 @@ static void __init check_sysemu(void)
                goto fail_stopped;
 
        sysemu_supported = 1;
-       printk("OK\n");
+       printf("OK\n");
        set_using_sysemu(!force_sysemu_disabled);
 
-       printk("Checking advanced syscall emulation patch for ptrace...");
+       printf("Checking advanced syscall emulation patch for ptrace...");
        pid = start_ptraced_child(&stack);
 
        if(ptrace(PTRACE_OLDSETOPTIONS, pid, 0,
@@ -246,7 +246,7 @@ static void __init check_sysemu(void)
                goto fail_stopped;
 
        sysemu_supported = 2;
-       printk("OK\n");
+       printf("OK\n");
 
        if ( !force_sysemu_disabled )
                set_using_sysemu(sysemu_supported);
@@ -255,7 +255,7 @@ static void __init check_sysemu(void)
 fail:
        stop_ptraced_child(pid, stack, 1, 0);
 fail_stopped:
-       printk("missing\n");
+       printf("missing\n");
 }
 
 static void __init check_ptrace(void)
@@ -263,7 +263,7 @@ static void __init check_ptrace(void)
        void *stack;
        int pid, syscall, n, status;
 
-       printk("Checking that ptrace can change system call numbers...");
+       printf("Checking that ptrace can change system call numbers...");
        pid = start_ptraced_child(&stack);
 
        if(ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
@@ -292,7 +292,7 @@ static void __init check_ptrace(void)
                }
        }
        stop_ptraced_child(pid, stack, 0, 1);
-       printk("OK\n");
+       printf("OK\n");
        check_sysemu();
 }
 
@@ -472,6 +472,8 @@ int can_do_skas(void)
 
 int have_devanon = 0;
 
+/* Runs on boot kernel stack - already safe to use printk. */
+
 void check_devanon(void)
 {
        int fd;
index 56d3f870926b8214a99899135d1f87f777a6b463..8da6ab31152ad47918fa75bfa73437859e01eebe 100644 (file)
@@ -34,6 +34,11 @@ EXPORT_SYMBOL(strstr);
        int sym(void);                  \
        EXPORT_SYMBOL(sym);
 
+extern void readdir64(void) __attribute__((weak));
+EXPORT_SYMBOL(readdir64);
+extern void truncate64(void) __attribute__((weak));
+EXPORT_SYMBOL(truncate64);
+
 #ifdef SUBARCH_i386
 EXPORT_SYMBOL(vsyscall_ehdr);
 EXPORT_SYMBOL(vsyscall_end);
index b3fbf125709b83d5a1bf7814fab538455aa95f26..2e41cabd3d93ab4f15350990ee32eb1a9e9d3eff 100644 (file)
@@ -21,11 +21,6 @@ define unprofile
 endef
 
 
-# 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
-
 # cmd_make_link checks to see if the $(foo-dir) variable starts with a /.  If
 # so, it's considered to be a path relative to $(srcdir) rather than
 # $(srcdir)/arch/$(SUBARCH).  This is because x86_64 wants to get ldt.c from
index 6dfeb70f6957727bf8a5a5c17fb8852599375ae2..f5fd5b0156d02a7f0a39882596c2b3bdb1e18de5 100644 (file)
@@ -1,11 +1,13 @@
-obj-y = bitops.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \
-       ptrace_user.o semaphore.o signal.o sigcontext.o stub.o stub_segv.o \
-       syscalls.o sysrq.o sys_call_table.o
+obj-y := bitops.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \
+       ptrace_user.o semaphore.o signal.o sigcontext.o syscalls.o sysrq.o \
+       sys_call_table.o
+
+obj-$(CONFIG_MODE_SKAS) += stub.o stub_segv.o
 
 obj-$(CONFIG_HIGHMEM) += highmem.o
 obj-$(CONFIG_MODULES) += module.o
 
-USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
+USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o stub_segv.o
 
 SYMLINKS = bitops.c semaphore.c highmem.c module.c
 
index 6360f1c958d048db6fc46272f7671b5e5f21d0e6..17746b4c08ff00afee1407018b05611e78e69bbe 100644 (file)
@@ -228,7 +228,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount)
                size = LDT_ENTRY_SIZE*LDT_DIRECT_ENTRIES;
                if(size > bytecount)
                        size = bytecount;
-               if(copy_to_user(ptr, ldt->entries, size))
+               if(copy_to_user(ptr, ldt->u.entries, size))
                        err = -EFAULT;
                bytecount -= size;
                ptr += size;
@@ -239,7 +239,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount)
                        size = PAGE_SIZE;
                        if(size > bytecount)
                                size = bytecount;
-                       if(copy_to_user(ptr, ldt->pages[i], size)){
+                       if(copy_to_user(ptr, ldt->u.pages[i], size)){
                                err = -EFAULT;
                                break;
                        }
@@ -321,10 +321,11 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func)
                    i*LDT_ENTRIES_PER_PAGE <= ldt_info.entry_number;
                    i++){
                        if(i == 0)
-                               memcpy(&entry0, ldt->entries, sizeof(entry0));
-                       ldt->pages[i] = (struct ldt_entry *)
-                                       __get_free_page(GFP_KERNEL|__GFP_ZERO);
-                       if(!ldt->pages[i]){
+                               memcpy(&entry0, ldt->u.entries,
+                                      sizeof(entry0));
+                       ldt->u.pages[i] = (struct ldt_entry *)
+                               __get_free_page(GFP_KERNEL|__GFP_ZERO);
+                       if(!ldt->u.pages[i]){
                                err = -ENOMEM;
                                /* Undo the change in host */
                                memset(&ldt_info, 0, sizeof(ldt_info));
@@ -332,8 +333,9 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func)
                                goto out_unlock;
                        }
                        if(i == 0) {
-                               memcpy(ldt->pages[0], &entry0, sizeof(entry0));
-                               memcpy(ldt->pages[0]+1, ldt->entries+1,
+                               memcpy(ldt->u.pages[0], &entry0,
+                                      sizeof(entry0));
+                               memcpy(ldt->u.pages[0]+1, ldt->u.entries+1,
                                       sizeof(entry0)*(LDT_DIRECT_ENTRIES-1));
                        }
                        ldt->entry_count = (i + 1) * LDT_ENTRIES_PER_PAGE;
@@ -343,9 +345,9 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func)
                ldt->entry_count = ldt_info.entry_number + 1;
 
        if(ldt->entry_count <= LDT_DIRECT_ENTRIES)
-               ldt_p = ldt->entries + ldt_info.entry_number;
+               ldt_p = ldt->u.entries + ldt_info.entry_number;
        else
-               ldt_p = ldt->pages[ldt_info.entry_number/LDT_ENTRIES_PER_PAGE] +
+               ldt_p = ldt->u.pages[ldt_info.entry_number/LDT_ENTRIES_PER_PAGE] +
                        ldt_info.entry_number%LDT_ENTRIES_PER_PAGE;
 
        if(ldt_info.base_addr == 0 && ldt_info.limit == 0 &&
@@ -501,8 +503,8 @@ long init_new_ldt(struct mmu_context_skas * new_mm,
                 */
                down(&from_mm->ldt.semaphore);
                if(from_mm->ldt.entry_count <= LDT_DIRECT_ENTRIES){
-                       memcpy(new_mm->ldt.entries, from_mm->ldt.entries,
-                              sizeof(new_mm->ldt.entries));
+                       memcpy(new_mm->ldt.u.entries, from_mm->ldt.u.entries,
+                              sizeof(new_mm->ldt.u.entries));
                }
                else{
                        i = from_mm->ldt.entry_count / LDT_ENTRIES_PER_PAGE;
@@ -512,9 +514,10 @@ long init_new_ldt(struct mmu_context_skas * new_mm,
                                        err = -ENOMEM;
                                        break;
                                }
-                               new_mm->ldt.pages[i] = (struct ldt_entry*)page;
-                               memcpy(new_mm->ldt.pages[i],
-                                      from_mm->ldt.pages[i], PAGE_SIZE);
+                               new_mm->ldt.u.pages[i] =
+                                       (struct ldt_entry *) page;
+                               memcpy(new_mm->ldt.u.pages[i],
+                                      from_mm->ldt.u.pages[i], PAGE_SIZE);
                        }
                }
                new_mm->ldt.entry_count = from_mm->ldt.entry_count;
@@ -532,7 +535,7 @@ void free_ldt(struct mmu_context_skas * mm)
        if(!ptrace_ldt && mm->ldt.entry_count > LDT_DIRECT_ENTRIES){
                i = mm->ldt.entry_count / LDT_ENTRIES_PER_PAGE;
                while(i-- > 0){
-                       free_page((long )mm->ldt.pages[i]);
+                       free_page((long )mm->ldt.u.pages[i]);
                }
        }
        mm->ldt.entry_count = 0;
index 1e88b275edacea8dede15209a158c2b4ad279cc4..a37f672ec964e3815c4f2de247b82d7d09dc1e30 100644 (file)
@@ -3,9 +3,11 @@
  * Licensed under the GPL
  */
 
-#include <asm/signal.h>
+#include <signal.h>
+#include <sys/select.h> /* The only way I can see to get sigset_t */
 #include <asm/unistd.h>
 #include "uml-config.h"
+#include "sysdep/stub.h"
 #include "sysdep/sigcontext.h"
 #include "sysdep/faultinfo.h"
 
@@ -13,13 +15,14 @@ void __attribute__ ((__section__ (".__syscall_stub")))
 stub_segv_handler(int sig)
 {
        struct sigcontext *sc = (struct sigcontext *) (&sig + 1);
+       int pid;
 
        GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA),
                              sc);
 
-       __asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid));
-       __asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;"
-               "int $0x80": : "g" (__NR_kill), "g" (SIGUSR1));
+       pid = stub_syscall0(__NR_getpid);
+       stub_syscall2(__NR_kill, pid, SIGUSR1);
+
        /* Load pointer to sigcontext into esp, since we need to leave
         * the stack in its original form when we do the sigreturn here, by
         * hand.
index ea977df395a10eb3254625e46b06483ce35d6b6b..a351091fbd99c0287b14e6775d60b717f401cb2a 100644 (file)
@@ -6,13 +6,14 @@
 
 #XXX: why into lib-y?
 lib-y = bitops.o bugs.o csum-partial.o delay.o fault.o ldt.o mem.o memcpy.o \
-       ptrace.o ptrace_user.o sigcontext.o signal.o stub.o \
-       stub_segv.o syscalls.o syscall_table.o sysrq.o thunk.o
+       ptrace.o ptrace_user.o sigcontext.o signal.o syscalls.o \
+       syscall_table.o sysrq.o thunk.o
+lib-$(CONFIG_MODE_SKAS) += stub.o stub_segv.o
 
 obj-y := ksyms.o
 obj-$(CONFIG_MODULES) += module.o um_module.o
 
-USER_OBJS := ptrace_user.o sigcontext.o
+USER_OBJS := ptrace_user.o sigcontext.o stub_segv.o
 
 SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c ldt.c memcpy.S \
        thunk.S module.c
index d1e53bdf2e85e7240c21511e9ed62953920cf828..a27099533198573d223f54a94134b84f8b7b7674 100644 (file)
@@ -3,14 +3,14 @@
  * Licensed under the GPL
  */
 
-#include <asm/signal.h>
+#include <stddef.h>
+#include <signal.h>
 #include <linux/compiler.h>
 #include <asm/unistd.h>
-#include <asm/ucontext.h>
 #include "uml-config.h"
 #include "sysdep/sigcontext.h"
 #include "sysdep/faultinfo.h"
-#include <stddef.h>
+#include "sysdep/stub.h"
 
 /* Copied from sys-x86_64/signal.c - Can't find an equivalent definition
  * in the libc headers anywhere.
@@ -31,21 +31,21 @@ void __attribute__ ((__section__ (".__syscall_stub")))
 stub_segv_handler(int sig)
 {
        struct ucontext *uc;
+        int pid;
 
        __asm__("movq %%rdx, %0" : "=g" (uc) :);
        GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA),
                              &uc->uc_mcontext);
 
-       __asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid));       
-       __asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;"
-               "syscall": : "g" (__NR_kill), "g" (SIGUSR1) : 
-               "%rdi", "%rax", "%rsi");
+       pid = stub_syscall0(__NR_getpid);
+       stub_syscall2(__NR_kill, pid, SIGUSR1);
+
        /* sys_sigreturn expects that the stack pointer will be 8 bytes into
         * the signal frame.  So, we use the ucontext pointer, which we know
         * already, to get the signal frame pointer, and add 8 to that.
         */
-       __asm__("movq %0, %%rsp": : 
+       __asm__("movq %0, %%rsp; movq %1, %%rax ; syscall": :
                "g" ((unsigned long) container_of(uc, struct rt_sigframe, 
-                                                 uc) + 8));
-       __asm__("movq %0, %%rax ; syscall" : : "g" (__NR_rt_sigreturn));
+                                                 uc) + 8),
+                "g" (__NR_rt_sigreturn));
 }
index 830feb272eca434c10f73adcb1499abeb71d7f9a..2b760d0d9ce292a515af2977f5423d8f26b75069 100644 (file)
@@ -217,8 +217,7 @@ elf_core_copy_task_fpregs(struct task_struct *tsk, struct pt_regs *regs, elf_fpr
        if (!tsk_used_math(tsk))
                return 0;
        if (!regs)
-               regs = (struct pt_regs *)tsk->thread.rsp0;
-       --regs;
+               regs = ((struct pt_regs *)tsk->thread.rsp0) - 1;
        if (tsk == current)
                unlazy_fpu(tsk);
        set_fs(KERNEL_DS); 
index dddeb678b440df5782af858f8db64100082c6f8a..afe11f4fbd1d49d068e7bc3fb64f6d759c342ef1 100644 (file)
@@ -329,7 +329,7 @@ int __kprobes kprobe_handler(struct pt_regs *regs)
                                 */
                                save_previous_kprobe(kcb);
                                set_current_kprobe(p, regs, kcb);
-                               p->nmissed++;
+                               kprobes_inc_nmissed_count(p);
                                prepare_singlestep(p, regs);
                                kcb->kprobe_status = KPROBE_REENTER;
                                return 1;
index 5afd63e8cef7ab9c9a71bb1f35df69a738ce90d5..7519fc520eb3f2d157d1da41cb4c3c1d5b40bc82 100644 (file)
@@ -351,13 +351,6 @@ void flush_thread(void)
        struct task_struct *tsk = current;
        struct thread_info *t = current_thread_info();
 
-       /*
-        * Remove function-return probe instances associated with this task
-        * and put them back on the free list. Do not insert an exit probe for
-        * this function, it will be disabled by kprobe_flush_task if you do.
-        */
-       kprobe_flush_task(tsk);
-
        if (t->flags & _TIF_ABI_PENDING)
                t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
 
index 750e01dcbdf49f364940c87f5ab6b4bc158d460a..64c4534b930c74bc118cf1530a812401456f3d4e 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/edd.h>
 #include <linux/mmzone.h>
 #include <linux/kexec.h>
+#include <linux/cpufreq.h>
 
 #include <asm/mtrr.h>
 #include <asm/uaccess.h>
@@ -1256,8 +1257,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                seq_printf(m, "stepping\t: unknown\n");
        
        if (cpu_has(c,X86_FEATURE_TSC)) {
+               unsigned int freq = cpufreq_quick_get((unsigned)(c-cpu_data));
+               if (!freq)
+                       freq = cpu_khz;
                seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
-                            cpu_khz / 1000, (cpu_khz % 1000));
+                            freq / 1000, (freq % 1000));
        }
 
        /* Cache size */
index 683c33f7b96753219a2c1043246dcdfac12b999e..ecbd7b83acc1ff7b9024d6de6fd1762ed58320f0 100644 (file)
@@ -1181,7 +1181,7 @@ int __cpu_disable(void)
        if (cpu == 0)
                return -EBUSY;
 
-       disable_APIC_timer();
+       clear_local_APIC();
 
        /*
         * HACK:
index fdaddc4e52847a1f0fea0c50ff960aadcc9caf60..74102796e5c06d4fdd749c5e50e0726262d1c975 100644 (file)
@@ -59,7 +59,7 @@ static int notsc __initdata = 0;
 unsigned int cpu_khz;                                  /* TSC clocks / usec, not used here */
 static unsigned long hpet_period;                      /* fsecs / HPET clock */
 unsigned long hpet_tick;                               /* HPET clocks / interrupt */
-static int hpet_use_timer;
+static int hpet_use_timer;                             /* Use counter of hpet for time keeping, otherwise PIT */
 unsigned long vxtime_hz = PIT_TICK_RATE;
 int report_lost_ticks;                         /* command line option */
 unsigned long long monotonic_base;
@@ -908,12 +908,14 @@ void __init time_init(void)
        if (!hpet_init())
                 vxtime_hz = (1000000000000000L + hpet_period / 2) /
                        hpet_period;
+       else
+               vxtime.hpet_address = 0;
 
        if (hpet_use_timer) {
                cpu_khz = hpet_calibrate_tsc();
                timename = "HPET";
 #ifdef CONFIG_X86_PM_TIMER
-       } else if (pmtmr_ioport) {
+       } else if (pmtmr_ioport && !vxtime.hpet_address) {
                vxtime_hz = PM_TIMER_FREQUENCY;
                timename = "PM";
                pit_init();
index 286f6a624c3ace5d3f33c5fb36258979c57dc80f..c016dfe8478414b9751b4588657b00e4206bf23f 100644 (file)
@@ -348,7 +348,7 @@ size_zones(unsigned long *z, unsigned long *h,
        }
 
        /* Compute holes */
-       w = 0;
+       w = start_pfn;
        for (i = 0; i < MAX_NR_ZONES; i++) {
                unsigned long s = w;
                w += z[i];
index ecf7acb5db9b4b0a8f744e0665d089bb7a040d78..ae207064201e19697160a332a3399f9a0594b2f8 100644 (file)
@@ -247,9 +247,15 @@ void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
        return __ioremap(phys_addr, size, _PAGE_PCD);
 }
 
+/**
+ * iounmap - Free a IO remapping
+ * @addr: virtual address from ioremap_*
+ *
+ * Caller must ensure there is only one unmapping for the same pointer.
+ */
 void iounmap(volatile void __iomem *addr)
 {
-       struct vm_struct *p;
+       struct vm_struct *p, *o;
 
        if (addr <= high_memory) 
                return; 
@@ -257,12 +263,31 @@ void iounmap(volatile void __iomem *addr)
                addr < phys_to_virt(ISA_END_ADDRESS))
                return;
 
-       write_lock(&vmlist_lock);
-       p = __remove_vm_area((void *)((unsigned long)addr & PAGE_MASK));
-       if (!p)
+       addr = (volatile void __iomem *)(PAGE_MASK & (unsigned long __force)addr);
+       /* Use the vm area unlocked, assuming the caller
+          ensures there isn't another iounmap for the same address
+          in parallel. Reuse of the virtual address is prevented by
+          leaving it in the global lists until we're done with it.
+          cpa takes care of the direct mappings. */
+       read_lock(&vmlist_lock);
+       for (p = vmlist; p; p = p->next) {
+               if (p->addr == addr)
+                       break;
+       }
+       read_unlock(&vmlist_lock);
+
+       if (!p) {
                printk("iounmap: bad address %p\n", addr);
-       else if (p->flags >> 20)
+               dump_stack();
+               return;
+       }
+
+       /* Reset the direct mapping. Can block */
+       if (p->flags >> 20)
                ioremap_change_attr(p->phys_addr, p->size, 0);
-       write_unlock(&vmlist_lock);
+
+       /* Finally remove it */
+       o = remove_vm_area((void *)addr);
+       BUG_ON(p != o || o == NULL);
        kfree(p); 
 }
index a828a01739cc791015d1bd02e8e04a555bdf288f..15b67d2760cbf8116eba1762a59e821adaddb073 100644 (file)
@@ -53,6 +53,8 @@ static int __init populate_memnodemap(
        int res = -1;
        unsigned long addr, end;
 
+       if (shift >= 64)
+               return -1;
        memset(memnodemap, 0xff, sizeof(memnodemap));
        for (i = 0; i < numnodes; i++) {
                addr = nodes[i].start;
@@ -65,7 +67,7 @@ static int __init populate_memnodemap(
                        if (memnodemap[addr >> shift] != 0xff)
                                return -1;
                        memnodemap[addr >> shift] = i;
-                       addr += (1 << shift);
+                       addr += (1UL << shift);
                } while (addr < end);
                res = 1;
        } 
index bb34e5ef916c610da0b989cc57fd1b241160b7b6..a8f75a2a0f6f0a328eb7b24d336615982310b10d 100644 (file)
@@ -11,7 +11,7 @@ obj-y         += fixup.o
 obj-$(CONFIG_ACPI)     += acpi.o
 obj-y                  += legacy.o irq.o common.o
 # mmconfig has a 64bit special
-obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o
+obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o
 
 obj-$(CONFIG_NUMA)     += k8-bus.o
 
index a0838c4a94e4c032d9d6024fb0eaed96b0d3dab3..f16c0d57c552f1fade440fb7a683fa649bc7099f 100644 (file)
@@ -8,18 +8,21 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/acpi.h>
+#include <linux/bitmap.h>
 #include "pci.h"
 
 #define MMCONFIG_APER_SIZE (256*1024*1024)
 
+static DECLARE_BITMAP(fallback_slots, 32);
+
 /* Static virtual mapping of the MMCONFIG aperture */
 struct mmcfg_virt {
        struct acpi_table_mcfg_config *cfg;
-       char *virt;
+       char __iomem *virt;
 };
 static struct mmcfg_virt *pci_mmcfg_virt;
 
-static char *get_virt(unsigned int seg, int bus)
+static char __iomem *get_virt(unsigned int seg, unsigned bus)
 {
        int cfg_num = -1;
        struct acpi_table_mcfg_config *cfg;
@@ -27,10 +30,9 @@ static char *get_virt(unsigned int seg, int bus)
        while (1) {
                ++cfg_num;
                if (cfg_num >= pci_mmcfg_config_num) {
-                       /* something bad is going on, no cfg table is found. */
-                       /* so we fall back to the old way we used to do this */
-                       /* and just rely on the first entry to be correct. */
-                       return pci_mmcfg_virt[0].virt;
+                       /* Not found - fall back to type 1. This happens
+                          e.g. on the internal devices of a K8 northbridge. */
+                       return NULL;
                }
                cfg = pci_mmcfg_virt[cfg_num].cfg;
                if (cfg->pci_segment_group_number != seg)
@@ -41,20 +43,30 @@ static char *get_virt(unsigned int seg, int bus)
        }
 }
 
-static inline char *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn)
+static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn)
 {
-
-       return get_virt(seg, bus) + ((bus << 20) | (devfn << 12));
+       char __iomem *addr;
+       if (seg == 0 && bus == 0 && test_bit(PCI_SLOT(devfn), &fallback_slots))
+               return NULL;
+       addr = get_virt(seg, bus);
+       if (!addr)
+               return NULL;
+       return addr + ((bus << 20) | (devfn << 12));
 }
 
 static int pci_mmcfg_read(unsigned int seg, unsigned int bus,
                          unsigned int devfn, int reg, int len, u32 *value)
 {
-       char *addr = pci_dev_base(seg, bus, devfn);
+       char __iomem *addr;
 
+       /* Why do we have this when nobody checks it. How about a BUG()!? -AK */
        if (unlikely(!value || (bus > 255) || (devfn > 255) || (reg > 4095)))
                return -EINVAL;
 
+       addr = pci_dev_base(seg, bus, devfn);
+       if (!addr)
+               return pci_conf1_read(seg,bus,devfn,reg,len,value);
+
        switch (len) {
        case 1:
                *value = readb(addr + reg);
@@ -73,11 +85,16 @@ static int pci_mmcfg_read(unsigned int seg, unsigned int bus,
 static int pci_mmcfg_write(unsigned int seg, unsigned int bus,
                           unsigned int devfn, int reg, int len, u32 value)
 {
-       char *addr = pci_dev_base(seg, bus, devfn);
+       char __iomem *addr;
 
+       /* Why do we have this when nobody checks it. How about a BUG()!? -AK */
        if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095)))
                return -EINVAL;
 
+       addr = pci_dev_base(seg, bus, devfn);
+       if (!addr)
+               return pci_conf1_write(seg,bus,devfn,reg,len,value);
+
        switch (len) {
        case 1:
                writeb(value, addr + reg);
@@ -98,6 +115,30 @@ static struct pci_raw_ops pci_mmcfg = {
        .write =        pci_mmcfg_write,
 };
 
+/* K8 systems have some devices (typically in the builtin northbridge)
+   that are only accessible using type1
+   Normally this can be expressed in the MCFG by not listing them
+   and assigning suitable _SEGs, but this isn't implemented in some BIOS.
+   Instead try to discover all devices on bus 0 that are unreachable using MM
+   and fallback for them.
+   We only do this for bus 0/seg 0 */
+static __init void unreachable_devices(void)
+{
+       int i;
+       for (i = 0; i < 32; i++) {
+               u32 val1;
+               char __iomem *addr;
+
+               pci_conf1_read(0, 0, PCI_DEVFN(i,0), 0, 4, &val1);
+               if (val1 == 0xffffffff)
+                       continue;
+               addr = pci_dev_base(0, 0, PCI_DEVFN(i, 0));
+               if (addr == NULL|| readl(addr) != val1) {
+                       set_bit(i, &fallback_slots);
+               }
+       }
+}
+
 static int __init pci_mmcfg_init(void)
 {
        int i;
@@ -128,6 +169,8 @@ static int __init pci_mmcfg_init(void)
                printk(KERN_INFO "PCI: Using MMCONFIG at %x\n", pci_mmcfg_config[i].base_address);
        }
 
+       unreachable_devices();
+
        raw_pci_ops = &pci_mmcfg;
        pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
 
index fbe050124ec514431c19091d395fa9065b2398a4..43fa2049568883d6b5c07cc304b77c93d3091abf 100644 (file)
@@ -1371,10 +1371,6 @@ static void as_add_request(request_queue_t *q, struct request *rq)
        struct as_rq *alias;
        int data_dir;
 
-       if (arq->state != AS_RQ_PRESCHED) {
-               printk("arq->state: %d\n", arq->state);
-               WARN_ON(1);
-       }
        arq->state = AS_RQ_NEW;
 
        if (rq_data_dir(arq->request) == READ
index 99c9ca6d5992ab18b3e40fa201423bd3e36a0055..d4beb9a89ee0b08b0b681ca5a09e5cda59b7e99f 100644 (file)
@@ -239,7 +239,7 @@ void blk_queue_make_request(request_queue_t * q, make_request_fn * mfn)
        q->backing_dev_info.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
        q->backing_dev_info.state = 0;
        q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY;
-       blk_queue_max_sectors(q, MAX_SECTORS);
+       blk_queue_max_sectors(q, SAFE_MAX_SECTORS);
        blk_queue_hardsect_size(q, 512);
        blk_queue_dma_alignment(q, 511);
        blk_queue_congestion_threshold(q);
@@ -555,7 +555,12 @@ void blk_queue_max_sectors(request_queue_t *q, unsigned short max_sectors)
                printk("%s: set to minimum %d\n", __FUNCTION__, max_sectors);
        }
 
-       q->max_sectors = q->max_hw_sectors = max_sectors;
+       if (BLK_DEF_MAX_SECTORS > max_sectors)
+               q->max_hw_sectors = q->max_sectors = max_sectors;
+       else {
+               q->max_sectors = BLK_DEF_MAX_SECTORS;
+               q->max_hw_sectors = max_sectors;
+       }
 }
 
 EXPORT_SYMBOL(blk_queue_max_sectors);
@@ -657,8 +662,8 @@ EXPORT_SYMBOL(blk_queue_hardsect_size);
 void blk_queue_stack_limits(request_queue_t *t, request_queue_t *b)
 {
        /* zero is "infinity" */
-       t->max_sectors = t->max_hw_sectors =
-               min_not_zero(t->max_sectors,b->max_sectors);
+       t->max_sectors = min_not_zero(t->max_sectors,b->max_sectors);
+       t->max_hw_sectors = min_not_zero(t->max_hw_sectors,b->max_hw_sectors);
 
        t->max_phys_segments = min(t->max_phys_segments,b->max_phys_segments);
        t->max_hw_segments = min(t->max_hw_segments,b->max_hw_segments);
@@ -1293,9 +1298,15 @@ static inline int ll_new_hw_segment(request_queue_t *q,
 static int ll_back_merge_fn(request_queue_t *q, struct request *req, 
                            struct bio *bio)
 {
+       unsigned short max_sectors;
        int len;
 
-       if (req->nr_sectors + bio_sectors(bio) > q->max_sectors) {
+       if (unlikely(blk_pc_request(req)))
+               max_sectors = q->max_hw_sectors;
+       else
+               max_sectors = q->max_sectors;
+
+       if (req->nr_sectors + bio_sectors(bio) > max_sectors) {
                req->flags |= REQ_NOMERGE;
                if (req == q->last_merge)
                        q->last_merge = NULL;
@@ -1325,9 +1336,16 @@ static int ll_back_merge_fn(request_queue_t *q, struct request *req,
 static int ll_front_merge_fn(request_queue_t *q, struct request *req, 
                             struct bio *bio)
 {
+       unsigned short max_sectors;
        int len;
 
-       if (req->nr_sectors + bio_sectors(bio) > q->max_sectors) {
+       if (unlikely(blk_pc_request(req)))
+               max_sectors = q->max_hw_sectors;
+       else
+               max_sectors = q->max_sectors;
+
+
+       if (req->nr_sectors + bio_sectors(bio) > max_sectors) {
                req->flags |= REQ_NOMERGE;
                if (req == q->last_merge)
                        q->last_merge = NULL;
@@ -2144,7 +2162,7 @@ int blk_rq_map_user(request_queue_t *q, struct request *rq, void __user *ubuf,
        struct bio *bio;
        int reading;
 
-       if (len > (q->max_sectors << 9))
+       if (len > (q->max_hw_sectors << 9))
                return -EINVAL;
        if (!len || !ubuf)
                return -EINVAL;
@@ -2259,7 +2277,7 @@ int blk_rq_map_kern(request_queue_t *q, struct request *rq, void *kbuf,
 {
        struct bio *bio;
 
-       if (len > (q->max_sectors << 9))
+       if (len > (q->max_hw_sectors << 9))
                return -EINVAL;
        if (!len || !kbuf)
                return -EINVAL;
@@ -2306,6 +2324,8 @@ void blk_execute_rq_nowait(request_queue_t *q, struct gendisk *bd_disk,
        generic_unplug_device(q);
 }
 
+EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
+
 /**
  * blk_execute_rq - insert a request into queue for execution
  * @q:         queue to insert the request in
@@ -2444,7 +2464,7 @@ void disk_round_stats(struct gendisk *disk)
 /*
  * queue lock must be held
  */
-static void __blk_put_request(request_queue_t *q, struct request *req)
+void __blk_put_request(request_queue_t *q, struct request *req)
 {
        struct request_list *rl = req->rl;
 
@@ -2473,6 +2493,8 @@ static void __blk_put_request(request_queue_t *q, struct request *req)
        }
 }
 
+EXPORT_SYMBOL_GPL(__blk_put_request);
+
 void blk_put_request(struct request *req)
 {
        unsigned long flags;
index 382dea7b224c61b87c354fdb425ad7b6f3e19c39..1d8852f7bbff077d14209b850b6d64e35186f81c 100644 (file)
@@ -233,7 +233,7 @@ static int sg_io(struct file *file, request_queue_t *q,
        if (verify_command(file, cmd))
                return -EPERM;
 
-       if (hdr->dxfer_len > (q->max_sectors << 9))
+       if (hdr->dxfer_len > (q->max_hw_sectors << 9))
                return -EIO;
 
        if (hdr->dxfer_len)
@@ -442,11 +442,37 @@ error:
        return err;
 }
 
+
+/* Send basic block requests */
+static int __blk_send_generic(request_queue_t *q, struct gendisk *bd_disk, int cmd, int data)
+{
+       struct request *rq;
+       int err;
+
+       rq = blk_get_request(q, WRITE, __GFP_WAIT);
+       rq->flags |= REQ_BLOCK_PC;
+       rq->data = NULL;
+       rq->data_len = 0;
+       rq->timeout = BLK_DEFAULT_TIMEOUT;
+       memset(rq->cmd, 0, sizeof(rq->cmd));
+       rq->cmd[0] = cmd;
+       rq->cmd[4] = data;
+       rq->cmd_len = 6;
+       err = blk_execute_rq(q, bd_disk, rq, 0);
+       blk_put_request(rq);
+
+       return err;
+}
+
+static inline int blk_send_start_stop(request_queue_t *q, struct gendisk *bd_disk, int data)
+{
+       return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data);
+}
+
 int scsi_cmd_ioctl(struct file *file, struct gendisk *bd_disk, unsigned int cmd, void __user *arg)
 {
        request_queue_t *q;
-       struct request *rq;
-       int close = 0, err;
+       int err;
 
        q = bd_disk->queue;
        if (!q)
@@ -564,19 +590,10 @@ int scsi_cmd_ioctl(struct file *file, struct gendisk *bd_disk, unsigned int cmd,
                        err = sg_scsi_ioctl(file, q, bd_disk, arg);
                        break;
                case CDROMCLOSETRAY:
-                       close = 1;
+                       err = blk_send_start_stop(q, bd_disk, 0x03);
+                       break;
                case CDROMEJECT:
-                       rq = blk_get_request(q, WRITE, __GFP_WAIT);
-                       rq->flags |= REQ_BLOCK_PC;
-                       rq->data = NULL;
-                       rq->data_len = 0;
-                       rq->timeout = BLK_DEFAULT_TIMEOUT;
-                       memset(rq->cmd, 0, sizeof(rq->cmd));
-                       rq->cmd[0] = GPCMD_START_STOP_UNIT;
-                       rq->cmd[4] = 0x02 + (close != 0);
-                       rq->cmd_len = 6;
-                       err = blk_execute_rq(q, bd_disk, rq, 0);
-                       blk_put_request(rq);
+                       err = blk_send_start_stop(q, bd_disk, 0x02);
                        break;
                default:
                        err = -ENOTTY;
index fac1e1603097d46bcc66e076c083601cfa37c52f..ea410b6b7644fa4b7959e324ba5595019b90bfe6 100644 (file)
@@ -5,7 +5,7 @@
 # Rewritten to use lists instead of if-statements.
 #
 
-obj-$(CONFIG_PCI)              += pci/ usb/
+obj-$(CONFIG_PCI)              += pci/
 obj-$(CONFIG_PARISC)           += parisc/
 obj-$(CONFIG_RAPIDIO)          += rapidio/
 obj-y                          += video/
@@ -49,6 +49,7 @@ obj-$(CONFIG_ATA_OVER_ETH)    += block/aoe/
 obj-$(CONFIG_PARIDE)           += block/paride/
 obj-$(CONFIG_TC)               += tc/
 obj-$(CONFIG_USB)              += usb/
+obj-$(CONFIG_PCI)              += usb/
 obj-$(CONFIG_USB_GADGET)       += usb/gadget/
 obj-$(CONFIG_GAMEPORT)         += input/gameport/
 obj-$(CONFIG_INPUT)            += input/
index fe1e8126fbae836d72ba045744ae5894cbd6d3a3..fce21c257523b729c68d29d201b41a7a762b5e31 100644 (file)
@@ -197,7 +197,6 @@ config ACPI_ASUS
 config ACPI_IBM
        tristate "IBM ThinkPad Laptop Extras"
        depends on X86
-       default y
        ---help---
          This is a Linux ACPI driver for the IBM ThinkPad laptops. It adds
          support for Fn-Fx key combinations, Bluetooth control, video
index a18243488c666cad223183fbe54726f9ba26fbed..5984b4f6715a95064e72d53938a4f8681bbb5714 100644 (file)
@@ -16,7 +16,7 @@ EXTRA_CFLAGS  += $(ACPI_CFLAGS)
 # ACPI Boot-Time Table Parsing
 #
 obj-y                          += tables.o
-obj-y                          += blacklist.o
+obj-$(CONFIG_X86)              += blacklist.o
 
 #
 # ACPI Core Subsystem (Interpreter)
index 82292b77e5c681b874334913078926106546bb2f..78927c0f155102a01f3acf97b87887819bfc546f 100644 (file)
@@ -316,7 +316,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
        if (!link || !irq)
                return_VALUE(-EINVAL);
 
-       resource = kmalloc(sizeof(*resource) + 1, GFP_KERNEL);
+       resource = kmalloc(sizeof(*resource) + 1, GFP_ATOMIC);
        if (!resource)
                return_VALUE(-ENOMEM);
 
index 4217925626423db1f39cc76880e95f700fb5d279..0c561c571f29a40f09dce5e96e9af29f79376fe4 100644 (file)
@@ -543,6 +543,8 @@ static int acpi_processor_get_info(struct acpi_processor *pr)
        return_VALUE(0);
 }
 
+static void *processor_device_array[NR_CPUS];
+
 static int acpi_processor_start(struct acpi_device *device)
 {
        int result = 0;
@@ -561,6 +563,19 @@ static int acpi_processor_start(struct acpi_device *device)
 
        BUG_ON((pr->id >= NR_CPUS) || (pr->id < 0));
 
+       /*
+        * Buggy BIOS check
+        * ACPI id of processors can be reported wrongly by the BIOS.
+        * Don't trust it blindly
+        */
+       if (processor_device_array[pr->id] != NULL &&
+           processor_device_array[pr->id] != (void *)device) {
+               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "BIOS reporting wrong ACPI id"
+                       "for the processor\n"));
+               return_VALUE(-ENODEV);
+       }
+       processor_device_array[pr->id] = (void *)device;
+
        processors[pr->id] = pr;
 
        result = acpi_processor_add_fs(device);
index 70d8a6ec0920f1589525395a1550360a26cbd54f..807b0df308f18d6a31fccb0a806cd7c03195c9f7 100644 (file)
@@ -169,15 +169,11 @@ acpi_processor_power_activate(struct acpi_processor *pr,
 
 static void acpi_safe_halt(void)
 {
-       int polling = test_thread_flag(TIF_POLLING_NRFLAG);
-       if (polling) {
-               clear_thread_flag(TIF_POLLING_NRFLAG);
-               smp_mb__after_clear_bit();
-       }
+       clear_thread_flag(TIF_POLLING_NRFLAG);
+       smp_mb__after_clear_bit();
        if (!need_resched())
                safe_halt();
-       if (polling)
-               set_thread_flag(TIF_POLLING_NRFLAG);
+       set_thread_flag(TIF_POLLING_NRFLAG);
 }
 
 static atomic_t c3_cpu_count;
@@ -278,6 +274,17 @@ static void acpi_processor_idle(void)
                }
        }
 
+#ifdef CONFIG_HOTPLUG_CPU
+       /*
+        * Check for P_LVL2_UP flag before entering C2 and above on
+        * an SMP system. We do it here instead of doing it at _CST/P_LVL
+        * detection phase, to work cleanly with logical CPU hotplug.
+        */
+       if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && 
+           !pr->flags.has_cst && !acpi_fadt.plvl2_up)
+               cx = &pr->power.states[ACPI_STATE_C1];
+#endif
+
        cx->usage++;
 
        /*
@@ -285,6 +292,16 @@ static void acpi_processor_idle(void)
         * ------
         * Invoke the current Cx state to put the processor to sleep.
         */
+       if (cx->type == ACPI_STATE_C2 || cx->type == ACPI_STATE_C3) {
+               clear_thread_flag(TIF_POLLING_NRFLAG);
+               smp_mb__after_clear_bit();
+               if (need_resched()) {
+                       set_thread_flag(TIF_POLLING_NRFLAG);
+                       local_irq_enable();
+                       return;
+               }
+       }
+
        switch (cx->type) {
 
        case ACPI_STATE_C1:
@@ -317,6 +334,7 @@ static void acpi_processor_idle(void)
                t2 = inl(acpi_fadt.xpm_tmr_blk.address);
                /* Re-enable interrupts */
                local_irq_enable();
+               set_thread_flag(TIF_POLLING_NRFLAG);
                /* Compute time (ticks) that we were actually asleep */
                sleep_ticks =
                    ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD;
@@ -356,6 +374,7 @@ static void acpi_processor_idle(void)
 
                /* Re-enable interrupts */
                local_irq_enable();
+               set_thread_flag(TIF_POLLING_NRFLAG);
                /* Compute time (ticks) that we were actually asleep */
                sleep_ticks =
                    ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD;
@@ -368,6 +387,15 @@ static void acpi_processor_idle(void)
 
        next_state = pr->power.state;
 
+#ifdef CONFIG_HOTPLUG_CPU
+       /* Don't do promotion/demotion */
+       if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) &&
+           !pr->flags.has_cst && !acpi_fadt.plvl2_up) {
+               next_state = cx;
+               goto end;
+       }
+#endif
+
        /*
         * Promotion?
         * ----------
@@ -534,6 +562,15 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
        pr->power.states[ACPI_STATE_C0].valid = 1;
        pr->power.states[ACPI_STATE_C1].valid = 1;
 
+#ifndef CONFIG_HOTPLUG_CPU
+       /*
+        * Check for P_LVL2_UP flag before entering C2 and above on
+        * an SMP system. 
+        */
+       if ((num_online_cpus() > 1) && !acpi_fadt.plvl2_up)
+               return_VALUE(-ENODEV);
+#endif
+
        /* determine C2 and C3 address from pblk */
        pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4;
        pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5;
@@ -690,7 +727,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
 
        /* Validate number of power states discovered */
        if (pr->power.count < 2)
-               status = -ENODEV;
+               status = -EFAULT;
 
       end:
        acpi_os_free(buffer.pointer);
@@ -841,11 +878,11 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
         * this function */
 
        result = acpi_processor_get_power_info_cst(pr);
-       if ((result) || (acpi_processor_power_verify(pr) < 2)) {
+       if (result == -ENODEV)
                result = acpi_processor_get_power_info_fadt(pr);
-               if ((result) || (acpi_processor_power_verify(pr) < 2))
-                       result = acpi_processor_get_power_info_default_c1(pr);
-       }
+
+       if ((result) || (acpi_processor_power_verify(pr) < 2))
+               result = acpi_processor_get_power_info_default_c1(pr);
 
        /*
         * Set Default Policy
index 37528c3b64b02baeb0aafbae96f2775495177453..dc9817cfb882a87f6b640640aeb243988e059c3d 100644 (file)
@@ -101,11 +101,9 @@ static unsigned int acpi_thermal_cpufreq_is_init = 0;
 static int cpu_has_cpufreq(unsigned int cpu)
 {
        struct cpufreq_policy policy;
-       if (!acpi_thermal_cpufreq_is_init)
-               return -ENODEV;
-       if (!cpufreq_get_policy(&policy, cpu))
-               return -ENODEV;
-       return 0;
+       if (!acpi_thermal_cpufreq_is_init || cpufreq_get_policy(&policy, cpu))
+               return 0;
+       return 1;
 }
 
 static int acpi_thermal_cpufreq_increase(unsigned int cpu)
@@ -127,13 +125,13 @@ static int acpi_thermal_cpufreq_decrease(unsigned int cpu)
        if (!cpu_has_cpufreq(cpu))
                return -ENODEV;
 
-       if (cpufreq_thermal_reduction_pctg[cpu] >= 20) {
+       if (cpufreq_thermal_reduction_pctg[cpu] > 20)
                cpufreq_thermal_reduction_pctg[cpu] -= 20;
-               cpufreq_update_policy(cpu);
-               return 0;
-       }
-
-       return -ERANGE;
+       else
+               cpufreq_thermal_reduction_pctg[cpu] = 0;
+       cpufreq_update_policy(cpu);
+       /* We reached max freq again and can leave passive mode */
+       return !cpufreq_thermal_reduction_pctg[cpu];
 }
 
 static int acpi_thermal_cpufreq_notifier(struct notifier_block *nb,
@@ -200,7 +198,7 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
        int result = 0;
        struct acpi_processor *pr = NULL;
        struct acpi_device *device = NULL;
-       int tx = 0;
+       int tx = 0, max_tx_px = 0;
 
        ACPI_FUNCTION_TRACE("acpi_processor_set_thermal_limit");
 
@@ -259,19 +257,27 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
                /* if going down: T-states first, P-states later */
 
                if (pr->flags.throttling) {
-                       if (tx == 0)
+                       if (tx == 0) {
+                               max_tx_px = 1;
                                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                                  "At minimum throttling state\n"));
-                       else {
+                       else {
                                tx--;
                                goto end;
                        }
                }
 
                result = acpi_thermal_cpufreq_decrease(pr->id);
-               if (result == -ERANGE)
+               if (result) {
+                       /*
+                        * We only could get -ERANGE, 1 or 0.
+                        * In the first two cases we reached max freq again.
+                        */
                        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                          "At minimum performance state\n"));
+                       max_tx_px = 1;
+               } else
+                       max_tx_px = 0;
 
                break;
        }
@@ -290,8 +296,10 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
                                  pr->limit.thermal.px, pr->limit.thermal.tx));
        } else
                result = 0;
-
-       return_VALUE(result);
+       if (max_tx_px)
+               return_VALUE(1);
+       else
+               return_VALUE(result);
 }
 
 int acpi_processor_get_limit_info(struct acpi_processor *pr)
index 23e2c6968a1164f9f54aa6f9a5493c619965019a..31218e1d2a18313a8ea9410c3bbab5934bb7b396 100644 (file)
@@ -1110,7 +1110,7 @@ acpi_add_single_object(struct acpi_device **child,
         *
         * TBD: Assumes LDM provides driver hot-plug capability.
         */
-       result = acpi_bus_find_driver(device);
+       acpi_bus_find_driver(device);
 
       end:
        if (!result)
index a24847c08f7f43d47cc28b33440e5d8d1bd04268..19f3ea48475e369ec9ba1b39405e5d14da9a2e6f 100644 (file)
@@ -72,7 +72,7 @@
 #define _COMPONENT             ACPI_THERMAL_COMPONENT
 ACPI_MODULE_NAME("acpi_thermal")
 
-    MODULE_AUTHOR("Paul Diefenbaugh");
+MODULE_AUTHOR("Paul Diefenbaugh");
 MODULE_DESCRIPTION(ACPI_THERMAL_DRIVER_NAME);
 MODULE_LICENSE("GPL");
 
@@ -517,9 +517,9 @@ static int acpi_thermal_hot(struct acpi_thermal *tz)
        return_VALUE(0);
 }
 
-static int acpi_thermal_passive(struct acpi_thermal *tz)
+static void acpi_thermal_passive(struct acpi_thermal *tz)
 {
-       int result = 0;
+       int result = 1;
        struct acpi_thermal_passive *passive = NULL;
        int trend = 0;
        int i = 0;
@@ -527,7 +527,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
        ACPI_FUNCTION_TRACE("acpi_thermal_passive");
 
        if (!tz || !tz->trips.passive.flags.valid)
-               return_VALUE(-EINVAL);
+               return;
 
        passive = &(tz->trips.passive);
 
@@ -547,7 +547,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
                                  trend, passive->tc1, tz->temperature,
                                  tz->last_temperature, passive->tc2,
                                  tz->temperature, passive->temperature));
-               tz->trips.passive.flags.enabled = 1;
+               passive->flags.enabled = 1;
                /* Heating up? */
                if (trend > 0)
                        for (i = 0; i < passive->devices.count; i++)
@@ -556,12 +556,32 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
                                                                 handles[i],
                                                                 ACPI_PROCESSOR_LIMIT_INCREMENT);
                /* Cooling off? */
-               else if (trend < 0)
+               else if (trend < 0) {
                        for (i = 0; i < passive->devices.count; i++)
-                               acpi_processor_set_thermal_limit(passive->
-                                                                devices.
-                                                                handles[i],
-                                                                ACPI_PROCESSOR_LIMIT_DECREMENT);
+                               /*
+                                * assume that we are on highest
+                                * freq/lowest thrott and can leave
+                                * passive mode, even in error case
+                                */
+                               if (!acpi_processor_set_thermal_limit
+                                   (passive->devices.handles[i],
+                                    ACPI_PROCESSOR_LIMIT_DECREMENT))
+                                       result = 0;
+                       /*
+                        * Leave cooling mode, even if the temp might
+                        * higher than trip point This is because some
+                        * machines might have long thermal polling
+                        * frequencies (tsp) defined. We will fall back
+                        * into passive mode in next cycle (probably quicker)
+                        */
+                       if (result) {
+                               passive->flags.enabled = 0;
+                               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                                 "Disabling passive cooling, still above threshold,"
+                                                 " but we are cooling down\n"));
+                       }
+               }
+               return;
        }
 
        /*
@@ -571,23 +591,21 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
         * and avoid thrashing around the passive trip point.  Note that we
         * assume symmetry.
         */
-       else if (tz->trips.passive.flags.enabled) {
-               for (i = 0; i < passive->devices.count; i++)
-                       result =
-                           acpi_processor_set_thermal_limit(passive->devices.
-                                                            handles[i],
-                                                            ACPI_PROCESSOR_LIMIT_DECREMENT);
-               if (result == 1) {
-                       tz->trips.passive.flags.enabled = 0;
-                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                         "Disabling passive cooling (zone is cool)\n"));
-               }
+       if (!passive->flags.enabled)
+               return;
+       for (i = 0; i < passive->devices.count; i++)
+               if (!acpi_processor_set_thermal_limit
+                   (passive->devices.handles[i],
+                    ACPI_PROCESSOR_LIMIT_DECREMENT))
+                       result = 0;
+       if (result) {
+               passive->flags.enabled = 0;
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                 "Disabling passive cooling (zone is cool)\n"));
        }
-
-       return_VALUE(0);
 }
 
-static int acpi_thermal_active(struct acpi_thermal *tz)
+static void acpi_thermal_active(struct acpi_thermal *tz)
 {
        int result = 0;
        struct acpi_thermal_active *active = NULL;
@@ -598,74 +616,66 @@ static int acpi_thermal_active(struct acpi_thermal *tz)
        ACPI_FUNCTION_TRACE("acpi_thermal_active");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return;
 
        for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
-
                active = &(tz->trips.active[i]);
                if (!active || !active->flags.valid)
                        break;
-
-               /*
-                * Above Threshold?
-                * ----------------
-                * If not already enabled, turn ON all cooling devices
-                * associated with this active threshold.
-                */
                if (tz->temperature >= active->temperature) {
+                       /*
+                        * Above Threshold?
+                        * ----------------
+                        * If not already enabled, turn ON all cooling devices
+                        * associated with this active threshold.
+                        */
                        if (active->temperature > maxtemp)
-                               tz->state.active_index = i, maxtemp =
-                                   active->temperature;
-                       if (!active->flags.enabled) {
-                               for (j = 0; j < active->devices.count; j++) {
-                                       result =
-                                           acpi_bus_set_power(active->devices.
-                                                              handles[j],
-                                                              ACPI_STATE_D0);
-                                       if (result) {
-                                               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                                                 "Unable to turn cooling device [%p] 'on'\n",
-                                                                 active->
-                                                                 devices.
-                                                                 handles[j]));
-                                               continue;
-                                       }
-                                       active->flags.enabled = 1;
-                                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                                         "Cooling device [%p] now 'on'\n",
-                                                         active->devices.
-                                                         handles[j]));
-                               }
-                       }
-               }
-               /*
-                * Below Threshold?
-                * ----------------
-                * Turn OFF all cooling devices associated with this
-                * threshold.
-                */
-               else if (active->flags.enabled) {
+                               tz->state.active_index = i;
+                       maxtemp = active->temperature;
+                       if (active->flags.enabled)
+                               continue;
                        for (j = 0; j < active->devices.count; j++) {
                                result =
                                    acpi_bus_set_power(active->devices.
                                                       handles[j],
-                                                      ACPI_STATE_D3);
+                                                      ACPI_STATE_D0);
                                if (result) {
                                        ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                                         "Unable to turn cooling device [%p] 'off'\n",
+                                                         "Unable to turn cooling device [%p] 'on'\n",
                                                          active->devices.
                                                          handles[j]));
                                        continue;
                                }
-                               active->flags.enabled = 0;
+                               active->flags.enabled = 1;
                                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                                 "Cooling device [%p] now 'off'\n",
+                                                 "Cooling device [%p] now 'on'\n",
                                                  active->devices.handles[j]));
                        }
+                       continue;
+               }
+               if (!active->flags.enabled)
+                       continue;
+               /*
+                * Below Threshold?
+                * ----------------
+                * Turn OFF all cooling devices associated with this
+                * threshold.
+                */
+               for (j = 0; j < active->devices.count; j++) {
+                       result = acpi_bus_set_power(active->devices.handles[j],
+                                                   ACPI_STATE_D3);
+                       if (result) {
+                               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
+                                                 "Unable to turn cooling device [%p] 'off'\n",
+                                                 active->devices.handles[j]));
+                               continue;
+                       }
+                       active->flags.enabled = 0;
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                         "Cooling device [%p] now 'off'\n",
+                                         active->devices.handles[j]));
                }
        }
-
-       return_VALUE(0);
 }
 
 static void acpi_thermal_check(void *context);
@@ -744,15 +754,12 @@ static void acpi_thermal_check(void *data)
         * Again, separated from the above two to allow independent policy
         * decisions.
         */
-       if (tz->trips.critical.flags.enabled)
-               tz->state.critical = 1;
-       if (tz->trips.hot.flags.enabled)
-               tz->state.hot = 1;
-       if (tz->trips.passive.flags.enabled)
-               tz->state.passive = 1;
+       tz->state.critical = tz->trips.critical.flags.enabled;
+       tz->state.hot = tz->trips.hot.flags.enabled;
+       tz->state.passive = tz->trips.passive.flags.enabled;
+       tz->state.active = 0;
        for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++)
-               if (tz->trips.active[i].flags.enabled)
-                       tz->state.active = 1;
+               tz->state.active |= tz->trips.active[i].flags.enabled;
 
        /*
         * Calculate Sleep Time
index 0c5abc536c7ad1deb1f7db7e55c410ccf289a591..2ce872d75890b99f44e5aa4712d828ba6ee0ff9c 100644 (file)
@@ -84,14 +84,14 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
 
        /* Find a free owner ID */
 
-       for (i = 0; i < 32; i++) {
-               if (!(acpi_gbl_owner_id_mask & (1 << i))) {
+       for (i = 0; i < 64; i++) {
+               if (!(acpi_gbl_owner_id_mask & (1ULL << i))) {
                        ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
-                                         "Current owner_id mask: %8.8X New ID: %2.2X\n",
+                                         "Current owner_id mask: %16.16LX New ID: %2.2X\n",
                                          acpi_gbl_owner_id_mask,
                                          (unsigned int)(i + 1)));
 
-                       acpi_gbl_owner_id_mask |= (1 << i);
+                       acpi_gbl_owner_id_mask |= (1ULL << i);
                        *owner_id = (acpi_owner_id) (i + 1);
                        goto exit;
                }
@@ -106,7 +106,7 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
         */
        *owner_id = 0;
        status = AE_OWNER_ID_LIMIT;
-       ACPI_REPORT_ERROR(("Could not allocate new owner_id (32 max), AE_OWNER_ID_LIMIT\n"));
+       ACPI_REPORT_ERROR(("Could not allocate new owner_id (64 max), AE_OWNER_ID_LIMIT\n"));
 
       exit:
        (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
@@ -123,7 +123,7 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
  *              control method or unloading a table. Either way, we would
  *              ignore any error anyway.
  *
- * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 32
+ * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 64
  *
  ******************************************************************************/
 
@@ -140,7 +140,7 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
 
        /* Zero is not a valid owner_iD */
 
-       if ((owner_id == 0) || (owner_id > 32)) {
+       if ((owner_id == 0) || (owner_id > 64)) {
                ACPI_REPORT_ERROR(("Invalid owner_id: %2.2X\n", owner_id));
                return_VOID;
        }
@@ -158,8 +158,8 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
 
        /* Free the owner ID only if it is valid */
 
-       if (acpi_gbl_owner_id_mask & (1 << owner_id)) {
-               acpi_gbl_owner_id_mask ^= (1 << owner_id);
+       if (acpi_gbl_owner_id_mask & (1ULL << owner_id)) {
+               acpi_gbl_owner_id_mask ^= (1ULL << owner_id);
        }
 
        (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
index f051b151580d7de14647213f6c4497a75a4eff57..d10668f146997d07c53630b722d15fad2054ed98 100644 (file)
@@ -812,7 +812,7 @@ acpi_video_device_write_brightness(struct file *file,
 
        ACPI_FUNCTION_TRACE("acpi_video_device_write_brightness");
 
-       if (!dev || count + 1 > sizeof str)
+       if (!dev || !dev->brightness || count + 1 > sizeof str)
                return_VALUE(-EINVAL);
 
        if (copy_from_user(str, buffer, count))
index 489de81ea6090814ade9c6746de975fe209ad073..01a9f1cb77438eeff822a5ac3a825179a72e8028 100644 (file)
@@ -5,6 +5,13 @@
 menu "ATM drivers"
        depends on NETDEVICES && ATM
 
+config ATM_DUMMY
+       tristate "Dummy ATM driver"
+       depends on ATM
+       help
+         Dummy ATM driver. Useful for proxy signalling, testing,
+         and development.  If unsure, say N.
+
 config ATM_TCP
        tristate "ATM over TCP"
        depends on INET && ATM
index 5b77188527a9ad91f8d3f70691ba9c2d4393f4a1..b5077ce8cb4007b901716c89208e6b94f5012bd5 100644 (file)
@@ -31,6 +31,7 @@ ifeq ($(CONFIG_ATM_IDT77252_USE_SUNI),y)
   obj-$(CONFIG_ATM_IDT77252)   += suni.o
 endif
 
+obj-$(CONFIG_ATM_DUMMY)                += adummy.o
 obj-$(CONFIG_ATM_TCP)          += atmtcp.o
 obj-$(CONFIG_ATM_FIRESTREAM)   += firestream.o
 obj-$(CONFIG_ATM_LANAI)                += lanai.o
diff --git a/drivers/atm/adummy.c b/drivers/atm/adummy.c
new file mode 100644 (file)
index 0000000..d1387cf
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * adummy.c: a dummy ATM driver
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/skbuff.h>
+#include <linux/pci.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <asm/io.h>
+#include <asm/byteorder.h>
+#include <asm/uaccess.h>
+
+#include <linux/atmdev.h>
+#include <linux/atm.h>
+#include <linux/sonet.h>
+
+/* version definition */
+
+#define DRV_VERSION "1.0"
+
+#define DEV_LABEL "adummy"
+
+#define ADUMMY_DEV(dev) ((struct adummy_dev *) (dev)->dev_data)
+
+struct adummy_dev {
+       struct atm_dev *atm_dev;
+
+       struct list_head entry;
+};
+
+/* globals */
+
+static LIST_HEAD(adummy_devs);
+
+static int __init
+adummy_start(struct atm_dev *dev)
+{
+       dev->ci_range.vpi_bits = 4;
+       dev->ci_range.vci_bits = 12;
+
+       return 0;
+}
+
+static int
+adummy_open(struct atm_vcc *vcc)
+{
+       short vpi = vcc->vpi;
+       int vci = vcc->vci;
+
+       if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC)
+               return 0;
+
+       set_bit(ATM_VF_ADDR, &vcc->flags);
+       set_bit(ATM_VF_READY, &vcc->flags);
+
+       return 0;
+}
+
+static void
+adummy_close(struct atm_vcc *vcc)
+{
+       clear_bit(ATM_VF_READY, &vcc->flags);
+       clear_bit(ATM_VF_ADDR, &vcc->flags);
+}
+
+static int
+adummy_send(struct atm_vcc *vcc, struct sk_buff *skb)
+{
+       if (vcc->pop)
+               vcc->pop(vcc, skb);
+       else
+               dev_kfree_skb_any(skb);
+       atomic_inc(&vcc->stats->tx);
+
+       return 0;
+}
+
+static int
+adummy_proc_read(struct atm_dev *dev, loff_t *pos, char *page)
+{
+       int left = *pos;
+
+       if (!left--)
+               return sprintf(page, "version %s\n", DRV_VERSION);
+
+       return 0;
+}
+
+static struct atmdev_ops adummy_ops =
+{
+       .open =         adummy_open,
+       .close =        adummy_close,   
+       .send =         adummy_send,
+       .proc_read =    adummy_proc_read,
+       .owner =        THIS_MODULE
+};
+
+static int __init adummy_init(void)
+{
+       struct atm_dev *atm_dev;
+       struct adummy_dev *adummy_dev;
+       int err = 0;
+
+       printk(KERN_ERR "adummy: version %s\n", DRV_VERSION);
+
+       adummy_dev = (struct adummy_dev *) kmalloc(sizeof(struct adummy_dev),
+                                                  GFP_KERNEL);
+       if (!adummy_dev) {
+               printk(KERN_ERR DEV_LABEL ": kmalloc() failed\n");
+               err = -ENOMEM;
+               goto out;
+       }
+       memset(adummy_dev, 0, sizeof(struct adummy_dev));
+
+       atm_dev = atm_dev_register(DEV_LABEL, &adummy_ops, -1, NULL);
+       if (!atm_dev) {
+               printk(KERN_ERR DEV_LABEL ": atm_dev_register() failed\n");
+               err = -ENODEV;
+               goto out_kfree;
+       }
+
+       adummy_dev->atm_dev = atm_dev;
+       atm_dev->dev_data = adummy_dev;
+
+       if (adummy_start(atm_dev)) {
+               printk(KERN_ERR DEV_LABEL ": adummy_start() failed\n");
+               err = -ENODEV;
+               goto out_unregister;
+       }
+
+       list_add(&adummy_dev->entry, &adummy_devs);
+out:
+       return err;
+
+out_unregister:
+       atm_dev_deregister(atm_dev);
+out_kfree:
+       kfree(adummy_dev);
+       goto out;
+}
+
+static void __exit adummy_cleanup(void)
+{
+       struct adummy_dev *adummy_dev, *next;
+
+       list_for_each_entry_safe(adummy_dev, next, &adummy_devs, entry) {
+               atm_dev_deregister(adummy_dev->atm_dev);
+               kfree(adummy_dev);
+       }
+}
+
+module_init(adummy_init);
+module_exit(adummy_cleanup);
+
+MODULE_AUTHOR("chas williams <chas@cmf.nrl.navy.mil>");
+MODULE_DESCRIPTION("dummy ATM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/atm/atmdev_init.c b/drivers/atm/atmdev_init.c
deleted file mode 100644 (file)
index 0e09e5c..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* drivers/atm/atmdev_init.c - ATM device driver initialization */
-/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
-
-#include <linux/config.h>
-#include <linux/init.h>
-
-
-#ifdef CONFIG_ATM_ZATM
-extern int zatm_detect(void);
-#endif
-#ifdef CONFIG_ATM_AMBASSADOR
-extern int amb_detect(void);
-#endif
-#ifdef CONFIG_ATM_HORIZON
-extern int hrz_detect(void);
-#endif
-#ifdef CONFIG_ATM_FORE200E
-extern int fore200e_detect(void);
-#endif
-#ifdef CONFIG_ATM_LANAI
-extern int lanai_detect(void);
-#endif
-
-
-/*
- * For historical reasons, atmdev_init returns the number of devices found.
- * Note that some detections may not go via atmdev_init (e.g. eni.c), so this
- * number is meaningless.
- */
-
-int __init atmdev_init(void)
-{
-       int devs;
-
-       devs = 0;
-#ifdef CONFIG_ATM_ZATM
-       devs += zatm_detect();
-#endif
-#ifdef CONFIG_ATM_AMBASSADOR
-       devs += amb_detect();
-#endif
-#ifdef CONFIG_ATM_HORIZON
-       devs += hrz_detect();
-#endif
-#ifdef CONFIG_ATM_FORE200E
-       devs += fore200e_detect();
-#endif
-#ifdef CONFIG_ATM_LANAI
-       devs += lanai_detect();
-#endif
-       return devs;
-}
index 57f1810fdccd74df8f755d1aa1f935ccf68b482e..fc518d85543db88a83ba0dc31b95ae1c9af61d55 100644 (file)
@@ -246,10 +246,6 @@ static void atmtcp_c_close(struct atm_vcc *vcc)
 {
        struct atm_dev *atmtcp_dev;
        struct atmtcp_dev_data *dev_data;
-       struct sock *s;
-       struct hlist_node *node;
-       struct atm_vcc *walk;
-       int i;
 
        atmtcp_dev = (struct atm_dev *) vcc->dev_data;
        dev_data = PRIV(atmtcp_dev);
@@ -257,20 +253,8 @@ static void atmtcp_c_close(struct atm_vcc *vcc)
        if (dev_data->persist) return;
        atmtcp_dev->dev_data = NULL;
        kfree(dev_data);
-       shutdown_atm_dev(atmtcp_dev);
+       atm_dev_deregister(atmtcp_dev);
        vcc->dev_data = NULL;
-       read_lock(&vcc_sklist_lock);
-       for(i = 0; i < VCC_HTABLE_SIZE; ++i) {
-               struct hlist_head *head = &vcc_hash[i];
-
-               sk_for_each(s, node, head) {
-                       walk = atm_sk(s);
-                       if (walk->dev != atmtcp_dev)
-                               continue;
-                       wake_up(s->sk_sleep);
-               }
-       }
-       read_unlock(&vcc_sklist_lock);
        module_put(THIS_MODULE);
 }
 
@@ -450,7 +434,7 @@ static int atmtcp_remove_persistent(int itf)
        if (PRIV(dev)->vcc) return 0;
        kfree(dev_data);
        atm_dev_put(dev);
-       shutdown_atm_dev(dev);
+       atm_dev_deregister(dev);
        return 0;
 }
 
index 51ec147872934e902cb8c6ce4c99c6480cd2e0d5..69f4c7ce9a633b04dea5611402a06159c118daba 100644 (file)
@@ -39,7 +39,7 @@
  * o  lanai_change_qos() isn't written yet
  *
  * o  There aren't any ioctl's yet -- I'd like to eventually support
- *    setting loopback and LED modes that way.  (see lanai_ioctl)
+ *    setting loopback and LED modes that way.
  *
  * o  If the segmentation engine or DMA gets shut down we should restart
  *    card as per section 17.0i.  (see lanai_reset)
@@ -305,7 +305,7 @@ struct lanai_dev {
  * vci with their bit set
  */
 static void vci_bitfield_iterate(struct lanai_dev *lanai,
-       /*const*/ unsigned long *lp,
+       const unsigned long *lp,
        void (*func)(struct lanai_dev *,vci_t vci))
 {
        vci_t vci = find_first_bit(lp, NUM_VCI);
@@ -951,7 +951,7 @@ static int __devinit eeprom_read(struct lanai_dev *lanai)
 /* read a big-endian 4-byte value out of eeprom */
 static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address)
 {
-       return be32_to_cpup((u32 *) (&lanai->eeprom[address]));
+       return be32_to_cpup((const u32 *) &lanai->eeprom[address]);
 }
 
 /* Checksum/validate EEPROM contents */
@@ -1160,7 +1160,7 @@ static inline int vcc_tx_space(const struct lanai_vcc *lvcc, int endptr)
 }
 
 /* test if VCC is currently backlogged */
-static inline int vcc_is_backlogged(/*const*/ struct lanai_vcc *lvcc)
+static inline int vcc_is_backlogged(const struct lanai_vcc *lvcc)
 {
        return !skb_queue_empty(&lvcc->tx.backlog);
 }
@@ -1395,7 +1395,8 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
 {
        int size;
        struct sk_buff *skb;
-       /*const*/ u32 *x, *end = &lvcc->rx.buf.start[endptr * 4];
+       const u32 *x;
+       u32 *end = &lvcc->rx.buf.start[endptr * 4];
        int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr);
        if (n < 0)
                n += lanai_buf_size(&lvcc->rx.buf);
@@ -2111,7 +2112,7 @@ static int lanai_normalize_ci(struct lanai_dev *lanai,
  * shifted by that much as we compute
  *
  */
-static int pcr_to_cbricg(/*const*/ struct atm_qos *qos)
+static int pcr_to_cbricg(const struct atm_qos *qos)
 {
        int rounddown = 0;      /* 1 = Round PCR down, i.e. round ICG _up_ */
        int x, icg, pcr = atm_pcr_goal(&qos->txtp);
@@ -2434,93 +2435,6 @@ static int lanai_open(struct atm_vcc *atmvcc)
        return result;
 }
 
-#if 0
-/* ioctl operations for card */
-/* NOTE: these are all DEBUGGING ONLY currently */
-static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void __user *arg)
-{
-       int result = 0;
-       struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
-       switch(cmd) {
-               case 2106275:
-                       shutdown_atm_dev(atmdev);
-                       return 0;
-               case 2200000: {
-                       unsigned long flags;
-                       spin_lock_irqsave(&lanai->servicelock, flags);
-                       run_service(lanai);
-                       spin_unlock_irqrestore(&lanai->servicelock, flags);
-                       return 0; }
-               case 2200002:
-                       get_statistics(lanai);
-                       return 0;
-               case 2200003: {
-                       unsigned int i;
-                       for (i = 0; i <= 0x5C ; i += 4) {
-                               if (i==0x48) /* Write-only butt reg */
-                                       continue;
-                               printk(KERN_CRIT DEV_LABEL "  0x%02X: "
-                                   "0x%08X\n", i,
-                                   (unsigned int) readl(lanai->base + i));
-                               barrier(); mb();
-                               pcistatus_check(lanai, 0);
-                               barrier(); mb();
-                       }
-                       return 0; }
-               case 2200004: {
-                       u8 b;
-                       u16 w;
-                       u32 dw;
-                       struct pci_dev *pci = lanai->pci;
-                       (void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
-                       DPRINTK("vendor = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
-                       DPRINTK("device = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_word(pci, PCI_COMMAND, &w);
-                       DPRINTK("command = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_word(pci, PCI_STATUS, &w);
-                       DPRINTK("status = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_dword(pci,
-                           PCI_CLASS_REVISION, &dw);
-                       DPRINTK("class/revision = 0x%X\n", (unsigned int) dw);
-                       (void) pci_read_config_byte(pci,
-                           PCI_CACHE_LINE_SIZE, &b);
-                       DPRINTK("cache line size = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
-                       DPRINTK("latency = %d (0x%X)\n",
-                           (int) b, (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
-                       DPRINTK("header type = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_BIST, &b);
-                       DPRINTK("bist = 0x%X\n", (unsigned int) b);
-                       /* skipping a few here */
-                       (void) pci_read_config_byte(pci,
-                           PCI_INTERRUPT_LINE, &b);
-                       DPRINTK("pci_int_line = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci,
-                           PCI_INTERRUPT_PIN, &b);
-                       DPRINTK("pci_int_pin = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
-                       DPRINTK("min_gnt = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
-                       DPRINTK("max_lat = 0x%X\n", (unsigned int) b); }
-                       return 0;
-#ifdef USE_POWERDOWN
-               case 2200005:
-                       DPRINTK("Coming out of powerdown\n");
-                       lanai->conf1 &= ~CONFIG1_POWERDOWN;
-                       conf1_write(lanai);
-                       return 0;
-#endif
-               default:
-                       result = -ENOIOCTLCMD;
-       }
-       return result;
-}
-#else /* !0 */
-#define lanai_ioctl NULL
-#endif /* 0 */
-
 static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
 {
        struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
@@ -2678,7 +2592,6 @@ static const struct atmdev_ops ops = {
        .dev_close      = lanai_dev_close,
        .open           = lanai_open,
        .close          = lanai_close,
-       .ioctl          = lanai_ioctl,
        .getsockopt     = NULL,
        .setsockopt     = NULL,
        .send           = lanai_send,
@@ -2760,6 +2673,7 @@ static void __exit lanai_module_exit(void)
         * gone, so there isn't much to do
         */
        DPRINTK("cleanup_module()\n");
+       pci_unregister_driver(&lanai_driver);
 }
 
 module_init(lanai_module_init);
index 03204bfd17afb3a64e940977474e411f74319535..fa601b085eba71a5f633ebd25de237838b3211fe 100644 (file)
@@ -133,7 +133,7 @@ static struct kobj_type ktype_bus = {
 decl_subsys(bus, &ktype_bus, NULL);
 
 
-/* Manually detach a device from it's associated driver. */
+/* Manually detach a device from its associated driver. */
 static int driver_helper(struct device *dev, void *data)
 {
        const char *name = data;
@@ -151,14 +151,13 @@ static ssize_t driver_unbind(struct device_driver *drv,
        int err = -ENODEV;
 
        dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
-       if ((dev) &&
-           (dev->driver == drv)) {
+       if (dev && dev->driver == drv) {
                device_release_driver(dev);
                err = count;
        }
-       if (err)
-               return err;
-       return count;
+       put_device(dev);
+       put_bus(bus);
+       return err;
 }
 static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
 
@@ -175,16 +174,14 @@ static ssize_t driver_bind(struct device_driver *drv,
        int err = -ENODEV;
 
        dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
-       if ((dev) &&
-           (dev->driver == NULL)) {
+       if (dev && dev->driver == NULL) {
                down(&dev->sem);
                err = driver_probe_device(drv, dev);
                up(&dev->sem);
-               put_device(dev);
        }
-       if (err)
-               return err;
-       return count;
+       put_device(dev);
+       put_bus(bus);
+       return err;
 }
 static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
 
index 3565e9795301d6d90a72ce2e433313a635df5c1c..3b419c9a1e7e6d407a8b3a5ad26440534c499a7b 100644 (file)
@@ -62,7 +62,6 @@ void device_bind_driver(struct device * dev)
  *     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.
  *
@@ -158,7 +157,6 @@ static int __driver_attach(struct device * dev, void * data)
                driver_probe_device(drv, dev);
        up(&dev->sem);
 
-
        return 0;
 }
 
@@ -225,15 +223,15 @@ void driver_detach(struct device_driver * drv)
        struct device * dev;
 
        for (;;) {
-               spin_lock_irq(&drv->klist_devices.k_lock);
+               spin_lock(&drv->klist_devices.k_lock);
                if (list_empty(&drv->klist_devices.k_list)) {
-                       spin_unlock_irq(&drv->klist_devices.k_lock);
+                       spin_unlock(&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);
+               spin_unlock(&drv->klist_devices.k_lock);
 
                down(&dev->sem);
                if (dev->driver == drv)
index b7ddd651d664ecf76da5f620bd06b0e6d01ba837..bc3ca6a656b27c725ea2fbff9ce94879b6d82e84 100644 (file)
@@ -28,7 +28,6 @@
 static struct sysdev_class memory_sysdev_class = {
        set_kset_name(MEMORY_CLASS_NAME),
 };
-EXPORT_SYMBOL(memory_sysdev_class);
 
 static char *memory_hotplug_name(struct kset *kset, struct kobject *kobj)
 {
index 7b1cd93892be4e271d5f94ef60982607020efa76..c4b9d2adfc08bce861a9078945c4e0acf63628a4 100644 (file)
@@ -358,7 +358,8 @@ config BLK_DEV_UB
          This driver supports certain USB attached storage devices
          such as flash keys.
 
-         Warning: Enabling this cripples the usb-storage driver.
+         If you enable this driver, it is recommended to avoid conflicts
+         with usb-storage by enabling USB_LIBUSUAL.
 
          If unsure, say N.
 
index a9e33db46e68b5432627835ea1945f02d40d861c..c3441b3f086eabaa5165ad5bec0e9ecb3ab3b258 100644 (file)
@@ -1146,7 +1146,6 @@ static int revalidate_allvol(ctlr_info_t *host)
                                del_gendisk(disk);
                        if (q)
                                blk_cleanup_queue(q);
-                       put_disk(disk);
                }
        }
 
@@ -1465,9 +1464,10 @@ static int deregister_disk(struct gendisk *disk, drive_info_struct *drv,
                        request_queue_t *q = disk->queue;
                        if (disk->flags & GENHD_FL_UP)
                                del_gendisk(disk);
-                       if (q)  
+                       if (q) {
                                blk_cleanup_queue(q);
-                       put_disk(disk); 
+                               drv->queue = NULL;
+                       }
                }
        }
 
@@ -3243,7 +3243,6 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
                                del_gendisk(disk);
                        if (q)
                                blk_cleanup_queue(q);
-                       put_disk(disk);
                }
        }
 
index 13b8a9bed66e03652d29f0a5dd9ae8f92a08069d..f7e765a1d313656eae67575a317dd9d24102999e 100644 (file)
@@ -3714,12 +3714,6 @@ static int floppy_open(struct inode *inode, struct file *filp)
                USETF(FD_VERIFY);
        }
 
-       /* set underlying gendisk policy to reflect real ro/rw status */
-       if (UTESTF(FD_DISK_WRITABLE))
-               inode->i_bdev->bd_disk->policy = 0;
-       else
-               inode->i_bdev->bd_disk->policy = 1;
-
        if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
                goto out2;
 
index bfb23d543ff7a71d1bba7b22de0ba5a5157cfaaf..10740a065088d73218b2306f2cd6acd6ff6a21b8 100644 (file)
@@ -9,7 +9,6 @@
  *
  * 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)
  *  -- special case some senses, e.g. 3a/0 -> no media present, reduce retries
@@ -29,6 +28,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/usb.h>
+#include <linux/usb_usual.h>
 #include <linux/blkdev.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/timer.h>
  *                                                                   +--------+
  */
 
-/*
- * Definitions which have to be scattered once we understand the layout better.
- */
-
-/* Transport (despite PR in the name) */
-#define US_PR_BULK     0x50            /* bulk only */
-
-/* Protocol */
-#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_MINORS_PER_MAJOR    8
+#define UB_PARTS_PER_LUN      8
 
 #define UB_MAX_CDB_SIZE      16                /* Corresponds to Bulk */
 
@@ -245,6 +235,13 @@ struct ub_scsi_cmd {
        void *back;
 };
 
+struct ub_request {
+       struct request *rq;
+       unsigned int current_try;
+       unsigned int nsg;               /* sgv[nsg] */
+       struct scatterlist sgv[UB_MAX_REQ_SG];
+};
+
 /*
  */
 struct ub_capacity {
@@ -340,6 +337,8 @@ struct ub_lun {
        int readonly;
        int first_open;                 /* Kludge. See ub_bd_open. */
 
+       struct ub_request urq;
+
        /* 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.
@@ -360,6 +359,7 @@ struct ub_dev {
        atomic_t poison;                /* The USB device is disconnected */
        int openc;                      /* protected by ub_lock! */
                                        /* kref is too implicit for our taste */
+       int reset;                      /* Reset is running */
        unsigned int tagcnt;
        char name[12];
        struct usb_device *dev;
@@ -387,6 +387,9 @@ struct ub_dev {
        struct bulk_cs_wrap work_bcs;
        struct usb_ctrlrequest work_cr;
 
+       struct work_struct reset_work;
+       wait_queue_head_t reset_wait;
+
        int sg_stat[6];
        struct ub_scsi_trace tr;
 };
@@ -395,12 +398,14 @@ struct ub_dev {
  */
 static void ub_cleanup(struct ub_dev *sc);
 static int ub_request_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_lun *lun,
-    struct ub_scsi_cmd *cmd, struct request *rq);
+static void ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_scsi_cmd *cmd, struct ub_request *urq);
+static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_scsi_cmd *cmd, struct ub_request *urq);
 static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
 static void ub_end_rq(struct request *rq, int uptodate);
+static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_request *urq, struct ub_scsi_cmd *cmd);
 static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
 static void ub_urb_complete(struct urb *urb, struct pt_regs *pt);
 static void ub_scsi_action(unsigned long _dev);
@@ -415,6 +420,8 @@ 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 void ub_reset_enter(struct ub_dev *sc);
+static void ub_reset_task(void *arg);
 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);
@@ -422,13 +429,18 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum);
 
 /*
  */
+#ifdef CONFIG_USB_LIBUSUAL
+
+#define ub_usb_ids  storage_usb_ids
+#else
+
 static struct usb_device_id ub_usb_ids[] = {
-       // { USB_DEVICE_VER(0x0781, 0x0002, 0x0009, 0x0009) },  /* SDDR-31 */
        { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI, US_PR_BULK) },
        { }
 };
 
 MODULE_DEVICE_TABLE(usb, ub_usb_ids);
+#endif /* CONFIG_USB_LIBUSUAL */
 
 /*
  * Find me a way to identify "next free minor" for add_disk(),
@@ -521,6 +533,9 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr,
        cnt = 0;
        spin_lock_irqsave(&sc->lock, flags);
 
+       cnt += sprintf(page + cnt,
+           "poison %d reset %d\n",
+           atomic_read(&sc->poison), sc->reset);
        cnt += sprintf(page + cnt,
            "qlen %d qmax %d\n",
            sc->cmd_queue.qlen, sc->cmd_queue.qmax);
@@ -770,7 +785,8 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq)
 {
        struct ub_dev *sc = lun->udev;
        struct ub_scsi_cmd *cmd;
-       int rc;
+       struct ub_request *urq;
+       int n_elem;
 
        if (atomic_read(&sc->poison) || lun->changed) {
                blkdev_dequeue_request(rq);
@@ -778,65 +794,70 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq)
                return 0;
        }
 
+       if (lun->urq.rq != NULL)
+               return -1;
        if ((cmd = ub_get_cmd(lun)) == NULL)
                return -1;
        memset(cmd, 0, sizeof(struct ub_scsi_cmd));
 
        blkdev_dequeue_request(rq);
+
+       urq = &lun->urq;
+       memset(urq, 0, sizeof(struct ub_request));
+       urq->rq = rq;
+
+       /*
+        * get scatterlist from block layer
+        */
+       n_elem = blk_rq_map_sg(lun->disk->queue, rq, &urq->sgv[0]);
+       if (n_elem < 0) {
+               printk(KERN_INFO "%s: failed request map (%d)\n",
+                   lun->name, n_elem); /* P3 */
+               goto drop;
+       }
+       if (n_elem > UB_MAX_REQ_SG) {   /* Paranoia */
+               printk(KERN_WARNING "%s: request with %d segments\n",
+                   lun->name, n_elem);
+               goto drop;
+       }
+       urq->nsg = n_elem;
+       sc->sg_stat[n_elem < 5 ? n_elem : 5]++;
+
        if (blk_pc_request(rq)) {
-               rc = ub_cmd_build_packet(sc, lun, cmd, rq);
+               ub_cmd_build_packet(sc, lun, cmd, urq);
        } else {
-               rc = ub_cmd_build_block(sc, lun, cmd, rq);
-       }
-       if (rc != 0) {
-               ub_put_cmd(lun, cmd);
-               ub_end_rq(rq, 0);
-               return 0;
+               ub_cmd_build_block(sc, lun, cmd, urq);
        }
        cmd->state = UB_CMDST_INIT;
        cmd->lun = lun;
        cmd->done = ub_rw_cmd_done;
-       cmd->back = rq;
+       cmd->back = urq;
 
        cmd->tag = sc->tagcnt++;
-       if (ub_submit_scsi(sc, cmd) != 0) {
-               ub_put_cmd(lun, cmd);
-               ub_end_rq(rq, 0);
-               return 0;
-       }
+       if (ub_submit_scsi(sc, cmd) != 0)
+               goto drop;
 
        return 0;
+
+drop:
+       ub_put_cmd(lun, cmd);
+       ub_end_rq(rq, 0);
+       return 0;
 }
 
-static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
-    struct ub_scsi_cmd *cmd, struct request *rq)
+static void ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_scsi_cmd *cmd, struct ub_request *urq)
 {
-       int ub_dir;
-       int n_elem;
+       struct request *rq = urq->rq;
        unsigned int block, nblks;
 
        if (rq_data_dir(rq) == WRITE)
-               ub_dir = UB_DIR_WRITE;
+               cmd->dir = UB_DIR_WRITE;
        else
-               ub_dir = UB_DIR_READ;
-       cmd->dir = ub_dir;
+               cmd->dir = UB_DIR_READ;
 
-       /*
-        * get scatterlist from block layer
-        */
-       n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]);
-       if (n_elem <= 0) {
-               printk(KERN_INFO "%s: failed request map (%d)\n",
-                   sc->name, n_elem); /* P3 */
-               return -1;              /* request with no s/g entries? */
-       }
-       if (n_elem > UB_MAX_REQ_SG) {   /* Paranoia */
-               printk(KERN_WARNING "%s: request with %d segments\n",
-                   sc->name, n_elem);
-               return -1;
-       }
-       cmd->nsg = n_elem;
-       sc->sg_stat[n_elem < 5 ? n_elem : 5]++;
+       cmd->nsg = urq->nsg;
+       memcpy(cmd->sgv, urq->sgv, sizeof(struct scatterlist) * cmd->nsg);
 
        /*
         * build the command
@@ -847,7 +868,7 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
        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;
+       cmd->cdb[0] = (cmd->dir == UB_DIR_READ)? READ_10: WRITE_10;
        /* 10-byte uses 4 bytes of LBA: 2147483648KB, 2097152MB, 2048GB */
        cmd->cdb[2] = block >> 24;
        cmd->cdb[3] = block >> 16;
@@ -858,14 +879,12 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
        cmd->cdb_len = 10;
 
        cmd->len = rq->nr_sectors * 512;
-
-       return 0;
 }
 
-static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
-    struct ub_scsi_cmd *cmd, struct request *rq)
+static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_scsi_cmd *cmd, struct ub_request *urq)
 {
-       int n_elem;
+       struct request *rq = urq->rq;
 
        if (rq->data_len == 0) {
                cmd->dir = UB_DIR_NONE;
@@ -874,40 +893,26 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
                        cmd->dir = UB_DIR_WRITE;
                else
                        cmd->dir = UB_DIR_READ;
-
        }
 
-       /*
-        * get scatterlist from block layer
-        */
-       n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]);
-       if (n_elem < 0) {
-               printk(KERN_INFO "%s: failed request map (%d)\n",
-                   sc->name, n_elem); /* P3 */
-               return -1;
-       }
-       if (n_elem > UB_MAX_REQ_SG) {   /* Paranoia */
-               printk(KERN_WARNING "%s: request with %d segments\n",
-                   sc->name, n_elem);
-               return -1;
-       }
-       cmd->nsg = n_elem;
-       sc->sg_stat[n_elem < 5 ? n_elem : 5]++;
+       cmd->nsg = urq->nsg;
+       memcpy(cmd->sgv, urq->sgv, sizeof(struct scatterlist) * cmd->nsg);
 
        memcpy(&cmd->cdb, rq->cmd, rq->cmd_len);
        cmd->cdb_len = rq->cmd_len;
 
        cmd->len = rq->data_len;
-
-       return 0;
 }
 
 static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 {
-       struct request *rq = cmd->back;
        struct ub_lun *lun = cmd->lun;
+       struct ub_request *urq = cmd->back;
+       struct request *rq;
        int uptodate;
 
+       rq = urq->rq;
+
        if (cmd->error == 0) {
                uptodate = 1;
 
@@ -928,9 +933,16 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                                rq->errors = SAM_STAT_CHECK_CONDITION;
                        else
                                rq->errors = DID_ERROR << 16;
+               } else {
+                       if (cmd->error == -EIO) {
+                               if (ub_rw_cmd_retry(sc, lun, urq, cmd) == 0)
+                                       return;
+                       }
                }
        }
 
+       urq->rq = NULL;
+
        ub_put_cmd(lun, cmd);
        ub_end_rq(rq, uptodate);
        blk_start_queue(lun->disk->queue);
@@ -938,13 +950,45 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 
 static void ub_end_rq(struct request *rq, int uptodate)
 {
-       int rc;
-
-       rc = end_that_request_first(rq, uptodate, rq->hard_nr_sectors);
-       // assert(rc == 0);
+       end_that_request_first(rq, uptodate, rq->hard_nr_sectors);
        end_that_request_last(rq);
 }
 
+static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun,
+    struct ub_request *urq, struct ub_scsi_cmd *cmd)
+{
+
+       if (atomic_read(&sc->poison))
+               return -ENXIO;
+
+       ub_reset_enter(sc);
+
+       if (urq->current_try >= 3)
+               return -EIO;
+       urq->current_try++;
+       /* P3 */ printk("%s: dir %c len/act %d/%d "
+           "[sense %x %02x %02x] retry %d\n",
+           sc->name, UB_DIR_CHAR(cmd->dir), cmd->len, cmd->act_len,
+           cmd->key, cmd->asc, cmd->ascq, urq->current_try);
+
+       memset(cmd, 0, sizeof(struct ub_scsi_cmd));
+       ub_cmd_build_block(sc, lun, cmd, urq);
+
+       cmd->state = UB_CMDST_INIT;
+       cmd->lun = lun;
+       cmd->done = ub_rw_cmd_done;
+       cmd->back = urq;
+
+       cmd->tag = sc->tagcnt++;
+
+#if 0 /* Wasteful */
+       return ub_submit_scsi(sc, cmd);
+#else
+       ub_cmdq_add(sc, cmd);
+       return 0;
+#endif
+}
+
 /*
  * Submit a regular SCSI operation (not an auto-sense).
  *
@@ -1075,7 +1119,7 @@ static void ub_scsi_dispatch(struct ub_dev *sc)
        struct ub_scsi_cmd *cmd;
        int rc;
 
-       while ((cmd = ub_cmdq_peek(sc)) != NULL) {
+       while (!sc->reset && (cmd = ub_cmdq_peek(sc)) != NULL) {
                if (cmd->state == UB_CMDST_DONE) {
                        ub_cmdq_pop(sc);
                        (*cmd->done)(sc, cmd);
@@ -1098,11 +1142,12 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 {
        struct urb *urb = &sc->work_urb;
        struct bulk_cs_wrap *bcs;
+       int len;
        int rc;
 
        if (atomic_read(&sc->poison)) {
-               /* A little too simplistic, I feel... */
-               goto Bad_End;
+               ub_state_done(sc, cmd, -ENODEV);
+               return;
        }
 
        if (cmd->state == UB_CMDST_CLEAR) {
@@ -1110,7 +1155,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        /*
                         * STALL while clearning STALL.
                         * 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\n",
                            sc->name);
@@ -1129,11 +1173,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 
        } else if (cmd->state == UB_CMDST_CLR2STS) {
                if (urb->status == -EPIPE) {
-                       /*
-                        * STALL while clearning STALL.
-                        * 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\n",
                            sc->name);
                        goto Bad_End;
@@ -1151,11 +1190,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
 
        } else if (cmd->state == UB_CMDST_CLRRS) {
                if (urb->status == -EPIPE) {
-                       /*
-                        * STALL while clearning STALL.
-                        * 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\n",
                            sc->name);
                        goto Bad_End;
@@ -1172,7 +1206,12 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                ub_state_stat_counted(sc, cmd);
 
        } else if (cmd->state == UB_CMDST_CMD) {
-               if (urb->status == -EPIPE) {
+               switch (urb->status) {
+               case 0:
+                       break;
+               case -EOVERFLOW:
+                       goto Bad_End;
+               case -EPIPE:
                        rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);
                        if (rc != 0) {
                                printk(KERN_NOTICE "%s: "
@@ -1182,17 +1221,20 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                                 * This is typically ENOMEM or some other such shit.
                                 * Retrying is pointless. Just do Bad End on it...
                                 */
-                               goto Bad_End;
+                               ub_state_done(sc, cmd, rc);
+                               return;
                        }
                        cmd->state = UB_CMDST_CLEAR;
                        ub_cmdtr_state(sc, cmd);
                        return;
-               }
-               if (urb->status != 0) {
+               case -ESHUTDOWN:        /* unplug */
+               case -EILSEQ:           /* unplug timeout on uhci */
+                       ub_state_done(sc, cmd, -ENODEV);
+                       return;
+               default:
                        goto Bad_End;
                }
                if (urb->actual_length != US_BULK_CB_WRAP_LEN) {
-                       /* XXX Must do reset here to unconfuse the device */
                        goto Bad_End;
                }
 
@@ -1211,11 +1253,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                                printk(KERN_NOTICE "%s: "
                                    "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...
-                                */
-                               goto Bad_End;
+                               ub_state_done(sc, cmd, rc);
+                               return;
                        }
                        cmd->state = UB_CMDST_CLR2STS;
                        ub_cmdtr_state(sc, cmd);
@@ -1224,14 +1263,50 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                if (urb->status == -EOVERFLOW) {
                        /*
                         * A babble? Failure, but we must transfer CSW now.
-                        * XXX This is going to end in perpetual babble. Reset.
                         */
                        cmd->error = -EOVERFLOW;        /* A cheap trick... */
                        ub_state_stat(sc, cmd);
                        return;
                }
-               if (urb->status != 0)
-                       goto Bad_End;
+
+               if (cmd->dir == UB_DIR_WRITE) {
+                       /*
+                        * Do not continue writes in case of a failure.
+                        * Doing so would cause sectors to be mixed up,
+                        * which is worse than sectors lost.
+                        *
+                        * We must try to read the CSW, or many devices
+                        * get confused.
+                        */
+                       len = urb->actual_length;
+                       if (urb->status != 0 ||
+                           len != cmd->sgv[cmd->current_sg].length) {
+                               cmd->act_len += len;
+                               ub_cmdtr_act_len(sc, cmd);
+
+                               cmd->error = -EIO;
+                               ub_state_stat(sc, cmd);
+                               return;
+                       }
+
+               } else {
+                       /*
+                        * If an error occurs on read, we record it, and
+                        * continue to fetch data in order to avoid bubble.
+                        *
+                        * As a small shortcut, we stop if we detect that
+                        * a CSW mixed into data.
+                        */
+                       if (urb->status != 0)
+                               cmd->error = -EIO;
+
+                       len = urb->actual_length;
+                       if (urb->status != 0 ||
+                           len != cmd->sgv[cmd->current_sg].length) {
+                               if ((len & 0x1FF) == US_BULK_CS_WRAP_LEN)
+                                       goto Bad_End;
+                       }
+               }
 
                cmd->act_len += urb->actual_length;
                ub_cmdtr_act_len(sc, cmd);
@@ -1249,11 +1324,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                                printk(KERN_NOTICE "%s: "
                                    "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...
-                                */
-                               goto Bad_End;
+                               ub_state_done(sc, cmd, rc);
+                               return;
                        }
 
                        /*
@@ -1266,14 +1338,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        ub_cmdtr_state(sc, cmd);
                        return;
                }
-               if (urb->status == -EOVERFLOW) {
-                       /*
-                        * XXX We are screwed here. Retrying is pointless,
-                        * because the pipelined data will not get in until
-                        * we read with a big enough buffer. We must reset XXX.
-                        */
-                       goto Bad_End;
-               }
+
+               /* Catch everything, including -EOVERFLOW and other nasties. */
                if (urb->status != 0)
                        goto Bad_End;
 
@@ -1319,15 +1385,15 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        return;
                }
 
-               rc = le32_to_cpu(bcs->Residue);
-               if (rc != cmd->len - cmd->act_len) {
+               len = le32_to_cpu(bcs->Residue);
+               if (len != cmd->len - cmd->act_len) {
                        /*
                         * It is all right to transfer less, the caller has
                         * to check. But it's not all right if the device
                         * counts disagree with our counts.
                         */
                        /* P3 */ printk("%s: resid %d len %d act %d\n",
-                           sc->name, rc, cmd->len, cmd->act_len);
+                           sc->name, len, cmd->len, cmd->act_len);
                        goto Bad_End;
                }
 
@@ -1338,13 +1404,13 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                        ub_state_sense(sc, cmd);
                        return;
                case US_BULK_STAT_PHASE:
-                       /* XXX We must reset the transport here */
                        /* P3 */ printk("%s: status PHASE\n", sc->name);
                        goto Bad_End;
                default:
                        printk(KERN_INFO "%s: unknown CSW status 0x%x\n",
                            sc->name, bcs->Status);
-                       goto Bad_End;
+                       ub_state_done(sc, cmd, -EINVAL);
+                       return;
                }
 
                /* Not zeroing error to preserve a babble indicator */
@@ -1364,7 +1430,8 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
                printk(KERN_WARNING "%s: "
                    "wrong command state %d\n",
                    sc->name, cmd->state);
-               goto Bad_End;
+               ub_state_done(sc, cmd, -EINVAL);
+               return;
        }
        return;
 
@@ -1611,6 +1678,93 @@ static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd)
        ub_scsi_urb_compl(sc, cmd);
 }
 
+/*
+ * Reset management
+ */
+
+static void ub_reset_enter(struct ub_dev *sc)
+{
+
+       if (sc->reset) {
+               /* This happens often on multi-LUN devices. */
+               return;
+       }
+       sc->reset = 1;
+
+#if 0 /* Not needed because the disconnect waits for us. */
+       unsigned long flags;
+       spin_lock_irqsave(&ub_lock, flags);
+       sc->openc++;
+       spin_unlock_irqrestore(&ub_lock, flags);
+#endif
+
+#if 0 /* We let them stop themselves. */
+       struct list_head *p;
+       struct ub_lun *lun;
+       list_for_each(p, &sc->luns) {
+               lun = list_entry(p, struct ub_lun, link);
+               blk_stop_queue(lun->disk->queue);
+       }
+#endif
+
+       schedule_work(&sc->reset_work);
+}
+
+static void ub_reset_task(void *arg)
+{
+       struct ub_dev *sc = arg;
+       unsigned long flags;
+       struct list_head *p;
+       struct ub_lun *lun;
+       int lkr, rc;
+
+       if (!sc->reset) {
+               printk(KERN_WARNING "%s: Running reset unrequested\n",
+                   sc->name);
+               return;
+       }
+
+       if (atomic_read(&sc->poison)) {
+               printk(KERN_NOTICE "%s: Not resetting disconnected device\n",
+                   sc->name); /* P3 This floods. Remove soon. XXX */
+       } else if (sc->dev->actconfig->desc.bNumInterfaces != 1) {
+               printk(KERN_NOTICE "%s: Not resetting multi-interface device\n",
+                   sc->name); /* P3 This floods. Remove soon. XXX */
+       } else {
+               if ((lkr = usb_lock_device_for_reset(sc->dev, sc->intf)) < 0) {
+                       printk(KERN_NOTICE
+                           "%s: usb_lock_device_for_reset failed (%d)\n",
+                           sc->name, lkr);
+               } else {
+                       rc = usb_reset_device(sc->dev);
+                       if (rc < 0) {
+                               printk(KERN_NOTICE "%s: "
+                                   "usb_lock_device_for_reset failed (%d)\n",
+                                   sc->name, rc);
+                       }
+
+                       if (lkr)
+                               usb_unlock_device(sc->dev);
+               }
+       }
+
+       /*
+        * In theory, no commands can be running while reset is active,
+        * so nobody can ask for another reset, and so we do not need any
+        * queues of resets or anything. We do need a spinlock though,
+        * to interact with block layer.
+        */
+       spin_lock_irqsave(&sc->lock, flags);
+       sc->reset = 0;
+       tasklet_schedule(&sc->tasklet);
+       list_for_each(p, &sc->luns) {
+               lun = list_entry(p, struct ub_lun, link);
+               blk_start_queue(lun->disk->queue);
+       }
+       wake_up(&sc->reset_wait);
+       spin_unlock_irqrestore(&sc->lock, flags);
+}
+
 /*
  * This is called from a process context.
  */
@@ -2146,7 +2300,7 @@ static int ub_get_pipes(struct ub_dev *sc, struct usb_device *dev,
        if (ep_in == NULL || ep_out == NULL) {
                printk(KERN_NOTICE "%s: failed endpoint check\n",
                    sc->name);
-               return -EIO;
+               return -ENODEV;
        }
 
        /* Calculate and store the pipe values */
@@ -2172,6 +2326,9 @@ static int ub_probe(struct usb_interface *intf,
        int rc;
        int i;
 
+       if (usb_usual_check_type(dev_id, USB_US_TYPE_UB))
+               return -ENXIO;
+
        rc = -ENOMEM;
        if ((sc = kmalloc(sizeof(struct ub_dev), GFP_KERNEL)) == NULL)
                goto err_core;
@@ -2181,6 +2338,8 @@ static int ub_probe(struct usb_interface *intf,
        usb_init_urb(&sc->work_urb);
        tasklet_init(&sc->tasklet, ub_scsi_action, (unsigned long)sc);
        atomic_set(&sc->poison, 0);
+       INIT_WORK(&sc->reset_work, ub_reset_task, sc);
+       init_waitqueue_head(&sc->reset_wait);
 
        init_timer(&sc->work_timer);
        sc->work_timer.data = (unsigned long) sc;
@@ -2201,7 +2360,8 @@ static int ub_probe(struct usb_interface *intf,
 
        /* XXX Verify that we can handle the device (from descriptors) */
 
-       ub_get_pipes(sc, sc->dev, intf);
+       if (ub_get_pipes(sc, sc->dev, intf) != 0)
+               goto err_dev_desc;
 
        if (device_create_file(&sc->intf->dev, &dev_attr_diag) != 0)
                goto err_diag;
@@ -2272,6 +2432,7 @@ static int ub_probe(struct usb_interface *intf,
 
        /* device_remove_file(&sc->intf->dev, &dev_attr_diag); */
 err_diag:
+err_dev_desc:
        usb_set_intfdata(intf, NULL);
        // usb_put_intf(sc->intf);
        usb_put_dev(sc->dev);
@@ -2309,14 +2470,14 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
        ub_revalidate(sc, lun);
 
        rc = -ENOMEM;
-       if ((disk = alloc_disk(UB_MINORS_PER_MAJOR)) == NULL)
+       if ((disk = alloc_disk(UB_PARTS_PER_LUN)) == NULL)
                goto err_diskalloc;
 
        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 = lun->id * UB_MINORS_PER_MAJOR;
+       disk->first_minor = lun->id * UB_PARTS_PER_LUN;
        disk->fops = &ub_bd_fops;
        disk->private_data = lun;
        disk->driverfs_dev = &sc->intf->dev;
@@ -2379,6 +2540,11 @@ static void ub_disconnect(struct usb_interface *intf)
         */
        atomic_set(&sc->poison, 1);
 
+       /*
+        * Wait for reset to end, if any.
+        */
+       wait_event(sc->reset_wait, !sc->reset);
+
        /*
         * Blow away queued commands.
         *
@@ -2392,7 +2558,7 @@ static void ub_disconnect(struct usb_interface *intf)
        {
                struct ub_scsi_cmd *cmd;
                int cnt = 0;
-               while ((cmd = ub_cmdq_pop(sc)) != NULL) {
+               while ((cmd = ub_cmdq_peek(sc)) != NULL) {
                        cmd->error = -ENOTCONN;
                        cmd->state = UB_CMDST_DONE;
                        ub_cmdtr_state(sc, cmd);
@@ -2461,7 +2627,6 @@ static void ub_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver ub_driver = {
-       .owner =        THIS_MODULE,
        .name =         "ub",
        .probe =        ub_probe,
        .disconnect =   ub_disconnect,
@@ -2479,6 +2644,7 @@ static int __init ub_init(void)
        if ((rc = usb_register(&ub_driver)) != 0)
                goto err_register;
 
+       usb_usual_set_present(USB_US_TYPE_UB);
        return 0;
 
 err_register:
@@ -2494,6 +2660,7 @@ static void __exit ub_exit(void)
 
        devfs_remove(DEVFS_NAME);
        unregister_blkdev(UB_MAJOR, DRV_NAME);
+       usb_usual_clear_present(USB_US_TYPE_UB);
 }
 
 module_init(ub_init);
index 8e7fb355177528fe544d32a990d5d7849ed85fda..3e7a067cc0871dafce5f0427f2690c383983a2c3 100644 (file)
@@ -275,7 +275,6 @@ static void bcm203x_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver bcm203x_driver = {
-       .owner          = THIS_MODULE,
        .name           = "bcm203x",
        .probe          = bcm203x_probe,
        .disconnect     = bcm203x_disconnect,
index 067e27893e4a8e4d5b1cbcc1692edd26d0034228..8947c8837dacf8bc64ebf202e87f1da87b58e730 100644 (file)
@@ -768,7 +768,6 @@ static void bfusb_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver bfusb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "bfusb",
        .probe          = bfusb_probe,
        .disconnect     = bfusb_disconnect,
index 394796315adcb18decd1ca61d13b62e1aae4ffe6..9446960ac742914f3c912eb15a2870bb4dc42432 100644 (file)
@@ -619,7 +619,6 @@ static void bpa10x_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver bpa10x_driver = {
-       .owner          = THIS_MODULE,
        .name           = "bpa10x",
        .probe          = bpa10x_probe,
        .disconnect     = bpa10x_disconnect,
index 057cb2b6e6d1f537723051c122eca2d59fec0c82..92382e8232855188a1f588a739c5c98a03b055ef 100644 (file)
@@ -1044,7 +1044,6 @@ static void hci_usb_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver hci_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "hci_usb",
        .probe          = hci_usb_probe,
        .disconnect     = hci_usb_disconnect,
index 970f70d498f4c814e1cf3362e33d7e23ac53c299..84e68cdd451b4e2f9fe8c5705d88185d1b55499f 100644 (file)
@@ -687,7 +687,7 @@ config NVRAM
 
 config RTC
        tristate "Enhanced Real Time Clock Support"
-       depends on !PPC32 && !PARISC && !IA64 && !M68K
+       depends on !PPC32 && !PARISC && !IA64 && !M68K && (!SPARC || PCI)
        ---help---
          If you say Y here and create a character special file /dev/rtc with
          major number 10 and minor number 135 using mknod ("man mknod"), you
@@ -735,7 +735,7 @@ config SGI_IP27_RTC
 
 config GEN_RTC
        tristate "Generic /dev/rtc emulation"
-       depends on RTC!=y && !IA64 && !ARM && !M32R && !SPARC32 && !SPARC64
+       depends on RTC!=y && !IA64 && !ARM && !M32R && !SPARC
        ---help---
          If you say Y here and create a character special file /dev/rtc with
          major number 10 and minor number 135 using mknod ("man mknod"), you
@@ -943,6 +943,15 @@ config RAW_DRIVER
           Applications should simply open the device (eg /dev/hda1)
           with the O_DIRECT flag.
 
+config MAX_RAW_DEVS
+       int "Maximum number of RAW devices to support (1-8192)"
+       depends on RAW_DRIVER
+       default "256"
+       help
+         The maximum number of RAW devices that are supported.
+         Default is 256. Increase this number in case you need lots of
+         raw devices.
+
 config HPET
        bool "HPET - High Precision Event Timer" if (X86 || IA64)
        default n
@@ -974,15 +983,6 @@ config HPET_MMAP
          exposed to the user.  If this applies to your hardware,
          say N here.
 
-config MAX_RAW_DEVS
-       int "Maximum number of RAW devices to support (1-8192)"
-       depends on RAW_DRIVER
-       default "256"
-       help
-         The maximum number of RAW devices that are supported.
-         Default is 256. Increase this number in case you need lots of
-         raw devices.
-
 config HANGCHECK_TIMER
        tristate "Hangcheck timer"
        depends on X86 || IA64 || PPC64 || ARCH_S390
index 76589782adcbf2f2f2372b919c6b49490bc4d593..810679dcbbb0cb006c619af994bb91f6e60cd7a0 100644 (file)
@@ -416,7 +416,7 @@ static void __devinit amd8151_init(struct pci_dev *pdev, struct agp_bridge_data
 }
 
 
-static struct aper_size_info_32 uli_sizes[7] =
+static const struct aper_size_info_32 uli_sizes[7] =
 {
        {256, 65536, 6, 10},
        {128, 32768, 5, 9},
@@ -470,7 +470,7 @@ static int __devinit uli_agp_init(struct pci_dev *pdev)
 }
 
 
-static struct aper_size_info_32 nforce3_sizes[5] =
+static const struct aper_size_info_32 nforce3_sizes[5] =
 {
        {512,  131072, 7, 0x00000000 },
        {256,  65536,  6, 0x00000008 },
index 27bca34b4a65d3770a0c8f54d8428720c3c76e7f..80ee17a8fc2322ed7e673a611a26201dc8329778 100644 (file)
@@ -97,7 +97,7 @@ void agp_backend_release(struct agp_bridge_data *bridge)
 EXPORT_SYMBOL(agp_backend_release);
 
 
-static struct { int mem, agp; } maxes_table[] = {
+static const struct { int mem, agp; } maxes_table[] = {
        {0, 0},
        {32, 4},
        {64, 28},
index c847df575cf5b96437b73dfb64311122a16326bf..97b0a890ba7f828310342e585e866af36e101136 100644 (file)
@@ -371,6 +371,11 @@ static struct agp_device_ids via_agp_device_ids[] __devinitdata =
                .device_id      = PCI_DEVICE_ID_VIA_3296_0,
                .chipset_name   = "P4M800",
        },
+       /* P4M800CE */
+       {
+               .device_id      = PCI_DEVICE_ID_VIA_P4M800CE,
+               .chipset_name   = "P4M800CE",
+       },
 
        { }, /* dummy final entry, always present */
 };
@@ -511,6 +516,7 @@ static struct pci_device_id agp_via_pci_table[] = {
        ID(PCI_DEVICE_ID_VIA_3269_0),
        ID(PCI_DEVICE_ID_VIA_83_87XX_1),
        ID(PCI_DEVICE_ID_VIA_3296_0),
+       ID(PCI_DEVICE_ID_VIA_P4M800CE),
        { }
 };
 
index bdd168d88f49b0ab6a0103f6c32b20e4fde46105..bd958d69a2ac2aeccb166739c83de1cb674fa4cc 100644 (file)
@@ -432,7 +432,10 @@ int drm_addctx(struct inode *inode, struct file *filp,
 
        if (ctx.handle != DRM_KERNEL_CONTEXT) {
                if (dev->driver->context_ctor)
-                       dev->driver->context_ctor(dev, ctx.handle);
+                       if (!dev->driver->context_ctor(dev, ctx.handle)) {
+                               DRM_DEBUG( "Running out of ctxs or memory.\n");
+                               return -ENOMEM;
+                       }
        }
 
        ctx_entry = drm_alloc(sizeof(*ctx_entry), DRM_MEM_CTXLIST);
index b276ae8a6633bb836cd96ed3cd927ca3504efce0..b48a595d54eca0e9c13b0cb269b88fba6dc49f56 100644 (file)
@@ -104,6 +104,10 @@ int drm_lock(struct inode *inode, struct file *filp,
        __set_current_state(TASK_RUNNING);
        remove_wait_queue(&dev->lock.lock_queue, &entry);
 
+       DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock");
+       if (ret)
+               return ret;
+
        sigemptyset(&dev->sigmask);
        sigaddset(&dev->sigmask, SIGSTOP);
        sigaddset(&dev->sigmask, SIGTSTP);
@@ -116,8 +120,12 @@ int drm_lock(struct inode *inode, struct file *filp,
        if (dev->driver->dma_ready && (lock.flags & _DRM_LOCK_READY))
                dev->driver->dma_ready(dev);
 
-       if (dev->driver->dma_quiescent && (lock.flags & _DRM_LOCK_QUIESCENT))
-               return dev->driver->dma_quiescent(dev);
+       if (dev->driver->dma_quiescent && (lock.flags & _DRM_LOCK_QUIESCENT)) {
+               if (dev->driver->dma_quiescent(dev)) {
+                       DRM_DEBUG("%d waiting for DMA quiescent\n", lock.context);
+                       return DRM_ERR(EBUSY);
+               }
+       }
 
        /* dev->driver->kernel_context_switch isn't used by any of the x86
         *  drivers but is used by the Sparc driver.
@@ -128,9 +136,7 @@ int drm_lock(struct inode *inode, struct file *filp,
                dev->driver->kernel_context_switch(dev, dev->last_context,
                                                   lock.context);
        }
-       DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock");
-
-       return ret;
+       return 0;
 }
 
 /**
index 2c74155aa84fb50c3fe1d831af4289f691799574..abef2acf99f596d67d34b29031c85cfadcd3afc3 100644 (file)
@@ -95,7 +95,7 @@ unsigned long drm_alloc_pages(int order, int area)
        unsigned long addr;
        unsigned int sz;
 
-       address = __get_free_pages(GFP_KERNEL, order);
+       address = __get_free_pages(GFP_KERNEL|__GFP_COMP, order);
        if (!address)
                return 0;
 
index 4542353195bd1f6c7c7f1682e7e3bb0ff5a6953a..b370aca718d278602217bbbcb58fb5812218c96d 100644 (file)
@@ -221,7 +221,7 @@ unsigned long DRM(alloc_pages) (int order, int area) {
        }
        spin_unlock(&DRM(mem_lock));
 
-       address = __get_free_pages(GFP_KERNEL, order);
+       address = __get_free_pages(GFP_KERNEL|__GFP_COMP, order);
        if (!address) {
                spin_lock(&DRM(mem_lock));
                ++DRM(mem_stats)[area].fail_count;
index 0cc7c305a7f63b87332656afaa040bf9ba2b1a79..1713451a5cc658ba0ca1c8ef291076010c78c7d6 100644 (file)
@@ -161,7 +161,7 @@ static int mga_driver_device_is_agp(drm_device_t * dev)
         * device.
         */
 
-       if ((pdev->device == 0x0525)
+       if ((pdev->device == 0x0525) && pdev->bus->self
            && (pdev->bus->self->vendor == 0x3388)
            && (pdev->bus->self->device == 0x0021)) {
                return 0;
index 03839ea31092d2f407e5d70e869392b2cc767472..342302d4674352f85f63b5fa9847b25e98129bd2 100644 (file)
@@ -1311,7 +1311,7 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
 
 static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
 {
-       drm_radeon_private_t *dev_priv = dev->dev_private;;
+       drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG("\n");
 
        dev_priv->is_pci = init->is_pci;
index 120ee5a8ebcc8ab2e12953dbabb7574d467a4af4..d92ccee3e54c64b29c9bbc7fcc4b1973386d3644 100644 (file)
@@ -214,8 +214,6 @@ typedef struct drm_radeon_private {
 
        int microcode_version;
 
-       int is_pci;
-
        struct {
                u32 boxes;
                int freelist_timeouts;
@@ -275,6 +273,7 @@ typedef struct drm_radeon_private {
 
        /* starting from here on, data is preserved accross an open */
        uint32_t flags;         /* see radeon_chip_flags */
+       int is_pci;
 } drm_radeon_private_t;
 
 typedef struct drm_radeon_buf_priv {
@@ -380,6 +379,7 @@ extern int r300_do_cp_cmdbuf(drm_device_t * dev, DRMFILE filp,
 #      define RADEON_PLL_WR_EN                 (1 << 7)
 #define RADEON_CLOCK_CNTL_INDEX                0x0008
 #define RADEON_CONFIG_APER_SIZE                0x0108
+#define RADEON_CONFIG_MEMSIZE          0x00f8
 #define RADEON_CRTC_OFFSET             0x0224
 #define RADEON_CRTC_OFFSET_CNTL                0x0228
 #      define RADEON_CRTC_TILE_EN              (1 << 15)
index e9b87a78622ce2be0771a68cda679b7861c35ea4..00342a677c90c473bb670c5e026d8c1aaa6f187c 100644 (file)
@@ -358,7 +358,7 @@ typedef struct _failStat
 #define MB_OUT_STRIPPED    0x40  // Board has read all output from fifo 
 #define MB_FATAL_ERROR     0x20  // Board has encountered a fatal error
 
-#pragma pack(4)                  // Reset padding to command-line default
+#pragma pack()                  // Reset padding to command-line default
 
 #endif      // I2PACK_H
 
index 6b302a930e5fad66204630d1fafb4421178b7fdd..1f56b4cf0f589f6622acbdc70da0e1e5a0d520d3 100644 (file)
@@ -2986,7 +2986,7 @@ static void send_panic_events(char *str)
        msg.cmd = 2; /* Platform event command. */
        msg.data = data;
        msg.data_len = 8;
-       data[0] = 0x21; /* Kernel generator ID, IPMI table 5-4 */
+       data[0] = 0x41; /* Kernel generator ID, IPMI table 5-4 */
        data[1] = 0x03; /* This is for IPMI 1.0. */
        data[2] = 0x20; /* OS Critical Stop, IPMI table 36-3 */
        data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */
index 01a1f6badb53e428c00dbdb7b4e3190513d48e8e..beea450ee4b220139618e622e31fe92a41ead695 100644 (file)
@@ -2399,7 +2399,8 @@ static int init_one_smi(int intf_num, struct smi_info **smi)
                        new_smi->handlers->cleanup(new_smi->si_sm);
                kfree(new_smi->si_sm);
        }
-       new_smi->io_cleanup(new_smi);
+       if (new_smi->io_cleanup)
+               new_smi->io_cleanup(new_smi);
 
        return rv;
 }
@@ -2518,7 +2519,8 @@ static void __exit cleanup_one_si(struct smi_info *to_clean)
 
        kfree(to_clean->si_sm);
 
-       to_clean->io_cleanup(to_clean);
+       if (to_clean->io_cleanup)
+               to_clean->io_cleanup(to_clean);
 }
 
 static __exit void cleanup_ipmi_si(void)
index 449d029ad4f40abc936fb85f6ee66f60511201a6..8b603b2d1c4211ebedb7a4e575db84278b75c276 100644 (file)
@@ -930,8 +930,8 @@ static void kbd_refresh_leds(struct input_handle *handle)
 }
 
 #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\
-    defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC32) ||\
-    defined(CONFIG_SPARC64) || defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\
+    defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\
+    defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\
     (defined(CONFIG_ARM) && defined(CONFIG_KEYBOARD_ATKBD) && !defined(CONFIG_ARCH_RPC))
 
 #define HW_RAW(dev) (test_bit(EV_MSC, dev->evbit) && test_bit(MSC_RAW, dev->mscbit) &&\
@@ -958,7 +958,7 @@ static unsigned short x86_keycodes[256] =
 extern int mac_hid_mouse_emulate_buttons(int, int, int);
 #endif /* CONFIG_MAC_EMUMOUSEBTN */
 
-#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
+#ifdef CONFIG_SPARC
 static int sparc_l1_a_state = 0;
 extern void sun_do_break(void);
 #endif
@@ -1045,7 +1045,7 @@ static void kbd_keycode(unsigned int keycode, int down,
 
        if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT)
                sysrq_alt = down;
-#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
+#ifdef CONFIG_SPARC
        if (keycode == KEY_STOP)
                sparc_l1_a_state = down;
 #endif
@@ -1072,7 +1072,7 @@ static void kbd_keycode(unsigned int keycode, int down,
                return;
        }
 #endif
-#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
+#ifdef CONFIG_SPARC
        if (keycode == KEY_A && sparc_l1_a_state) {
                sparc_l1_a_state = 0;
                sun_do_break();
index f1f9da7a65c1f42d04fbfbf93223fb1d7658b55b..60c961ae23b4c18cab1ad744d583adfc080fdbc9 100644 (file)
@@ -69,7 +69,7 @@ typedef struct _MW_ABILITIES {
 typedef struct _MW_READWRITE {
        unsigned short usDspAddress;    /* The dsp address */
        unsigned long ulDataLength;     /* The size in bytes of the data or user buffer */
-       void *pBuf;             /* Input:variable sized buffer */
+       void __user *pBuf;              /* Input:variable sized buffer */
 } MW_READWRITE, *pMW_READWRITE;
 
 #define IOCTL_MW_RESET           _IO(MWAVE_MINOR,1)
index c3660d8781a4ef35e6fce62532d2629bfa4039ab..a133a62f3d5528a1ad93d6d2ee181cdaaebac295 100644 (file)
@@ -562,7 +562,7 @@ static void n_hdlc_tty_receive(struct tty_struct *tty, const __u8 *data,
 }      /* end of n_hdlc_tty_receive() */
 
 /**
- * n_hdlc_tty_read - Called to retreive one frame of data (if available)
+ * n_hdlc_tty_read - Called to retrieve one frame of data (if available)
  * @tty - pointer to tty instance data
  * @file - pointer to open file object
  * @buf - pointer to returned data buffer
index ef011ef5dc465cad12c64dfe1110b64c3f94dd0b..61681c9f3f727cbfc3f69ba02cb457a70462cbbb 100644 (file)
@@ -1444,6 +1444,7 @@ static int cmm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        dev_link_t *link;
        int size;
        int rc;
+       void __user *argp = (void __user *)arg;
 #ifdef PCMCIA_DEBUG
        char *ioctl_names[CM_IOC_MAXNR + 1] = {
                [_IOC_NR(CM_IOCGSTATUS)] "CM_IOCGSTATUS",
@@ -1481,11 +1482,11 @@ static int cmm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
              _IOC_DIR(cmd), _IOC_READ, _IOC_WRITE, size, cmd);
 
        if (_IOC_DIR(cmd) & _IOC_READ) {
-               if (!access_ok(VERIFY_WRITE, (void *)arg, size))
+               if (!access_ok(VERIFY_WRITE, argp, size))
                        return -EFAULT;
        }
        if (_IOC_DIR(cmd) & _IOC_WRITE) {
-               if (!access_ok(VERIFY_READ, (void *)arg, size))
+               if (!access_ok(VERIFY_READ, argp, size))
                        return -EFAULT;
        }
 
@@ -1506,14 +1507,14 @@ static int cmm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                                status |= CM_NO_READER;
                        if (test_bit(IS_BAD_CARD, &dev->flags))
                                status |= CM_BAD_CARD;
-                       if (copy_to_user((int *)arg, &status, sizeof(int)))
+                       if (copy_to_user(argp, &status, sizeof(int)))
                                return -EFAULT;
                }
                return 0;
        case CM_IOCGATR:
                DEBUGP(4, dev, "... in CM_IOCGATR\n");
                {
-                       struct atreq *atreq = (struct atreq *) arg;
+                       struct atreq __user *atreq = argp;
                        int tmp;
                        /* allow nonblocking io and being interrupted */
                        if (wait_event_interruptible
@@ -1597,7 +1598,7 @@ static int cmm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                {
                        struct ptsreq krnptsreq;
 
-                       if (copy_from_user(&krnptsreq, (struct ptsreq *) arg,
+                       if (copy_from_user(&krnptsreq, argp,
                                           sizeof(struct ptsreq)))
                                return -EFAULT;
 
@@ -1641,7 +1642,7 @@ static int cmm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                        int old_pc_debug = 0;
 
                        old_pc_debug = pc_debug;
-                       if (copy_from_user(&pc_debug, (int *)arg, sizeof(int)))
+                       if (copy_from_user(&pc_debug, argp, sizeof(int)))
                                return -EFAULT;
 
                        if (old_pc_debug != pc_debug)
index 7999da25fe40afb035c4342cd1f227f0b4d21078..bdfdfd28594d17d648b5346c273217c097974dff 100644 (file)
@@ -1554,10 +1554,8 @@ __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr,
 
 EXPORT_SYMBOL(secure_tcp_sequence_number);
 
-
-
-/* Generate secure starting point for ephemeral TCP port search */
-u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport)
+/* Generate secure starting point for ephemeral IPV4 transport port search */
+u32 secure_ipv4_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport)
 {
        struct keydata *keyptr = get_keyptr();
        u32 hash[4];
@@ -1575,7 +1573,7 @@ u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport)
 }
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-u32 secure_tcpv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dport)
+u32 secure_ipv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dport)
 {
        struct keydata *keyptr = get_keyptr();
        u32 hash[12];
@@ -1586,7 +1584,7 @@ u32 secure_tcpv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dp
 
        return twothirdsMD4Transform(daddr, hash);
 }
-EXPORT_SYMBOL(secure_tcpv6_port_ephemeral);
+EXPORT_SYMBOL(secure_ipv6_port_ephemeral);
 #endif
 
 #if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)
index f66c7ad6fd387772b78799fad82464f0971d773d..3c1dafaa3441eacbeae9e2f924219fd5fea5e5fe 100644 (file)
@@ -419,7 +419,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
                        while (this_round > 1) {
                                unsigned short w;
 
-                               w = get_unaligned(((const unsigned short *)con_buf0));
+                               w = get_unaligned(((unsigned short *)con_buf0));
                                vcs_scr_writew(vc, w, org++);
                                con_buf0 += 2;
                                this_round -= 2;
index 65830ec71042f0a2fd64666775138ce491bf3066..b6640606b44d87d7402e11a6c96ba79126a2a649 100644 (file)
@@ -72,7 +72,7 @@ static __inline__ void booke_wdt_ping(void)
 /*
  * booke_wdt_write:
  */
-static ssize_t booke_wdt_write (struct file *file, const char *buf,
+static ssize_t booke_wdt_write (struct file *file, const char __user *buf,
                                size_t count, loff_t *ppos)
 {
        booke_wdt_ping();
@@ -92,14 +92,15 @@ static int booke_wdt_ioctl (struct inode *inode, struct file *file,
                            unsigned int cmd, unsigned long arg)
 {
        u32 tmp = 0;
+       u32 __user *p = (u32 __user *)arg;
 
        switch (cmd) {
        case WDIOC_GETSUPPORT:
-               if (copy_to_user ((struct watchdog_info *) arg, &ident,
+               if (copy_to_user ((struct watchdog_info __user *) arg, &ident,
                                sizeof(struct watchdog_info)))
                        return -EFAULT;
        case WDIOC_GETSTATUS:
-               return put_user(ident.options, (u32 *) arg);
+               return put_user(ident.options, p);
        case WDIOC_GETBOOTSTATUS:
                /* XXX: something is clearing TSR */
                tmp = mfspr(SPRN_TSR) & TSR_WRS(3);
@@ -109,14 +110,14 @@ static int booke_wdt_ioctl (struct inode *inode, struct file *file,
                booke_wdt_ping();
                return 0;
        case WDIOC_SETTIMEOUT:
-               if (get_user(booke_wdt_period, (u32 *) arg))
+               if (get_user(booke_wdt_period, p))
                        return -EFAULT;
                mtspr(SPRN_TCR, (mfspr(SPRN_TCR)&~WDTP(0))|WDTP(booke_wdt_period));
                return 0;
        case WDIOC_GETTIMEOUT:
-               return put_user(booke_wdt_period, (u32 *) arg);
+               return put_user(booke_wdt_period, p);
        case WDIOC_SETOPTIONS:
-               if (get_user(tmp, (u32 *) arg))
+               if (get_user(tmp, p))
                        return -EINVAL;
                if (tmp == WDIOS_ENABLECARD) {
                        booke_wdt_ping();
@@ -172,7 +173,7 @@ static int __init booke_wdt_init(void)
        int ret = 0;
 
        printk (KERN_INFO "PowerPC Book-E Watchdog Timer Loaded\n");
-       ident.firmware_version = cpu_specs[0].pvr_value;
+       ident.firmware_version = cur_cpu_spec->pvr_value;
 
        ret = misc_register(&booke_wdt_miscdev);
        if (ret) {
index 9defcf861b67095e2a245b1ddeae0686d75badc7..b4d843489881adaacdf3e2326ed09bf49b9b0f7d 100644 (file)
@@ -180,10 +180,6 @@ static ssize_t mpcore_wdt_write(struct file *file, const char *data, size_t len,
 {
        struct mpcore_wdt *wdt = file->private_data;
 
-       /*  Can't seek (pwrite) on this device  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
        /*
         *      Refresh the timer.
         */
index 092e9b133750f67f56d803df1ce06039ab6c78cf..1533f56baa42f8304e889b280994510c380cabec 100644 (file)
@@ -151,7 +151,6 @@ static void usb_pcwd_disconnect     (struct usb_interface *interface);
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver usb_pcwd_driver = {
-       .owner =        THIS_MODULE,
        .name =         DRIVER_NAME,
        .probe =        usb_pcwd_probe,
        .disconnect =   usb_pcwd_disconnect,
index 619e2ffca33ff4bd62f28a6b519fa63f189feeb1..dacfe31caccf3fb5f3fb525f349dabec087cd644 100644 (file)
@@ -320,7 +320,7 @@ static int
 wdrtas_ioctl(struct inode *inode, struct file *file,
             unsigned int cmd, unsigned long arg)
 {
-       int __user *argp = (void *)arg;
+       int __user *argp = (void __user *)arg;
        int i;
        static struct watchdog_info wdinfo = {
                .options = WDRTAS_SUPPORTED_MASK,
index fcdf0fff13a6cc449e431957e061e67d253eefbe..969d2b4aaec06952132d9fc4f516355bcdc38d3b 100644 (file)
@@ -56,6 +56,7 @@ void proc_fork_connector(struct task_struct *task)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        get_seq(&msg->seq, &ev->cpu);
+       getnstimestamp(&ev->timestamp);
        ev->what = PROC_EVENT_FORK;
        ev->event_data.fork.parent_pid = task->real_parent->pid;
        ev->event_data.fork.parent_tgid = task->real_parent->tgid;
@@ -81,6 +82,7 @@ void proc_exec_connector(struct task_struct *task)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        get_seq(&msg->seq, &ev->cpu);
+       getnstimestamp(&ev->timestamp);
        ev->what = PROC_EVENT_EXEC;
        ev->event_data.exec.process_pid = task->pid;
        ev->event_data.exec.process_tgid = task->tgid;
@@ -114,6 +116,7 @@ void proc_id_connector(struct task_struct *task, int which_id)
        } else
                return;
        get_seq(&msg->seq, &ev->cpu);
+       getnstimestamp(&ev->timestamp);
 
        memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
        msg->ack = 0; /* not used */
@@ -133,6 +136,7 @@ void proc_exit_connector(struct task_struct *task)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        get_seq(&msg->seq, &ev->cpu);
+       getnstimestamp(&ev->timestamp);
        ev->what = PROC_EVENT_EXIT;
        ev->event_data.exit.process_pid = task->pid;
        ev->event_data.exit.process_tgid = task->tgid;
@@ -165,6 +169,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        msg->seq = rcvd_seq;
+       getnstimestamp(&ev->timestamp);
        ev->cpu = -1;
        ev->what = PROC_EVENT_NONE;
        ev->event_data.ack.err = err;
index 23a63207d74702f15aff24b0ab422cd1a724ac4c..a9163d02983af68f069887a520330e84470cc58b 100644 (file)
@@ -693,8 +693,8 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
        unsigned int cpu = sys_dev->id;
        unsigned long flags;
        struct cpufreq_policy *data;
-       struct sys_device *cpu_sys_dev;
 #ifdef CONFIG_SMP
+       struct sys_device *cpu_sys_dev;
        unsigned int j;
 #endif
 
@@ -822,6 +822,30 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq, unsigne
 }
 
 
+/** 
+ * cpufreq_quick_get - get the CPU frequency (in kHz) frpm policy->cur
+ * @cpu: CPU number
+ *
+ * This is the last known freq, without actually getting it from the driver.
+ * Return value will be same as what is shown in scaling_cur_freq in sysfs.
+ */
+unsigned int cpufreq_quick_get(unsigned int cpu)
+{
+       struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
+       unsigned int ret = 0;
+
+       if (policy) {
+               down(&policy->lock);
+               ret = policy->cur;
+               up(&policy->lock);
+               cpufreq_cpu_put(policy);
+       }
+
+       return (ret);
+}
+EXPORT_SYMBOL(cpufreq_quick_get);
+
+
 /** 
  * cpufreq_get - get the current CPU frequency (in kHz)
  * @cpu: CPU number
@@ -1113,21 +1137,13 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
 {
        int retval = -EINVAL;
 
-       /*
-        * If we are already in context of hotplug thread, we dont need to
-        * acquire the hotplug lock. Otherwise acquire cpucontrol to prevent
-        * hotplug from removing this cpu that we are working on.
-        */
-       if (!current_in_cpu_hotplug())
-               lock_cpu_hotplug();
-
+       lock_cpu_hotplug();
        dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu,
                target_freq, relation);
        if (cpu_online(policy->cpu) && cpufreq_driver->target)
                retval = cpufreq_driver->target(policy, target_freq, relation);
 
-       if (!current_in_cpu_hotplug())
-               unlock_cpu_hotplug();
+       unlock_cpu_hotplug();
 
        return retval;
 }
index 2ed5c4363b536220843d942af2e84276b9a1dbd0..39543a2bed0f43c232e724ce809f1c89d438f6e1 100644 (file)
@@ -93,7 +93,7 @@ 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 ? 
+               ( dbs_tuners_ins.ignore_nice ?
                  kstat_cpu(cpu).cpustat.nice :
                  0);
 }
@@ -127,7 +127,7 @@ 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(ignore_nice_load, ignore_nice);
 show_one(freq_step, freq_step);
 
 static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused, 
@@ -207,7 +207,7 @@ static ssize_t store_down_threshold(struct cpufreq_policy *unused,
        return count;
 }
 
-static ssize_t store_ignore_nice(struct cpufreq_policy *policy,
+static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy,
                const char *buf, size_t count)
 {
        unsigned int input;
@@ -272,7 +272,7 @@ 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(ignore_nice_load);
 define_one_rw(freq_step);
 
 static struct attribute * dbs_attributes[] = {
@@ -282,7 +282,7 @@ static struct attribute * dbs_attributes[] = {
        &sampling_down_factor.attr,
        &up_threshold.attr,
        &down_threshold.attr,
-       &ignore_nice.attr,
+       &ignore_nice_load.attr,
        &freq_step.attr,
        NULL
 };
index 17741111246b9f21362710cdc1099c31cb69512d..e69fd8dd1f1cb7bf6042a878b2545a714c7df133 100644 (file)
@@ -89,7 +89,7 @@ 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 ? 
+               ( dbs_tuners_ins.ignore_nice ?
                  kstat_cpu(cpu).cpustat.nice :
                  0);
 }
@@ -122,7 +122,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(ignore_nice, ignore_nice);
+show_one(ignore_nice_load, ignore_nice);
 
 static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused, 
                const char *buf, size_t count)
@@ -182,7 +182,7 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
        return count;
 }
 
-static ssize_t store_ignore_nice(struct cpufreq_policy *policy,
+static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy,
                const char *buf, size_t count)
 {
        unsigned int input;
@@ -223,7 +223,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(ignore_nice);
+define_one_rw(ignore_nice_load);
 
 static struct attribute * dbs_attributes[] = {
        &sampling_rate_max.attr,
@@ -231,7 +231,7 @@ static struct attribute * dbs_attributes[] = {
        &sampling_rate.attr,
        &sampling_down_factor.attr,
        &up_threshold.attr,
-       &ignore_nice.attr,
+       &ignore_nice_load.attr,
        NULL
 };
 
index f00c02a13ed687be66a2c876dff0ceffa421b621..345dbe6f10dff0cf1acae16b4454a708717da7bf 100644 (file)
@@ -26,7 +26,7 @@ comment "FC4 drivers"
 
 config FC4_SOC
        tristate "Sun SOC/Sbus"
-       depends on FC4!=n && (SPARC32 || SPARC64)
+       depends on FC4!=n && SPARC
        help
          Serial Optical Channel is an interface card with one or two Fibre
          Optic ports, each of which can be connected to a disk array. Note
@@ -38,7 +38,7 @@ config FC4_SOC
 
 config FC4_SOCAL
        tristate "Sun SOC+ (aka SOCAL)"
-       depends on FC4!=n && (SPARC32 || SPARC64)
+       depends on FC4!=n && SPARC
        ---help---
          Serial Optical Channel Plus is an interface card with up to two
          Fibre Optic ports. This card supports FC Arbitrated Loop (usually
@@ -62,7 +62,7 @@ config SCSI_PLUTO
          be called pluto.
 
 config SCSI_FCAL
-       tristate "Sun Enterprise Network Array (A5000 and EX500)" if SPARC32 || SPARC64
+       tristate "Sun Enterprise Network Array (A5000 and EX500)" if SPARC
        depends on FC4!=n && SCSI
        help
          This driver drives FC-AL disks connected through a Fibre Channel
@@ -75,7 +75,7 @@ config SCSI_FCAL
 
 config SCSI_FCAL
        prompt "Generic FC-AL disk driver"
-       depends on FC4!=n && SCSI && !SPARC32 && !SPARC64
+       depends on FC4!=n && SCSI && !SPARC
 
 endmenu
 
index b6815c6c29a2ca6bf579c1f7c814a694a0389bad..1e371a510dd219313821af876b7992c5877e695a 100644 (file)
@@ -60,6 +60,7 @@ config EFI_PCDP
 
 config DELL_RBU
        tristate "BIOS update support for DELL systems via sysfs"
+       depends on X86
        select FW_LOADER
        help
         Say m if you want to have the option of updating the BIOS for your
index 6d83299e7c9b1123c6bd06479c39606dae41c596..dfedb777d8c90e607a88ce37fbd8846a6934a7c9 100644 (file)
@@ -105,8 +105,8 @@ static int create_packet(void *data, size_t length)
        int ordernum = 0;
        int retval = 0;
        unsigned int packet_array_size = 0;
-       void **invalid_addr_packet_array = 0;
-       void *packet_data_temp_buf = 0;
+       void **invalid_addr_packet_array = NULL;
+       void *packet_data_temp_buf = NULL;
        unsigned int idx = 0;
 
        pr_debug("create_packet: entry \n");
@@ -178,7 +178,7 @@ static int create_packet(void *data, size_t length)
                                                packet_data_temp_buf),
                                        allocation_floor);
                        invalid_addr_packet_array[idx++] = packet_data_temp_buf;
-                       packet_data_temp_buf = 0;
+                       packet_data_temp_buf = NULL;
                }
        }
        spin_lock(&rbu_data.lock);
index c81bd4bce1b8648b69b7e730f5c2c414be5d85bf..23a9e1ea8e321e218acc42de271e8e157191764f 100644 (file)
@@ -570,7 +570,7 @@ static int __init hdaps_init(void)
        hdaps_idev->evbit[0] = BIT(EV_ABS);
        input_set_abs_params(hdaps_idev, ABS_X,
                        -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
-       input_set_abs_params(hdaps_idev, ABS_X,
+       input_set_abs_params(hdaps_idev, ABS_Y,
                        -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
 
        input_register_device(hdaps_idev);
index 6c41e25e670be0235c34a9fb0fce027da6df6d72..a61f5d00f10a2abf1cf0211c9f7d1355db0cf28e 100644 (file)
@@ -522,8 +522,15 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
        struct i2c_client *client = to_i2c_client(dev);
        struct it87_data *data = i2c_get_clientdata(client);
        int val = simple_strtol(buf, NULL, 10);
+       u8 reg = it87_read_value(client, IT87_REG_FAN_DIV);
 
        down(&data->update_lock);
+       switch (nr) {
+       case 0: data->fan_div[nr] = reg & 0x07; break;
+       case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
+       case 2: data->fan_div[nr] = (reg & 0x40) ? 3 : 1; break;
+       }
+
        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
        it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]);
        up(&data->update_lock);
index bde0cda9477e1a52c62e3960dd1022185c5e838a..78cdd506439feae1a31424afd3da7f9ad7fcaaa7 100644 (file)
@@ -451,7 +451,7 @@ static DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_3_div, NULL);
 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(82, data->vid));
+       return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
 }
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 
index 4e9a04e1f08e5eecbfa541a65740f9564e3659ff..bbb3dcde146bd8618c140d0bc1f33ed59b003489 100644 (file)
@@ -456,7 +456,9 @@ static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *a
                (w83627thf == data->type || w83637hf == data->type))
 
                /* use VRM9 calculation */
-               data->in_min[0] = (u8)(((val * 100) - 70000 + 244) / 488);
+               data->in_min[0] =
+                       SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
+                                       255);
        else
                /* use VRM8 (standard) calculation */
                data->in_min[0] = IN_TO_REG(val);
@@ -481,7 +483,9 @@ static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *a
                (w83627thf == data->type || w83637hf == data->type))
                
                /* use VRM9 calculation */
-               data->in_max[0] = (u8)(((val * 100) - 70000 + 244) / 488);
+               data->in_max[0] =
+                       SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
+                                       255);
        else
                /* use VRM8 (standard) calculation */
                data->in_max[0] = IN_TO_REG(val);
index 4be59dbb78c472467c507587e9cb47279a557572..1ba072630361959678ef87def072a43755464345 100644 (file)
@@ -193,6 +193,7 @@ static const u8 W83792D_REG_LEVELS[3][4] = {
          0xE2 }        /* (bit3-0) SmartFanII: Fan3 Level 3 */
 };
 
+#define W83792D_REG_GPIO_EN            0x1A
 #define W83792D_REG_CONFIG             0x40
 #define W83792D_REG_VID_FANDIV         0x47
 #define W83792D_REG_CHIPID             0x49
@@ -257,7 +258,7 @@ DIV_TO_REG(long val)
 {
        int i;
        val = SENSORS_LIMIT(val, 1, 128) >> 1;
-       for (i = 0; i < 6; i++) {
+       for (i = 0; i < 7; i++) {
                if (val == 0)
                        break;
                val >>= 1;
@@ -1282,8 +1283,8 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind)
        w83792d_init_client(new_client);
 
        /* A few vars need to be filled upon startup */
-       for (i = 1; i <= 7; i++) {
-               data->fan_min[i - 1] = w83792d_read_value(new_client,
+       for (i = 0; i < 7; i++) {
+               data->fan_min[i] = w83792d_read_value(new_client,
                                        W83792D_REG_FAN_MIN[i]);
        }
 
@@ -1306,10 +1307,20 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind)
        device_create_file_fan(new_client, 1);
        device_create_file_fan(new_client, 2);
        device_create_file_fan(new_client, 3);
-       device_create_file_fan(new_client, 4);
-       device_create_file_fan(new_client, 5);
-       device_create_file_fan(new_client, 6);
-       device_create_file_fan(new_client, 7);
+
+       /* Read GPIO enable register to check if pins for fan 4,5 are used as
+          GPIO */
+       val1 = w83792d_read_value(new_client, W83792D_REG_GPIO_EN);
+       if (!(val1 & 0x40))
+               device_create_file_fan(new_client, 4);
+       if (!(val1 & 0x20))
+               device_create_file_fan(new_client, 5);
+
+       val1 = w83792d_read_value(new_client, W83792D_REG_PIN);
+       if (val1 & 0x40)
+               device_create_file_fan(new_client, 6);
+       if (val1 & 0x04)
+               device_create_file_fan(new_client, 7);
 
        device_create_file_temp1(new_client);           /* Temp1 */
        device_create_file_temp_add(new_client, 2);     /* Temp2 */
index cef024a7d048eaf63b79765700228dbf4fe9f3dd..cd6f45d186ab4d6a3b51ade91cf7bbb8f68a4f3a 100644 (file)
@@ -36,8 +36,6 @@
 #include <asm/hardware.h>      /* Pick up IXP2000-specific bits */
 #include <asm/arch/gpio.h>
 
-static struct device_driver ixp2000_i2c_driver;
-
 static inline int ixp2000_scl_pin(void *data)
 {
        return ((struct ixp2000_i2c_pins*)data)->scl_pin;
@@ -120,7 +118,7 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev)
        drv_data->algo_data.timeout = 100;
 
        drv_data->adapter.id = I2C_HW_B_IXP2000,
-       strlcpy(drv_data->adapter.name, ixp2000_i2c_driver.name,
+       strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
                I2C_NAME_SIZE);
        drv_data->adapter.algo_data = &drv_data->algo_data,
 
@@ -132,7 +130,7 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev)
        gpio_line_set(gpio->sda_pin, 0);
 
        if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) {
-               dev_err(dev, "Could not install, error %d\n", err);
+               dev_err(&plat_dev->dev, "Could not install, error %d\n", err);
                kfree(drv_data);
                return err;
        } 
index f87220be3c87ddc09795e1d77d6dc1eda0e56986..e422d8b2d4d69536f618dc8e883907152b5119bd 100644 (file)
@@ -35,8 +35,6 @@
 
 #include <asm/hardware.h>      /* Pick up IXP4xx-specific bits */
 
-static struct platform_driver ixp4xx_i2c_driver;
-
 static inline int ixp4xx_scl_pin(void *data)
 {
        return ((struct ixp4xx_i2c_pins*)data)->scl_pin;
@@ -128,7 +126,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
        drv_data->algo_data.timeout = 100;
 
        drv_data->adapter.id = I2C_HW_B_IXP4XX;
-       strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.driver.name,
+       strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
                I2C_NAME_SIZE);
        drv_data->adapter.algo_data = &drv_data->algo_data;
 
@@ -140,8 +138,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
        gpio_line_set(gpio->sda_pin, 0);
 
        if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) {
-               printk(KERN_ERR "ERROR: Could not install %s\n", 
-                               plat_dev->dev.bus_id);
+               printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id);
 
                kfree(drv_data);
                return err;
index afd7634e5cc9f1bf68a2ae358f689cad2c55fd09..81031eb510565e09c707ef0d1392f5a0e34c730e 100644 (file)
@@ -529,14 +529,15 @@ mv64xxx_i2c_probe(struct platform_device *pd)
        i2c_set_adapdata(&drv_data->adapter, drv_data);
 
        if (request_irq(drv_data->irq, mv64xxx_i2c_intr, 0,
-               MV64XXX_I2C_CTLR_NAME, drv_data)) {
-
-               dev_err(dev, "mv64xxx: Can't register intr handler "
-                       "irq: %d\n", drv_data->irq);
+                       MV64XXX_I2C_CTLR_NAME, drv_data)) {
+               dev_err(&drv_data->adapter.dev,
+                       "mv64xxx: Can't register intr handler irq: %d\n",
+                       drv_data->irq);
                rc = -EINVAL;
                goto exit_unmap_regs;
        } else if ((rc = i2c_add_adapter(&drv_data->adapter)) != 0) {
-               dev_err(dev, "mv64xxx: Can't add i2c adapter, rc: %d\n", -rc);
+               dev_err(&drv_data->adapter.dev,
+                       "mv64xxx: Can't add i2c adapter, rc: %d\n", -rc);
                goto exit_free_irq;
        }
 
index 31e649a9ff710a9462057fb894228587c647634d..1c81174595b3ce12db4ee9d8194d29b61d92c67b 100644 (file)
@@ -807,14 +807,6 @@ config BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
        depends on SOC_AU1200 && BLK_DEV_IDE_AU1XXX
 endchoice
 
-config BLK_DEV_IDE_AU1XXX_BURSTABLE_ON
-        bool "Enable burstable Mode on DbDMA"
-        default false
-        depends BLK_DEV_IDE_AU1XXX
-        help
-          This option enable the burstable Flag on DbDMA controller
-          (cf. "AMD Alchemy 'Au1200' Processor Data Book - PRELIMINARY").
-
 config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
        int "Maximum transfer size (KB) per request (up to 128)"
        default "128"
@@ -940,7 +932,7 @@ config BLK_DEV_Q40IDE
 
 config BLK_DEV_MPC8xx_IDE
        bool "MPC8xx IDE support"
-       depends on 8xx
+       depends on 8xx && IDE=y && BLK_DEV_IDE=y
        help
          This option provides support for IDE on Motorola MPC8xx Systems.
          Please see 'Type of MPC8xx IDE interface' for details.
index 421b62d900afc641e4cd377ec1f367448684a441..b4d7a3efb90f4d977a60cdbc829f2fbd8ef42b8f 100644 (file)
@@ -1292,7 +1292,6 @@ static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
        struct cdrom_info *info = drive->driver_data;
 
        info->dma = 0;
-       info->cmd = 0;
        info->start_seek = jiffies;
        return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
 }
@@ -1344,8 +1343,6 @@ static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
            (rq->nr_sectors & (sectors_per_frame - 1)))
                info->dma = 0;
 
-       info->cmd = READ;
-
        /* Start sending the read request to the drive. */
        return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
 }
@@ -1484,7 +1481,6 @@ static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
        struct cdrom_info *info = drive->driver_data;
 
        info->dma = 0;
-       info->cmd = 0;
        rq->flags &= ~REQ_FAILED;
        len = rq->data_len;
 
@@ -1891,7 +1887,6 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
        /* use dma, if possible. we don't need to check more, since we
         * know that the transfer is always (at least!) frame aligned */
        info->dma = drive->using_dma ? 1 : 0;
-       info->cmd = WRITE;
 
        info->devinfo.media_written = 1;
 
@@ -1916,7 +1911,6 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
        rq->flags |= REQ_QUIET;
 
        info->dma = 0;
-       info->cmd = 0;
 
        /*
         * sg request
@@ -1925,7 +1919,6 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
                int mask = drive->queue->dma_alignment;
                unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
 
-               info->cmd = rq_data_dir(rq);
                info->dma = drive->using_dma;
 
                /*
@@ -3510,8 +3503,8 @@ static void __exit ide_cdrom_exit(void)
 {
        driver_unregister(&ide_cdrom_driver.gen_driver);
 }
-static int ide_cdrom_init(void)
+
+static int __init ide_cdrom_init(void)
 {
        return driver_register(&ide_cdrom_driver.gen_driver);
 }
index 7ca3e5afc66551b352bcc1c2bd2eb84d098e91d0..ad1f2ed14a3723cbcec3081341487e7d784c494c 100644 (file)
@@ -480,7 +480,6 @@ struct cdrom_info {
 
        struct request request_sense_request;
        int dma;
-       int cmd;
        unsigned long last_block;
        unsigned long start_seek;
        /* Buffer to hold mechanism status and changer slot table. */
index 1a45f75dc9b2ebbe436c7dd63d3a355614b7dbee..449522f0540c20d77b1957cd224021ce39bc5f9e 100644 (file)
@@ -1034,12 +1034,12 @@ static int ide_disk_remove(struct device *dev)
        struct ide_disk_obj *idkp = drive->driver_data;
        struct gendisk *g = idkp->disk;
 
-       ide_cacheflush_p(drive);
-
        ide_unregister_subdriver(drive, idkp->driver);
 
        del_gendisk(g);
 
+       ide_cacheflush_p(drive);
+
        ide_disk_put(idkp);
 
        return 0;
@@ -1266,7 +1266,7 @@ static void __exit idedisk_exit (void)
        driver_unregister(&idedisk_driver.gen_driver);
 }
 
-static int idedisk_init (void)
+static int __init idedisk_init(void)
 {
        return driver_register(&idedisk_driver.gen_driver);
 }
index 1e1531334c251579cac44d980973942f1df9391b..0523da77425aa35ceb5905636e9a8b839bf887f4 100644 (file)
 #include <asm/io.h>
 #include <asm/irq.h>
 
-struct drive_list_entry {
-       const char *id_model;
-       const char *id_firmware;
-};
-
 static const struct drive_list_entry drive_whitelist [] = {
 
        { "Micropolis 2112A"    ,       "ALL"           },
@@ -139,7 +134,7 @@ static const struct drive_list_entry drive_blacklist [] = {
 };
 
 /**
- *     in_drive_list   -       look for drive in black/white list
+ *     ide_in_drive_list       -       look for drive in black/white list
  *     @id: drive identifier
  *     @drive_table: list to inspect
  *
@@ -147,7 +142,7 @@ static const struct drive_list_entry drive_blacklist [] = {
  *     Returns 1 if the drive is found in the table.
  */
 
-static int in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
+int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
 {
        for ( ; drive_table->id_model ; drive_table++)
                if ((!strcmp(drive_table->id_model, id->model)) &&
@@ -157,6 +152,8 @@ static int in_drive_list(struct hd_driveid *id, const struct drive_list_entry *d
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(ide_in_drive_list);
+
 /**
  *     ide_dma_intr    -       IDE DMA interrupt handler
  *     @drive: the drive the interrupt is for
@@ -663,7 +660,7 @@ int __ide_dma_bad_drive (ide_drive_t *drive)
 {
        struct hd_driveid *id = drive->id;
 
-       int blacklist = in_drive_list(id, drive_blacklist);
+       int blacklist = ide_in_drive_list(id, drive_blacklist);
        if (blacklist) {
                printk(KERN_WARNING "%s: Disabling (U)DMA for %s (blacklisted)\n",
                                    drive->name, id->model);
@@ -677,7 +674,7 @@ EXPORT_SYMBOL(__ide_dma_bad_drive);
 int __ide_dma_good_drive (ide_drive_t *drive)
 {
        struct hd_driveid *id = drive->id;
-       return in_drive_list(id, drive_whitelist);
+       return ide_in_drive_list(id, drive_whitelist);
 }
 
 EXPORT_SYMBOL(__ide_dma_good_drive);
index 94c147b79a4974088d9c5900dd4872ef3b47c630..9e293c8063dccfbe20b9589df836b8b0fa34f4f8 100644 (file)
@@ -2191,10 +2191,7 @@ static void __exit idefloppy_exit (void)
        driver_unregister(&idefloppy_driver.gen_driver);
 }
 
-/*
- *     idefloppy_init will register the driver for each floppy.
- */
-static int idefloppy_init (void)
+static int __init idefloppy_init(void)
 {
        printk("ide-floppy driver " IDEFLOPPY_VERSION "\n");
        return driver_register(&idefloppy_driver.gen_driver);
index 5275cbb1afe9c790fe9b427c0c916dcfa7c4b9a3..ecfafcdafea41ec8a776796e3c9f0e93aa6b1b15 100644 (file)
@@ -1629,12 +1629,6 @@ EXPORT_SYMBOL(ide_init_drive_cmd);
  *     for the new rq to be completed.  This is VERY DANGEROUS, and is
  *     intended for careful use by the ATAPI tape/cdrom driver code.
  *
- *     If action is ide_next, then the rq is queued immediately after
- *     the currently-being-processed-request (if any), and the function
- *     returns without waiting for the new rq to be completed.  As above,
- *     This is VERY DANGEROUS, and is intended for careful use by the
- *     ATAPI tape/cdrom driver code.
- *
  *     If action is ide_end, then the rq is queued at the end of the
  *     request queue, and the function returns immediately without waiting
  *     for the new rq to be completed. This is again intended for careful
index 2069dd693c9f4bcd42a20ba1ec7744106a1954d0..7d7944ed4158b89b88e73d6fb4220fdb1111609c 100644 (file)
@@ -4916,10 +4916,7 @@ static void __exit idetape_exit (void)
        unregister_chrdev(IDETAPE_MAJOR, "ht");
 }
 
-/*
- *     idetape_init will register the driver for each tape.
- */
-static int idetape_init (void)
+static int __init idetape_init(void)
 {
        int error = 1;
        idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape");
index 54f9639c2a8cc1fbd42685d0271de662bc1a9210..62ebefd6394a0af83b10a188c86e9a12a4d1520a 100644 (file)
@@ -51,8 +51,6 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
-#define DEBUG_TASKFILE 0       /* unset when fixed */
-
 static void ata_bswap_data (void *buffer, int wcount)
 {
        u16 *p = buffer;
@@ -765,9 +763,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
        ide_hwif_t *hwif        = HWIF(drive);
        task_struct_t *taskfile = (task_struct_t *) task->tfRegister;
        hob_struct_t *hobfile   = (hob_struct_t *) task->hobRegister;
-#if DEBUG_TASKFILE
-       u8 status;
-#endif
 
        if (task->data_phase == TASKFILE_MULTI_IN ||
            task->data_phase == TASKFILE_MULTI_OUT) {
@@ -778,19 +773,13 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
        }
 
        /*
-        * (ks) Check taskfile in/out flags.
+        * (ks) Check taskfile in flags.
         * If set, then execute as it is defined.
         * If not set, then define default settings.
         * The default values are:
-        *      write and read all taskfile registers (except data) 
-        *      write and read the hob registers (sector,nsector,lcyl,hcyl)
+        *      read all taskfile registers (except data)
+        *      read the hob registers (sector, nsector, lcyl, hcyl)
         */
-       if (task->tf_out_flags.all == 0) {
-               task->tf_out_flags.all = IDE_TASKFILE_STD_OUT_FLAGS;
-               if (drive->addressing == 1)
-                       task->tf_out_flags.all |= (IDE_HOB_STD_OUT_FLAGS << 8);
-        }
-
        if (task->tf_in_flags.all == 0) {
                task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS;
                if (drive->addressing == 1)
@@ -803,16 +792,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
                hwif->OUTB(drive->ctl, IDE_CONTROL_REG);
        SELECT_MASK(drive, 0);
 
-#if DEBUG_TASKFILE
-       status = hwif->INB(IDE_STATUS_REG);
-       if (status & 0x80) {
-               printk("flagged_taskfile -> Bad status. Status = %02x. wait 100 usec ...\n", status);
-               udelay(100);
-               status = hwif->INB(IDE_STATUS_REG);
-               printk("flagged_taskfile -> Status = %02x\n", status);
-       }
-#endif
-
        if (task->tf_out_flags.b.data) {
                u16 data =  taskfile->data + (hobfile->data << 8);
                hwif->OUTW(data, IDE_DATA_REG);
index 578e52a59588849342887ab0a0a69c8ae7666f8a..677c7b2bac92419879119205bf209c88289879ca 100644 (file)
@@ -1 +1,4 @@
 obj-$(CONFIG_BLK_DEV_IDE_SWARM)                += swarm.o
+obj-$(CONFIG_BLK_DEV_IDE_AU1XXX)       += au1xxx-ide.o
+
+EXTRA_CFLAGS    := -Idrivers/ide
index 2b6327c576b9f081bf4f4a4d5658cb4e19ae584f..32431dcf5d8e51cf181ecd2f78b8cfa24fecc6c0 100644 (file)
  */
 #undef REALLY_SLOW_IO           /* most systems can safely undef this */
 
-#include <linux/config.h>       /* for CONFIG_BLK_DEV_IDEPCI */
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/ioport.h>
-#include <linux/hdreg.h>
+#include <linux/platform_device.h>
+
 #include <linux/init.h>
 #include <linux/ide.h>
 #include <linux/sysdev.h>
 
 #include <linux/dma-mapping.h>
 
+#include "ide-timing.h"
+
 #include <asm/io.h>
 #include <asm/mach-au1x00/au1xxx.h>
 #include <asm/mach-au1x00/au1xxx_dbdma.h>
 
-#if CONFIG_PM
-#include <asm/mach-au1x00/au1xxx_pm.h>
-#endif
-
 #include <asm/mach-au1x00/au1xxx_ide.h>
 
 #define DRV_NAME       "au1200-ide"
 #define DRV_VERSION    "1.0"
-#define DRV_AUTHOR     "AMD PCS / Pete Popov <ppopov@embeddedalley.com>"
-#define DRV_DESC       "Au1200 IDE"
-
-static _auide_hwif auide_hwif;
-static spinlock_t ide_tune_drive_spin_lock = SPIN_LOCK_UNLOCKED;
-static spinlock_t ide_tune_chipset_spin_lock = SPIN_LOCK_UNLOCKED;
-static int dbdma_init_done = 0;
-
-/*
- * local I/O functions
- */
-u8 auide_inb(unsigned long port)
-{
-        return (au_readb(port));
-}
+#define DRV_AUTHOR     "Enrico Walther <enrico.walther@amd.com> / Pete Popov <ppopov@embeddedalley.com>"
 
-u16 auide_inw(unsigned long port)
-{
-        return (au_readw(port));
-}
+/* enable the burstmode in the dbdma */
+#define IDE_AU1XXX_BURSTMODE   1
 
-u32 auide_inl(unsigned long port)
-{
-        return (au_readl(port));
-}
+static _auide_hwif auide_hwif;
+static int dbdma_init_done;
 
-void auide_insw(unsigned long port, void *addr, u32 count)
-{
 #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
 
-        _auide_hwif *ahwif = &auide_hwif;
-        chan_tab_t *ctp;
-        au1x_ddma_desc_t *dp;
-
-        if(!put_dest_flags(ahwif->rx_chan, (void*)addr, count << 1,
-                               DDMA_FLAGS_NOIE)) {
-                printk(KERN_ERR "%s failed %d\n", __FUNCTION__, __LINE__);
-                return;
-        }
-        ctp = *((chan_tab_t **)ahwif->rx_chan);
-        dp = ctp->cur_ptr;
-        while (dp->dscr_cmd0 & DSCR_CMD0_V)
-                ;
-        ctp->cur_ptr = au1xxx_ddma_get_nextptr_virt(dp);
-#else
-        while (count--)
-        {
-                *(u16 *)addr = au_readw(port);
-                addr +=2 ;
-        }
-#endif
-}
-
-void auide_insl(unsigned long port, void *addr, u32 count)
-{
-        while (count--)
-        {
-                *(u32 *)addr = au_readl(port);
-                /* NOTE: For IDE interfaces over PCMCIA,
-                 * 32-bit access does not work
-                 */
-                addr += 4;
-        }
-}
-
-void auide_outb(u8 addr, unsigned long port)
+void auide_insw(unsigned long port, void *addr, u32 count)
 {
-        return (au_writeb(addr, port));
-}
+       _auide_hwif *ahwif = &auide_hwif;
+       chan_tab_t *ctp;
+       au1x_ddma_desc_t *dp;
 
-void auide_outbsync(ide_drive_t *drive, u8 addr, unsigned long port)
-{
-        return (au_writeb(addr, port));
+       if(!put_dest_flags(ahwif->rx_chan, (void*)addr, count << 1, 
+                          DDMA_FLAGS_NOIE)) {
+               printk(KERN_ERR "%s failed %d\n", __FUNCTION__, __LINE__);
+               return;
+       }
+       ctp = *((chan_tab_t **)ahwif->rx_chan);
+       dp = ctp->cur_ptr;
+       while (dp->dscr_cmd0 & DSCR_CMD0_V)
+               ;
+       ctp->cur_ptr = au1xxx_ddma_get_nextptr_virt(dp);
 }
 
-void auide_outw(u16 addr, unsigned long port)
+void auide_outsw(unsigned long port, void *addr, u32 count)
 {
-        return (au_writew(addr, port));
-}
+       _auide_hwif *ahwif = &auide_hwif;
+       chan_tab_t *ctp;
+       au1x_ddma_desc_t *dp;
 
-void auide_outl(u32 addr, unsigned long port)
-{
-        return (au_writel(addr, port));
+       if(!put_source_flags(ahwif->tx_chan, (void*)addr,
+                            count << 1, DDMA_FLAGS_NOIE)) {
+               printk(KERN_ERR "%s failed %d\n", __FUNCTION__, __LINE__);
+               return;
+       }
+       ctp = *((chan_tab_t **)ahwif->tx_chan);
+       dp = ctp->cur_ptr;
+       while (dp->dscr_cmd0 & DSCR_CMD0_V)
+               ;
+       ctp->cur_ptr = au1xxx_ddma_get_nextptr_virt(dp);
 }
 
-void auide_outsw(unsigned long port, void *addr, u32 count)
-{
-#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
-        _auide_hwif *ahwif = &auide_hwif;
-        chan_tab_t *ctp;
-        au1x_ddma_desc_t *dp;
-
-        if(!put_source_flags(ahwif->tx_chan, (void*)addr,
-                                          count << 1, DDMA_FLAGS_NOIE)) {
-                printk(KERN_ERR "%s failed %d\n", __FUNCTION__, __LINE__);
-                return;
-        }
-        ctp = *((chan_tab_t **)ahwif->tx_chan);
-        dp = ctp->cur_ptr;
-        while (dp->dscr_cmd0 & DSCR_CMD0_V)
-                ;
-        ctp->cur_ptr = au1xxx_ddma_get_nextptr_virt(dp);
-#else
-        while (count--)
-        {
-                au_writew(*(u16 *)addr, port);
-                addr += 2;
-        }
 #endif
-}
-
-void auide_outsl(unsigned long port, void *addr, u32 count)
-{
-        while (count--)
-        {
-                au_writel(*(u32 *)addr, port);
-                /* NOTE: For IDE interfaces over PCMCIA,
-                 * 32-bit access does not work
-                 */
-                addr += 4;
-        }
-}
 
 static void auide_tune_drive(ide_drive_t *drive, byte pio)
 {
-        int mem_sttime;
-        int mem_stcfg;
-        unsigned long flags;
-        u8 speed;
-
-        /* get the best pio mode for the drive */
-        pio = ide_get_best_pio_mode(drive, pio, 4, NULL);
-
-        printk("%s: setting Au1XXX IDE to PIO mode%d\n",
-                drive->name, pio);
-
-        spin_lock_irqsave(&ide_tune_drive_spin_lock, flags);
-
-        mem_sttime = 0;
-        mem_stcfg  = au_readl(MEM_STCFG2);
-
-        /* set pio mode! */
-        switch(pio) {
-                case 0:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_PIO0_TWCS
-                                     | SBC_IDE_PIO0_TCSH
-                                     | SBC_IDE_PIO0_TCSOFF
-                                     | SBC_IDE_PIO0_TWP
-                                     | SBC_IDE_PIO0_TCSW
-                                     | SBC_IDE_PIO0_TPM
-                                     | SBC_IDE_PIO0_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg |= TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_PIO0_TCSOE | SBC_IDE_PIO0_TOECS;
-
-                        au_writel(mem_sttime,MEM_STTIME2);
-                        au_writel(mem_stcfg,MEM_STCFG2);
-                        break;
-
-                case 1:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_PIO1_TWCS
-                                     | SBC_IDE_PIO1_TCSH
-                                     | SBC_IDE_PIO1_TCSOFF
-                                     | SBC_IDE_PIO1_TWP
-                                     | SBC_IDE_PIO1_TCSW
-                                     | SBC_IDE_PIO1_TPM
-                                     | SBC_IDE_PIO1_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg |= TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_PIO1_TCSOE | SBC_IDE_PIO1_TOECS;
-                        break;
-
-                case 2:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_PIO2_TWCS
-                                     | SBC_IDE_PIO2_TCSH
-                                     | SBC_IDE_PIO2_TCSOFF
-                                     | SBC_IDE_PIO2_TWP
-                                     | SBC_IDE_PIO2_TCSW
-                                     | SBC_IDE_PIO2_TPM
-                                     | SBC_IDE_PIO2_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg &= ~TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_PIO2_TCSOE | SBC_IDE_PIO2_TOECS;
-                        break;
-
-                case 3:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_PIO3_TWCS
-                                     | SBC_IDE_PIO3_TCSH
-                                     | SBC_IDE_PIO3_TCSOFF
-                                     | SBC_IDE_PIO3_TWP
-                                     | SBC_IDE_PIO3_TCSW
-                                     | SBC_IDE_PIO3_TPM
-                                     | SBC_IDE_PIO3_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg |= TS_MASK;
-                        mem_stcfg &= ~TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_PIO3_TCSOE | SBC_IDE_PIO3_TOECS;
-
-                        break;
-
-                case 4:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_PIO4_TWCS
-                                     | SBC_IDE_PIO4_TCSH
-                                     | SBC_IDE_PIO4_TCSOFF
-                                     | SBC_IDE_PIO4_TWP
-                                     | SBC_IDE_PIO4_TCSW
-                                     | SBC_IDE_PIO4_TPM
-                                     | SBC_IDE_PIO4_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg &= ~TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_PIO4_TCSOE | SBC_IDE_PIO4_TOECS;
-                        break;
-        }
-
-        au_writel(mem_sttime,MEM_STTIME2);
-        au_writel(mem_stcfg,MEM_STCFG2);
-
-        spin_unlock_irqrestore(&ide_tune_drive_spin_lock, flags);
-
-        speed = pio + XFER_PIO_0;
-        ide_config_drive_speed(drive, speed);
+       int mem_sttime;
+       int mem_stcfg;
+       u8 speed;
+
+       /* get the best pio mode for the drive */
+       pio = ide_get_best_pio_mode(drive, pio, 4, NULL);
+
+       printk(KERN_INFO "%s: setting Au1XXX IDE to PIO mode%d\n",
+              drive->name, pio);
+
+       mem_sttime = 0;
+       mem_stcfg  = au_readl(MEM_STCFG2);
+
+       /* set pio mode! */
+       switch(pio) {
+       case 0:
+               mem_sttime = SBC_IDE_TIMING(PIO0);
+
+               /* set configuration for RCS2# */
+               mem_stcfg |= TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_PIO0_TCSOE | SBC_IDE_PIO0_TOECS;
+               break;
+
+       case 1:
+               mem_sttime = SBC_IDE_TIMING(PIO1);
+
+               /* set configuration for RCS2# */
+               mem_stcfg |= TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_PIO1_TCSOE | SBC_IDE_PIO1_TOECS;
+               break;
+
+       case 2:
+               mem_sttime = SBC_IDE_TIMING(PIO2);
+
+               /* set configuration for RCS2# */
+               mem_stcfg &= ~TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_PIO2_TCSOE | SBC_IDE_PIO2_TOECS;
+               break;
+
+       case 3:
+               mem_sttime = SBC_IDE_TIMING(PIO3);
+
+               /* set configuration for RCS2# */
+               mem_stcfg &= ~TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_PIO3_TCSOE | SBC_IDE_PIO3_TOECS;
+
+               break;
+
+       case 4:
+               mem_sttime = SBC_IDE_TIMING(PIO4);
+
+               /* set configuration for RCS2# */
+               mem_stcfg &= ~TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_PIO4_TCSOE | SBC_IDE_PIO4_TOECS;
+               break;
+       }
+
+       au_writel(mem_sttime,MEM_STTIME2);
+       au_writel(mem_stcfg,MEM_STCFG2);
+
+       speed = pio + XFER_PIO_0;
+       ide_config_drive_speed(drive, speed);
 }
 
 static int auide_tune_chipset (ide_drive_t *drive, u8 speed)
 {
-        u8 mode = 0;
-        int mem_sttime;
-        int mem_stcfg;
-        unsigned long flags;
+       int mem_sttime;
+       int mem_stcfg;
+       unsigned long mode;
+
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-        struct hd_driveid *id = drive->id;
-
-        /*
-         * Now see what the current drive is capable of,
-         * selecting UDMA only if the mate said it was ok.
-         */
-        if (id && (id->capability & 1) && drive->autodma &&
-            !__ide_dma_bad_drive(drive)) {
-                if (!mode && (id->field_valid & 2) && (id->dma_mword & 7)) {
-                        if      (id->dma_mword & 4)
-                                mode = XFER_MW_DMA_2;
-                        else if (id->dma_mword & 2)
-                                mode = XFER_MW_DMA_1;
-                        else if (id->dma_mword & 1)
-                                mode = XFER_MW_DMA_0;
-                }
-        }
+       if (ide_use_dma(drive))
+               mode = ide_dma_speed(drive, 0);
 #endif
 
-        spin_lock_irqsave(&ide_tune_chipset_spin_lock, flags);
+       mem_sttime = 0;
+       mem_stcfg  = au_readl(MEM_STCFG2);
 
-        mem_sttime = 0;
-        mem_stcfg  = au_readl(MEM_STCFG2);
-
-        switch(speed) {
-                case XFER_PIO_4:
-                case XFER_PIO_3:
-                case XFER_PIO_2:
-                case XFER_PIO_1:
-                case XFER_PIO_0:
-                        auide_tune_drive(drive, (speed - XFER_PIO_0));
-                        break;
+       if (speed >= XFER_PIO_0 && speed <= XFER_PIO_4) {
+               auide_tune_drive(drive, speed - XFER_PIO_0);
+               return 0;
+       }
+             
+       switch(speed) {
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-                case XFER_MW_DMA_2:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_MDMA2_TWCS
-                                     | SBC_IDE_MDMA2_TCSH
-                                     | SBC_IDE_MDMA2_TCSOFF
-                                     | SBC_IDE_MDMA2_TWP
-                                     | SBC_IDE_MDMA2_TCSW
-                                     | SBC_IDE_MDMA2_TPM
-                                     | SBC_IDE_MDMA2_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg &= ~TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_MDMA2_TCSOE | SBC_IDE_MDMA2_TOECS;
-
-                        mode = XFER_MW_DMA_2;
-                        break;
-                case XFER_MW_DMA_1:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_MDMA1_TWCS
-                                     | SBC_IDE_MDMA1_TCSH
-                                     | SBC_IDE_MDMA1_TCSOFF
-                                     | SBC_IDE_MDMA1_TWP
-                                     | SBC_IDE_MDMA1_TCSW
-                                     | SBC_IDE_MDMA1_TPM
-                                     | SBC_IDE_MDMA1_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg &= ~TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_MDMA1_TCSOE | SBC_IDE_MDMA1_TOECS;
-
-                        mode = XFER_MW_DMA_1;
-                        break;
-                case XFER_MW_DMA_0:
-                        /* set timing parameters for RCS2# */
-                        mem_sttime =   SBC_IDE_MDMA0_TWCS
-                                     | SBC_IDE_MDMA0_TCSH
-                                     | SBC_IDE_MDMA0_TCSOFF
-                                     | SBC_IDE_MDMA0_TWP
-                                     | SBC_IDE_MDMA0_TCSW
-                                     | SBC_IDE_MDMA0_TPM
-                                     | SBC_IDE_MDMA0_TA;
-                        /* set configuration for RCS2# */
-                        mem_stcfg |= TS_MASK;
-                        mem_stcfg &= ~TCSOE_MASK;
-                        mem_stcfg &= ~TOECS_MASK;
-                        mem_stcfg |= SBC_IDE_MDMA0_TCSOE | SBC_IDE_MDMA0_TOECS;
-
-                        mode = XFER_MW_DMA_0;
-                        break;
+       case XFER_MW_DMA_2:
+               mem_sttime = SBC_IDE_TIMING(MDMA2);
+
+               /* set configuration for RCS2# */
+               mem_stcfg &= ~TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_MDMA2_TCSOE | SBC_IDE_MDMA2_TOECS;
+
+               mode = XFER_MW_DMA_2;
+               break;
+       case XFER_MW_DMA_1:
+               mem_sttime = SBC_IDE_TIMING(MDMA1);
+
+               /* set configuration for RCS2# */
+               mem_stcfg &= ~TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_MDMA1_TCSOE | SBC_IDE_MDMA1_TOECS;
+
+               mode = XFER_MW_DMA_1;
+               break;
+       case XFER_MW_DMA_0:
+               mem_sttime = SBC_IDE_TIMING(MDMA0);
+
+               /* set configuration for RCS2# */
+               mem_stcfg |= TS_MASK;
+               mem_stcfg &= ~TCSOE_MASK;
+               mem_stcfg &= ~TOECS_MASK;
+               mem_stcfg |= SBC_IDE_MDMA0_TCSOE | SBC_IDE_MDMA0_TOECS;
+
+               mode = XFER_MW_DMA_0;
+               break;
 #endif
-                default:
-                        return 1;
-        }
-
-        /*
-         * Tell the drive to switch to the new mode; abort on failure.
-         */
-        if (!mode || ide_config_drive_speed(drive, mode))
-        {
-                return 1;       /* failure */
-        }
-
-
-        au_writel(mem_sttime,MEM_STTIME2);
-        au_writel(mem_stcfg,MEM_STCFG2);
+       default:
+               return 1;
+       }
+       
+       if (ide_config_drive_speed(drive, mode))
+               return 1;
 
-        spin_unlock_irqrestore(&ide_tune_chipset_spin_lock, flags);
+       au_writel(mem_sttime,MEM_STTIME2);
+       au_writel(mem_stcfg,MEM_STCFG2);
 
-        return 0;
+       return 0;
 }
 
 /*
  * Multi-Word DMA + DbDMA functions
  */
-#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
 
-static int in_drive_list(struct hd_driveid *id,
-                         const struct drive_list_entry *drive_table)
-{
-        for ( ; drive_table->id_model ; drive_table++){
-                if ((!strcmp(drive_table->id_model, id->model)) &&
-                        ((strstr(drive_table->id_firmware, id->fw_rev)) ||
-                        (!strcmp(drive_table->id_firmware, "ALL")))
-                )
-                        return 1;
-        }
-        return 0;
-}
+#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
 
 static int auide_build_sglist(ide_drive_t *drive,  struct request *rq)
 {
-        ide_hwif_t *hwif = drive->hwif;
-        _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data;
-        struct scatterlist *sg = hwif->sg_table;
+       ide_hwif_t *hwif = drive->hwif;
+       _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data;
+       struct scatterlist *sg = hwif->sg_table;
 
-        ide_map_sg(drive, rq);
+       ide_map_sg(drive, rq);
 
-        if (rq_data_dir(rq) == READ)
-                hwif->sg_dma_direction = DMA_FROM_DEVICE;
-        else
-                hwif->sg_dma_direction = DMA_TO_DEVICE;
+       if (rq_data_dir(rq) == READ)
+               hwif->sg_dma_direction = DMA_FROM_DEVICE;
+       else
+               hwif->sg_dma_direction = DMA_TO_DEVICE;
 
-        return dma_map_sg(ahwif->dev, sg, hwif->sg_nents,
-                          hwif->sg_dma_direction);
+       return dma_map_sg(ahwif->dev, sg, hwif->sg_nents,
+                         hwif->sg_dma_direction);
 }
 
 static int auide_build_dmatable(ide_drive_t *drive)
 {
-        int i, iswrite, count = 0;
-        ide_hwif_t *hwif = HWIF(drive);
-
-        struct request *rq = HWGROUP(drive)->rq;
-
-        _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data;
-        struct scatterlist *sg;
-
-        iswrite = (rq_data_dir(rq) == WRITE);
-        /* Save for interrupt context */
-        ahwif->drive = drive;
-
-        /* Build sglist */
-        hwif->sg_nents = i = auide_build_sglist(drive, rq);
-
-        if (!i)
-                return 0;
-
-        /* fill the descriptors */
-        sg = hwif->sg_table;
-        while (i && sg_dma_len(sg)) {
-                u32 cur_addr;
-                u32 cur_len;
-
-                cur_addr = sg_dma_address(sg);
-                cur_len = sg_dma_len(sg);
-
-                while (cur_len) {
-                        u32 flags = DDMA_FLAGS_NOIE;
-                        unsigned int tc = (cur_len < 0xfe00)? cur_len: 0xfe00;
-
-                        if (++count >= PRD_ENTRIES) {
-                                printk(KERN_WARNING "%s: DMA table too small\n",
-                                drive->name);
-                                goto use_pio_instead;
-                        }
-
-                        /* Lets enable intr for the last descriptor only */
-                        if (1==i)
-                                flags = DDMA_FLAGS_IE;
-                        else
-                                flags = DDMA_FLAGS_NOIE;
-
-                        if (iswrite) {
-                               if(!put_source_flags(ahwif->tx_chan,
-                                               (void*)(page_address(sg->page)
-                                                       + sg->offset),
-                                               tc, flags)) {
-                                       printk(KERN_ERR "%s failed %d\n",
-                                                       __FUNCTION__, __LINE__);
+       int i, iswrite, count = 0;
+       ide_hwif_t *hwif = HWIF(drive);
+
+       struct request *rq = HWGROUP(drive)->rq;
+
+       _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data;
+       struct scatterlist *sg;
+
+       iswrite = (rq_data_dir(rq) == WRITE);
+       /* Save for interrupt context */
+       ahwif->drive = drive;
+
+       /* Build sglist */
+       hwif->sg_nents = i = auide_build_sglist(drive, rq);
+
+       if (!i)
+               return 0;
+
+       /* fill the descriptors */
+       sg = hwif->sg_table;
+       while (i && sg_dma_len(sg)) {
+               u32 cur_addr;
+               u32 cur_len;
+
+               cur_addr = sg_dma_address(sg);
+               cur_len = sg_dma_len(sg);
+
+               while (cur_len) {
+                       u32 flags = DDMA_FLAGS_NOIE;
+                       unsigned int tc = (cur_len < 0xfe00)? cur_len: 0xfe00;
+
+                       if (++count >= PRD_ENTRIES) {
+                               printk(KERN_WARNING "%s: DMA table too small\n",
+                                      drive->name);
+                               goto use_pio_instead;
+                       }
+
+                       /* Lets enable intr for the last descriptor only */
+                       if (1==i)
+                               flags = DDMA_FLAGS_IE;
+                       else
+                               flags = DDMA_FLAGS_NOIE;
+
+                       if (iswrite) {
+                               if(!put_source_flags(ahwif->tx_chan, 
+                                                    (void*)(page_address(sg->page) 
+                                                            + sg->offset), 
+                                                    tc, flags)) { 
+                                       printk(KERN_ERR "%s failed %d\n", 
+                                              __FUNCTION__, __LINE__);
                                }
-                        } else
+                       } else 
                        {
-                               if(!put_dest_flags(ahwif->rx_chan,
-                                               (void*)(page_address(sg->page)
-                                                       + sg->offset),
-                                               tc, flags)) {
-                                       printk(KERN_ERR "%s failed %d\n",
-                                                       __FUNCTION__, __LINE__);
+                               if(!put_dest_flags(ahwif->rx_chan, 
+                                                  (void*)(page_address(sg->page) 
+                                                          + sg->offset), 
+                                                  tc, flags)) { 
+                                       printk(KERN_ERR "%s failed %d\n", 
+                                              __FUNCTION__, __LINE__);
                                }
-                        }
+                       }
 
-                        cur_addr += tc;
-                        cur_len -= tc;
-                }
-                sg++;
-                i--;
-        }
+                       cur_addr += tc;
+                       cur_len -= tc;
+               }
+               sg++;
+               i--;
+       }
 
-        if (count)
-                return 1;
+       if (count)
+               return 1;
 
-use_pio_instead:
-        dma_unmap_sg(ahwif->dev,
-                     hwif->sg_table,
-                     hwif->sg_nents,
-                     hwif->sg_dma_direction);
+ use_pio_instead:
+       dma_unmap_sg(ahwif->dev,
+                    hwif->sg_table,
+                    hwif->sg_nents,
+                    hwif->sg_dma_direction);
 
-        return 0; /* revert to PIO for this request */
+       return 0; /* revert to PIO for this request */
 }
 
 static int auide_dma_end(ide_drive_t *drive)
 {
-        ide_hwif_t *hwif = HWIF(drive);
-        _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data;
+       ide_hwif_t *hwif = HWIF(drive);
+       _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data;
 
-        if (hwif->sg_nents) {
-                dma_unmap_sg(ahwif->dev, hwif->sg_table, hwif->sg_nents,
-                             hwif->sg_dma_direction);
-                hwif->sg_nents = 0;
-        }
+       if (hwif->sg_nents) {
+               dma_unmap_sg(ahwif->dev, hwif->sg_table, hwif->sg_nents,
+                            hwif->sg_dma_direction);
+               hwif->sg_nents = 0;
+       }
 
-        return 0;
+       return 0;
 }
 
 static void auide_dma_start(ide_drive_t *drive )
 {
-//      printk("%s\n", __FUNCTION__);
 }
 
-ide_startstop_t auide_dma_intr(ide_drive_t *drive)
-{
-        //printk("%s\n", __FUNCTION__);
-
-        u8 stat = 0, dma_stat = 0;
-
-        dma_stat = HWIF(drive)->ide_dma_end(drive);
-        stat = HWIF(drive)->INB(IDE_STATUS_REG);        /* get drive status */
-        if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
-                if (!dma_stat) {
-                        struct request *rq = HWGROUP(drive)->rq;
-
-                        ide_end_request(drive, 1, rq->nr_sectors);
-                        return ide_stopped;
-                }
-                printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",
-                                 drive->name, dma_stat);
-        }
-        return ide_error(drive, "dma_intr", stat);
-}
 
 static void auide_dma_exec_cmd(ide_drive_t *drive, u8 command)
 {
-        //printk("%s\n", __FUNCTION__);
-
-        /* issue cmd to drive */
-        ide_execute_command(drive, command, &auide_dma_intr,
-                            (2*WAIT_CMD), NULL);
+       /* issue cmd to drive */
+       ide_execute_command(drive, command, &ide_dma_intr,
+                           (2*WAIT_CMD), NULL);
 }
 
 static int auide_dma_setup(ide_drive_t *drive)
-{
-//      printk("%s\n", __FUNCTION__);
-
-        if (drive->media != ide_disk)
-                return 1;
-
-        if (!auide_build_dmatable(drive))
-                        /* try PIO instead of DMA */
-                        return 1;
+{              
+       struct request *rq = HWGROUP(drive)->rq;
 
-        drive->waiting_for_dma = 1;
+       if (!auide_build_dmatable(drive)) {
+               ide_map_sg(drive, rq);
+               return 1;
+       }
 
-        return 0;
+       drive->waiting_for_dma = 1;
+       return 0;
 }
 
 static int auide_dma_check(ide_drive_t *drive)
 {
-//      printk("%s\n", __FUNCTION__);
+       u8 speed;
 
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-        if( !dbdma_init_done ){
-                auide_hwif.white_list = in_drive_list(drive->id,
-                                                      dma_white_list);
-                auide_hwif.black_list = in_drive_list(drive->id,
-                                                      dma_black_list);
-                auide_hwif.drive = drive;
-                auide_ddma_init(&auide_hwif);
-                dbdma_init_done = 1;
-        }
+
+       if( dbdma_init_done == 0 ){
+               auide_hwif.white_list = ide_in_drive_list(drive->id,
+                                                         dma_white_list);
+               auide_hwif.black_list = ide_in_drive_list(drive->id,
+                                                         dma_black_list);
+               auide_hwif.drive = drive;
+               auide_ddma_init(&auide_hwif);
+               dbdma_init_done = 1;
+       }
 #endif
 
-        /* Is the drive in our DMA black list? */
-        if ( auide_hwif.black_list ) {
-                drive->using_dma = 0;
-                printk("%s found in dma_blacklist[]! Disabling DMA.\n",
-                drive->id->model);
-        }
-        else
-                drive->using_dma = 1;
+       /* Is the drive in our DMA black list? */
+
+       if ( auide_hwif.black_list ) {
+               drive->using_dma = 0;
+
+               /* Borrowed the warning message from ide-dma.c */
 
-        return HWIF(drive)->ide_dma_host_on(drive);
+               printk(KERN_WARNING "%s: Disabling DMA for %s (blacklisted)\n",
+                      drive->name, drive->id->model);         
+       }
+       else
+               drive->using_dma = 1;
+
+       speed = ide_find_best_mode(drive, XFER_PIO | XFER_MWDMA);
+       
+       if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
+               return HWIF(drive)->ide_dma_on(drive);
+
+       return HWIF(drive)->ide_dma_off_quietly(drive);
 }
 
 static int auide_dma_test_irq(ide_drive_t *drive)
-{
-//      printk("%s\n", __FUNCTION__);
-
-        if (!drive->waiting_for_dma)
-                printk(KERN_WARNING "%s: ide_dma_test_irq \
+{      
+       if (drive->waiting_for_dma == 0)
+               printk(KERN_WARNING "%s: ide_dma_test_irq \
                                      called while not waiting\n", drive->name);
 
-        /* If dbdma didn't execute the STOP command yet, the
-         * active bit is still set
+       /* If dbdma didn't execute the STOP command yet, the
+        * active bit is still set
         */
-        drive->waiting_for_dma++;
-        if (drive->waiting_for_dma >= DMA_WAIT_TIMEOUT) {
-                printk(KERN_WARNING "%s: timeout waiting for ddma to \
+       drive->waiting_for_dma++;
+       if (drive->waiting_for_dma >= DMA_WAIT_TIMEOUT) {
+               printk(KERN_WARNING "%s: timeout waiting for ddma to \
                                      complete\n", drive->name);
-                return 1;
-        }
-        udelay(10);
-        return 0;
+               return 1;
+       }
+       udelay(10);
+       return 0;
 }
 
 static int auide_dma_host_on(ide_drive_t *drive)
 {
-//      printk("%s\n", __FUNCTION__);
-        return 0;
+       return 0;
 }
 
 static int auide_dma_on(ide_drive_t *drive)
 {
-//      printk("%s\n", __FUNCTION__);
-        drive->using_dma = 1;
-        return auide_dma_host_on(drive);
+       drive->using_dma = 1;
+       return auide_dma_host_on(drive);
 }
 
 
 static int auide_dma_host_off(ide_drive_t *drive)
 {
-//      printk("%s\n", __FUNCTION__);
-        return 0;
+       return 0;
 }
 
 static int auide_dma_off_quietly(ide_drive_t *drive)
 {
-//      printk("%s\n", __FUNCTION__);
-        drive->using_dma = 0;
-        return auide_dma_host_off(drive);
+       drive->using_dma = 0;
+       return auide_dma_host_off(drive);
 }
 
 static int auide_dma_lostirq(ide_drive_t *drive)
 {
-//      printk("%s\n", __FUNCTION__);
-
-        printk(KERN_ERR "%s: IRQ lost\n", drive->name);
-        return 0;
+       printk(KERN_ERR "%s: IRQ lost\n", drive->name);
+       return 0;
 }
 
 static void auide_ddma_tx_callback(int irq, void *param, struct pt_regs *regs)
 {
-//      printk("%s\n", __FUNCTION__);
-
-        _auide_hwif *ahwif = (_auide_hwif*)param;
-        ahwif->drive->waiting_for_dma = 0;
-        return;
+       _auide_hwif *ahwif = (_auide_hwif*)param;
+       ahwif->drive->waiting_for_dma = 0;
 }
 
 static void auide_ddma_rx_callback(int irq, void *param, struct pt_regs *regs)
 {
-//      printk("%s\n", __FUNCTION__);
+       _auide_hwif *ahwif = (_auide_hwif*)param;
+       ahwif->drive->waiting_for_dma = 0;
+}
+
+#endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
 
-        _auide_hwif *ahwif = (_auide_hwif*)param;
-        ahwif->drive->waiting_for_dma = 0;
-        return;
+static void auide_init_dbdma_dev(dbdev_tab_t *dev, u32 dev_id, u32 tsize, u32 devwidth, u32 flags)
+{
+       dev->dev_id          = dev_id;
+       dev->dev_physaddr    = (u32)AU1XXX_ATA_PHYS_ADDR;
+       dev->dev_intlevel    = 0;
+       dev->dev_intpolarity = 0;
+       dev->dev_tsize       = tsize;
+       dev->dev_devwidth    = devwidth;
+       dev->dev_flags       = flags;
 }
+  
+#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
 
 static int auide_dma_timeout(ide_drive_t *drive)
 {
 //      printk("%s\n", __FUNCTION__);
 
-        printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);
+       printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);
 
-        if (HWIF(drive)->ide_dma_test_irq(drive))
-                return 0;
+       if (HWIF(drive)->ide_dma_test_irq(drive))
+               return 0;
 
-        return HWIF(drive)->ide_dma_end(drive);
+       return HWIF(drive)->ide_dma_end(drive);
 }
-#endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
+                                       
 
+static int auide_ddma_init(_auide_hwif *auide) {
+       
+       dbdev_tab_t source_dev_tab, target_dev_tab;
+       u32 dev_id, tsize, devwidth, flags;
+       ide_hwif_t *hwif = auide->hwif;
 
-static int auide_ddma_init( _auide_hwif *auide )
-{
-//      printk("%s\n", __FUNCTION__);
+       dev_id   = AU1XXX_ATA_DDMA_REQ;
 
-        dbdev_tab_t source_dev_tab;
-#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
-        dbdev_tab_t target_dev_tab;
-        ide_hwif_t *hwif = auide->hwif;
-        char warning_output [2][80];
-        int i;
-#endif
+       if (auide->white_list || auide->black_list) {
+               tsize    = 8;
+               devwidth = 32;
+       }
+       else { 
+               tsize    = 1;
+               devwidth = 16;
+               
+               printk(KERN_ERR "au1xxx-ide: %s is not on ide driver whitelist.\n",auide_hwif.drive->id->model);
+               printk(KERN_ERR "            please read 'Documentation/mips/AU1xxx_IDE.README'");
+       }
 
-        /* Add our custom device to DDMA device table */
-        /* Create our new device entries in the table */
-#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
-        source_dev_tab.dev_id = AU1XXX_ATA_DDMA_REQ;
-
-        if( auide->white_list || auide->black_list ){
-                source_dev_tab.dev_tsize       = 8;
-                source_dev_tab.dev_devwidth    = 32;
-                source_dev_tab.dev_physaddr    = (u32)AU1XXX_ATA_PHYS_ADDR;
-                source_dev_tab.dev_intlevel    = 0;
-                source_dev_tab.dev_intpolarity = 0;
-
-                /* init device table for target - static bus controller - */
-                target_dev_tab.dev_id          = DSCR_CMD0_ALWAYS;
-                target_dev_tab.dev_tsize       = 8;
-                target_dev_tab.dev_devwidth    = 32;
-                target_dev_tab.dev_physaddr    = (u32)AU1XXX_ATA_PHYS_ADDR;
-                target_dev_tab.dev_intlevel    = 0;
-                target_dev_tab.dev_intpolarity = 0;
-                target_dev_tab.dev_flags       = DEV_FLAGS_ANYUSE;
-        }
-        else{
-                source_dev_tab.dev_tsize       = 1;
-                source_dev_tab.dev_devwidth    = 16;
-                source_dev_tab.dev_physaddr    = (u32)AU1XXX_ATA_PHYS_ADDR;
-                source_dev_tab.dev_intlevel    = 0;
-                source_dev_tab.dev_intpolarity = 0;
-
-                /* init device table for target - static bus controller - */
-                target_dev_tab.dev_id          = DSCR_CMD0_ALWAYS;
-                target_dev_tab.dev_tsize       = 1;
-                target_dev_tab.dev_devwidth    = 16;
-                target_dev_tab.dev_physaddr    = (u32)AU1XXX_ATA_PHYS_ADDR;
-                target_dev_tab.dev_intlevel    = 0;
-                target_dev_tab.dev_intpolarity = 0;
-                target_dev_tab.dev_flags       = DEV_FLAGS_ANYUSE;
-
-                sprintf(&warning_output[0][0],
-                        "%s is not on ide driver white list.",
-                        auide_hwif.drive->id->model);
-                for ( i=strlen(&warning_output[0][0]) ; i<76; i++ ){
-                        sprintf(&warning_output[0][i]," ");
-                }
-
-                sprintf(&warning_output[1][0],
-                "To add %s please read 'Documentation/mips/AU1xxx_IDE.README'.",
-                        auide_hwif.drive->id->model);
-                for ( i=strlen(&warning_output[1][0]) ; i<76; i++ ){
-                        sprintf(&warning_output[1][i]," ");
-                }
-
-                printk("\n****************************************");
-                printk("****************************************\n");
-                printk("* %s *\n",&warning_output[0][0]);
-                printk("* Switch to safe MWDMA Mode!            ");
-                printk("                                       *\n");
-                printk("* %s *\n",&warning_output[1][0]);
-                printk("****************************************");
-                printk("****************************************\n\n");
-        }
+#ifdef IDE_AU1XXX_BURSTMODE 
+       flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE;
 #else
-        source_dev_tab.dev_id = DSCR_CMD0_ALWAYS;
-        source_dev_tab.dev_tsize       = 8;
-        source_dev_tab.dev_devwidth    = 32;
-        source_dev_tab.dev_physaddr    = (u32)AU1XXX_ATA_PHYS_ADDR;
-        source_dev_tab.dev_intlevel    = 0;
-        source_dev_tab.dev_intpolarity = 0;
+       flags = DEV_FLAGS_SYNC;
 #endif
 
-#if CONFIG_BLK_DEV_IDE_AU1XXX_BURSTABLE_ON
-        /* set flags for tx channel */
-        source_dev_tab.dev_flags =  DEV_FLAGS_OUT
-                                  | DEV_FLAGS_SYNC
-                                  | DEV_FLAGS_BURSTABLE;
-        auide->tx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
-        /* set flags for rx channel */
-        source_dev_tab.dev_flags =  DEV_FLAGS_IN
-                                  | DEV_FLAGS_SYNC
-                                  | DEV_FLAGS_BURSTABLE;
-        auide->rx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
+       /* setup dev_tab for tx channel */
+       auide_init_dbdma_dev( &source_dev_tab,
+                             dev_id,
+                             tsize, devwidth, DEV_FLAGS_OUT | flags);
+       auide->tx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
+
+       auide_init_dbdma_dev( &source_dev_tab,
+                             dev_id,
+                             tsize, devwidth, DEV_FLAGS_IN | flags);
+       auide->rx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
+       
+       /* We also need to add a target device for the DMA */
+       auide_init_dbdma_dev( &target_dev_tab,
+                             (u32)DSCR_CMD0_ALWAYS,
+                             tsize, devwidth, DEV_FLAGS_ANYUSE);
+       auide->target_dev_id = au1xxx_ddma_add_device(&target_dev_tab); 
+       /* Get a channel for TX */
+       auide->tx_chan = au1xxx_dbdma_chan_alloc(auide->target_dev_id,
+                                                auide->tx_dev_id,
+                                                auide_ddma_tx_callback,
+                                                (void*)auide);
+       /* Get a channel for RX */
+       auide->rx_chan = au1xxx_dbdma_chan_alloc(auide->rx_dev_id,
+                                                auide->target_dev_id,
+                                                auide_ddma_rx_callback,
+                                                (void*)auide);
+
+       auide->tx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->tx_chan,
+                                                            NUM_DESCRIPTORS);
+       auide->rx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->rx_chan,
+                                                            NUM_DESCRIPTORS);
+       hwif->dmatable_cpu = dma_alloc_coherent(auide->dev,
+                                               PRD_ENTRIES * PRD_BYTES,        /* 1 Page */
+                                               &hwif->dmatable_dma, GFP_KERNEL);
+       
+       au1xxx_dbdma_start( auide->tx_chan );
+       au1xxx_dbdma_start( auide->rx_chan );
+       return 0;
+} 
 #else
-        /* set flags for tx channel */
-        source_dev_tab.dev_flags = DEV_FLAGS_OUT | DEV_FLAGS_SYNC;
-        auide->tx_dev_id         = au1xxx_ddma_add_device( &source_dev_tab );
-        /* set flags for rx channel */
-        source_dev_tab.dev_flags = DEV_FLAGS_IN | DEV_FLAGS_SYNC;
-        auide->rx_dev_id         = au1xxx_ddma_add_device( &source_dev_tab );
-#endif
+static int auide_ddma_init( _auide_hwif *auide )
+{
+       dbdev_tab_t source_dev_tab;
+       int flags;
 
-#if  defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
-
-        auide->target_dev_id           = au1xxx_ddma_add_device(&target_dev_tab);
-
-        /* Get a channel for TX */
-        auide->tx_chan = au1xxx_dbdma_chan_alloc(auide->target_dev_id,
-                                                 auide->tx_dev_id,
-                                                 auide_ddma_tx_callback,
-                                                 (void*)auide);
-        /* Get a channel for RX */
-        auide->rx_chan = au1xxx_dbdma_chan_alloc(auide->rx_dev_id,
-                                                 auide->target_dev_id,
-                                                 auide_ddma_rx_callback,
-                                                 (void*)auide);
-#else   /* CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA */
-        /*
-         * Note: if call back is not enabled, update ctp->cur_ptr manually
-         */
-        auide->tx_chan = au1xxx_dbdma_chan_alloc(DSCR_CMD0_ALWAYS,
-                                                 auide->tx_dev_id,
-                                                 NULL,
-                                                 (void*)auide);
-        auide->rx_chan = au1xxx_dbdma_chan_alloc(auide->rx_dev_id,
-                                                 DSCR_CMD0_ALWAYS,
-                                                 NULL,
-                                                 (void*)auide);
+#ifdef IDE_AU1XXX_BURSTMODE 
+       flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE;
+#else
+       flags = DEV_FLAGS_SYNC;
 #endif
-        auide->tx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->tx_chan,
-                                                             NUM_DESCRIPTORS);
-        auide->rx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->rx_chan,
-                                                             NUM_DESCRIPTORS);
 
-#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
-        hwif->dmatable_cpu = dma_alloc_coherent(auide->dev,
-                                                PRD_ENTRIES * PRD_BYTES,        /* 1 Page */
-                                                &hwif->dmatable_dma, GFP_KERNEL);
-
-        auide->sg_table = kmalloc(sizeof(struct scatterlist) * PRD_ENTRIES,
-                                GFP_KERNEL|GFP_DMA);
-        if (auide->sg_table == NULL) {
-                return -ENOMEM;
-        }
-#endif
-        au1xxx_dbdma_start( auide->tx_chan );
-        au1xxx_dbdma_start( auide->rx_chan );
-        return 0;
+       /* setup dev_tab for tx channel */
+       auide_init_dbdma_dev( &source_dev_tab,
+                             (u32)DSCR_CMD0_ALWAYS,
+                             8, 32, DEV_FLAGS_OUT | flags);
+       auide->tx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
+
+       auide_init_dbdma_dev( &source_dev_tab,
+                             (u32)DSCR_CMD0_ALWAYS,
+                             8, 32, DEV_FLAGS_IN | flags);
+       auide->rx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
+       
+       /* Get a channel for TX */
+       auide->tx_chan = au1xxx_dbdma_chan_alloc(DSCR_CMD0_ALWAYS,
+                                                auide->tx_dev_id,
+                                                NULL,
+                                                (void*)auide);
+       /* Get a channel for RX */
+       auide->rx_chan = au1xxx_dbdma_chan_alloc(auide->rx_dev_id,
+                                                DSCR_CMD0_ALWAYS,
+                                                NULL,
+                                                (void*)auide);
+       auide->tx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->tx_chan,
+                                                            NUM_DESCRIPTORS);
+       auide->rx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->rx_chan,
+                                                            NUM_DESCRIPTORS);
+       au1xxx_dbdma_start( auide->tx_chan );
+       au1xxx_dbdma_start( auide->rx_chan );
+       
+       return 0;
 }
+#endif
 
 static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif)
 {
-        int i;
-#define ide_ioreg_t unsigned long
-        ide_ioreg_t *ata_regs = hw->io_ports;
-
-       /* fixme */
-        for (i = 0; i < IDE_CONTROL_OFFSET; i++) {
-                *ata_regs++ = (ide_ioreg_t) ahwif->regbase
-                            + (ide_ioreg_t)(i << AU1XXX_ATA_REG_OFFSET);
-        }
-
-        /* set the Alternative Status register */
-        *ata_regs = (ide_ioreg_t) ahwif->regbase
-                  + (ide_ioreg_t)(14 << AU1XXX_ATA_REG_OFFSET);
+       int i;
+       unsigned long *ata_regs = hw->io_ports;
+
+       /* FIXME? */
+       for (i = 0; i < IDE_CONTROL_OFFSET; i++) {
+               *ata_regs++ = ahwif->regbase + (i << AU1XXX_ATA_REG_OFFSET);
+       }
+
+       /* set the Alternative Status register */
+       *ata_regs = ahwif->regbase + (14 << AU1XXX_ATA_REG_OFFSET);
 }
 
 static int au_ide_probe(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
-        _auide_hwif *ahwif = &auide_hwif;
-        ide_hwif_t *hwif;
+       _auide_hwif *ahwif = &auide_hwif;
+       ide_hwif_t *hwif;
        struct resource *res;
        int ret = 0;
 
 #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
-        char *mode = "MWDMA2";
+       char *mode = "MWDMA2";
 #elif defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
-        char *mode = "PIO+DDMA(offload)";
+       char *mode = "PIO+DDMA(offload)";
 #endif
 
-        memset(&auide_hwif, 0, sizeof(_auide_hwif));
-        auide_hwif.dev                  = 0;
+       memset(&auide_hwif, 0, sizeof(_auide_hwif));
+       auide_hwif.dev                  = 0;
 
        ahwif->dev = dev;
        ahwif->irq = platform_get_irq(pdev, 0);
@@ -902,11 +675,11 @@ static int au_ide_probe(struct device *dev)
                goto out;
        }
 
-        if (!request_mem_region (res->start, res->end-res->start, pdev->name)) {
+       if (!request_mem_region (res->start, res->end-res->start, pdev->name)) {
                pr_debug("%s: request_mem_region failed\n", DRV_NAME);
-                ret =  -EBUSY;
+               ret =  -EBUSY;
                goto out;
-        }
+       }
 
        ahwif->regbase = (u32)ioremap(res->start, res->end-res->start);
        if (ahwif->regbase == 0) {
@@ -914,130 +687,92 @@ static int au_ide_probe(struct device *dev)
                goto out;
        }
 
-        hwif                            = &ide_hwifs[pdev->id];
+       /* FIXME:  This might possibly break PCMCIA IDE devices */
+
+       hwif                            = &ide_hwifs[pdev->id];
        hw_regs_t *hw                   = &hwif->hw;
-        hwif->irq = hw->irq             = ahwif->irq;
-        hwif->chipset                   = ide_au1xxx;
+       hwif->irq = hw->irq             = ahwif->irq;
+       hwif->chipset                   = ide_au1xxx;
 
-        auide_setup_ports(hw, ahwif);
+       auide_setup_ports(hw, ahwif);
        memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports));
 
-#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
-        hwif->rqsize = CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ;
-        hwif->rqsize                    = ((hwif->rqsize > AU1XXX_ATA_RQSIZE)
-                                        || (hwif->rqsize < 32)) ? AU1XXX_ATA_RQSIZE : hwif->rqsize;
-#else /* if kernel config is not set */
-        hwif->rqsize                    = AU1XXX_ATA_RQSIZE;
-#endif
-
-        hwif->ultra_mask                = 0x0;  /* Disable Ultra DMA */
+       hwif->ultra_mask                = 0x0;  /* Disable Ultra DMA */
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-        hwif->mwdma_mask                = 0x07; /* Multimode-2 DMA  */
-        hwif->swdma_mask                = 0x07;
+       hwif->mwdma_mask                = 0x07; /* Multimode-2 DMA  */
+       hwif->swdma_mask                = 0x00;
 #else
-        hwif->mwdma_mask                = 0x0;
-        hwif->swdma_mask                = 0x0;
+       hwif->mwdma_mask                = 0x0;
+       hwif->swdma_mask                = 0x0;
+#endif
+
+       hwif->noprobe = 0;
+       hwif->drives[0].unmask          = 1;
+       hwif->drives[1].unmask          = 1;
+
+       /* hold should be on in all cases */
+       hwif->hold                      = 1;
+       hwif->mmio                      = 2;
+
+       /* If the user has selected DDMA assisted copies,
+          then set up a few local I/O function entry points 
+       */
+
+#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA     
+       hwif->INSW                      = auide_insw;
+       hwif->OUTSW                     = auide_outsw;
 #endif
-        //hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
-        hwif->noprobe = 0;
-        hwif->drives[0].unmask          = 1;
-        hwif->drives[1].unmask          = 1;
-
-        /* hold should be on in all cases */
-        hwif->hold                      = 1;
-        hwif->mmio                      = 2;
-
-        /* set up local I/O function entry points */
-        hwif->INB                       = auide_inb;
-        hwif->INW                       = auide_inw;
-        hwif->INL                       = auide_inl;
-        hwif->INSW                      = auide_insw;
-        hwif->INSL                      = auide_insl;
-        hwif->OUTB                      = auide_outb;
-        hwif->OUTBSYNC                  = auide_outbsync;
-        hwif->OUTW                      = auide_outw;
-        hwif->OUTL                      = auide_outl;
-        hwif->OUTSW                     = auide_outsw;
-        hwif->OUTSL                     = auide_outsl;
-
-        hwif->tuneproc                  = &auide_tune_drive;
-        hwif->speedproc                 = &auide_tune_chipset;
+
+       hwif->tuneproc                  = &auide_tune_drive;
+       hwif->speedproc                 = &auide_tune_chipset;
 
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-        hwif->ide_dma_off_quietly       = &auide_dma_off_quietly;
-        hwif->ide_dma_timeout           = &auide_dma_timeout;
-
-        hwif->ide_dma_check             = &auide_dma_check;
-        hwif->dma_exec_cmd              = &auide_dma_exec_cmd;
-        hwif->dma_start                 = &auide_dma_start;
-        hwif->ide_dma_end               = &auide_dma_end;
-        hwif->dma_setup                 = &auide_dma_setup;
-        hwif->ide_dma_test_irq          = &auide_dma_test_irq;
-        hwif->ide_dma_host_off          = &auide_dma_host_off;
-        hwif->ide_dma_host_on           = &auide_dma_host_on;
-        hwif->ide_dma_lostirq           = &auide_dma_lostirq;
-        hwif->ide_dma_on                = &auide_dma_on;
-
-        hwif->autodma                   = 1;
-        hwif->drives[0].autodma         = hwif->autodma;
-        hwif->drives[1].autodma         = hwif->autodma;
-        hwif->atapi_dma                 = 1;
-        hwif->drives[0].using_dma       = 1;
-        hwif->drives[1].using_dma       = 1;
+       hwif->ide_dma_off_quietly       = &auide_dma_off_quietly;
+       hwif->ide_dma_timeout           = &auide_dma_timeout;
+
+       hwif->ide_dma_check             = &auide_dma_check;
+       hwif->dma_exec_cmd              = &auide_dma_exec_cmd;
+       hwif->dma_start                 = &auide_dma_start;
+       hwif->ide_dma_end               = &auide_dma_end;
+       hwif->dma_setup                 = &auide_dma_setup;
+       hwif->ide_dma_test_irq          = &auide_dma_test_irq;
+       hwif->ide_dma_host_off          = &auide_dma_host_off;
+       hwif->ide_dma_host_on           = &auide_dma_host_on;
+       hwif->ide_dma_lostirq           = &auide_dma_lostirq;
+       hwif->ide_dma_on                = &auide_dma_on;
+
+       hwif->autodma                   = 1;
+       hwif->drives[0].autodma         = hwif->autodma;
+       hwif->drives[1].autodma         = hwif->autodma;
+       hwif->atapi_dma                 = 1;
+
 #else /* !CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
-        hwif->autodma                   = 0;
-        hwif->channel                   = 0;
-        hwif->hold                      = 1;
-        hwif->select_data               = 0;    /* no chipset-specific code */
-        hwif->config_data               = 0;    /* no chipset-specific code */
-
-        hwif->drives[0].autodma         = 0;
-        hwif->drives[0].drive_data      = 0;    /* no drive data */
-        hwif->drives[0].using_dma       = 0;
-        hwif->drives[0].waiting_for_dma = 0;
-        hwif->drives[0].autotune        = 1;    /* 1=autotune, 2=noautotune, 0=default */
-        /* secondary hdd not supported */
-        hwif->drives[1].autodma         = 0;
-
-        hwif->drives[1].drive_data      = 0;
-        hwif->drives[1].using_dma       = 0;
-        hwif->drives[1].waiting_for_dma = 0;
-        hwif->drives[1].autotune        = 2;   /* 1=autotune, 2=noautotune, 0=default */
-#endif
-        hwif->drives[0].io_32bit        = 0;   /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
-        hwif->drives[1].io_32bit        = 0;   /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
-
-        /*Register Driver with PM Framework*/
-#ifdef CONFIG_PM
-        auide_hwif.pm.lock    = SPIN_LOCK_UNLOCKED;
-        auide_hwif.pm.stopped = 0;
-
-        auide_hwif.pm.dev = new_au1xxx_power_device( "ide",
-                                                &au1200ide_pm_callback,
-                                                NULL);
-        if ( auide_hwif.pm.dev == NULL )
-                printk(KERN_INFO "Unable to create a power management \
-                                device entry for the au1200-IDE.\n");
-        else
-                printk(KERN_INFO "Power management device entry for the \
-                                au1200-IDE loaded.\n");
+       hwif->autodma                   = 0;
+       hwif->channel                   = 0;
+       hwif->hold                      = 1;
+       hwif->select_data               = 0;    /* no chipset-specific code */
+       hwif->config_data               = 0;    /* no chipset-specific code */
+
+       hwif->drives[0].autodma         = 0;
+       hwif->drives[0].autotune        = 1;    /* 1=autotune, 2=noautotune, 0=default */
 #endif
+       hwif->drives[0].no_io_32bit     = 1;   
 
-        auide_hwif.hwif                 = hwif;
-        hwif->hwif_data                 = &auide_hwif;
+       auide_hwif.hwif                 = hwif;
+       hwif->hwif_data                 = &auide_hwif;
 
-#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
-        auide_ddma_init(&auide_hwif);
-        dbdma_init_done = 1;
+#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA           
+       auide_ddma_init(&auide_hwif);
+       dbdma_init_done = 1;
 #endif
 
        probe_hwif_init(hwif);
        dev_set_drvdata(dev, hwif);
 
-        printk(KERN_INFO "Au1xxx IDE(builtin) configured for %s\n", mode );
+       printk(KERN_INFO "Au1xxx IDE(builtin) configured for %s\n", mode );
 
-out:
-        return ret;
+ out:
+       return ret;
 }
 
 static int au_ide_remove(struct device *dev)
@@ -1045,7 +780,7 @@ static int au_ide_remove(struct device *dev)
        struct platform_device *pdev = to_platform_device(dev);
        struct resource *res;
        ide_hwif_t *hwif = dev_get_drvdata(dev);
-        _auide_hwif *ahwif = &auide_hwif;
+       _auide_hwif *ahwif = &auide_hwif;
 
        ide_unregister(hwif - ide_hwifs);
 
@@ -1069,180 +804,11 @@ static int __init au_ide_init(void)
        return driver_register(&au1200_ide_driver);
 }
 
-static void __init au_ide_exit(void)
+static void __exit au_ide_exit(void)
 {
        driver_unregister(&au1200_ide_driver);
 }
 
-#ifdef CONFIG_PM
-int au1200ide_pm_callback( au1xxx_power_dev_t *dev,\
-                        au1xxx_request_t request, void *data) {
-
-        unsigned int d, err = 0;
-        unsigned long flags;
-
-        spin_lock_irqsave(auide_hwif.pm.lock, flags);
-
-        switch (request){
-                case AU1XXX_PM_SLEEP:
-                        err = au1xxxide_pm_sleep(dev);
-                        break;
-                case AU1XXX_PM_WAKEUP:
-                        d = *((unsigned int*)data);
-                        if ( d > 0 && d <= 99) {
-                                err = au1xxxide_pm_standby(dev);
-                        }
-                        else {
-                                err = au1xxxide_pm_resume(dev);
-                        }
-                        break;
-                case AU1XXX_PM_GETSTATUS:
-                        err = au1xxxide_pm_getstatus(dev);
-                        break;
-                case AU1XXX_PM_ACCESS:
-                        err = au1xxxide_pm_access(dev);
-                        break;
-                case AU1XXX_PM_IDLE:
-                        err = au1xxxide_pm_idle(dev);
-                        break;
-                case AU1XXX_PM_CLEANUP:
-                        err = au1xxxide_pm_cleanup(dev);
-                        break;
-                default:
-                        err = -1;
-                        break;
-        }
-
-        spin_unlock_irqrestore(auide_hwif.pm.lock, flags);
-
-        return err;
-}
-
-static int au1xxxide_pm_standby( au1xxx_power_dev_t *dev ) {
-        return 0;
-}
-
-static int au1xxxide_pm_sleep( au1xxx_power_dev_t *dev ) {
-
-        int retval;
-        ide_hwif_t *hwif = auide_hwif.hwif;
-        struct request rq;
-        struct request_pm_state rqpm;
-        ide_task_t args;
-
-        if(auide_hwif.pm.stopped)
-                return -1;
-
-        /*
-         * wait until hard disc is ready
-         */
-        if ( wait_for_ready(&hwif->drives[0], 35000) ) {
-                printk("Wait for drive sleep timeout!\n");
-                retval = -1;
-        }
-
-        /*
-         * sequenz to tell the high level ide driver that pm is resuming
-         */
-        memset(&rq, 0, sizeof(rq));
-        memset(&rqpm, 0, sizeof(rqpm));
-        memset(&args, 0, sizeof(args));
-        rq.flags = REQ_PM_SUSPEND;
-        rq.special = &args;
-        rq.pm = &rqpm;
-        rqpm.pm_step = ide_pm_state_start_suspend;
-        rqpm.pm_state = PMSG_SUSPEND;
-
-        retval = ide_do_drive_cmd(&hwif->drives[0], &rq, ide_wait);
-
-        if (wait_for_ready (&hwif->drives[0], 35000)) {
-                printk("Wait for drive sleep timeout!\n");
-                retval = -1;
-        }
-
-        /*
-         * stop dbdma channels
-         */
-        au1xxx_dbdma_reset(auide_hwif.tx_chan);
-        au1xxx_dbdma_reset(auide_hwif.rx_chan);
-
-        auide_hwif.pm.stopped = 1;
-
-        return retval;
-}
-
-static int au1xxxide_pm_resume( au1xxx_power_dev_t *dev ) {
-
-        int retval;
-        ide_hwif_t *hwif = auide_hwif.hwif;
-        struct request rq;
-        struct request_pm_state rqpm;
-        ide_task_t args;
-
-        if(!auide_hwif.pm.stopped)
-                return -1;
-
-        /*
-         * start dbdma channels
-         */
-        au1xxx_dbdma_start(auide_hwif.tx_chan);
-        au1xxx_dbdma_start(auide_hwif.rx_chan);
-
-        /*
-         * wait until hard disc is ready
-         */
-        if (wait_for_ready ( &hwif->drives[0], 35000)) {
-                printk("Wait for drive wake up timeout!\n");
-                retval = -1;
-        }
-
-        /*
-         * sequenz to tell the high level ide driver that pm is resuming
-         */
-        memset(&rq, 0, sizeof(rq));
-        memset(&rqpm, 0, sizeof(rqpm));
-        memset(&args, 0, sizeof(args));
-        rq.flags = REQ_PM_RESUME;
-        rq.special = &args;
-        rq.pm = &rqpm;
-        rqpm.pm_step = ide_pm_state_start_resume;
-        rqpm.pm_state = PMSG_ON;
-
-        retval = ide_do_drive_cmd(&hwif->drives[0], &rq, ide_head_wait);
-
-        /*
-        * wait for hard disc
-        */
-        if ( wait_for_ready(&hwif->drives[0], 35000) ) {
-                printk("Wait for drive wake up timeout!\n");
-                retval = -1;
-        }
-
-        auide_hwif.pm.stopped = 0;
-
-        return retval;
-}
-
-static int au1xxxide_pm_getstatus( au1xxx_power_dev_t *dev ) {
-        return dev->cur_state;
-}
-
-static int au1xxxide_pm_access( au1xxx_power_dev_t *dev ) {
-        if (dev->cur_state != AWAKE_STATE)
-                return 0;
-        else
-                return -1;
-}
-
-static int au1xxxide_pm_idle( au1xxx_power_dev_t *dev ) {
-        return 0;
-}
-
-static int au1xxxide_pm_cleanup( au1xxx_power_dev_t *dev ) {
-        return 0;
-}
-#endif /* CONFIG_PM */
-
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("AU1200 IDE driver");
 
index af526b671c4e1f7ee0d9b274b5f2d90603fe7637..4ee597d087978c3e64c397849fccab1abeeb36cf 100644 (file)
@@ -622,12 +622,18 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
        ide_hwif_t *hwif;
        int h;
 
+       /*
+        * Find an empty HWIF; if none available, return -ENOMEM.
+        */
        for (h = 0; h < MAX_HWIFS; ++h) {
                hwif = &ide_hwifs[h];
-               /* Find an empty HWIF */
                if (hwif->chipset == ide_unknown)
                        break;
        }
+       if (h == MAX_HWIFS) {
+               printk(KERN_ERR "%s: too many IDE interfaces, no room in table\n", d->name);
+               return -ENOMEM;
+       }
 
        /*  Get the CmdBlk and CtrlBlk Base Registers */
        base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET;
index 16b3e2d8bfb107635f5489c8b3b75c807b1a291a..75a2253a3e6872813a94179db4767c3751502f4e 100644 (file)
@@ -87,6 +87,7 @@ static const struct {
        u8 chipset_family;
        u8 flags;
 } SiSHostChipInfo[] = {
+       { "SiS965",     PCI_DEVICE_ID_SI_965,   ATA_133  },
        { "SiS745",     PCI_DEVICE_ID_SI_745,   ATA_100  },
        { "SiS735",     PCI_DEVICE_ID_SI_735,   ATA_100  },
        { "SiS733",     PCI_DEVICE_ID_SI_733,   ATA_100  },
index cee2c374cd2f752d430d149a28b2cbc229caa1e5..86fb1e0286d38b704cd8f8ebf327c4aeb3673e11 100644 (file)
@@ -79,6 +79,8 @@ static struct via_isa_bridge {
        u8 rev_max;
        u16 flags;
 } via_isa_bridges[] = {
+       { "vt6410",     PCI_DEVICE_ID_VIA_6410,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "vt8251",     PCI_DEVICE_ID_VIA_8251,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
        { "vt8237",     PCI_DEVICE_ID_VIA_8237,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
        { "vt8235",     PCI_DEVICE_ID_VIA_8235,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
        { "vt8233a",    PCI_DEVICE_ID_VIA_8233A,    0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
@@ -467,24 +469,35 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
        hwif->drives[1].autodma = hwif->autodma;
 }
 
-static ide_pci_device_t via82cxxx_chipset __devinitdata = {
-       .name           = "VP_IDE",
-       .init_chipset   = init_chipset_via82cxxx,
-       .init_hwif      = init_hwif_via82cxxx,
-       .channels       = 2,
-       .autodma        = NOAUTODMA,
-       .enablebits     = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
-       .bootable       = ON_BOARD,
+static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = {
+       {       /* 0 */
+               .name           = "VP_IDE",
+               .init_chipset   = init_chipset_via82cxxx,
+               .init_hwif      = init_hwif_via82cxxx,
+               .channels       = 2,
+               .autodma        = NOAUTODMA,
+               .enablebits     = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
+               .bootable       = ON_BOARD
+       },{     /* 1 */
+               .name           = "VP_IDE",
+               .init_chipset   = init_chipset_via82cxxx,
+               .init_hwif      = init_hwif_via82cxxx,
+               .channels       = 2,
+               .autodma        = AUTODMA,
+               .enablebits     = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
+               .bootable       = ON_BOARD,
+       }
 };
 
 static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &via82cxxx_chipset);
+       return ide_setup_pci_device(dev, &via82cxxx_chipsets[id->driver_data]);
 }
 
 static struct pci_device_id via_pci_tbl[] = {
        { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_6410,     PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, via_pci_tbl);
index 38f42112dff0f8b48782e038b10db69bb1241a84..ae9b02cc013fe252d4c109c2b85dec1c1677cf0d 100644 (file)
@@ -41,6 +41,7 @@ struct hpsb_host {
         /* this nodes state */
         unsigned in_bus_reset:1;
         unsigned is_shutdown:1;
+       unsigned resume_packet_sent:1;
 
         /* this nodes' duties on the bus */
         unsigned is_root:1;
index 7fff5a1d2ea4c7abc8713df31f2222a5cfb6c4b2..0ea37b1bccb27c13d1ae81392fad02c48dbd8923 100644 (file)
@@ -1349,6 +1349,33 @@ static void nodemgr_update_pdrv(struct node_entry *ne)
 }
 
 
+/* Write the BROADCAST_CHANNEL as per IEEE1394a 8.3.2.3.11 and 8.4.2.3.  This
+ * seems like an optional service but in the end it is practically mandatory
+ * as a consequence of these clauses.
+ *
+ * Note that we cannot do a broadcast write to all nodes at once because some
+ * pre-1394a devices would hang. */
+static void nodemgr_irm_write_bc(struct node_entry *ne, int generation)
+{
+       const u64 bc_addr = (CSR_REGISTER_BASE | CSR_BROADCAST_CHANNEL);
+       quadlet_t bc_remote, bc_local;
+       int ret;
+
+       if (!ne->host->is_irm || ne->generation != generation ||
+           ne->nodeid == ne->host->node_id)
+               return;
+
+       bc_local = cpu_to_be32(ne->host->csr.broadcast_channel);
+
+       /* Check if the register is implemented and 1394a compliant. */
+       ret = hpsb_read(ne->host, ne->nodeid, generation, bc_addr, &bc_remote,
+                       sizeof(bc_remote));
+       if (!ret && bc_remote & cpu_to_be32(0x80000000) &&
+           bc_remote != bc_local)
+               hpsb_node_write(ne, bc_addr, &bc_local, sizeof(bc_local));
+}
+
+
 static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int generation)
 {
        struct device *dev;
@@ -1360,6 +1387,8 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge
        if (!dev)
                return;
 
+       nodemgr_irm_write_bc(ne, generation);
+
        /* If "needs_probe", then this is either a new or changed node we
         * rescan totally. If the generation matches for an existing node
         * (one that existed prior to the bus reset) we send update calls
@@ -1413,9 +1442,25 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
        return;
 }
 
-/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other
- * nodes of the broadcast channel.  (Really we're only setting the validity
- * bit). Other IRM responsibilities go in here as well. */
+static int nodemgr_send_resume_packet(struct hpsb_host *host)
+{
+       struct hpsb_packet *packet;
+       int ret = 1;
+
+       packet = hpsb_make_phypacket(host,
+                       0x003c0000 | NODEID_TO_NODE(host->node_id) << 24);
+       if (packet) {
+               packet->no_waiter = 1;
+               packet->generation = get_hpsb_generation(host);
+               ret = hpsb_send_packet(packet);
+       }
+       if (ret)
+               HPSB_WARN("fw-host%d: Failed to broadcast resume packet",
+                         host->id);
+       return ret;
+}
+
+/* Perform a few high-level IRM responsibilities. */
 static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
 {
        quadlet_t bc;
@@ -1424,13 +1469,8 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
        if (!host->is_irm || host->irm_id == (nodeid_t)-1)
                return 1;
 
-       host->csr.broadcast_channel |= 0x40000000;  /* set validity bit */
-
-       bc = cpu_to_be32(host->csr.broadcast_channel);
-
-       hpsb_write(host, LOCAL_BUS | ALL_NODES, get_hpsb_generation(host),
-                  (CSR_REGISTER_BASE | CSR_BROADCAST_CHANNEL),
-                  &bc, sizeof(quadlet_t));
+       /* We are a 1394a-2000 compliant IRM. Set the validity bit. */
+       host->csr.broadcast_channel |= 0x40000000;
 
        /* If there is no bus manager then we should set the root node's
         * force_root bit to promote bus stability per the 1394
@@ -1463,6 +1503,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
                }
        }
 
+       /* Some devices suspend their ports while being connected to an inactive
+        * host adapter, i.e. if connected before the low-level driver is
+        * loaded.  They become visible either when physically unplugged and
+        * replugged, or when receiving a resume packet.  Send one once. */
+       if (!host->resume_packet_sent && !nodemgr_send_resume_packet(host))
+               host->resume_packet_sent = 1;
+
        return 1;
 }
 
index 12cec7c4a34295acc8e25607c7b383aedd973521..f7e18ccc5c0a28fbbbcbb541e765a8c581537dfa 100644 (file)
@@ -2350,6 +2350,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int dest
        struct scsi_cmnd *SCpnt = NULL;
        u32 scsi_status = SBP2_SCSI_STATUS_GOOD;
        struct sbp2_command_info *command;
+       unsigned long flags;
 
        SBP2_DEBUG("sbp2_handle_status_write");
 
@@ -2451,9 +2452,11 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int dest
                 * null out last orb so that next time around we write directly to the orb pointer...
                 * Quick start saves one 1394 bus transaction.
                 */
+               spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
                if (list_empty(&scsi_id->sbp2_command_orb_inuse)) {
                        scsi_id->last_orb = NULL;
                }
+               spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
 
        } else {
 
@@ -2563,9 +2566,11 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id
        struct sbp2scsi_host_info *hi = scsi_id->hi;
        struct list_head *lh;
        struct sbp2_command_info *command;
+       unsigned long flags;
 
        SBP2_DEBUG("sbp2scsi_complete_all_commands");
 
+       spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
        while (!list_empty(&scsi_id->sbp2_command_orb_inuse)) {
                SBP2_DEBUG("Found pending command to complete");
                lh = scsi_id->sbp2_command_orb_inuse.next;
@@ -2582,6 +2587,7 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id
                        command->Current_done(command->Current_SCpnt);
                }
        }
+       spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
 
        return;
 }
index 41d6b4017acb9d24aebdd5aed278b079bf382d85..d393b504bf26b23ffafc069e92a07bf485ffd3f4 100644 (file)
@@ -355,9 +355,9 @@ error4:
        spin_unlock_irqrestore(&port_priv->reg_lock, flags);
        kfree(reg_req);
 error3:
-       kfree(mad_agent_priv);
-error2:
        ib_dereg_mr(mad_agent_priv->agent.mr);
+error2:
+       kfree(mad_agent_priv);
 error1:
        return ret;
 }
index e73f81c223811954e5656f0ed97749b161758cdd..eb7f52537ccc9c41faa51d787ecd9b0a73cec894 100644 (file)
@@ -310,7 +310,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf,
        u8 method;
        __be64 *tid;
        int ret, length, hdr_len, copy_offset;
-       int rmpp_active = 0;
+       int rmpp_active, has_rmpp_header;
 
        if (count < sizeof (struct ib_user_mad) + IB_MGMT_RMPP_HDR)
                return -EINVAL;
@@ -360,28 +360,31 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf,
        }
 
        rmpp_mad = (struct ib_rmpp_mad *) packet->mad.data;
-       if (ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) & IB_MGMT_RMPP_FLAG_ACTIVE) {
-               /* RMPP active */
-               if (!agent->rmpp_version) {
-                       ret = -EINVAL;
-                       goto err_ah;
-               }
-
-               /* Validate that the management class can support RMPP */
-               if (rmpp_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_ADM) {
-                       hdr_len = IB_MGMT_SA_HDR;
-               } else if ((rmpp_mad->mad_hdr.mgmt_class >= IB_MGMT_CLASS_VENDOR_RANGE2_START) &&
-                           (rmpp_mad->mad_hdr.mgmt_class <= IB_MGMT_CLASS_VENDOR_RANGE2_END)) {
-                               hdr_len = IB_MGMT_VENDOR_HDR;
-               } else {
-                       ret = -EINVAL;
-                       goto err_ah;
-               }
-               rmpp_active = 1;
+       if (rmpp_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_ADM) {
+               hdr_len = IB_MGMT_SA_HDR;
                copy_offset = IB_MGMT_RMPP_HDR;
+               has_rmpp_header = 1;
+       } else if (rmpp_mad->mad_hdr.mgmt_class >= IB_MGMT_CLASS_VENDOR_RANGE2_START &&
+                  rmpp_mad->mad_hdr.mgmt_class <= IB_MGMT_CLASS_VENDOR_RANGE2_END) {
+                       hdr_len = IB_MGMT_VENDOR_HDR;
+                       copy_offset = IB_MGMT_RMPP_HDR;
+                       has_rmpp_header = 1;
        } else {
                hdr_len = IB_MGMT_MAD_HDR;
                copy_offset = IB_MGMT_MAD_HDR;
+               has_rmpp_header = 0;
+       }
+
+       if (has_rmpp_header)
+               rmpp_active = ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) &
+                             IB_MGMT_RMPP_FLAG_ACTIVE;
+       else
+               rmpp_active = 0;
+
+       /* Validate that the management class can support RMPP */
+       if (rmpp_active && !agent->rmpp_version) {
+               ret = -EINVAL;
+               goto err_ah;
        }
 
        packet->msg = ib_create_send_mad(agent,
index ecb830127865d5ef96f534c62351be697d90fbb5..7114e3fbab00d2d1bfccd76c7964ad6d4a81c130 100644 (file)
@@ -105,12 +105,23 @@ struct ib_uverbs_event {
        u32                                    *counter;
 };
 
+struct ib_uverbs_mcast_entry {
+       struct list_head        list;
+       union ib_gid            gid;
+       u16                     lid;
+};
+
 struct ib_uevent_object {
        struct ib_uobject       uobject;
        struct list_head        event_list;
        u32                     events_reported;
 };
 
+struct ib_uqp_object {
+       struct ib_uevent_object uevent;
+       struct list_head        mcast_list;
+};
+
 struct ib_ucq_object {
        struct ib_uobject       uobject;
        struct ib_uverbs_file  *uverbs_file;
index ed45da892b1cc84fcb2e61805cad9183f4043709..a57d021d435ae2d4f0a694c134d643d2836582c7 100644 (file)
@@ -815,7 +815,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
        struct ib_uverbs_create_qp      cmd;
        struct ib_uverbs_create_qp_resp resp;
        struct ib_udata                 udata;
-       struct ib_uevent_object        *uobj;
+       struct ib_uqp_object           *uobj;
        struct ib_pd                   *pd;
        struct ib_cq                   *scq, *rcq;
        struct ib_srq                  *srq;
@@ -866,10 +866,11 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
        attr.cap.max_recv_sge    = cmd.max_recv_sge;
        attr.cap.max_inline_data = cmd.max_inline_data;
 
-       uobj->uobject.user_handle = cmd.user_handle;
-       uobj->uobject.context     = file->ucontext;
-       uobj->events_reported     = 0;
-       INIT_LIST_HEAD(&uobj->event_list);
+       uobj->uevent.uobject.user_handle = cmd.user_handle;
+       uobj->uevent.uobject.context     = file->ucontext;
+       uobj->uevent.events_reported     = 0;
+       INIT_LIST_HEAD(&uobj->uevent.event_list);
+       INIT_LIST_HEAD(&uobj->mcast_list);
 
        qp = pd->device->create_qp(pd, &attr, &udata);
        if (IS_ERR(qp)) {
@@ -882,7 +883,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
        qp->send_cq       = attr.send_cq;
        qp->recv_cq       = attr.recv_cq;
        qp->srq           = attr.srq;
-       qp->uobject       = &uobj->uobject;
+       qp->uobject       = &uobj->uevent.uobject;
        qp->event_handler = attr.event_handler;
        qp->qp_context    = attr.qp_context;
        qp->qp_type       = attr.qp_type;
@@ -901,14 +902,14 @@ retry:
                goto err_destroy;
        }
 
-       ret = idr_get_new(&ib_uverbs_qp_idr, qp, &uobj->uobject.id);
+       ret = idr_get_new(&ib_uverbs_qp_idr, qp, &uobj->uevent.uobject.id);
 
        if (ret == -EAGAIN)
                goto retry;
        if (ret)
                goto err_destroy;
 
-       resp.qp_handle       = uobj->uobject.id;
+       resp.qp_handle       = uobj->uevent.uobject.id;
        resp.max_recv_sge    = attr.cap.max_recv_sge;
        resp.max_send_sge    = attr.cap.max_send_sge;
        resp.max_recv_wr     = attr.cap.max_recv_wr;
@@ -922,7 +923,7 @@ retry:
        }
 
        down(&file->mutex);
-       list_add_tail(&uobj->uobject.list, &file->ucontext->qp_list);
+       list_add_tail(&uobj->uevent.uobject.list, &file->ucontext->qp_list);
        up(&file->mutex);
 
        up(&ib_uverbs_idr_mutex);
@@ -930,7 +931,7 @@ retry:
        return in_len;
 
 err_idr:
-       idr_remove(&ib_uverbs_qp_idr, uobj->uobject.id);
+       idr_remove(&ib_uverbs_qp_idr, uobj->uevent.uobject.id);
 
 err_destroy:
        ib_destroy_qp(qp);
@@ -1032,7 +1033,7 @@ ssize_t ib_uverbs_destroy_qp(struct ib_uverbs_file *file,
        struct ib_uverbs_destroy_qp      cmd;
        struct ib_uverbs_destroy_qp_resp resp;
        struct ib_qp                    *qp;
-       struct ib_uevent_object         *uobj;
+       struct ib_uqp_object            *uobj;
        int                              ret = -EINVAL;
 
        if (copy_from_user(&cmd, buf, sizeof cmd))
@@ -1046,7 +1047,12 @@ ssize_t ib_uverbs_destroy_qp(struct ib_uverbs_file *file,
        if (!qp || qp->uobject->context != file->ucontext)
                goto out;
 
-       uobj = container_of(qp->uobject, struct ib_uevent_object, uobject);
+       uobj = container_of(qp->uobject, struct ib_uqp_object, uevent.uobject);
+
+       if (!list_empty(&uobj->mcast_list)) {
+               ret = -EBUSY;
+               goto out;
+       }
 
        ret = ib_destroy_qp(qp);
        if (ret)
@@ -1055,12 +1061,12 @@ ssize_t ib_uverbs_destroy_qp(struct ib_uverbs_file *file,
        idr_remove(&ib_uverbs_qp_idr, cmd.qp_handle);
 
        down(&file->mutex);
-       list_del(&uobj->uobject.list);
+       list_del(&uobj->uevent.uobject.list);
        up(&file->mutex);
 
-       ib_uverbs_release_uevent(file, uobj);
+       ib_uverbs_release_uevent(file, &uobj->uevent);
 
-       resp.events_reported = uobj->events_reported;
+       resp.events_reported = uobj->uevent.events_reported;
 
        kfree(uobj);
 
@@ -1542,6 +1548,8 @@ ssize_t ib_uverbs_attach_mcast(struct ib_uverbs_file *file,
 {
        struct ib_uverbs_attach_mcast cmd;
        struct ib_qp                 *qp;
+       struct ib_uqp_object         *uobj;
+       struct ib_uverbs_mcast_entry *mcast;
        int                           ret = -EINVAL;
 
        if (copy_from_user(&cmd, buf, sizeof cmd))
@@ -1550,9 +1558,36 @@ ssize_t ib_uverbs_attach_mcast(struct ib_uverbs_file *file,
        down(&ib_uverbs_idr_mutex);
 
        qp = idr_find(&ib_uverbs_qp_idr, cmd.qp_handle);
-       if (qp && qp->uobject->context == file->ucontext)
-               ret = ib_attach_mcast(qp, (union ib_gid *) cmd.gid, cmd.mlid);
+       if (!qp || qp->uobject->context != file->ucontext)
+               goto out;
+
+       uobj = container_of(qp->uobject, struct ib_uqp_object, uevent.uobject);
+
+       list_for_each_entry(mcast, &uobj->mcast_list, list)
+               if (cmd.mlid == mcast->lid &&
+                   !memcmp(cmd.gid, mcast->gid.raw, sizeof mcast->gid.raw)) {
+                       ret = 0;
+                       goto out;
+               }
 
+       mcast = kmalloc(sizeof *mcast, GFP_KERNEL);
+       if (!mcast) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       mcast->lid = cmd.mlid;
+       memcpy(mcast->gid.raw, cmd.gid, sizeof mcast->gid.raw);
+
+       ret = ib_attach_mcast(qp, &mcast->gid, cmd.mlid);
+       if (!ret) {
+               uobj = container_of(qp->uobject, struct ib_uqp_object,
+                                   uevent.uobject);
+               list_add_tail(&mcast->list, &uobj->mcast_list);
+       } else
+               kfree(mcast);
+
+out:
        up(&ib_uverbs_idr_mutex);
 
        return ret ? ret : in_len;
@@ -1563,7 +1598,9 @@ ssize_t ib_uverbs_detach_mcast(struct ib_uverbs_file *file,
                               int out_len)
 {
        struct ib_uverbs_detach_mcast cmd;
+       struct ib_uqp_object         *uobj;
        struct ib_qp                 *qp;
+       struct ib_uverbs_mcast_entry *mcast;
        int                           ret = -EINVAL;
 
        if (copy_from_user(&cmd, buf, sizeof cmd))
@@ -1572,9 +1609,24 @@ ssize_t ib_uverbs_detach_mcast(struct ib_uverbs_file *file,
        down(&ib_uverbs_idr_mutex);
 
        qp = idr_find(&ib_uverbs_qp_idr, cmd.qp_handle);
-       if (qp && qp->uobject->context == file->ucontext)
-               ret = ib_detach_mcast(qp, (union ib_gid *) cmd.gid, cmd.mlid);
+       if (!qp || qp->uobject->context != file->ucontext)
+               goto out;
+
+       ret = ib_detach_mcast(qp, (union ib_gid *) cmd.gid, cmd.mlid);
+       if (ret)
+               goto out;
 
+       uobj = container_of(qp->uobject, struct ib_uqp_object, uevent.uobject);
+
+       list_for_each_entry(mcast, &uobj->mcast_list, list)
+               if (cmd.mlid == mcast->lid &&
+                   !memcmp(cmd.gid, mcast->gid.raw, sizeof mcast->gid.raw)) {
+                       list_del(&mcast->list);
+                       kfree(mcast);
+                       break;
+               }
+
+out:
        up(&ib_uverbs_idr_mutex);
 
        return ret ? ret : in_len;
index de6581d7cb8db5c979938c80f9b0fef336f56dd3..81737bd6faea1405ef9f3fe41f4f2f136e6b043c 100644 (file)
@@ -160,6 +160,18 @@ void ib_uverbs_release_uevent(struct ib_uverbs_file *file,
        spin_unlock_irq(&file->async_file->lock);
 }
 
+static void ib_uverbs_detach_umcast(struct ib_qp *qp,
+                                   struct ib_uqp_object *uobj)
+{
+       struct ib_uverbs_mcast_entry *mcast, *tmp;
+
+       list_for_each_entry_safe(mcast, tmp, &uobj->mcast_list, list) {
+               ib_detach_mcast(qp, &mcast->gid, mcast->lid);
+               list_del(&mcast->list);
+               kfree(mcast);
+       }
+}
+
 static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
                                      struct ib_ucontext *context)
 {
@@ -180,13 +192,14 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
 
        list_for_each_entry_safe(uobj, tmp, &context->qp_list, list) {
                struct ib_qp *qp = idr_find(&ib_uverbs_qp_idr, uobj->id);
-               struct ib_uevent_object *uevent =
-                       container_of(uobj, struct ib_uevent_object, uobject);
+               struct ib_uqp_object *uqp =
+                       container_of(uobj, struct ib_uqp_object, uevent.uobject);
                idr_remove(&ib_uverbs_qp_idr, uobj->id);
+               ib_uverbs_detach_umcast(qp, uqp);
                ib_destroy_qp(qp);
                list_del(&uobj->list);
-               ib_uverbs_release_uevent(file, uevent);
-               kfree(uevent);
+               ib_uverbs_release_uevent(file, &uqp->uevent);
+               kfree(uqp);
        }
 
        list_for_each_entry_safe(uobj, tmp, &context->cq_list, list) {
index dd4e13303e96e8f470e50c37e6d2a35377f1a373..7450550db736260bdd06228e66348b26a6eb8b19 100644 (file)
@@ -871,7 +871,10 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask)
                                       qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
 
                mthca_wq_init(&qp->sq);
+               qp->sq.last = get_send_wqe(qp, qp->sq.max - 1);
+
                mthca_wq_init(&qp->rq);
+               qp->rq.last = get_recv_wqe(qp, qp->rq.max - 1);
 
                if (mthca_is_memfree(dev)) {
                        *qp->sq.db = 0;
@@ -1819,6 +1822,7 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 {
        struct mthca_dev *dev = to_mdev(ibqp->device);
        struct mthca_qp *qp = to_mqp(ibqp);
+       __be32 doorbell[2];
        void *wqe;
        void *prev_wqe;
        unsigned long flags;
@@ -1838,6 +1842,34 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
        ind = qp->sq.head & (qp->sq.max - 1);
 
        for (nreq = 0; wr; ++nreq, wr = wr->next) {
+               if (unlikely(nreq == MTHCA_ARBEL_MAX_WQES_PER_SEND_DB)) {
+                       nreq = 0;
+
+                       doorbell[0] = cpu_to_be32((MTHCA_ARBEL_MAX_WQES_PER_SEND_DB << 24) |
+                                                 ((qp->sq.head & 0xffff) << 8) |
+                                                 f0 | op0);
+                       doorbell[1] = cpu_to_be32((qp->qpn << 8) | size0);
+
+                       qp->sq.head += MTHCA_ARBEL_MAX_WQES_PER_SEND_DB;
+                       size0 = 0;
+
+                       /*
+                        * Make sure that descriptors are written before
+                        * doorbell record.
+                        */
+                       wmb();
+                       *qp->sq.db = cpu_to_be32(qp->sq.head & 0xffff);
+
+                       /*
+                        * Make sure doorbell record is written before we
+                        * write MMIO send doorbell.
+                        */
+                       wmb();
+                       mthca_write64(doorbell,
+                                     dev->kar + MTHCA_SEND_DOORBELL,
+                                     MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
+               }
+
                if (mthca_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) {
                        mthca_err(dev, "SQ %06x full (%u head, %u tail,"
                                        " %d max, %d nreq)\n", qp->qpn,
@@ -2014,8 +2046,6 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 
 out:
        if (likely(nreq)) {
-               __be32 doorbell[2];
-
                doorbell[0] = cpu_to_be32((nreq << 24)                  |
                                          ((qp->sq.head & 0xffff) << 8) |
                                          f0 | op0);
index 73f1c0b9021e65b5f05bf9ee4cdd821bc6d6daee..e7d2c1e86199598a6762adcdc57d6a6858bcca77 100644 (file)
@@ -50,7 +50,8 @@ enum {
 
 enum {
        MTHCA_INVAL_LKEY                        = 0x100,
-       MTHCA_TAVOR_MAX_WQES_PER_RECV_DB        = 256
+       MTHCA_TAVOR_MAX_WQES_PER_RECV_DB        = 256,
+       MTHCA_ARBEL_MAX_WQES_PER_SEND_DB        = 255
 };
 
 struct mthca_next_seg {
index 54ef2fea530f8494ba71882b1c5b4b20f8ff169f..23885801b6d2b3efd1cfefc925b8b451eafceff9 100644 (file)
@@ -608,9 +608,13 @@ void ipoib_ib_dev_flush(void *_dev)
        if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
                ipoib_ib_dev_up(dev);
 
+       down(&priv->vlan_mutex);
+
        /* Flush any child interfaces too */
        list_for_each_entry(cpriv, &priv->child_intfs, list)
                ipoib_ib_dev_flush(&cpriv->dev);
+
+       up(&priv->vlan_mutex);
 }
 
 void ipoib_ib_dev_cleanup(struct net_device *dev)
index 2fa30751f3623f52bfab28595ab667fe4f1ed91b..780009c7eaa651f908e78def9a8106eea752cd81 100644 (file)
@@ -47,6 +47,8 @@
 #include <linux/ip.h>
 #include <linux/in.h>
 
+#include <net/dst.h>
+
 MODULE_AUTHOR("Roland Dreier");
 MODULE_DESCRIPTION("IP-over-InfiniBand net driver");
 MODULE_LICENSE("Dual BSD/GPL");
@@ -94,8 +96,10 @@ int ipoib_open(struct net_device *dev)
        if (ipoib_ib_dev_open(dev))
                return -EINVAL;
 
-       if (ipoib_ib_dev_up(dev))
+       if (ipoib_ib_dev_up(dev)) {
+               ipoib_ib_dev_stop(dev);
                return -EINVAL;
+       }
 
        if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
                struct ipoib_dev_priv *cpriv;
@@ -398,9 +402,9 @@ static void path_rec_completion(int status,
                        while ((skb = __skb_dequeue(&neigh->queue)))
                                __skb_queue_tail(&skqueue, skb);
                }
-       } else
-               path->query = NULL;
+       }
 
+       path->query = NULL;
        complete(&path->done);
 
        spin_unlock_irqrestore(&priv->lock, flags);
@@ -428,7 +432,6 @@ static struct ipoib_path *path_rec_create(struct net_device *dev,
        skb_queue_head_init(&path->queue);
 
        INIT_LIST_HEAD(&path->neigh_list);
-       init_completion(&path->done);
 
        memcpy(path->pathrec.dgid.raw, gid->raw, sizeof (union ib_gid));
        path->pathrec.sgid      = priv->local_gid;
@@ -446,6 +449,8 @@ static int path_rec_start(struct net_device *dev,
        ipoib_dbg(priv, "Start path record lookup for " IPOIB_GID_FMT "\n",
                  IPOIB_GID_ARG(path->pathrec.dgid));
 
+       init_completion(&path->done);
+
        path->query_id =
                ib_sa_path_rec_get(priv->ca, priv->port,
                                   &path->pathrec,
index c33ed87f9dff5c2efdf04ed6a4352e3bea5af950..ed0c2ead8bc16f0c215a054f0c765d4d2a440eee 100644 (file)
@@ -43,6 +43,8 @@
 #include <linux/delay.h>
 #include <linux/completion.h>
 
+#include <net/dst.h>
+
 #include "ipoib.h"
 
 #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
@@ -135,20 +137,14 @@ static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev,
        if (!mcast)
                return NULL;
 
-       init_completion(&mcast->done);
-
        mcast->dev = dev;
        mcast->created = jiffies;
        mcast->backoff = 1;
-       mcast->logcount = 0;
 
        INIT_LIST_HEAD(&mcast->list);
        INIT_LIST_HEAD(&mcast->neigh_list);
        skb_queue_head_init(&mcast->pkt_queue);
 
-       mcast->ah    = NULL;
-       mcast->query = NULL;
-
        return mcast;
 }
 
@@ -350,6 +346,8 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast)
        rec.port_gid = priv->local_gid;
        rec.pkey     = cpu_to_be16(priv->pkey);
 
+       init_completion(&mcast->done);
+
        ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec,
                                     IB_SA_MCMEMBER_REC_MGID            |
                                     IB_SA_MCMEMBER_REC_PORT_GID        |
@@ -469,6 +467,8 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast,
                rec.traffic_class = priv->broadcast->mcmember.traffic_class;
        }
 
+       init_completion(&mcast->done);
+
        ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, comp_mask,
                                     mcast->backoff * 1000, GFP_ATOMIC,
                                     ipoib_mcast_join_complete,
index 0506934244f001861f309f40fa33e0eee4e0fc3b..caac6d63d46f4a7da7ffc70293aad635d7c6bb37 100644 (file)
@@ -339,14 +339,20 @@ static struct gameport_event *gameport_get_event(void)
        return event;
 }
 
-static void gameport_handle_events(void)
+static void gameport_handle_event(void)
 {
        struct gameport_event *event;
        struct gameport_driver *gameport_drv;
 
        down(&gameport_sem);
 
-       while ((event = gameport_get_event())) {
+       /*
+        * Note that we handle only one event here to give swsusp
+        * a chance to freeze kgameportd thread. Gameport events
+        * should be pretty rare so we are not concerned about
+        * taking performance hit.
+        */
+       if ((event = gameport_get_event())) {
 
                switch (event->type) {
                        case GAMEPORT_REGISTER_PORT:
@@ -433,7 +439,7 @@ static struct gameport *gameport_get_pending_child(struct gameport *parent)
 static int gameport_thread(void *nothing)
 {
        do {
-               gameport_handle_events();
+               gameport_handle_event();
                wait_event_interruptible(gameport_wait,
                        kthread_should_stop() || !list_empty(&gameport_event_list));
                try_to_freeze();
index c8ae2bb054e026c4e4e2cf44214c26316737f0dc..bdd2a7fc268dac799210be077f223a56b3255a31 100644 (file)
@@ -536,7 +536,7 @@ static struct attribute *input_dev_attrs[] = {
        NULL
 };
 
-static struct attribute_group input_dev_group = {
+static struct attribute_group input_dev_attr_group = {
        .attrs  = input_dev_attrs,
 };
 
@@ -717,35 +717,14 @@ struct input_dev *input_allocate_device(void)
        return dev;
 }
 
-static void input_register_classdevice(struct input_dev *dev)
-{
-       static atomic_t input_no = ATOMIC_INIT(0);
-       const char *path;
-
-       __module_get(THIS_MODULE);
-
-       dev->dev = dev->cdev.dev;
-
-       snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id),
-                "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);
-
-       path = kobject_get_path(&dev->cdev.class->subsys.kset.kobj, GFP_KERNEL);
-       printk(KERN_INFO "input: %s as %s/%s\n",
-               dev->name ? dev->name : "Unspecified device",
-               path ? path : "", dev->cdev.class_id);
-       kfree(path);
-
-       class_device_add(&dev->cdev);
-       sysfs_create_group(&dev->cdev.kobj, &input_dev_group);
-       sysfs_create_group(&dev->cdev.kobj, &input_dev_id_attr_group);
-       sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group);
-}
-
 int input_register_device(struct input_dev *dev)
 {
+       static atomic_t input_no = ATOMIC_INIT(0);
        struct input_handle *handle;
        struct input_handler *handler;
        struct input_device_id *id;
+       const char *path;
+       int error;
 
        if (!dev->dynalloc) {
                printk(KERN_WARNING "input: device %s is statically allocated, will not register\n"
@@ -773,7 +752,32 @@ int input_register_device(struct input_dev *dev)
        INIT_LIST_HEAD(&dev->h_list);
        list_add_tail(&dev->node, &input_dev_list);
 
-       input_register_classdevice(dev);
+       dev->cdev.class = &input_class;
+       snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id),
+                "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);
+
+       error = class_device_add(&dev->cdev);
+       if (error)
+               return error;
+
+       error = sysfs_create_group(&dev->cdev.kobj, &input_dev_attr_group);
+       if (error)
+               goto fail1;
+
+       error = sysfs_create_group(&dev->cdev.kobj, &input_dev_id_attr_group);
+       if (error)
+               goto fail2;
+
+       error = sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group);
+       if (error)
+               goto fail3;
+
+       __module_get(THIS_MODULE);
+
+       path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL);
+       printk(KERN_INFO "input: %s as %s\n",
+               dev->name ? dev->name : "Unspecified device", path ? path : "N/A");
+       kfree(path);
 
        list_for_each_entry(handler, &input_handler_list, node)
                if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
@@ -784,6 +788,11 @@ int input_register_device(struct input_dev *dev)
        input_wakeup_procfs_readers();
 
        return 0;
+
+ fail3:        sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group);
+ fail2:        sysfs_remove_group(&dev->cdev.kobj, &input_dev_attr_group);
+ fail1:        class_device_del(&dev->cdev);
+       return error;
 }
 
 void input_unregister_device(struct input_dev *dev)
@@ -805,7 +814,7 @@ void input_unregister_device(struct input_dev *dev)
 
        sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group);
        sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group);
-       sysfs_remove_group(&dev->cdev.kobj, &input_dev_group);
+       sysfs_remove_group(&dev->cdev.kobj, &input_dev_attr_group);
        class_device_unregister(&dev->cdev);
 
        input_wakeup_procfs_readers();
index 64b4a308098521ee6d01cc6893a4e938759aa6a3..bc2fce60f9f8012484d8600fe9a8121065664498 100644 (file)
@@ -235,7 +235,6 @@ static struct usb_device_id iforce_usb_ids [] = {
 MODULE_DEVICE_TABLE (usb, iforce_usb_ids);
 
 struct usb_driver iforce_usb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "iforce",
        .probe =        iforce_usb_probe,
        .disconnect =   iforce_usb_disconnect,
index 99a642d2a1feb145c18bbf0afb55966a8b964cee..1849b176cf1871263171be8d5311cb8470f8784e 100644 (file)
@@ -172,7 +172,7 @@ static int warrior_connect(struct serio *serio, struct serio_driver *drv)
        input_set_abs_params(input_dev, ABS_Y, -64, 64, 0, 8);
        input_set_abs_params(input_dev, ABS_THROTTLE, -112, 112, 0, 0);
        input_set_abs_params(input_dev, ABS_HAT0X, -1, 1, 0, 0);
-       input_set_abs_params(input_dev, ABS_HAT0X, -1, 1, 0, 0);
+       input_set_abs_params(input_dev, ABS_HAT0Y, -1, 1, 0, 0);
 
        serio_set_drvdata(serio, warrior);
 
index 820c7fd9a6049c7f0e732de29b558a18ce503711..a0256f8de8efab412a1ee6ee22321fb5ca941ce7 100644 (file)
@@ -166,6 +166,9 @@ static unsigned char atkbd_unxlate_table[128] = {
 
 #define ATKBD_SPECIAL          248
 
+#define ATKBD_LED_EVENT_BIT    0
+#define ATKBD_REP_EVENT_BIT    1
+
 static struct {
        unsigned char keycode;
        unsigned char set2;
@@ -211,6 +214,10 @@ struct atkbd {
        unsigned char err_xl;
        unsigned int last;
        unsigned long time;
+
+       struct work_struct event_work;
+       struct semaphore event_sem;
+       unsigned long event_mask;
 };
 
 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
@@ -424,58 +431,86 @@ out:
 }
 
 /*
- * Event callback from the input module. Events that change the state of
- * the hardware are processed here.
+ * atkbd_event_work() is used to complete processing of events that
+ * can not be processed by input_event() which is often called from
+ * interrupt context.
  */
 
-static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+static void atkbd_event_work(void *data)
 {
-       struct atkbd *atkbd = dev->private;
        const short period[32] =
                { 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
                 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
        const short delay[4] =
                { 250, 500, 750, 1000 };
+
+       struct atkbd *atkbd = data;
+       struct input_dev *dev = atkbd->dev;
        unsigned char param[2];
        int i, j;
 
+       down(&atkbd->event_sem);
+
+       if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) {
+               param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0)
+                        | (test_bit(LED_NUML,    dev->led) ? 2 : 0)
+                        | (test_bit(LED_CAPSL,   dev->led) ? 4 : 0);
+               ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS);
+
+               if (atkbd->extra) {
+                       param[0] = 0;
+                       param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0)
+                                | (test_bit(LED_SLEEP,   dev->led) ? 0x02 : 0)
+                                | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0)
+                                | (test_bit(LED_MISC,    dev->led) ? 0x10 : 0)
+                                | (test_bit(LED_MUTE,    dev->led) ? 0x20 : 0);
+                       ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS);
+               }
+       }
+
+       if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) {
+               i = j = 0;
+               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);
+               ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP);
+       }
+
+       up(&atkbd->event_sem);
+}
+
+/*
+ * Event callback from the input module. Events that change the state of
+ * the hardware are processed here. If action can not be performed in
+ * interrupt context it is offloaded to atkbd_event_work.
+ */
+
+static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+       struct atkbd *atkbd = dev->private;
+
        if (!atkbd->write)
                return -1;
 
        switch (type) {
 
                case EV_LED:
-
-                       param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0)
-                                | (test_bit(LED_NUML,    dev->led) ? 2 : 0)
-                                | (test_bit(LED_CAPSL,   dev->led) ? 4 : 0);
-                       ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS);
-
-                       if (atkbd->extra) {
-                               param[0] = 0;
-                               param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0)
-                                        | (test_bit(LED_SLEEP,   dev->led) ? 0x02 : 0)
-                                        | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0)
-                                        | (test_bit(LED_MISC,    dev->led) ? 0x10 : 0)
-                                        | (test_bit(LED_MUTE,    dev->led) ? 0x20 : 0);
-                               ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS);
-                       }
-
+                       set_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask);
+                       wmb();
+                       schedule_work(&atkbd->event_work);
                        return 0;
 
                case EV_REP:
 
-                       if (atkbd->softrepeat) return 0;
-
-                       i = j = 0;
-                       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);
-                       ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP);
+                       if (!atkbd->softrepeat) {
+                               set_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask);
+                               wmb();
+                               schedule_work(&atkbd->event_work);
+                       }
 
                        return 0;
        }
@@ -810,6 +845,8 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
 
        atkbd->dev = dev;
        ps2_init(&atkbd->ps2dev, serio);
+       INIT_WORK(&atkbd->event_work, atkbd_event_work, atkbd);
+       init_MUTEX(&atkbd->event_sem);
 
        switch (serio->id.type) {
 
index b3eaac1b35b64109b27c475a8b4b818ce35be780..e08dbe08f46dd0100b7f31d1b3a82ce2e640b5c0 100644 (file)
@@ -26,7 +26,7 @@ config INPUT_PCSPKR
 
 config INPUT_SPARCSPKR
        tristate "SPARC Speaker support"
-       depends on PCI && (SPARC32 || SPARC64)
+       depends on PCI && SPARC
        help
          Say Y here if you want the standard Speaker on Sparc PCI systems
          to be used for bells and whistles.
@@ -40,6 +40,16 @@ config INPUT_M68K_BEEP
        tristate "M68k Beeper support"
        depends on M68K
 
+config INPUT_WISTRON_BTNS
+       tristate "x86 Wistron laptop button interface"
+       depends on X86 && !X86_64
+       help
+         Say Y here for support of Winstron laptop button interface, used on
+         laptops of various brands, including Acer and Fujitsu-Siemens.
+
+         To compile this driver as a module, choose M here: the module will
+         be called wistron_btns.
+
 config INPUT_UINPUT
        tristate "User level driver support"
        help
index f8d01c69f349567247108e755f4b1725fb3dd96e..ce44cce012855a22142eec77fcc83e38eb88b39e 100644 (file)
@@ -9,4 +9,5 @@ obj-$(CONFIG_INPUT_PCSPKR)              += pcspkr.o
 obj-$(CONFIG_INPUT_M68K_BEEP)          += m68kspkr.o
 obj-$(CONFIG_INPUT_98SPKR)             += 98spkr.o
 obj-$(CONFIG_INPUT_UINPUT)             += uinput.o
+obj-$(CONFIG_INPUT_WISTRON_BTNS)       += wistron_btns.o
 obj-$(CONFIG_HP_SDC_RTC)               += hp_sdc_rtc.o
index 948c1cc01bc95ea5291a843b107f86f2e7cf70bd..546ed9b4901df211ae125e5395fc5e0675fc7458 100644 (file)
@@ -92,24 +92,19 @@ static void uinput_request_done(struct uinput_device *udev, struct uinput_reques
 {
        /* Mark slot as available */
        udev->requests[request->id] = NULL;
-       wake_up_interruptible(&udev->requests_waitq);
+       wake_up(&udev->requests_waitq);
 
        complete(&request->done);
 }
 
 static int uinput_request_submit(struct input_dev *dev, struct uinput_request *request)
 {
-       int retval;
-
        /* Tell our userspace app about this new request by queueing an input event */
        uinput_dev_event(dev, EV_UINPUT, request->code, request->id);
 
        /* Wait for the request to complete */
-       retval = wait_for_completion_interruptible(&request->done);
-       if (!retval)
-               retval = request->retval;
-
-       return retval;
+       wait_for_completion(&request->done);
+       return request->retval;
 }
 
 static int uinput_dev_upload_effect(struct input_dev *dev, struct ff_effect *effect)
@@ -152,67 +147,62 @@ static int uinput_dev_erase_effect(struct input_dev *dev, int effect_id)
        return retval;
 }
 
-static int uinput_create_device(struct uinput_device *udev)
+static void uinput_destroy_device(struct uinput_device *udev)
 {
-       if (!udev->dev->name) {
-               printk(KERN_DEBUG "%s: write device info first\n", UINPUT_NAME);
-               return -EINVAL;
+       const char *name, *phys;
+
+       if (udev->dev) {
+               name = udev->dev->name;
+               phys = udev->dev->phys;
+               if (udev->state == UIST_CREATED)
+                       input_unregister_device(udev->dev);
+               else
+                       input_free_device(udev->dev);
+               kfree(name);
+               kfree(phys);
+               udev->dev = NULL;
        }
 
-       udev->dev->event = uinput_dev_event;
-       udev->dev->upload_effect = uinput_dev_upload_effect;
-       udev->dev->erase_effect = uinput_dev_erase_effect;
-       udev->dev->private = udev;
-
-       init_waitqueue_head(&udev->waitq);
-
-       input_register_device(udev->dev);
-
-       set_bit(UIST_CREATED, &udev->state);
-
-       return 0;
+       udev->state = UIST_NEW_DEVICE;
 }
 
-static int uinput_destroy_device(struct uinput_device *udev)
+static int uinput_create_device(struct uinput_device *udev)
 {
-       if (!test_bit(UIST_CREATED, &udev->state)) {
-               printk(KERN_WARNING "%s: create the device first\n", UINPUT_NAME);
+       int error;
+
+       if (udev->state != UIST_SETUP_COMPLETE) {
+               printk(KERN_DEBUG "%s: write device info first\n", UINPUT_NAME);
                return -EINVAL;
        }
 
-       input_unregister_device(udev->dev);
+       error = input_register_device(udev->dev);
+       if (error) {
+               uinput_destroy_device(udev);
+               return error;
+       }
 
-       clear_bit(UIST_CREATED, &udev->state);
+       udev->state = UIST_CREATED;
 
        return 0;
 }
 
 static int uinput_open(struct inode *inode, struct file *file)
 {
-       struct uinput_device    *newdev;
-       struct input_dev        *newinput;
+       struct uinput_device *newdev;
 
-       newdev = kmalloc(sizeof(struct uinput_device), GFP_KERNEL);
+       newdev = kzalloc(sizeof(struct uinput_device), GFP_KERNEL);
        if (!newdev)
-               goto error;
-       memset(newdev, 0, sizeof(struct uinput_device));
+               return -ENOMEM;
+
+       init_MUTEX(&newdev->sem);
        spin_lock_init(&newdev->requests_lock);
        init_waitqueue_head(&newdev->requests_waitq);
-
-       newinput = kmalloc(sizeof(struct input_dev), GFP_KERNEL);
-       if (!newinput)
-               goto cleanup;
-       memset(newinput, 0, sizeof(struct input_dev));
-
-       newdev->dev = newinput;
+       init_waitqueue_head(&newdev->waitq);
+       newdev->state = UIST_NEW_DEVICE;
 
        file->private_data = newdev;
 
        return 0;
-cleanup:
-       kfree(newdev);
-error:
-       return -ENOMEM;
 }
 
 static int uinput_validate_absbits(struct input_dev *dev)
@@ -246,34 +236,55 @@ static int uinput_validate_absbits(struct input_dev *dev)
        return retval;
 }
 
-static int uinput_alloc_device(struct file *file, const char __user *buffer, size_t count)
+static int uinput_allocate_device(struct uinput_device *udev)
+{
+       udev->dev = input_allocate_device();
+       if (!udev->dev)
+               return -ENOMEM;
+
+       udev->dev->event = uinput_dev_event;
+       udev->dev->upload_effect = uinput_dev_upload_effect;
+       udev->dev->erase_effect = uinput_dev_erase_effect;
+       udev->dev->private = udev;
+
+       return 0;
+}
+
+static int uinput_setup_device(struct uinput_device *udev, const char __user *buffer, size_t count)
 {
        struct uinput_user_dev  *user_dev;
        struct input_dev        *dev;
-       struct uinput_device    *udev;
        char                    *name;
        int                     size;
        int                     retval;
 
-       retval = count;
+       if (count != sizeof(struct uinput_user_dev))
+               return -EINVAL;
+
+       if (!udev->dev) {
+               retval = uinput_allocate_device(udev);
+               if (retval)
+                       return retval;
+       }
 
-       udev = file->private_data;
        dev = udev->dev;
 
        user_dev = kmalloc(sizeof(struct uinput_user_dev), GFP_KERNEL);
-       if (!user_dev) {
-               retval = -ENOMEM;
-               goto exit;
-       }
+       if (!user_dev)
+               return -ENOMEM;
 
        if (copy_from_user(user_dev, buffer, sizeof(struct uinput_user_dev))) {
                retval = -EFAULT;
                goto exit;
        }
 
-       kfree(dev->name);
-
        size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1;
+       if (!size) {
+               retval = -EINVAL;
+               goto exit;
+       }
+
+       kfree(dev->name);
        dev->name = name = kmalloc(size, GFP_KERNEL);
        if (!name) {
                retval = -ENOMEM;
@@ -296,32 +307,50 @@ static int uinput_alloc_device(struct file *file, const char __user *buffer, siz
        /* check if absmin/absmax/absfuzz/absflat are filled as
         * told in Documentation/input/input-programming.txt */
        if (test_bit(EV_ABS, dev->evbit)) {
-               int err = uinput_validate_absbits(dev);
-               if (err < 0) {
-                       retval = err;
-                       kfree(dev->name);
-               }
+               retval = uinput_validate_absbits(dev);
+               if (retval < 0)
+                       goto exit;
        }
 
-exit:
+       udev->state = UIST_SETUP_COMPLETE;
+       retval = count;
+
+ exit:
        kfree(user_dev);
        return retval;
 }
 
+static inline ssize_t uinput_inject_event(struct uinput_device *udev, const char __user *buffer, size_t count)
+{
+       struct input_event ev;
+
+       if (count != sizeof(struct input_event))
+               return -EINVAL;
+
+       if (copy_from_user(&ev, buffer, sizeof(struct input_event)))
+               return -EFAULT;
+
+       input_event(udev->dev, ev.type, ev.code, ev.value);
+
+       return sizeof(struct input_event);
+}
+
 static ssize_t uinput_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
 {
        struct uinput_device *udev = file->private_data;
+       int retval;
+
+       retval = down_interruptible(&udev->sem);
+       if (retval)
+               return retval;
 
-       if (test_bit(UIST_CREATED, &udev->state)) {
-               struct input_event      ev;
+       retval = udev->state == UIST_CREATED ?
+                       uinput_inject_event(udev, buffer, count) :
+                       uinput_setup_device(udev, buffer, count);
 
-               if (copy_from_user(&ev, buffer, sizeof(struct input_event)))
-                       return -EFAULT;
-               input_event(udev->dev, ev.type, ev.code, ev.value);
-       } else
-               count = uinput_alloc_device(file, buffer, count);
+       up(&udev->sem);
 
-       return count;
+       return retval;
 }
 
 static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
@@ -329,28 +358,38 @@ static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count,
        struct uinput_device *udev = file->private_data;
        int retval = 0;
 
-       if (!test_bit(UIST_CREATED, &udev->state))
+       if (udev->state != UIST_CREATED)
                return -ENODEV;
 
        if (udev->head == udev->tail && (file->f_flags & O_NONBLOCK))
                return -EAGAIN;
 
        retval = wait_event_interruptible(udev->waitq,
-                       udev->head != udev->tail || !test_bit(UIST_CREATED, &udev->state));
+                       udev->head != udev->tail || udev->state != UIST_CREATED);
        if (retval)
                return retval;
 
-       if (!test_bit(UIST_CREATED, &udev->state))
-               return -ENODEV;
+       retval = down_interruptible(&udev->sem);
+       if (retval)
+               return retval;
 
-       while ((udev->head != udev->tail) &&
-           (retval + sizeof(struct input_event) <= count)) {
-               if (copy_to_user(buffer + retval, &udev->buff[udev->tail], sizeof(struct input_event)))
-                       return -EFAULT;
+       if (udev->state != UIST_CREATED) {
+               retval = -ENODEV;
+               goto out;
+       }
+
+       while (udev->head != udev->tail && retval + sizeof(struct input_event) <= count) {
+               if (copy_to_user(buffer + retval, &udev->buff[udev->tail], sizeof(struct input_event))) {
+                       retval = -EFAULT;
+                       goto out;
+               }
                udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE;
                retval += sizeof(struct input_event);
        }
 
+ out:
+       up(&udev->sem);
+
        return retval;
 }
 
@@ -366,28 +405,30 @@ static unsigned int uinput_poll(struct file *file, poll_table *wait)
        return 0;
 }
 
-static int uinput_burn_device(struct uinput_device *udev)
+static int uinput_release(struct inode *inode, struct file *file)
 {
-       if (test_bit(UIST_CREATED, &udev->state))
-               uinput_destroy_device(udev);
+       struct uinput_device *udev = file->private_data;
 
-       kfree(udev->dev->name);
-       kfree(udev->dev->phys);
-       kfree(udev->dev);
+       uinput_destroy_device(udev);
        kfree(udev);
 
        return 0;
 }
 
-static int uinput_close(struct inode *inode, struct file *file)
+#define uinput_set_bit(_arg, _bit, _max)               \
+({                                                     \
+       int __ret = 0;                                  \
+       if (udev->state == UIST_CREATED)                \
+               __ret =  -EINVAL;                       \
+       else if ((_arg) > (_max))                       \
+               __ret = -EINVAL;                        \
+       else set_bit((_arg), udev->dev->_bit);          \
+       __ret;                                          \
+})
+
+static long uinput_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
-       uinput_burn_device(file->private_data);
-       return 0;
-}
-
-static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
-       int                     retval = 0;
+       int                     retval;
        struct uinput_device    *udev;
        void __user             *p = (void __user *)arg;
        struct uinput_ff_upload ff_up;
@@ -398,19 +439,14 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
 
        udev = file->private_data;
 
-       /* device attributes can not be changed after the device is created */
-       switch (cmd) {
-               case UI_SET_EVBIT:
-               case UI_SET_KEYBIT:
-               case UI_SET_RELBIT:
-               case UI_SET_ABSBIT:
-               case UI_SET_MSCBIT:
-               case UI_SET_LEDBIT:
-               case UI_SET_SNDBIT:
-               case UI_SET_FFBIT:
-               case UI_SET_PHYS:
-                       if (test_bit(UIST_CREATED, &udev->state))
-                               return -EINVAL;
+       retval = down_interruptible(&udev->sem);
+       if (retval)
+               return retval;
+
+       if (!udev->dev) {
+               retval = uinput_allocate_device(udev);
+               if (retval)
+                       goto out;
        }
 
        switch (cmd) {
@@ -419,74 +455,50 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                        break;
 
                case UI_DEV_DESTROY:
-                       retval = uinput_destroy_device(udev);
+                       uinput_destroy_device(udev);
                        break;
 
                case UI_SET_EVBIT:
-                       if (arg > EV_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->evbit);
+                       retval = uinput_set_bit(arg, evbit, EV_MAX);
                        break;
 
                case UI_SET_KEYBIT:
-                       if (arg > KEY_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->keybit);
+                       retval = uinput_set_bit(arg, keybit, KEY_MAX);
                        break;
 
                case UI_SET_RELBIT:
-                       if (arg > REL_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->relbit);
+                       retval = uinput_set_bit(arg, relbit, REL_MAX);
                        break;
 
                case UI_SET_ABSBIT:
-                       if (arg > ABS_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->absbit);
+                       retval = uinput_set_bit(arg, absbit, ABS_MAX);
                        break;
 
                case UI_SET_MSCBIT:
-                       if (arg > MSC_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->mscbit);
+                       retval = uinput_set_bit(arg, mscbit, MSC_MAX);
                        break;
 
                case UI_SET_LEDBIT:
-                       if (arg > LED_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->ledbit);
+                       retval = uinput_set_bit(arg, ledbit, LED_MAX);
                        break;
 
                case UI_SET_SNDBIT:
-                       if (arg > SND_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->sndbit);
+                       retval = uinput_set_bit(arg, sndbit, SND_MAX);
                        break;
 
                case UI_SET_FFBIT:
-                       if (arg > FF_MAX) {
-                               retval = -EINVAL;
-                               break;
-                       }
-                       set_bit(arg, udev->dev->ffbit);
+                       retval = uinput_set_bit(arg, ffbit, FF_MAX);
+                       break;
+
+               case UI_SET_SWBIT:
+                       retval = uinput_set_bit(arg, swbit, SW_MAX);
                        break;
 
                case UI_SET_PHYS:
+                       if (udev->state == UIST_CREATED) {
+                               retval = -EINVAL;
+                               goto out;
+                       }
                        length = strnlen_user(p, 1024);
                        if (length <= 0) {
                                retval = -EFAULT;
@@ -575,23 +587,26 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                default:
                        retval = -EINVAL;
        }
+
+ out:
+       up(&udev->sem);
        return retval;
 }
 
 static struct file_operations uinput_fops = {
-       .owner =        THIS_MODULE,
-       .open =         uinput_open,
-       .release =      uinput_close,
-       .read =         uinput_read,
-       .write =        uinput_write,
-       .poll =         uinput_poll,
-       .ioctl =        uinput_ioctl,
+       .owner          = THIS_MODULE,
+       .open           = uinput_open,
+       .release        = uinput_release,
+       .read           = uinput_read,
+       .write          = uinput_write,
+       .poll           = uinput_poll,
+       .unlocked_ioctl = uinput_ioctl,
 };
 
 static struct miscdevice uinput_misc = {
-       .fops =         &uinput_fops,
-       .minor =        UINPUT_MINOR,
-       .name =         UINPUT_NAME,
+       .fops           = &uinput_fops,
+       .minor          = UINPUT_MINOR,
+       .name           = UINPUT_NAME,
 };
 
 static int __init uinput_init(void)
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c
new file mode 100644 (file)
index 0000000..bac3085
--- /dev/null
@@ -0,0 +1,561 @@
+/*
+ * Wistron laptop button driver
+ * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
+ * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
+ * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
+ *
+ * You can redistribute and/or modify this program under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation.
+ *
+ * This program is distributed in the hope 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/io.h>
+#include <linux/dmi.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/mc146818rtc.h>
+#include <linux/module.h>
+#include <linux/preempt.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/types.h>
+#include <linux/platform_device.h>
+
+/*
+ * Number of attempts to read data from queue per poll;
+ * the queue can hold up to 31 entries
+ */
+#define MAX_POLL_ITERATIONS 64
+
+#define POLL_FREQUENCY 10 /* Number of polls per second */
+
+#if POLL_FREQUENCY > HZ
+#error "POLL_FREQUENCY too high"
+#endif
+
+/* BIOS subsystem IDs */
+#define WIFI           0x35
+#define BLUETOOTH      0x34
+
+MODULE_AUTHOR("Miloslav Trmac <mitr@volny.cz>");
+MODULE_DESCRIPTION("Wistron laptop button driver");
+MODULE_LICENSE("GPL v2");
+MODULE_VERSION("0.1");
+
+static int force; /* = 0; */
+module_param(force, bool, 0);
+MODULE_PARM_DESC(force, "Load even if computer is not in database");
+
+static char *keymap_name; /* = NULL; */
+module_param_named(keymap, keymap_name, charp, 0);
+MODULE_PARM_DESC(keymap, "Keymap name, if it can't be autodetected");
+
+static struct platform_device *wistron_device;
+
+ /* BIOS interface implementation */
+
+static void __iomem *bios_entry_point; /* BIOS routine entry point */
+static void __iomem *bios_code_map_base;
+static void __iomem *bios_data_map_base;
+
+static u8 cmos_address;
+
+struct regs {
+       u32 eax, ebx, ecx;
+};
+
+static void call_bios(struct regs *regs)
+{
+       unsigned long flags;
+
+       preempt_disable();
+       local_irq_save(flags);
+       asm volatile ("pushl %%ebp;"
+                     "movl %7, %%ebp;"
+                     "call *%6;"
+                     "popl %%ebp"
+                     : "=a" (regs->eax), "=b" (regs->ebx), "=c" (regs->ecx)
+                     : "0" (regs->eax), "1" (regs->ebx), "2" (regs->ecx),
+                       "m" (bios_entry_point), "m" (bios_data_map_base)
+                     : "edx", "edi", "esi", "memory");
+       local_irq_restore(flags);
+       preempt_enable();
+}
+
+static size_t __init locate_wistron_bios(void __iomem *base)
+{
+       static const unsigned char __initdata signature[] =
+               { 0x42, 0x21, 0x55, 0x30 };
+       size_t offset;
+
+       for (offset = 0; offset < 0x10000; offset += 0x10) {
+               if (check_signature(base + offset, signature,
+                                   sizeof(signature)) != 0)
+                       return offset;
+       }
+       return -1;
+}
+
+static int __init map_bios(void)
+{
+       void __iomem *base;
+       size_t offset;
+       u32 entry_point;
+
+       base = ioremap(0xF0000, 0x10000); /* Can't fail */
+       offset = locate_wistron_bios(base);
+       if (offset < 0) {
+               printk(KERN_ERR "wistron_btns: BIOS entry point not found\n");
+               iounmap(base);
+               return -ENODEV;
+       }
+
+       entry_point = readl(base + offset + 5);
+       printk(KERN_DEBUG
+               "wistron_btns: BIOS signature found at %p, entry point %08X\n",
+               base + offset, entry_point);
+
+       if (entry_point >= 0xF0000) {
+               bios_code_map_base = base;
+               bios_entry_point = bios_code_map_base + (entry_point & 0xFFFF);
+       } else {
+               iounmap(base);
+               bios_code_map_base = ioremap(entry_point & ~0x3FFF, 0x4000);
+               if (bios_code_map_base == NULL) {
+                       printk(KERN_ERR
+                               "wistron_btns: Can't map BIOS code at %08X\n",
+                               entry_point & ~0x3FFF);
+                       goto err;
+               }
+               bios_entry_point = bios_code_map_base + (entry_point & 0x3FFF);
+       }
+       /* The Windows driver maps 0x10000 bytes, we keep only one page... */
+       bios_data_map_base = ioremap(0x400, 0xc00);
+       if (bios_data_map_base == NULL) {
+               printk(KERN_ERR "wistron_btns: Can't map BIOS data\n");
+               goto err_code;
+       }
+       return 0;
+
+err_code:
+       iounmap(bios_code_map_base);
+err:
+       return -ENOMEM;
+}
+
+static inline void unmap_bios(void)
+{
+       iounmap(bios_code_map_base);
+       iounmap(bios_data_map_base);
+}
+
+ /* BIOS calls */
+
+static u16 bios_pop_queue(void)
+{
+       struct regs regs;
+
+       memset(&regs, 0, sizeof (regs));
+       regs.eax = 0x9610;
+       regs.ebx = 0x061C;
+       regs.ecx = 0x0000;
+       call_bios(&regs);
+
+       return regs.eax;
+}
+
+static void __init bios_attach(void)
+{
+       struct regs regs;
+
+       memset(&regs, 0, sizeof (regs));
+       regs.eax = 0x9610;
+       regs.ebx = 0x012E;
+       call_bios(&regs);
+}
+
+static void bios_detach(void)
+{
+       struct regs regs;
+
+       memset(&regs, 0, sizeof (regs));
+       regs.eax = 0x9610;
+       regs.ebx = 0x002E;
+       call_bios(&regs);
+}
+
+static u8 __init bios_get_cmos_address(void)
+{
+       struct regs regs;
+
+       memset(&regs, 0, sizeof (regs));
+       regs.eax = 0x9610;
+       regs.ebx = 0x051C;
+       call_bios(&regs);
+
+       return regs.ecx;
+}
+
+static u16 __init bios_get_default_setting(u8 subsys)
+{
+       struct regs regs;
+
+       memset(&regs, 0, sizeof (regs));
+       regs.eax = 0x9610;
+       regs.ebx = 0x0200 | subsys;
+       call_bios(&regs);
+
+       return regs.eax;
+}
+
+static void bios_set_state(u8 subsys, int enable)
+{
+       struct regs regs;
+
+       memset(&regs, 0, sizeof (regs));
+       regs.eax = 0x9610;
+       regs.ebx = (enable ? 0x0100 : 0x0000) | subsys;
+       call_bios(&regs);
+}
+
+/* Hardware database */
+
+struct key_entry {
+       char type;              /* See KE_* below */
+       u8 code;
+       unsigned keycode;       /* For KE_KEY */
+};
+
+enum { KE_END, KE_KEY, KE_WIFI, KE_BLUETOOTH };
+
+static const struct key_entry *keymap; /* = NULL; Current key map */
+static int have_wifi;
+static int have_bluetooth;
+
+static int __init dmi_matched(struct dmi_system_id *dmi)
+{
+       const struct key_entry *key;
+
+       keymap = dmi->driver_data;
+       for (key = keymap; key->type != KE_END; key++) {
+               if (key->type == KE_WIFI) {
+                       have_wifi = 1;
+                       break;
+               } else if (key->type == KE_BLUETOOTH) {
+                       have_bluetooth = 1;
+                       break;
+               }
+       }
+       return 1;
+}
+
+static struct key_entry keymap_empty[] = {
+       { KE_END, 0 }
+};
+
+static struct key_entry keymap_fs_amilo_pro_v2000[] = {
+       { KE_KEY,  0x01, KEY_HELP },
+       { KE_KEY,  0x11, KEY_PROG1 },
+       { KE_KEY,  0x12, KEY_PROG2 },
+       { KE_WIFI, 0x30, 0 },
+       { KE_KEY,  0x31, KEY_MAIL },
+       { KE_KEY,  0x36, KEY_WWW },
+       { KE_END,  0 }
+};
+
+static struct key_entry keymap_wistron_ms2141[] = {
+       { KE_KEY,  0x11, KEY_PROG1 },
+       { KE_KEY,  0x12, KEY_PROG2 },
+       { KE_WIFI, 0x30, 0 },
+       { KE_KEY,  0x22, KEY_REWIND },
+       { KE_KEY,  0x23, KEY_FORWARD },
+       { KE_KEY,  0x24, KEY_PLAYPAUSE },
+       { KE_KEY,  0x25, KEY_STOPCD },
+       { KE_KEY,  0x31, KEY_MAIL },
+       { KE_KEY,  0x36, KEY_WWW },
+       { KE_END,  0 }
+};
+
+static struct key_entry keymap_acer_aspire_1500[] = {
+       { KE_KEY, 0x11, KEY_PROG1 },
+       { KE_KEY, 0x12, KEY_PROG2 },
+       { KE_WIFI, 0x30, 0 },
+       { KE_KEY, 0x31, KEY_MAIL },
+       { KE_KEY, 0x36, KEY_WWW },
+       { KE_BLUETOOTH, 0x44, 0 },
+       { KE_END, 0 }
+};
+
+/*
+ * If your machine is not here (which is currently rather likely), please send
+ * a list of buttons and their key codes (reported when loading this module
+ * with force=1) and the output of dmidecode to $MODULE_AUTHOR.
+ */
+static struct dmi_system_id dmi_ids[] = {
+       {
+               .callback = dmi_matched,
+               .ident = "Fujitsu-Siemens Amilo Pro V2000",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"),
+               },
+               .driver_data = keymap_fs_amilo_pro_v2000
+       },
+       {
+               .callback = dmi_matched,
+               .ident = "Acer Aspire 1500",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"),
+               },
+               .driver_data = keymap_acer_aspire_1500
+       },
+       { NULL, }
+};
+
+static int __init select_keymap(void)
+{
+       if (keymap_name != NULL) {
+               if (strcmp (keymap_name, "1557/MS2141") == 0)
+                       keymap = keymap_wistron_ms2141;
+               else {
+                       printk(KERN_ERR "wistron_btns: Keymap unknown\n");
+                       return -EINVAL;
+               }
+       }
+       dmi_check_system(dmi_ids);
+       if (keymap == NULL) {
+               if (!force) {
+                       printk(KERN_ERR "wistron_btns: System unknown\n");
+                       return -ENODEV;
+               }
+               keymap = keymap_empty;
+       }
+       return 0;
+}
+
+ /* Input layer interface */
+
+static struct input_dev *input_dev;
+
+static int __init setup_input_dev(void)
+{
+       const struct key_entry *key;
+       int error;
+
+       input_dev = input_allocate_device();
+       if (!input_dev)
+               return -ENOMEM;
+
+       input_dev->name = "Wistron laptop buttons";
+       input_dev->phys = "wistron/input0";
+       input_dev->id.bustype = BUS_HOST;
+       input_dev->cdev.dev = &wistron_device->dev;
+
+       for (key = keymap; key->type != KE_END; key++) {
+               if (key->type == KE_KEY) {
+                       input_dev->evbit[LONG(EV_KEY)] = BIT(EV_KEY);
+                       set_bit(key->keycode, input_dev->keybit);
+               }
+       }
+
+       error = input_register_device(input_dev);
+       if (error) {
+               input_free_device(input_dev);
+               return error;
+       }
+
+       return 0;
+}
+
+static void report_key(unsigned keycode)
+{
+       input_report_key(input_dev, keycode, 1);
+       input_sync(input_dev);
+       input_report_key(input_dev, keycode, 0);
+       input_sync(input_dev);
+}
+
+ /* Driver core */
+
+static int wifi_enabled;
+static int bluetooth_enabled;
+
+static void poll_bios(unsigned long);
+
+static struct timer_list poll_timer = TIMER_INITIALIZER(poll_bios, 0, 0);
+
+static void handle_key(u8 code)
+{
+       const struct key_entry *key;
+
+       for (key = keymap; key->type != KE_END; key++) {
+               if (code == key->code) {
+                       switch (key->type) {
+                       case KE_KEY:
+                               report_key(key->keycode);
+                               break;
+
+                       case KE_WIFI:
+                               if (have_wifi) {
+                                       wifi_enabled = !wifi_enabled;
+                                       bios_set_state(WIFI, wifi_enabled);
+                               }
+                               break;
+
+                       case KE_BLUETOOTH:
+                               if (have_bluetooth) {
+                                       bluetooth_enabled = !bluetooth_enabled;
+                                       bios_set_state(BLUETOOTH, bluetooth_enabled);
+                               }
+                               break;
+
+                       case KE_END:
+                       default:
+                               BUG();
+                       }
+                       return;
+               }
+       }
+       printk(KERN_NOTICE "wistron_btns: Unknown key code %02X\n", code);
+}
+
+static void poll_bios(unsigned long discard)
+{
+       u8 qlen;
+       u16 val;
+
+       for (;;) {
+               qlen = CMOS_READ(cmos_address);
+               if (qlen == 0)
+                       break;
+               val = bios_pop_queue();
+               if (val != 0 && !discard)
+                       handle_key((u8)val);
+       }
+
+       mod_timer(&poll_timer, jiffies + HZ / POLL_FREQUENCY);
+}
+
+static int wistron_suspend(struct platform_device *dev, pm_message_t state)
+{
+       del_timer_sync(&poll_timer);
+
+       if (have_wifi)
+               bios_set_state(WIFI, 0);
+
+       if (have_bluetooth)
+               bios_set_state(BLUETOOTH, 0);
+
+       return 0;
+}
+
+static int wistron_resume(struct platform_device *dev)
+{
+       if (have_wifi)
+               bios_set_state(WIFI, wifi_enabled);
+
+       if (have_bluetooth)
+               bios_set_state(BLUETOOTH, bluetooth_enabled);
+
+       poll_bios(1);
+
+       return 0;
+}
+
+static struct platform_driver wistron_driver = {
+       .suspend        = wistron_suspend,
+       .resume         = wistron_resume,
+       .driver         = {
+               .name   = "wistron-bios",
+       },
+};
+
+static int __init wb_module_init(void)
+{
+       int err;
+
+       err = select_keymap();
+       if (err)
+               return err;
+
+       err = map_bios();
+       if (err)
+               return err;
+
+       bios_attach();
+       cmos_address = bios_get_cmos_address();
+
+       err = platform_driver_register(&wistron_driver);
+       if (err)
+               goto err_detach_bios;
+
+       wistron_device = platform_device_register_simple("wistron-bios", -1, NULL, 0);
+       if (IS_ERR(wistron_device)) {
+               err = PTR_ERR(wistron_device);
+               goto err_unregister_driver;
+       }
+
+       if (have_wifi) {
+               u16 wifi = bios_get_default_setting(WIFI);
+               if (wifi & 1)
+                       wifi_enabled = (wifi & 2) ? 1 : 0;
+               else
+                       have_wifi = 0;
+
+               if (have_wifi)
+                       bios_set_state(WIFI, wifi_enabled);
+       }
+
+       if (have_bluetooth) {
+               u16 bt = bios_get_default_setting(BLUETOOTH);
+               if (bt & 1)
+                       bluetooth_enabled = (bt & 2) ? 1 : 0;
+               else
+                       have_bluetooth = 0;
+
+               if (have_bluetooth)
+                       bios_set_state(BLUETOOTH, bluetooth_enabled);
+       }
+
+       err = setup_input_dev();
+       if (err)
+               goto err_unregister_device;
+
+       poll_bios(1); /* Flush stale event queue and arm timer */
+
+       return 0;
+
+ err_unregister_device:
+       platform_device_unregister(wistron_device);
+ err_unregister_driver:
+       platform_driver_unregister(&wistron_driver);
+ err_detach_bios:
+       bios_detach();
+       unmap_bios();
+
+       return err;
+}
+
+static void __exit wb_module_exit(void)
+{
+       del_timer_sync(&poll_timer);
+       input_unregister_device(input_dev);
+       platform_device_unregister(wistron_device);
+       platform_driver_unregister(&wistron_driver);
+       bios_detach();
+       unmap_bios();
+}
+
+module_init(wb_module_init);
+module_exit(wb_module_exit);
index 4acc7fd4cd0fdcc675b5e8fbe10a9731e5eb3b5b..4f41ec3e4332162fc9187a5c2ef4d7e0ac017ff0 100644 (file)
@@ -42,7 +42,7 @@ static struct alps_model_info alps_model_data[] = {
        { { 0x53, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
        { { 0x63, 0x02, 0x0a }, 0xf8, 0xf8, 0 },
        { { 0x63, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
-       { { 0x63, 0x02, 0x28 }, 0xf8, 0xf8, 0 },
+       { { 0x63, 0x02, 0x28 }, 0xf8, 0xf8, ALPS_FW_BK_2 },             /* Fujitsu Siemens S6010 */
        { { 0x63, 0x02, 0x3c }, 0x8f, 0x8f, ALPS_WHEEL },               /* Toshiba Satellite S2400-103 */
        { { 0x63, 0x02, 0x50 }, 0xef, 0xef, ALPS_FW_BK_1 },             /* NEC Versa L320 */
        { { 0x63, 0x02, 0x64 }, 0xf8, 0xf8, 0 },
index 4bf584364d28303ee49a53822c7a668f35bab49b..2f9a04ae725fa0024735f9864886b0853921efd0 100644 (file)
@@ -95,7 +95,7 @@ static void sermouse_process_msc(struct sermouse *sermouse, signed char data, st
 
        input_sync(dev);
 
-       if (++sermouse->count == (5 - ((sermouse->type == SERIO_SUN) << 1)))
+       if (++sermouse->count == 5)
                sermouse->count = 0;
 }
 
index 13835039a2a798dfeaf9b859ed78d2f1fca1e0e6..cbbf3842da5bb353703757beeeaf8ff6da5967dc 100644 (file)
@@ -21,7 +21,7 @@
 #include "i8042-ip22io.h"
 #elif defined(CONFIG_PPC)
 #include "i8042-ppcio.h"
-#elif defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
+#elif defined(CONFIG_SPARC)
 #include "i8042-sparcio.h"
 #elif defined(CONFIG_X86) || defined(CONFIG_IA64)
 #include "i8042-x86ia64io.h"
index edd15db17715852ff05e1119ddd02b5de248e469..fbb69ef6a77b0a6a8659ec5b19b107bb32812040 100644 (file)
@@ -269,14 +269,20 @@ static struct serio_event *serio_get_event(void)
        return event;
 }
 
-static void serio_handle_events(void)
+static void serio_handle_event(void)
 {
        struct serio_event *event;
        struct serio_driver *serio_drv;
 
        down(&serio_sem);
 
-       while ((event = serio_get_event())) {
+       /*
+        * Note that we handle only one event here to give swsusp
+        * a chance to freeze kseriod thread. Serio events should
+        * be pretty rare so we are not concerned about taking
+        * performance hit.
+        */
+       if ((event = serio_get_event())) {
 
                switch (event->type) {
                        case SERIO_REGISTER_PORT:
@@ -368,7 +374,7 @@ static struct serio *serio_get_pending_child(struct serio *parent)
 static int serio_thread(void *nothing)
 {
        do {
-               serio_handle_events();
+               serio_handle_event();
                wait_event_interruptible(serio_wait,
                        kthread_should_stop() || !list_empty(&serio_event_list));
                try_to_freeze();
index f8457ef488260bc4e4af7db6a3cdc9c672c15b5a..ca5b4a3b683e67c1fc2d04df730302890048d195 100644 (file)
@@ -1715,7 +1715,6 @@ hfc_usb_disconnect(struct usb_interface
 /* our driver information structure */
 /************************************/
 static struct usb_driver hfc_drv = {
-       .owner = THIS_MODULE,
        .name  = "hfc_usb",
        .id_table = hfcusb_idtab,
        .probe = hfc_usb_probe,
index 8e192a3a34906ca80118f30c2b4ecff3bb6b2019..99cb0f3d59a15ff4e4a65748b9bb309858dc5d21 100644 (file)
@@ -180,7 +180,6 @@ static struct usb_device_id st5481_ids[] = {
 MODULE_DEVICE_TABLE (usb, st5481_ids);
 
 static struct usb_driver st5481_usb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "st5481_usb",
        .probe =        probe_st5481,
        .disconnect =   disconnect_st5481,
index 3fc8cdd94c3daa9b4154b8d721b381bb0eb09797..190878eef9903e1ec8a4c2e938772ab06ae8a0d9 100644 (file)
@@ -923,7 +923,7 @@ static void do_monitor_cpu_combined(void)
        if (temp_combi >= ((state0->mpu.tmax + 8) << 16)) {
                printk(KERN_WARNING "Warning ! Temperature way above maximum (%d) !\n",
                       temp_combi >> 16);
-               state0->overtemp = CPU_MAX_OVERTEMP;
+               state0->overtemp += CPU_MAX_OVERTEMP / 4;
        } else if (temp_combi > (state0->mpu.tmax << 16))
                state0->overtemp++;
        else
@@ -933,7 +933,7 @@ static void do_monitor_cpu_combined(void)
        if (state0->overtemp > 0) {
                state0->rpm = state0->mpu.rmaxn_exhaust_fan;
                state0->intake_rpm = intake = state0->mpu.rmaxn_intake_fan;
-               pump = state0->pump_min;
+               pump = state0->pump_max;
                goto do_set_fans;
        }
 
@@ -998,7 +998,7 @@ static void do_monitor_cpu_split(struct cpu_pid_state *state)
                printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum"
                       " (%d) !\n",
                       state->index, temp >> 16);
-               state->overtemp = CPU_MAX_OVERTEMP;
+               state->overtemp += CPU_MAX_OVERTEMP / 4;
        } else if (temp > (state->mpu.tmax << 16))
                state->overtemp++;
        else
@@ -1060,7 +1060,7 @@ static void do_monitor_cpu_rack(struct cpu_pid_state *state)
                printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum"
                       " (%d) !\n",
                       state->index, temp >> 16);
-               state->overtemp = CPU_MAX_OVERTEMP;
+               state->overtemp = CPU_MAX_OVERTEMP / 4;
        } else if (temp > (state->mpu.tmax << 16))
                state->overtemp++;
        else
index 322c74b2687f4cbe6aa30ec6b3b2a484d937e6f8..80ddf9776bde23c0a85e294e8fa76eef6ac7ee42 100644 (file)
@@ -207,7 +207,7 @@ static struct wf_smu_sys_fans_param wf_smu_sys_all_params[] = {
        },
        /* Model ID 3 */
        {
-               .model_id       = 2,
+               .model_id       = 3,
                .itarget        = 0x350000,
                .gd             = 0x08e00000,
                .gp             = 0x00566666,
@@ -219,7 +219,7 @@ static struct wf_smu_sys_fans_param wf_smu_sys_all_params[] = {
        },
        /* Model ID 5 */
        {
-               .model_id       = 2,
+               .model_id       = 5,
                .itarget        = 0x3a0000,
                .gd             = 0x15400000,
                .gp             = 0x00233333,
index bc021e1fd4d14b6d04a465cc6e91c7491032bfb7..bbf4615f0e30d792990208325fa9fa48580ce879 100644 (file)
@@ -33,6 +33,9 @@ static inline void bio_list_add(struct bio_list *bl, struct bio *bio)
 
 static inline void bio_list_merge(struct bio_list *bl, struct bio_list *bl2)
 {
+       if (!bl2->head)
+               return;
+
        if (bl->tail)
                bl->tail->bi_next = bl2->head;
        else
index 54ec737195e00f9043a8db9dbc04aff0df09e40f..07d44e19536e5c42c12cc00f3b37f23f16a49dfb 100644 (file)
@@ -425,8 +425,8 @@ static void list_version_get_needed(struct target_type *tt, void *needed_param)
 {
     size_t *needed = needed_param;
 
+    *needed += sizeof(struct dm_target_versions);
     *needed += strlen(tt->name);
-    *needed += sizeof(tt->version);
     *needed += ALIGN_MASK;
 }
 
@@ -974,6 +974,7 @@ static int table_load(struct dm_ioctl *param, size_t param_size)
        if (!hc) {
                DMWARN("device doesn't appear to be in the dev hash table.");
                up_write(&_hash_lock);
+               dm_table_put(t);
                return -ENXIO;
        }
 
index e110655eabdbcdd487b2275fc024bdb53d682c88..a76349cb10a53aa571412af63d3115c4242815cc 100644 (file)
@@ -333,10 +333,10 @@ static int core_ctr(struct dirty_log *log, struct dm_target *ti,
        lc->sync = sync;
 
        /*
-        * Work out how many words we need to hold the bitset.
+        * Work out how many "unsigned long"s we need to hold the bitset.
         */
        bitset_size = dm_round_up(region_count,
-                                 sizeof(*lc->clean_bits) << BYTE_SHIFT);
+                                 sizeof(unsigned long) << BYTE_SHIFT);
        bitset_size >>= BYTE_SHIFT;
 
        lc->bitset_uint32_count = bitset_size / 4;
index f9b7b32d5d5c773bea00dfc9e2f198333ea550c1..f72a82fb943489872b3d91abdffe4cb292c92267 100644 (file)
@@ -1000,6 +1000,7 @@ static int do_end_io(struct multipath *m, struct bio *bio,
 {
        struct hw_handler *hwh = &m->hw_handler;
        unsigned err_flags = MP_FAIL_PATH;      /* Default behavior */
+       unsigned long flags;
 
        if (!error)
                return 0;       /* I/O complete */
@@ -1010,17 +1011,17 @@ static int do_end_io(struct multipath *m, struct bio *bio,
        if (error == -EOPNOTSUPP)
                return error;
 
-       spin_lock(&m->lock);
+       spin_lock_irqsave(&m->lock, flags);
        if (!m->nr_valid_paths) {
                if (!m->queue_if_no_path) {
-                       spin_unlock(&m->lock);
+                       spin_unlock_irqrestore(&m->lock, flags);
                        return -EIO;
                } else {
-                       spin_unlock(&m->lock);
+                       spin_unlock_irqrestore(&m->lock, flags);
                        goto requeue;
                }
        }
-       spin_unlock(&m->lock);
+       spin_unlock_irqrestore(&m->lock, flags);
 
        if (hwh->type && hwh->type->error)
                err_flags = hwh->type->error(hwh, bio);
@@ -1040,12 +1041,12 @@ static int do_end_io(struct multipath *m, struct bio *bio,
        dm_bio_restore(&mpio->details, bio);
 
        /* queue for the daemon to resubmit or fail */
-       spin_lock(&m->lock);
+       spin_lock_irqsave(&m->lock, flags);
        bio_list_add(&m->queued_ios, bio);
        m->queue_size++;
        if (!m->queue_io)
                queue_work(kmultipathd, &m->process_queued_ios);
-       spin_unlock(&m->lock);
+       spin_unlock_irqrestore(&m->lock, flags);
 
        return 1;       /* io not complete */
 }
index 2375709a392cedb1540010e4665021fcca30b6a2..6b0fc16709295b7732a50e0ca97b5d1d1e009662 100644 (file)
@@ -376,16 +376,18 @@ static void rh_inc(struct region_hash *rh, region_t region)
        read_lock(&rh->hash_lock);
        reg = __rh_find(rh, region);
 
+       spin_lock_irq(&rh->region_lock);
        atomic_inc(&reg->pending);
 
-       spin_lock_irq(&rh->region_lock);
        if (reg->state == RH_CLEAN) {
-               rh->log->type->mark_region(rh->log, reg->key);
-
                reg->state = RH_DIRTY;
                list_del_init(&reg->list);      /* take off the clean list */
-       }
-       spin_unlock_irq(&rh->region_lock);
+               spin_unlock_irq(&rh->region_lock);
+
+               rh->log->type->mark_region(rh->log, reg->key);
+       } else
+               spin_unlock_irq(&rh->region_lock);
+
 
        read_unlock(&rh->hash_lock);
 }
@@ -408,21 +410,17 @@ static void rh_dec(struct region_hash *rh, region_t region)
        reg = __rh_lookup(rh, region);
        read_unlock(&rh->hash_lock);
 
+       spin_lock_irqsave(&rh->region_lock, flags);
        if (atomic_dec_and_test(&reg->pending)) {
-               spin_lock_irqsave(&rh->region_lock, flags);
-               if (atomic_read(&reg->pending)) { /* check race */
-                       spin_unlock_irqrestore(&rh->region_lock, flags);
-                       return;
-               }
                if (reg->state == RH_RECOVERING) {
                        list_add_tail(&reg->list, &rh->quiesced_regions);
                } else {
                        reg->state = RH_CLEAN;
                        list_add(&reg->list, &rh->clean_regions);
                }
-               spin_unlock_irqrestore(&rh->region_lock, flags);
                should_wake = 1;
        }
+       spin_unlock_irqrestore(&rh->region_lock, flags);
 
        if (should_wake)
                wake();
index a6d3baa46f6168e7f9143191abe22ffa5e2a65c2..a6f2dc66c3db12b09606218e1595e147b20c8a57 100644 (file)
@@ -638,7 +638,7 @@ int dm_split_args(int *argc, char ***argvp, char *input)
 static void check_for_valid_limits(struct io_restrictions *rs)
 {
        if (!rs->max_sectors)
-               rs->max_sectors = MAX_SECTORS;
+               rs->max_sectors = SAFE_MAX_SECTORS;
        if (!rs->max_phys_segments)
                rs->max_phys_segments = MAX_PHYS_SEGMENTS;
        if (!rs->max_hw_segments)
index 78c7418478d63e86f55127026d227bfae18e94a3..8175a2a222da8fc847f7a48f220eea7768414fb9 100644 (file)
@@ -1028,7 +1028,6 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                mddev->size = le64_to_cpu(sb->size)/2;
                mddev->events = le64_to_cpu(sb->events);
                mddev->bitmap_offset = 0;
-               mddev->default_bitmap_offset = 0;
                mddev->default_bitmap_offset = 1024;
                
                mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
@@ -1730,7 +1729,7 @@ level_show(mddev_t *mddev, char *page)
        if (p == NULL && mddev->raid_disks == 0)
                return 0;
        if (mddev->level >= 0)
-               return sprintf(page, "RAID-%d\n", mddev->level);
+               return sprintf(page, "raid%d\n", mddev->level);
        else
                return sprintf(page, "%s\n", p->name);
 }
@@ -2932,6 +2931,9 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
 
        mddev->sb_dirty      = 1;
 
+       mddev->default_bitmap_offset = MD_SB_BYTES >> 9;
+       mddev->bitmap_offset = 0;
+
        /*
         * Generate a 128 bit UUID
         */
index 2da9d3ba902dd1337ff2d724e46838f9d604f148..229d7b20429721f0939fd84d207bff5441127d4b 100644 (file)
@@ -320,7 +320,6 @@ 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:
                 */
                r1_bio->bios[mirror] = NULL;
-               bio_put(bio);
                if (!uptodate) {
                        md_error(r1_bio->mddev, conf->mirrors[mirror].rdev);
                        /* an I/O failed, we can't clear the bitmap */
@@ -377,7 +376,6 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
                }
                if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
                        /* free extra copy of the data pages */
-/* FIXME bio has been freed!!! */
                        int i = bio->bi_vcnt;
                        while (i--)
                                __free_page(bio->bi_io_vec[i].bv_page);
@@ -391,6 +389,9 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
                raid_end_bio_io(r1_bio);
        }
 
+       if (r1_bio->bios[mirror]==NULL)
+               bio_put(bio);
+
        rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
        return 0;
 }
@@ -953,9 +954,6 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
        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) {
 
@@ -972,7 +970,10 @@ 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)
+                       /* As all devices are equivalent, we don't need a full recovery
+                        * if this was recently any drive of the array
+                        */
+                       if (rdev->saved_raid_disk < 0)
                                conf->fullsync = 1;
                        rcu_assign_pointer(p->rdev, rdev);
                        break;
index 867f06ae33d944e8ef7178d28fc3fa8905d963b3..713dc9c2c73093a67348e473f2bfc47f888d6e3c 100644 (file)
@@ -552,7 +552,11 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio)
                    !test_bit(In_sync, &rdev->flags))
                        continue;
 
-               if (!atomic_read(&rdev->nr_pending)) {
+               /* This optimisation is debatable, and completely destroys
+                * sequential read speed for 'far copies' arrays.  So only
+                * keep it for 'near' arrays, and review those later.
+                */
+               if (conf->near_copies > 1 && !atomic_read(&rdev->nr_pending)) {
                        disk = ndisk;
                        slot = nslot;
                        break;
index e2a40283e323b46335beedb18face0aad67eae00..fafc4bc045f79082fe4c2d4d77a09327720af1c8 100644 (file)
@@ -98,7 +98,7 @@ static inline void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
                        list_add_tail(&sh->lru, &conf->inactive_list);
                        atomic_dec(&conf->active_stripes);
                        if (!conf->inactive_blocked ||
-                           atomic_read(&conf->active_stripes) < (NR_STRIPES*3/4))
+                           atomic_read(&conf->active_stripes) < (conf->max_nr_stripes*3/4))
                                wake_up(&conf->wait_for_stripe);
                }
        }
@@ -264,7 +264,8 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector
                                conf->inactive_blocked = 1;
                                wait_event_lock_irq(conf->wait_for_stripe,
                                                    !list_empty(&conf->inactive_list) &&
-                                                   (atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4)
+                                                   (atomic_read(&conf->active_stripes)
+                                                    < (conf->max_nr_stripes *3/4)
                                                     || !conf->inactive_blocked),
                                                    conf->device_lock,
                                                    unplug_slaves(conf->mddev);
@@ -1704,7 +1705,9 @@ static void raid5d (mddev_t *mddev)
 
                if (conf->seq_flush - conf->seq_write > 0) {
                        int seq = conf->seq_flush;
+                       spin_unlock_irq(&conf->device_lock);
                        bitmap_unplug(mddev->bitmap);
+                       spin_lock_irq(&conf->device_lock);
                        conf->seq_write = seq;
                        activate_bit_delay(conf);
                }
@@ -1915,7 +1918,7 @@ static int run(mddev_t *mddev)
                        goto abort;
                }
        }
-memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
+       memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
                 conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
        if (grow_stripes(conf, conf->max_nr_stripes)) {
                printk(KERN_ERR 
index eae5a35629c59101372d31518ecba9daa4e77814..0000d162d198a60d558ab4be3f54f608ff8b7473 100644 (file)
@@ -1702,6 +1702,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
        int data_disks = raid_disks - 2;
        sector_t max_sector = mddev->size << 1;
        int sync_blocks;
+       int still_degraded = 0;
+       int i;
 
        if (sector_nr >= max_sector) {
                /* just being told to finish up .. nothing much to do */
@@ -1710,7 +1712,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
                if (mddev->curr_resync < max_sector) /* aborted */
                        bitmap_end_sync(mddev->bitmap, mddev->curr_resync,
                                        &sync_blocks, 1);
-               else /* compelted sync */
+               else /* completed sync */
                        conf->fullsync = 0;
                bitmap_close_sync(mddev->bitmap);
 
@@ -1748,7 +1750,16 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
                 */
                schedule_timeout_uninterruptible(1);
        }
-       bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 0);
+       /* Need to check if array will still be degraded after recovery/resync
+        * We don't need to check the 'failed' flag as when that gets set,
+        * recovery aborts.
+        */
+       for (i=0; i<mddev->raid_disks; i++)
+               if (conf->disks[i].rdev == NULL)
+                       still_degraded = 1;
+
+       bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, still_degraded);
+
        spin_lock(&sh->lock);
        set_bit(STRIPE_SYNCING, &sh->state);
        clear_bit(STRIPE_INSYNC, &sh->state);
@@ -1784,7 +1795,9 @@ static void raid6d (mddev_t *mddev)
 
                if (conf->seq_flush - conf->seq_write > 0) {
                        int seq = conf->seq_flush;
+                       spin_unlock_irq(&conf->device_lock);
                        bitmap_unplug(mddev->bitmap);
+                       spin_lock_irq(&conf->device_lock);
                        conf->seq_write = seq;
                        activate_bit_delay(conf);
                }
@@ -2145,9 +2158,15 @@ static int raid6_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
                /* no point adding a device */
                return 0;
        /*
-        * find the disk ...
+        * find the disk ... but prefer rdev->saved_raid_disk
+        * if possible.
         */
-       for (disk=0; disk < mddev->raid_disks; disk++)
+       if (rdev->saved_raid_disk >= 0 &&
+           conf->disks[rdev->saved_raid_disk].rdev == NULL)
+               disk = rdev->saved_raid_disk;
+       else
+               disk = 0;
+       for ( ; disk < mddev->raid_disks; disk++)
                if ((p=conf->disks + disk)->rdev == NULL) {
                        clear_bit(In_sync, &rdev->flags);
                        rdev->raid_disk = disk;
index caebd0a1c021c28745ca089c784f7e35149ae9e9..6a901a0268e174a6cdfde7a4b08aee76ff956fe6 100644 (file)
@@ -1,12 +1,12 @@
 config VIDEO_SAA7146
-        tristate
+       tristate
        select I2C
 
 config VIDEO_SAA7146_VV
-        tristate
+       tristate
        select VIDEO_BUF
        select VIDEO_VIDEOBUF
        select VIDEO_SAA7146
 
 config VIDEO_VIDEOBUF
-        tristate
+       tristate
index 97b4341255ea5bcf9084adde0865b61dcda5daea..bd458cb9b4ea9c972ad13843a2ffabb5cc21f034 100644 (file)
@@ -1,5 +1,5 @@
-saa7146-objs    := saa7146_i2c.o saa7146_core.o 
-saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o  
+saa7146-objs    := saa7146_i2c.o saa7146_core.o
+saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
 
 obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
 obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
index 7972c73bc14eba1e1c3560a2c072cb28d917e624..97fa3fc571c419d34ec043f56f12863f9ea7132b 100644 (file)
@@ -313,6 +313,7 @@ void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
        if (ir_codes)
                memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));
 
+
        dev->keycode     = ir->ir_codes;
        dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
        dev->keycodemax  = IR_KEYTAB_SIZE;
index 206cc2f61f26154bb3f5e1a6b62e888ee74e8065..2899d34e5f7e3249c8be04ea941d2be7bb9af327 100644 (file)
@@ -174,8 +174,8 @@ void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
 
 int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
 {
-        u32          *cpu;
-        dma_addr_t   dma_addr;
+       u32          *cpu;
+       dma_addr_t   dma_addr;
 
        cpu = pci_alloc_consistent(pci, PAGE_SIZE, &dma_addr);
        if (NULL == cpu) {
@@ -405,7 +405,7 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
 
        pci_set_drvdata(pci, dev);
 
-        init_MUTEX(&dev->lock);
+       init_MUTEX(&dev->lock);
        spin_lock_init(&dev->int_slock);
        spin_lock_init(&dev->slock);
 
index 37888989ea2e36e75b55a9fa22b09947453eee03..09ec964dec5c07742e4afa923c80f7f360762a07 100644 (file)
@@ -1,6 +1,6 @@
 #include <media/saa7146_vv.h>
 
-#define BOARD_CAN_DO_VBI(dev)   (dev->revision != 0 && dev->vv_data->vbi_minor != -1) 
+#define BOARD_CAN_DO_VBI(dev)   (dev->revision != 0 && dev->vv_data->vbi_minor != -1)
 
 /****************************************************************************/
 /* resource management functions, shamelessly stolen from saa7134 driver */
@@ -102,9 +102,9 @@ void saa7146_buffer_finish(struct saa7146_dev *dev,
        /* finish current buffer */
        if (NULL == q->curr) {
                DEB_D(("aiii. no current buffer\n"));
-               return; 
+               return;
        }
-                       
+
        q->curr->vb.state = state;
        do_gettimeofday(&q->curr->vb.ts);
        wake_up(&q->curr->vb.done);
@@ -143,13 +143,13 @@ void saa7146_buffer_next(struct saa7146_dev *dev,
                        // fixme: fix this for vflip != 0
 
                        saa7146_write(dev, PROT_ADDR1, 0);
-                       saa7146_write(dev, MC2, (MASK_02|MASK_18));             
+                       saa7146_write(dev, MC2, (MASK_02|MASK_18));
 
                        /* write the address of the rps-program */
                        saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
                        /* turn on rps */
                        saa7146_write(dev, MC1, (MASK_12 | MASK_28));
-                               
+
 /*
                        printk("vdma%d.base_even:     0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
                        printk("vdma%d.base_odd:      0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
@@ -246,7 +246,7 @@ static int fops_open(struct inode *inode, struct file *file)
                goto out;
        }
        memset(fh,0,sizeof(*fh));
-       
+
        file->private_data = fh;
        fh->dev = dev;
        fh->type = type;
@@ -275,7 +275,7 @@ out:
                file->private_data = NULL;
        }
        up(&saa7146_devices_lock);
-        return result;
+       return result;
 }
 
 static int fops_release(struct inode *inode, struct file *file)
@@ -405,7 +405,7 @@ static struct file_operations video_fops =
 static void vv_callback(struct saa7146_dev *dev, unsigned long status)
 {
        u32 isr = status;
-       
+
        DEB_INT(("dev:%p, isr:0x%08x\n",dev,(u32)status));
 
        if (0 != (isr & (MASK_27))) {
@@ -454,11 +454,11 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
           handle different devices that might need different
           configuration data) */
        dev->ext_vv_data = ext_vv;
-       
+
        vv->video_minor = -1;
        vv->vbi_minor = -1;
 
-       vv->d_clipping.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_CLIPPING_MEM, &vv->d_clipping.dma_handle);     
+       vv->d_clipping.cpu_addr = pci_alloc_consistent(dev->pci, SAA7146_CLIPPING_MEM, &vv->d_clipping.dma_handle);
        if( NULL == vv->d_clipping.cpu_addr ) {
                ERR(("out of memory. aborting.\n"));
                kfree(vv);
@@ -468,7 +468,7 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
 
        saa7146_video_uops.init(dev,vv);
        saa7146_vbi_uops.init(dev,vv);
-       
+
        dev->vv_data = vv;
        dev->vv_callback = &vv_callback;
 
@@ -480,12 +480,12 @@ int saa7146_vv_release(struct saa7146_dev* dev)
        struct saa7146_vv *vv = dev->vv_data;
 
        DEB_EE(("dev:%p\n",dev));
+
        pci_free_consistent(dev->pci, SAA7146_RPS_MEM, vv->d_clipping.cpu_addr, vv->d_clipping.dma_handle);
-       kfree(vv);
+       kfree(vv);
        dev->vv_data = NULL;
        dev->vv_callback = NULL;
-       
+
        return 0;
 }
 
@@ -498,7 +498,7 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
        DEB_EE(("dev:%p, name:'%s', type:%d\n",dev,name,type));
 
        // released by vfd->release
-       vfd = video_device_alloc();
+       vfd = video_device_alloc();
        if (vfd == NULL)
                return -ENOMEM;
 
@@ -530,7 +530,7 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
 int saa7146_unregister_device(struct video_device **vid, struct saa7146_dev* dev)
 {
        struct saa7146_vv *vv = dev->vv_data;
-       
+
        DEB_EE(("dev:%p\n",dev));
 
        if( VFL_TYPE_GRABBER == (*vid)->type ) {
index fec6beab8c2873d95715f67a38b4d20bc97d04c9..8aabdd8fb3c53a5b928fa78ff3e1a3b9d9fd19c1 100644 (file)
@@ -276,8 +276,8 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
        int i = 0, count = 0;
        u32* buffer = dev->d_i2c.cpu_addr;
        int err = 0;
-        int address_err = 0;
-        int short_delay = 0;
+       int address_err = 0;
+       int short_delay = 0;
 
        if (down_interruptible (&dev->i2c_lock))
                return -ERESTARTSYS;
@@ -325,7 +325,7 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
                                        if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
                                                goto out;
                                        }
-                                       address_err++;
+                                       address_err++;
                                }
                                DEB_I2C(("error while sending message(s). starting again.\n"));
                                break;
@@ -336,14 +336,14 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
                        break;
                }
 
-               /* delay a bit before retrying */
-               msleep(10);
+               /* delay a bit before retrying */
+               msleep(10);
 
        } while (err != num && retries--);
 
-        /* if every retry had an address error, exit right away */
-        if (address_err == retries) {
-               goto out;
+       /* if every retry had an address error, exit right away */
+       if (address_err == retries) {
+               goto out;
        }
 
        /* if any things had to be read, get the results */
index cb86a97fda1faad89cfd12a3f40527803913c7a7..063986ec16b51752868cf1d8440875202327aac7 100644 (file)
@@ -6,8 +6,8 @@ static int vbi_workaround(struct saa7146_dev *dev)
 {
        struct saa7146_vv *vv = dev->vv_data;
 
-        u32          *cpu;
-        dma_addr_t   dma_addr;
+       u32          *cpu;
+       dma_addr_t   dma_addr;
 
        int count = 0;
        int i;
index 8dd4d15ca36d8f038531eacda23af1925a202cba..1d961023b837c973852225cc0ba621205d4651ed 100644 (file)
@@ -150,23 +150,23 @@ static int try_win(struct saa7146_dev *dev, struct v4l2_window *win)
        maxh  = vv->standard->v_max_out;
 
        if (V4L2_FIELD_ANY == field) {
-                field = (win->w.height > maxh/2)
-                        ? V4L2_FIELD_INTERLACED
-                        : V4L2_FIELD_TOP;
-               }
-        switch (field) {
-        case V4L2_FIELD_TOP:
-        case V4L2_FIELD_BOTTOM:
-        case V4L2_FIELD_ALTERNATE:
-                maxh = maxh / 2;
-                break;
-        case V4L2_FIELD_INTERLACED:
-                break;
-        default: {
+               field = (win->w.height > maxh/2)
+                       ? V4L2_FIELD_INTERLACED
+                       : V4L2_FIELD_TOP;
+               }
+       switch (field) {
+       case V4L2_FIELD_TOP:
+       case V4L2_FIELD_BOTTOM:
+       case V4L2_FIELD_ALTERNATE:
+               maxh = maxh / 2;
+               break;
+       case V4L2_FIELD_INTERLACED:
+               break;
+       default: {
                DEB_D(("no known field mode '%d'.\n",field));
-                return -EINVAL;
+               return -EINVAL;
+       }
        }
-        }
 
        win->field = field;
        if (win->w.width > maxw)
@@ -887,7 +887,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
 
                DEB_EE(("VIDIOC_QUERYCAP\n"));
 
-                strcpy(cap->driver, "saa7146 v4l2");
+               strcpy(cap->driver, "saa7146 v4l2");
                strlcpy(cap->card, dev->ext->name, sizeof(cap->card));
                sprintf(cap->bus_info,"PCI:%s", pci_name(dev->pci));
                cap->version = SAA7146_VERSION_CODE;
@@ -1011,19 +1011,19 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
                err = set_control(fh,arg);
                return err;
        }
-        case VIDIOC_G_PARM:
-        {
-                struct v4l2_streamparm *parm = arg;
+       case VIDIOC_G_PARM:
+       {
+               struct v4l2_streamparm *parm = arg;
                if( parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ) {
                        return -EINVAL;
                }
-                memset(&parm->parm.capture,0,sizeof(struct v4l2_captureparm));
+               memset(&parm->parm.capture,0,sizeof(struct v4l2_captureparm));
                parm->parm.capture.readbuffers = 1;
                // fixme: only for PAL!
                parm->parm.capture.timeperframe.numerator = 1;
                parm->parm.capture.timeperframe.denominator = 25;
-                return 0;
-        }
+               return 0;
+       }
        case VIDIOC_G_FMT:
        {
                struct v4l2_format *f = arg;
@@ -1383,7 +1383,7 @@ static struct videobuf_queue_ops video_qops = {
 
 static void video_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
 {
-        INIT_LIST_HEAD(&vv->video_q.queue);
+       INIT_LIST_HEAD(&vv->video_q.queue);
 
        init_timer(&vv->video_q.timeout);
        vv->video_q.timeout.function = saa7146_buffer_timeout;
index a94912ac1872797384b53f3f4a1e4cba24e476a8..344a3c898460768057e8efdf649ed5b0d937537c 100644 (file)
@@ -132,7 +132,7 @@ int flexcop_eeprom_check_mac_addr(struct flexcop_device *fc, int extended);
  * 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);
+                       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);
index a35330315f6597f4019026ca11649f0584bec1c3..21a9045b3ef6f1358cea5d823ed86dfb7553ba05 100644 (file)
@@ -298,7 +298,7 @@ static int flexcop_fe_request_firmware(struct dvb_frontend* fe, const struct fir
 }
 
 static int lgdt3303_pll_set(struct dvb_frontend* fe,
-                            struct dvb_frontend_parameters* params)
+                           struct dvb_frontend_parameters* params)
 {
        struct flexcop_device *fc = fe->dvb->priv;
        u8 buf[4];
@@ -332,7 +332,7 @@ static int lgdt3303_pll_set(struct dvb_frontend* fe,
                        return -EREMOTEIO;
        }
 
-        return 0;
+       return 0;
 }
 
 static struct lgdt330x_config air2pc_atsc_hd5000_config = {
index 75cf237196eb85203a9b8306cebd38850290d643..b386cc66c6b31e3b89a2b982e5ad8efede9fdead 100644 (file)
@@ -19,7 +19,7 @@ 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)
+static void flexcop_null_filter_ctrl(struct flexcop_device *fc, int onoff)
 {
        flexcop_set_ibi_value(ctrl_208,Null_filter_sig,onoff);
 }
index 0a78ba3737a58d85a64a7d902b30e9dfeeae4579..a6c91db40ad693b17a323a49034cf5b501f62eb0 100644 (file)
@@ -544,7 +544,6 @@ static struct usb_device_id flexcop_usb_table [] = {
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver flexcop_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "b2c2_flexcop_usb",
        .probe          = flexcop_usb_probe,
        .disconnect = flexcop_usb_disconnect,
index e6541aff39968597f67d390ab453e846bcc07d35..2239651969c88f236c073d691e4598722fdc27d3 100644 (file)
@@ -406,7 +406,7 @@ static int ca_send_message(struct dst_state *state, struct ca_msg *p_ca_message,
        }
        dprintk(verbose, DST_CA_DEBUG, 1, " ");
 
-       if (copy_from_user(p_ca_message, (void *)arg, sizeof (struct ca_msg))) {
+       if (copy_from_user(p_ca_message, arg, sizeof (struct ca_msg))) {
                result = -EFAULT;
                goto free_mem_and_exit;
        }
@@ -579,7 +579,7 @@ static int dst_ca_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static int dst_ca_read(struct file *file, char __user *buffer, size_t length, loff_t *offset)
+static ssize_t dst_ca_read(struct file *file, char __user *buffer, size_t length, loff_t *offset)
 {
        int bytes_read = 0;
 
@@ -588,7 +588,7 @@ static int dst_ca_read(struct file *file, char __user *buffer, size_t length, lo
        return bytes_read;
 }
 
-static int dst_ca_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset)
+static ssize_t dst_ca_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset)
 {
        dprintk(verbose, DST_CA_DEBUG, 1, " Device write.");
 
index 2e398090cf63e1e70d3af43aee7b9079862aa760..77977e9c013e7d1e1bfd0b157a5f461e9418502b 100644 (file)
@@ -556,9 +556,9 @@ static int tdvs_tua6034_pll_set(struct dvb_frontend* fe, struct dvb_frontend_par
        dprintk("%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n",
                __FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]);
        if ((err = i2c_transfer(card->i2c_adapter, &msg, 1)) != 1) {
-               printk(KERN_WARNING "dvb-bt8xx: %s error "
-                       "(addr %02x <- %02x, err = %i)\n",
-                       __FUNCTION__, buf[0], buf[1], err);
+               printk(KERN_WARNING "dvb-bt8xx: %s error "
+                       "(addr %02x <- %02x, err = %i)\n",
+                       __FUNCTION__, buf[0], buf[1], err);
                if (err < 0)
                        return err;
                else
index fb394a0d838c8df550b523eee0e17e7ad908cda2..b996fb59b7e44bfbda4b448ade43995c870984fb 100644 (file)
@@ -772,7 +772,7 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
        input_dev->name = DRIVER_NAME " remote control";
        input_dev->phys = cinergyt2->phys;
        input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
-       for (i = 0; ARRAY_SIZE(rc_keys); i += 3)
+       for (i = 0; i < ARRAY_SIZE(rc_keys); i += 3)
                set_bit(rc_keys[i + 2], input_dev->keybit);
        input_dev->keycodesize = 0;
        input_dev->keycodemax = 0;
@@ -986,7 +986,6 @@ static const struct usb_device_id cinergyt2_table [] __devinitdata = {
 MODULE_DEVICE_TABLE(usb, cinergyt2_table);
 
 static struct usb_driver cinergyt2_driver = {
-       .owner  = THIS_MODULE,
        .name   = "cinergyT2",
        .probe  = cinergyt2_probe,
        .disconnect     = cinergyt2_disconnect,
index 7d7b0067f2281740f4e3393687744742ccbb948b..9f025825b2d2ca816940254fbd3fb8f4dcf9145a 100644 (file)
@@ -86,25 +86,25 @@ enum dmx_success {
 
 enum dmx_ts_pes
 {  /* also send packets to decoder (if it exists) */
-        DMX_TS_PES_AUDIO0,
+       DMX_TS_PES_AUDIO0,
        DMX_TS_PES_VIDEO0,
        DMX_TS_PES_TELETEXT0,
        DMX_TS_PES_SUBTITLE0,
        DMX_TS_PES_PCR0,
 
-        DMX_TS_PES_AUDIO1,
+       DMX_TS_PES_AUDIO1,
        DMX_TS_PES_VIDEO1,
        DMX_TS_PES_TELETEXT1,
        DMX_TS_PES_SUBTITLE1,
        DMX_TS_PES_PCR1,
 
-        DMX_TS_PES_AUDIO2,
+       DMX_TS_PES_AUDIO2,
        DMX_TS_PES_VIDEO2,
        DMX_TS_PES_TELETEXT2,
        DMX_TS_PES_SUBTITLE2,
        DMX_TS_PES_PCR2,
 
-        DMX_TS_PES_AUDIO3,
+       DMX_TS_PES_AUDIO3,
        DMX_TS_PES_VIDEO3,
        DMX_TS_PES_TELETEXT3,
        DMX_TS_PES_SUBTITLE3,
@@ -121,17 +121,17 @@ enum dmx_ts_pes
 
 
 struct dmx_ts_feed {
-        int is_filtering; /* Set to non-zero when filtering in progress */
-        struct dmx_demux *parent; /* Back-pointer */
-        void *priv; /* Pointer to private data of the API client */
-        int (*set) (struct dmx_ts_feed *feed,
+       int is_filtering; /* Set to non-zero when filtering in progress */
+       struct dmx_demux *parent; /* Back-pointer */
+       void *priv; /* Pointer to private data of the API client */
+       int (*set) (struct dmx_ts_feed *feed,
                    u16 pid,
                    int type,
                    enum dmx_ts_pes pes_type,
                    size_t circular_buffer_size,
                    struct timespec timeout);
-        int (*start_filtering) (struct dmx_ts_feed* feed);
-        int (*stop_filtering) (struct dmx_ts_feed* feed);
+       int (*start_filtering) (struct dmx_ts_feed* feed);
+       int (*stop_filtering) (struct dmx_ts_feed* feed);
 };
 
 /*--------------------------------------------------------------------------*/
@@ -139,35 +139,35 @@ struct dmx_ts_feed {
 /*--------------------------------------------------------------------------*/
 
 struct dmx_section_filter {
-        u8 filter_value [DMX_MAX_FILTER_SIZE];
-        u8 filter_mask [DMX_MAX_FILTER_SIZE];
-        u8 filter_mode [DMX_MAX_FILTER_SIZE];
-        struct dmx_section_feed* parent; /* Back-pointer */
-        void* priv; /* Pointer to private data of the API client */
+       u8 filter_value [DMX_MAX_FILTER_SIZE];
+       u8 filter_mask [DMX_MAX_FILTER_SIZE];
+       u8 filter_mode [DMX_MAX_FILTER_SIZE];
+       struct dmx_section_feed* parent; /* Back-pointer */
+       void* priv; /* Pointer to private data of the API client */
 };
 
 struct dmx_section_feed {
-        int is_filtering; /* Set to non-zero when filtering in progress */
-        struct dmx_demux* parent; /* Back-pointer */
-        void* priv; /* Pointer to private data of the API client */
+       int is_filtering; /* Set to non-zero when filtering in progress */
+       struct dmx_demux* parent; /* Back-pointer */
+       void* priv; /* Pointer to private data of the API client */
 
-        int check_crc;
+       int check_crc;
        u32 crc_val;
 
-        u8 *secbuf;
-        u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
-        u16 secbufp, seclen, tsfeedp;
+       u8 *secbuf;
+       u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
+       u16 secbufp, seclen, tsfeedp;
 
-        int (*set) (struct dmx_section_feed* feed,
+       int (*set) (struct dmx_section_feed* feed,
                    u16 pid,
                    size_t circular_buffer_size,
                    int check_crc);
-        int (*allocate_filter) (struct dmx_section_feed* feed,
+       int (*allocate_filter) (struct dmx_section_feed* feed,
                                struct dmx_section_filter** filter);
-        int (*release_filter) (struct dmx_section_feed* feed,
+       int (*release_filter) (struct dmx_section_feed* feed,
                               struct dmx_section_filter* filter);
-        int (*start_filtering) (struct dmx_section_feed* feed);
-        int (*stop_filtering) (struct dmx_section_feed* feed);
+       int (*start_filtering) (struct dmx_section_feed* feed);
+       int (*stop_filtering) (struct dmx_section_feed* feed);
 };
 
 /*--------------------------------------------------------------------------*/
@@ -205,10 +205,10 @@ enum dmx_frontend_source {
 };
 
 struct dmx_frontend {
-        struct list_head connectivity_list; /* List of front-ends that can
+       struct list_head connectivity_list; /* List of front-ends that can
                                               be connected to a particular
                                               demux */
-        enum dmx_frontend_source source;
+       enum dmx_frontend_source source;
 };
 
 /*--------------------------------------------------------------------------*/
@@ -240,38 +240,38 @@ struct dmx_frontend {
 #define DMX_FE_ENTRY(list) list_entry(list, struct dmx_frontend, connectivity_list)
 
 struct dmx_demux {
-        u32 capabilities;            /* Bitfield of capability flags */
-        struct dmx_frontend* frontend;    /* Front-end connected to the demux */
-        void* priv;                  /* Pointer to private data of the API client */
-        int (*open) (struct dmx_demux* demux);
-        int (*close) (struct dmx_demux* demux);
-        int (*write) (struct dmx_demux* demux, const char* buf, size_t count);
-        int (*allocate_ts_feed) (struct dmx_demux* demux,
+       u32 capabilities;            /* Bitfield of capability flags */
+       struct dmx_frontend* frontend;    /* Front-end connected to the demux */
+       void* priv;                  /* Pointer to private data of the API client */
+       int (*open) (struct dmx_demux* demux);
+       int (*close) (struct dmx_demux* demux);
+       int (*write) (struct dmx_demux* demux, const char* buf, size_t count);
+       int (*allocate_ts_feed) (struct dmx_demux* demux,
                                 struct dmx_ts_feed** feed,
                                 dmx_ts_cb callback);
-        int (*release_ts_feed) (struct dmx_demux* demux,
+       int (*release_ts_feed) (struct dmx_demux* demux,
                                struct dmx_ts_feed* feed);
-        int (*allocate_section_feed) (struct dmx_demux* demux,
+       int (*allocate_section_feed) (struct dmx_demux* demux,
                                      struct dmx_section_feed** feed,
                                      dmx_section_cb callback);
-        int (*release_section_feed) (struct dmx_demux* demux,
+       int (*release_section_feed) (struct dmx_demux* demux,
                                     struct dmx_section_feed* feed);
-        int (*add_frontend) (struct dmx_demux* demux,
+       int (*add_frontend) (struct dmx_demux* demux,
                             struct dmx_frontend* frontend);
-        int (*remove_frontend) (struct dmx_demux* demux,
+       int (*remove_frontend) (struct dmx_demux* demux,
                                struct dmx_frontend* frontend);
-        struct list_head* (*get_frontends) (struct dmx_demux* demux);
-        int (*connect_frontend) (struct dmx_demux* demux,
+       struct list_head* (*get_frontends) (struct dmx_demux* demux);
+       int (*connect_frontend) (struct dmx_demux* demux,
                                 struct dmx_frontend* frontend);
-        int (*disconnect_frontend) (struct dmx_demux* demux);
+       int (*disconnect_frontend) (struct dmx_demux* demux);
 
-        int (*get_pes_pids) (struct dmx_demux* demux, u16 *pids);
+       int (*get_pes_pids) (struct dmx_demux* demux, u16 *pids);
 
        int (*get_caps) (struct dmx_demux* demux, struct dmx_caps *caps);
 
        int (*set_source) (struct dmx_demux* demux, const dmx_source_t *src);
 
-        int (*get_stc) (struct dmx_demux* demux, unsigned int num,
+       int (*get_stc) (struct dmx_demux* demux, unsigned int num,
                        u64 *stc, unsigned int *base);
 };
 
index 8028c3a5e287c8a5abe8a42b73984545df911506..7b8373ad121b051cccbcbd675ca32e4f9d16efaa 100644 (file)
@@ -947,7 +947,7 @@ static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
 
        case DMX_GET_STC:
                if (!dmxdev->demux->get_stc) {
-                       ret=-EINVAL;
+                       ret=-EINVAL;
                        break;
                }
                ret = dmxdev->demux->get_stc(dmxdev->demux,
index 395a9cd75012c148bb0142adcaeb2e9dd67b1931..fd72920c21998586cab856d1796f543460d2968d 100644 (file)
@@ -53,51 +53,51 @@ enum dmxdev_state {
 };
 
 struct dmxdev_buffer {
-        u8 *data;
-        int size;
-        int pread;
-        int pwrite;
+       u8 *data;
+       int size;
+       int pread;
+       int pwrite;
        wait_queue_head_t queue;
-        int error;
+       int error;
 };
 
 struct dmxdev_filter {
        struct dvb_device *dvbdev;
 
-        union {
-               struct dmx_section_filter *sec;
+       union {
+               struct dmx_section_filter *sec;
        } filter;
 
-        union {
-                struct dmx_ts_feed *ts;
-                struct dmx_section_feed *sec;
+       union {
+               struct dmx_ts_feed *ts;
+               struct dmx_section_feed *sec;
        } feed;
 
-        union {
-               struct dmx_sct_filter_params sec;
-               struct dmx_pes_filter_params pes;
+       union {
+               struct dmx_sct_filter_params sec;
+               struct dmx_pes_filter_params pes;
        } params;
 
-        int type;
-        enum dmxdev_state state;
-        struct dmxdev *dev;
-        struct dmxdev_buffer buffer;
+       int type;
+       enum dmxdev_state state;
+       struct dmxdev *dev;
+       struct dmxdev_buffer buffer;
 
        struct semaphore mutex;
 
-        /* only for sections */
-        struct timer_list timer;
-        int todo;
-        u8 secheader[3];
+       /* only for sections */
+       struct timer_list timer;
+       int todo;
+       u8 secheader[3];
 
-        u16 pid;
+       u16 pid;
 };
 
 
 struct dmxdev_dvr {
-        int state;
-        struct dmxdev *dev;
-        struct dmxdev_buffer buffer;
+       int state;
+       struct dmxdev *dev;
+       struct dmxdev_buffer buffer;
 };
 
 
@@ -105,16 +105,16 @@ struct dmxdev {
        struct dvb_device *dvbdev;
        struct dvb_device *dvr_dvbdev;
 
-        struct dmxdev_filter *filter;
-        struct dmxdev_dvr *dvr;
-        struct dmx_demux *demux;
+       struct dmxdev_filter *filter;
+       struct dmxdev_dvr *dvr;
+       struct dmx_demux *demux;
 
-        int filternum;
-        int capabilities;
+       int filternum;
+       int capabilities;
 #define DMXDEV_CAP_DUPLEX 1
-        struct dmx_frontend *dvr_orig_fe;
+       struct dmx_frontend *dvr_orig_fe;
 
-        struct dmxdev_buffer dvr_buffer;
+       struct dmxdev_buffer dvr_buffer;
 #define DVR_BUFFER_SIZE (10*188*1024)
 
        struct semaphore mutex;
index 2aa767f9bd7dd88f797c8b9d48d485289661cb8a..5956c35d34accd234cf1cf5ecf4bc0fdd0a2f12f 100644 (file)
@@ -35,7 +35,7 @@
 #include <linux/moduleparam.h>
 #include <linux/vmalloc.h>
 #include <linux/delay.h>
-#include <linux/rwsem.h>
+#include <linux/spinlock.h>
 #include <linux/sched.h>
 
 #include "dvb_ca_en50221.h"
@@ -111,9 +111,6 @@ struct dvb_ca_slot {
        /* size of the buffer to use when talking to the CAM */
        int link_buf_size;
 
-       /* semaphore for syncing access to slot structure */
-       struct rw_semaphore sem;
-
        /* buffer for incoming packets */
        struct dvb_ringbuffer rx_buffer;
 
@@ -501,7 +498,7 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
        /* process the CFTABLE_ENTRY tuples, and any after those */
        while ((!end_chain) && (address < 0x1000)) {
                if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
-                                                       &tupleLength, tuple)) < 0)
+                                                       &tupleLength, tuple)) < 0)
                        return status;
                switch (tupleType) {
                case 0x1B:      // CISTPL_CFTABLE_ENTRY
@@ -602,14 +599,11 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * eb
        if (ebuf == NULL) {
                int buf_free;
 
-               down_read(&ca->slot_info[slot].sem);
                if (ca->slot_info[slot].rx_buffer.data == NULL) {
-                       up_read(&ca->slot_info[slot].sem);
                        status = -EIO;
                        goto exit;
                }
                buf_free = dvb_ringbuffer_free(&ca->slot_info[slot].rx_buffer);
-               up_read(&ca->slot_info[slot].sem);
 
                if (buf_free < (ca->slot_info[slot].link_buf_size + DVB_RINGBUFFER_PKTHDRSIZE)) {
                        status = -EAGAIN;
@@ -680,14 +674,11 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * eb
 
        /* OK, add it to the receive buffer, or copy into external buffer if supplied */
        if (ebuf == NULL) {
-               down_read(&ca->slot_info[slot].sem);
                if (ca->slot_info[slot].rx_buffer.data == NULL) {
-                       up_read(&ca->slot_info[slot].sem);
                        status = -EIO;
                        goto exit;
                }
                dvb_ringbuffer_pkt_write(&ca->slot_info[slot].rx_buffer, buf, bytes_read);
-               up_read(&ca->slot_info[slot].sem);
        } else {
                memcpy(ebuf, buf, bytes_read);
        }
@@ -802,12 +793,8 @@ static int dvb_ca_en50221_slot_shutdown(struct dvb_ca_private *ca, int slot)
 {
        dprintk("%s\n", __FUNCTION__);
 
-       down_write(&ca->slot_info[slot].sem);
        ca->pub->slot_shutdown(ca->pub, slot);
        ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
-       vfree(ca->slot_info[slot].rx_buffer.data);
-       ca->slot_info[slot].rx_buffer.data = NULL;
-       up_write(&ca->slot_info[slot].sem);
 
        /* need to wake up all processes to check if they're now
           trying to write to a defunct CAM */
@@ -893,7 +880,7 @@ void dvb_ca_en50221_frda_irq(struct dvb_ca_en50221 *pubca, int slot)
 
        case DVB_CA_SLOTSTATE_RUNNING:
                if (ca->open)
-                       dvb_ca_en50221_read_data(ca, slot, NULL, 0);
+                       dvb_ca_en50221_thread_wakeup(ca);
                break;
        }
 }
@@ -1127,16 +1114,16 @@ static int dvb_ca_en50221_thread(void *data)
                                        break;
                                }
 
-                               rxbuf = vmalloc(RX_BUFFER_SIZE);
-                               if (rxbuf == NULL) {
-                                       printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num);
-                                       ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
-                                       dvb_ca_en50221_thread_update_delay(ca);
-                                       break;
+                               if (ca->slot_info[slot].rx_buffer.data == NULL) {
+                                       rxbuf = vmalloc(RX_BUFFER_SIZE);
+                                       if (rxbuf == NULL) {
+                                               printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num);
+                                               ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
+                                               dvb_ca_en50221_thread_update_delay(ca);
+                                               break;
+                                       }
+                                       dvb_ringbuffer_init(&ca->slot_info[slot].rx_buffer, rxbuf, RX_BUFFER_SIZE);
                                }
-                               down_write(&ca->slot_info[slot].sem);
-                               dvb_ringbuffer_init(&ca->slot_info[slot].rx_buffer, rxbuf, RX_BUFFER_SIZE);
-                               up_write(&ca->slot_info[slot].sem);
 
                                ca->pub->slot_ts_enable(ca->pub, slot);
                                ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_RUNNING;
@@ -1148,11 +1135,7 @@ static int dvb_ca_en50221_thread(void *data)
                                if (!ca->open)
                                        continue;
 
-                               // no need to poll if the CAM supports IRQs
-                               if (ca->slot_info[slot].da_irq_supported)
-                                       break;
-
-                               // poll mode
+                               // poll slots for data
                                pktcount = 0;
                                while ((status = dvb_ca_en50221_read_data(ca, slot, NULL, 0)) > 0) {
                                        if (!ca->open)
@@ -1367,12 +1350,13 @@ exit:
 /**
  * Condition for waking up in dvb_ca_en50221_io_read_condition
  */
-static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *result, int *_slot)
+static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca,
+                                           int *result, int *_slot)
 {
        int slot;
        int slot_count = 0;
        int idx;
-       int fraglen;
+       size_t fraglen;
        int connection_id = -1;
        int found = 0;
        u8 hdr[2];
@@ -1382,10 +1366,7 @@ static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *resu
                if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING)
                        goto nextslot;
 
-               down_read(&ca->slot_info[slot].sem);
-
                if (ca->slot_info[slot].rx_buffer.data == NULL) {
-                       up_read(&ca->slot_info[slot].sem);
                        return 0;
                }
 
@@ -1403,10 +1384,7 @@ static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca, int *resu
                        idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, idx, &fraglen);
                }
 
-               if (!found)
-                       up_read(&ca->slot_info[slot].sem);
-
-             nextslot:
+nextslot:
                slot = (slot + 1) % ca->slot_count;
                slot_count++;
        }
@@ -1511,8 +1489,7 @@ static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
                goto exit;
        status = pktlen;
 
-      exit:
-       up_read(&ca->slot_info[slot].sem);
+exit:
        return status;
 }
 
@@ -1544,11 +1521,11 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
        for (i = 0; i < ca->slot_count; i++) {
 
                if (ca->slot_info[i].slot_state == DVB_CA_SLOTSTATE_RUNNING) {
-                       down_write(&ca->slot_info[i].sem);
                        if (ca->slot_info[i].rx_buffer.data != NULL) {
+                               /* it is safe to call this here without locks because
+                                * ca->open == 0. Data is not read in this case */
                                dvb_ringbuffer_flush(&ca->slot_info[i].rx_buffer);
                        }
-                       up_write(&ca->slot_info[i].sem);
                }
        }
 
@@ -1607,7 +1584,6 @@ static unsigned int dvb_ca_en50221_io_poll(struct file *file, poll_table * wait)
        dprintk("%s\n", __FUNCTION__);
 
        if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
-               up_read(&ca->slot_info[slot].sem);
                mask |= POLLIN;
        }
 
@@ -1619,7 +1595,6 @@ static unsigned int dvb_ca_en50221_io_poll(struct file *file, poll_table * wait)
        poll_wait(file, &ca->wait_queue, wait);
 
        if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
-               up_read(&ca->slot_info[slot].sem);
                mask |= POLLIN;
        }
 
@@ -1709,7 +1684,6 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
                ca->slot_info[i].slot_state = DVB_CA_SLOTSTATE_NONE;
                atomic_set(&ca->slot_info[i].camchange_count, 0);
                ca->slot_info[i].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
-               init_rwsem(&ca->slot_info[i].sem);
        }
 
        if (signal_pending(current)) {
@@ -1729,7 +1703,7 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
        ca->thread_pid = ret;
        return 0;
 
-      error:
+error:
        if (ca != NULL) {
                if (ca->dvbdev != NULL)
                        dvb_unregister_device(ca->dvbdev);
@@ -1771,6 +1745,9 @@ void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)
 
        for (i = 0; i < ca->slot_count; i++) {
                dvb_ca_en50221_slot_shutdown(ca, i);
+               if (ca->slot_info[i].rx_buffer.data != NULL) {
+                       vfree(ca->slot_info[i].rx_buffer.data);
+               }
        }
        kfree(ca->slot_info);
        dvb_unregister_device(ca->dvbdev);
index bd5143906084dea1eb1b26ab5ee29553a2363a25..c49fd0bd7181dd89a2c67d73a891e5073cde6e9f 100644 (file)
@@ -72,12 +72,12 @@ static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, in
        u8 pct;
 
        if (pr) printk( "Pic header: ");
-        pic->temporal_reference[field] = (( headr[0] << 2 ) |
+       pic->temporal_reference[field] = (( headr[0] << 2 ) |
                                          (headr[1] & 0x03) )& 0x03ff;
        if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
 
        pct = ( headr[1] >> 2 ) & 0x07;
-        pic->picture_coding_type[field] = pct;
+       pic->picture_coding_type[field] = pct;
        if (pr) {
                switch(pct){
                        case I_FRAME:
@@ -93,17 +93,17 @@ static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, in
        }
 
 
-        pic->vinfo.vbv_delay  = (( headr[1] >> 5 ) | ( headr[2] << 3) |
+       pic->vinfo.vbv_delay  = (( headr[1] >> 5 ) | ( headr[2] << 3) |
                                 ( (headr[3] & 0x1F) << 11) ) & 0xffff;
 
        if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
 
-        pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
+       pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
                ((headr[4] & 0x80) >> 3);
 
-        if ( pct == B_FRAME ){
-                pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
-        }
+       if ( pct == B_FRAME ){
+               pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
+       }
        if (pr) printk( " pic head param: 0x%x",
                        pic->picture_header_parameter);
 
@@ -124,18 +124,18 @@ static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
                       ((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
                       ((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
 
-        if ( ( headr[3] & 0x40 ) != 0 ){
-                pic->closed_gop = 1;
-        } else {
-                pic->closed_gop = 0;
-        }
+       if ( ( headr[3] & 0x40 ) != 0 ){
+               pic->closed_gop = 1;
+       } else {
+               pic->closed_gop = 0;
+       }
        if (pr) printk("closed: %d", pic->closed_gop);
 
-        if ( ( headr[3] & 0x20 ) != 0 ){
-                pic->broken_link = 1;
-        } else {
-                pic->broken_link = 0;
-        }
+       if ( ( headr[3] & 0x20 ) != 0 ){
+               pic->broken_link = 1;
+       } else {
+               pic->broken_link = 0;
+       }
        if (pr) printk(" broken: %d\n", pic->broken_link);
 
        return 0;
@@ -146,7 +146,7 @@ static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
 /* needs 8 byte input */
 static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
 {
-        int sw;
+       int sw;
        int form = -1;
 
        if (pr) printk("Reading sequence header\n");
@@ -154,9 +154,9 @@ static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
        vi->horizontal_size     = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
        vi->vertical_size       = ((headr[1] &0x0F) << 8) | (headr[2]);
 
-        sw = (int)((headr[3]&0xF0) >> 4) ;
+       sw = (int)((headr[3]&0xF0) >> 4) ;
 
-        switch( sw ){
+       switch( sw ){
        case 1:
                if (pr)
                        printk("Videostream: ASPECT: 1:1");
@@ -165,84 +165,84 @@ static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
        case 2:
                if (pr)
                        printk("Videostream: ASPECT: 4:3");
-                vi->aspect_ratio = 133;
+               vi->aspect_ratio = 133;
                break;
        case 3:
                if (pr)
                        printk("Videostream: ASPECT: 16:9");
-                vi->aspect_ratio = 177;
+               vi->aspect_ratio = 177;
                break;
        case 4:
                if (pr)
                        printk("Videostream: ASPECT: 2.21:1");
-                vi->aspect_ratio = 221;
+               vi->aspect_ratio = 221;
                break;
 
-        case 5 ... 15:
+       case 5 ... 15:
                if (pr)
                        printk("Videostream: ASPECT: reserved");
-                vi->aspect_ratio = 0;
+               vi->aspect_ratio = 0;
                break;
 
-        default:
-                vi->aspect_ratio = 0;
-                return -1;
+       default:
+               vi->aspect_ratio = 0;
+               return -1;
        }
 
        if (pr)
                printk("  Size = %dx%d",vi->horizontal_size,vi->vertical_size);
 
-        sw = (int)(headr[3]&0x0F);
+       sw = (int)(headr[3]&0x0F);
 
-        switch ( sw ) {
+       switch ( sw ) {
        case 1:
                if (pr)
                        printk("  FRate: 23.976 fps");
-                vi->framerate = 23976;
+               vi->framerate = 23976;
                form = -1;
                break;
        case 2:
                if (pr)
                        printk("  FRate: 24 fps");
-                vi->framerate = 24000;
+               vi->framerate = 24000;
                form = -1;
                break;
        case 3:
                if (pr)
                        printk("  FRate: 25 fps");
-                vi->framerate = 25000;
+               vi->framerate = 25000;
                form = VIDEO_MODE_PAL;
                break;
        case 4:
                if (pr)
                        printk("  FRate: 29.97 fps");
-                vi->framerate = 29970;
+               vi->framerate = 29970;
                form = VIDEO_MODE_NTSC;
                break;
        case 5:
                if (pr)
                        printk("  FRate: 30 fps");
-                vi->framerate = 30000;
+               vi->framerate = 30000;
                form = VIDEO_MODE_NTSC;
                break;
        case 6:
                if (pr)
                        printk("  FRate: 50 fps");
-                vi->framerate = 50000;
+               vi->framerate = 50000;
                form = VIDEO_MODE_PAL;
                break;
        case 7:
                if (pr)
                        printk("  FRate: 60 fps");
-                vi->framerate = 60000;
+               vi->framerate = 60000;
                form = VIDEO_MODE_NTSC;
                break;
        }
 
        vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
 
-        vi->vbv_buffer_size
-                = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
+       vi->vbv_buffer_size
+               = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
 
        if (pr){
                printk("  BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
@@ -250,7 +250,7 @@ static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
                printk("\n");
        }
 
-        vi->video_format = form;
+       vi->video_format = form;
 
        return 0;
 }
@@ -308,7 +308,7 @@ static int get_ainfo(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
        if (!found) return -1;
 
        if (c+3 >= count) return -1;
-        headr = mbuf+c;
+       headr = mbuf+c;
 
        ai->layer = (headr[1] & 0x06) >> 1;
 
@@ -368,7 +368,7 @@ int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int p
        if (c+5 >= count) return -1;
 
        ai->layer = 0;  // 0 for AC3
-        headr = mbuf+c+2;
+       headr = mbuf+c+2;
 
        frame = (headr[2]&0x3f);
        ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
@@ -396,159 +396,159 @@ EXPORT_SYMBOL(dvb_filter_get_ac3info);
 #if 0
 static u8 *skip_pes_header(u8 **bufp)
 {
-        u8 *inbuf = *bufp;
-        u8 *buf = inbuf;
-        u8 *pts = NULL;
-        int skip = 0;
+       u8 *inbuf = *bufp;
+       u8 *buf = inbuf;
+       u8 *pts = NULL;
+       int skip = 0;
 
        static const int mpeg1_skip_table[16] = {
                1, 0xffff,      5,     10, 0xffff, 0xffff, 0xffff, 0xffff,
-               0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+               0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
        };
 
 
-        if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
-                if (buf[7] & PTS_ONLY)
-                        pts = buf+9;
-                else pts = NULL;
-                buf = inbuf + 9 + inbuf[8];
-        } else {        /* mpeg1 */
-                for (buf = inbuf + 6; *buf == 0xff; buf++)
-                        if (buf == inbuf + 6 + 16) {
-                                break;
-                        }
-                if ((*buf & 0xc0) == 0x40)
-                        buf += 2;
-                skip = mpeg1_skip_table [*buf >> 4];
-                if (skip == 5 || skip == 10) pts = buf;
-                else pts = NULL;
-
-                buf += mpeg1_skip_table [*buf >> 4];
-        }
-
-        *bufp = buf;
-        return pts;
+       if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
+               if (buf[7] & PTS_ONLY)
+                       pts = buf+9;
+               else pts = NULL;
+               buf = inbuf + 9 + inbuf[8];
+       } else {        /* mpeg1 */
+               for (buf = inbuf + 6; *buf == 0xff; buf++)
+                       if (buf == inbuf + 6 + 16) {
+                               break;
+                       }
+               if ((*buf & 0xc0) == 0x40)
+                       buf += 2;
+               skip = mpeg1_skip_table [*buf >> 4];
+               if (skip == 5 || skip == 10) pts = buf;
+               else pts = NULL;
+
+               buf += mpeg1_skip_table [*buf >> 4];
+       }
+
+       *bufp = buf;
+       return pts;
 }
 #endif
 
 #if 0
 static void initialize_quant_matrix( u32 *matrix )
 {
-        int i;
-
-        matrix[0]  = 0x08101013;
-        matrix[1]  = 0x10131616;
-        matrix[2]  = 0x16161616;
-        matrix[3]  = 0x1a181a1b;
-        matrix[4]  = 0x1b1b1a1a;
-        matrix[5]  = 0x1a1a1b1b;
-        matrix[6]  = 0x1b1d1d1d;
-        matrix[7]  = 0x2222221d;
-        matrix[8]  = 0x1d1d1b1b;
-        matrix[9]  = 0x1d1d2020;
-        matrix[10] = 0x22222526;
-        matrix[11] = 0x25232322;
-        matrix[12] = 0x23262628;
-        matrix[13] = 0x28283030;
-        matrix[14] = 0x2e2e3838;
-        matrix[15] = 0x3a454553;
-
-        for ( i = 16 ; i < 32 ; i++ )
-                matrix[i] = 0x10101010;
+       int i;
+
+       matrix[0]  = 0x08101013;
+       matrix[1]  = 0x10131616;
+       matrix[2]  = 0x16161616;
+       matrix[3]  = 0x1a181a1b;
+       matrix[4]  = 0x1b1b1a1a;
+       matrix[5]  = 0x1a1a1b1b;
+       matrix[6]  = 0x1b1d1d1d;
+       matrix[7]  = 0x2222221d;
+       matrix[8]  = 0x1d1d1b1b;
+       matrix[9]  = 0x1d1d2020;
+       matrix[10] = 0x22222526;
+       matrix[11] = 0x25232322;
+       matrix[12] = 0x23262628;
+       matrix[13] = 0x28283030;
+       matrix[14] = 0x2e2e3838;
+       matrix[15] = 0x3a454553;
+
+       for ( i = 16 ; i < 32 ; i++ )
+               matrix[i] = 0x10101010;
 }
 #endif
 
 #if 0
 static void initialize_mpg_picture(struct mpg_picture *pic)
 {
-        int i;
-
-        /* set MPEG1 */
-        pic->mpeg1_flag = 1;
-        pic->profile_and_level = 0x4A ;        /* MP@LL */
-        pic->progressive_sequence = 1;
-        pic->low_delay = 0;
-
-        pic->sequence_display_extension_flag = 0;
-        for ( i = 0 ; i < 4 ; i++ ){
-                pic->frame_centre_horizontal_offset[i] = 0;
-                pic->frame_centre_vertical_offset[i] = 0;
-        }
-        pic->last_frame_centre_horizontal_offset = 0;
-        pic->last_frame_centre_vertical_offset = 0;
-
-        pic->picture_display_extension_flag[0] = 0;
-        pic->picture_display_extension_flag[1] = 0;
-        pic->sequence_header_flag = 0;
+       int i;
+
+       /* set MPEG1 */
+       pic->mpeg1_flag = 1;
+       pic->profile_and_level = 0x4A ;        /* MP@LL */
+       pic->progressive_sequence = 1;
+       pic->low_delay = 0;
+
+       pic->sequence_display_extension_flag = 0;
+       for ( i = 0 ; i < 4 ; i++ ){
+               pic->frame_centre_horizontal_offset[i] = 0;
+               pic->frame_centre_vertical_offset[i] = 0;
+       }
+       pic->last_frame_centre_horizontal_offset = 0;
+       pic->last_frame_centre_vertical_offset = 0;
+
+       pic->picture_display_extension_flag[0] = 0;
+       pic->picture_display_extension_flag[1] = 0;
+       pic->sequence_header_flag = 0;
        pic->gop_flag = 0;
-        pic->sequence_end_flag = 0;
+       pic->sequence_end_flag = 0;
 }
 #endif
 
 #if 0
 static void mpg_set_picture_parameter( int32_t field_type, struct mpg_picture *pic )
 {
-        int16_t last_h_offset;
-        int16_t last_v_offset;
-
-        int16_t *p_h_offset;
-        int16_t *p_v_offset;
-
-        if ( pic->mpeg1_flag ){
-                pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
-                pic->top_field_first = 0;
-                pic->repeat_first_field = 0;
-                pic->progressive_frame = 1;
-                pic->picture_coding_parameter = 0x000010;
-        }
-
-        /* Reset flag */
-        pic->picture_display_extension_flag[field_type] = 0;
-
-        last_h_offset = pic->last_frame_centre_horizontal_offset;
-        last_v_offset = pic->last_frame_centre_vertical_offset;
-        if ( field_type == FIRST_FIELD ){
-                p_h_offset = pic->frame_centre_horizontal_offset;
-                p_v_offset = pic->frame_centre_vertical_offset;
-                *p_h_offset = last_h_offset;
-                *(p_h_offset + 1) = last_h_offset;
-                *(p_h_offset + 2) = last_h_offset;
-                *p_v_offset = last_v_offset;
-                *(p_v_offset + 1) = last_v_offset;
-                *(p_v_offset + 2) = last_v_offset;
-        } else {
-                pic->frame_centre_horizontal_offset[3] = last_h_offset;
-                pic->frame_centre_vertical_offset[3] = last_v_offset;
-        }
+       int16_t last_h_offset;
+       int16_t last_v_offset;
+
+       int16_t *p_h_offset;
+       int16_t *p_v_offset;
+
+       if ( pic->mpeg1_flag ){
+               pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
+               pic->top_field_first = 0;
+               pic->repeat_first_field = 0;
+               pic->progressive_frame = 1;
+               pic->picture_coding_parameter = 0x000010;
+       }
+
+       /* Reset flag */
+       pic->picture_display_extension_flag[field_type] = 0;
+
+       last_h_offset = pic->last_frame_centre_horizontal_offset;
+       last_v_offset = pic->last_frame_centre_vertical_offset;
+       if ( field_type == FIRST_FIELD ){
+               p_h_offset = pic->frame_centre_horizontal_offset;
+               p_v_offset = pic->frame_centre_vertical_offset;
+               *p_h_offset = last_h_offset;
+               *(p_h_offset + 1) = last_h_offset;
+               *(p_h_offset + 2) = last_h_offset;
+               *p_v_offset = last_v_offset;
+               *(p_v_offset + 1) = last_v_offset;
+               *(p_v_offset + 2) = last_v_offset;
+       } else {
+               pic->frame_centre_horizontal_offset[3] = last_h_offset;
+               pic->frame_centre_vertical_offset[3] = last_v_offset;
+       }
 }
 #endif
 
 #if 0
 static void init_mpg_picture( struct mpg_picture *pic, int chan, int32_t field_type)
 {
-        pic->picture_header = 0;
-        pic->sequence_header_data
-                = ( INIT_HORIZONTAL_SIZE << 20 )
-                        | ( INIT_VERTICAL_SIZE << 8 )
-                        | ( INIT_ASPECT_RATIO << 4 )
-                        | ( INIT_FRAME_RATE );
-        pic->mpeg1_flag = 0;
-        pic->vinfo.horizontal_size
-                = INIT_DISP_HORIZONTAL_SIZE;
-        pic->vinfo.vertical_size
-                = INIT_DISP_VERTICAL_SIZE;
-        pic->picture_display_extension_flag[field_type]
-                = 0;
-        pic->pts_flag[field_type] = 0;
-
-        pic->sequence_gop_header = 0;
-        pic->picture_header = 0;
-        pic->sequence_header_flag = 0;
-        pic->gop_flag = 0;
-        pic->sequence_end_flag = 0;
-        pic->sequence_display_extension_flag = 0;
-        pic->last_frame_centre_horizontal_offset = 0;
-        pic->last_frame_centre_vertical_offset = 0;
+       pic->picture_header = 0;
+       pic->sequence_header_data
+               = ( INIT_HORIZONTAL_SIZE << 20 )
+                       | ( INIT_VERTICAL_SIZE << 8 )
+                       | ( INIT_ASPECT_RATIO << 4 )
+                       | ( INIT_FRAME_RATE );
+       pic->mpeg1_flag = 0;
+       pic->vinfo.horizontal_size
+               = INIT_DISP_HORIZONTAL_SIZE;
+       pic->vinfo.vertical_size
+               = INIT_DISP_VERTICAL_SIZE;
+       pic->picture_display_extension_flag[field_type]
+               = 0;
+       pic->pts_flag[field_type] = 0;
+
+       pic->sequence_gop_header = 0;
+       pic->picture_header = 0;
+       pic->sequence_header_flag = 0;
+       pic->gop_flag = 0;
+       pic->sequence_end_flag = 0;
+       pic->sequence_display_extension_flag = 0;
+       pic->last_frame_centre_horizontal_offset = 0;
+       pic->last_frame_centre_vertical_offset = 0;
        pic->channel = chan;
 }
 #endif
@@ -588,11 +588,11 @@ int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
                buf[1]&=~0x40;
        }
        if (!len)
-               return 0;
+               return 0;
        buf[3]=0x30|((p2ts->cc++)&0x0f);
        rest=183-len;
        if (rest) {
-               buf[5]=0x00;
+               buf[5]=0x00;
                if (rest-1)
                        memset(buf+6, 0xff, rest-1);
        }
index b0848f7836b746026421df1c3e290c0b185c88bc..375e3be184b1afc54bacb55ad951948e819ed1c9 100644 (file)
@@ -29,8 +29,8 @@ typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
 
 struct dvb_filter_pes2ts {
        unsigned char buf[188];
-        unsigned char cc;
-        dvb_filter_pes2ts_cb_t *cb;
+       unsigned char cc;
+       dvb_filter_pes2ts_cb_t *cb;
        void *priv;
 };
 
@@ -162,7 +162,7 @@ struct dvb_video_info {
        u32 bit_rate;
        u32 comp_bit_rate;
        u32 vbv_buffer_size;
-        s16 vbv_delay;
+       s16 vbv_delay;
        u32 CSPF;
        u32 off;
 };
@@ -173,60 +173,60 @@ struct dvb_video_info {
 #define VIDEO_FRAME_PICTURE 0x03
 
 struct mpg_picture {
-        int       channel;
+       int       channel;
        struct dvb_video_info vinfo;
-        u32      *sequence_gop_header;
-        u32      *picture_header;
-        s32       time_code;
-        int       low_delay;
-        int       closed_gop;
-        int       broken_link;
-        int       sequence_header_flag;
-        int       gop_flag;
-        int       sequence_end_flag;
-
-        u8        profile_and_level;
-        s32       picture_coding_parameter;
-        u32       matrix[32];
-        s8        matrix_change_flag;
-
-        u8        picture_header_parameter;
+       u32      *sequence_gop_header;
+       u32      *picture_header;
+       s32       time_code;
+       int       low_delay;
+       int       closed_gop;
+       int       broken_link;
+       int       sequence_header_flag;
+       int       gop_flag;
+       int       sequence_end_flag;
+
+       u8        profile_and_level;
+       s32       picture_coding_parameter;
+       u32       matrix[32];
+       s8        matrix_change_flag;
+
+       u8        picture_header_parameter;
   /* bit 0 - 2: bwd f code
      bit 3    : fpb vector
      bit 4 - 6: fwd f code
      bit 7    : fpf vector */
 
-        int       mpeg1_flag;
-        int       progressive_sequence;
-        int       sequence_display_extension_flag;
-        u32       sequence_header_data;
-        s16       last_frame_centre_horizontal_offset;
-        s16       last_frame_centre_vertical_offset;
-
-        u32       pts[2]; /* [0] 1st field, [1] 2nd field */
-        int       top_field_first;
-        int       repeat_first_field;
-        int       progressive_frame;
-        int       bank;
-        int       forward_bank;
-        int       backward_bank;
-        int       compress;
-        s16       frame_centre_horizontal_offset[OFF_SIZE];
-                  /* [0-2] 1st field, [3] 2nd field */
-        s16       frame_centre_vertical_offset[OFF_SIZE];
-                  /* [0-2] 1st field, [3] 2nd field */
-        s16       temporal_reference[2];
-                  /* [0] 1st field, [1] 2nd field */
-
-        s8        picture_coding_type[2];
-                  /* [0] 1st field, [1] 2nd field */
-        s8        picture_structure[2];
-                  /* [0] 1st field, [1] 2nd field */
-        s8        picture_display_extension_flag[2];
-                  /* [0] 1st field, [1] 2nd field */
-                  /* picture_display_extenion() 0:no 1:exit*/
-        s8        pts_flag[2];
-                  /* [0] 1st field, [1] 2nd field */
+       int       mpeg1_flag;
+       int       progressive_sequence;
+       int       sequence_display_extension_flag;
+       u32       sequence_header_data;
+       s16       last_frame_centre_horizontal_offset;
+       s16       last_frame_centre_vertical_offset;
+
+       u32       pts[2]; /* [0] 1st field, [1] 2nd field */
+       int       top_field_first;
+       int       repeat_first_field;
+       int       progressive_frame;
+       int       bank;
+       int       forward_bank;
+       int       backward_bank;
+       int       compress;
+       s16       frame_centre_horizontal_offset[OFF_SIZE];
+                 /* [0-2] 1st field, [3] 2nd field */
+       s16       frame_centre_vertical_offset[OFF_SIZE];
+                 /* [0-2] 1st field, [3] 2nd field */
+       s16       temporal_reference[2];
+                 /* [0] 1st field, [1] 2nd field */
+
+       s8        picture_coding_type[2];
+                 /* [0] 1st field, [1] 2nd field */
+       s8        picture_structure[2];
+                 /* [0] 1st field, [1] 2nd field */
+       s8        picture_display_extension_flag[2];
+                 /* [0] 1st field, [1] 2nd field */
+                 /* picture_display_extenion() 0:no 1:exit*/
+       s8        pts_flag[2];
+                 /* [0] 1st field, [1] 2nd field */
 };
 
 struct dvb_audio_info {
index 6ffa6b2163631117661d16c7a7f540d79b3ee8b6..95ea5095e07e07ae0ecb5d46240aaa297d7b7442 100644 (file)
@@ -372,10 +372,10 @@ static int dvb_frontend_thread(void *data)
 
        snprintf (name, sizeof(name), "kdvb-fe-%i", fe->dvb->num);
 
-        lock_kernel();
-        daemonize(name);
-        sigfillset(&current->blocked);
-        unlock_kernel();
+       lock_kernel();
+       daemonize(name);
+       sigfillset(&current->blocked);
+       unlock_kernel();
 
        fepriv->status = 0;
        dvb_frontend_init(fe);
index 348c9b0b988aeab22245fd58ae369ae91b88fdaf..1e0840d02f1f5e0307cbd7b9cc1d9eabc53c7f56 100644 (file)
 #include "dvbdev.h"
 
 struct dvb_frontend_tune_settings {
-        int min_delay_ms;
-        int step_size;
-        int max_drift;
-        struct dvb_frontend_parameters parameters;
+       int min_delay_ms;
+       int step_size;
+       int max_drift;
+       struct dvb_frontend_parameters parameters;
 };
 
 struct dvb_frontend;
index 87935490bfb2f1e4deb34c0bea36ff5de3cf4c7c..86bba81e851e0efe9eeed9b06979493328439dcc 100644 (file)
@@ -151,6 +151,8 @@ struct dvb_net_priv {
        unsigned char ule_bridged;              /* Whether the ULE_BRIDGED extension header was found. */
        int ule_sndu_remain;                    /* Nr. of bytes still required for current ULE SNDU. */
        unsigned long ts_count;                 /* Current ts cell counter. */
+
+       struct semaphore mutex;
 };
 
 
@@ -711,7 +713,7 @@ static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
        if (buffer1_len > 32768)
                printk(KERN_WARNING "length > 32k: %zu.\n", buffer1_len);
        /* printk("TS callback: %u bytes, %u TS cells @ %p.\n",
-                 buffer1_len, buffer1_len / TS_SZ, buffer1); */
+                 buffer1_len, buffer1_len / TS_SZ, buffer1); */
        dvb_net_ule(dev, buffer1, buffer1_len);
        return 0;
 }
@@ -719,8 +721,8 @@ static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
 
 static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
 {
-        u8 *eth;
-        struct sk_buff *skb;
+       u8 *eth;
+       struct sk_buff *skb;
        struct net_device_stats *stats = &(((struct dvb_net_priv *) dev->priv)->stats);
        int snap = 0;
 
@@ -752,7 +754,7 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
                        return;
                }
                snap = 8;
-        }
+       }
        if (pkt[7]) {
                /* FIXME: assemble datagram from multiple sections */
                stats->rx_errors++;
@@ -776,14 +778,14 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
        memcpy(eth + 14, pkt + 12 + snap, pkt_len - 12 - 4 - snap);
 
        /* create ethernet header: */
-        eth[0]=pkt[0x0b];
-        eth[1]=pkt[0x0a];
-        eth[2]=pkt[0x09];
-        eth[3]=pkt[0x08];
-        eth[4]=pkt[0x04];
-        eth[5]=pkt[0x03];
+       eth[0]=pkt[0x0b];
+       eth[1]=pkt[0x0a];
+       eth[2]=pkt[0x09];
+       eth[3]=pkt[0x08];
+       eth[4]=pkt[0x04];
+       eth[5]=pkt[0x03];
 
-        eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
+       eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
 
        if (snap) {
                eth[12] = pkt[18];
@@ -805,7 +807,7 @@ static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
 
        stats->rx_packets++;
        stats->rx_bytes+=skb->len;
-        netif_rx(skb);
+       netif_rx(skb);
 }
 
 static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
@@ -813,7 +815,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 = filter->priv;
+       struct net_device *dev = filter->priv;
 
        /**
         * we rely on the DVB API definition where exactly one complete
@@ -881,12 +883,13 @@ static int dvb_net_filter_sec_set(struct net_device *dev,
 
 static int dvb_net_feed_start(struct net_device *dev)
 {
-       int ret, i;
+       int ret = 0, i;
        struct dvb_net_priv *priv = dev->priv;
-        struct dmx_demux *demux = priv->demux;
-        unsigned char *mac = (unsigned char *) dev->dev_addr;
+       struct dmx_demux *demux = priv->demux;
+       unsigned char *mac = (unsigned char *) dev->dev_addr;
 
        dprintk("%s: rx_mode %i\n", __FUNCTION__, priv->rx_mode);
+       down(&priv->mutex);
        if (priv->tsfeed || priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
                printk("%s: BUG %d\n", __FUNCTION__, __LINE__);
 
@@ -900,7 +903,7 @@ static int dvb_net_feed_start(struct net_device *dev)
                                         dvb_net_sec_callback);
                if (ret<0) {
                        printk("%s: could not allocate section feed\n", dev->name);
-                       return ret;
+                       goto error;
                }
 
                ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 1);
@@ -909,7 +912,7 @@ static int dvb_net_feed_start(struct net_device *dev)
                        printk("%s: could not set section feed\n", dev->name);
                        priv->demux->release_section_feed(priv->demux, priv->secfeed);
                        priv->secfeed=NULL;
-                       return ret;
+                       goto error;
                }
 
                if (priv->rx_mode != RX_MODE_PROMISC) {
@@ -948,7 +951,7 @@ static int dvb_net_feed_start(struct net_device *dev)
                ret = demux->allocate_ts_feed(demux, &priv->tsfeed, dvb_net_ts_callback);
                if (ret < 0) {
                        printk("%s: could not allocate ts feed\n", dev->name);
-                       return ret;
+                       goto error;
                }
 
                /* Set netdevice pointer for ts decaps callback. */
@@ -962,23 +965,26 @@ static int dvb_net_feed_start(struct net_device *dev)
                        printk("%s: could not set ts feed\n", dev->name);
                        priv->demux->release_ts_feed(priv->demux, priv->tsfeed);
                        priv->tsfeed = NULL;
-                       return ret;
+                       goto error;
                }
 
                dprintk("%s: start filtering\n", __FUNCTION__);
                priv->tsfeed->start_filtering(priv->tsfeed);
        } else
-               return -EINVAL;
+               ret = -EINVAL;
 
-       return 0;
+error:
+       up(&priv->mutex);
+       return ret;
 }
 
 static int dvb_net_feed_stop(struct net_device *dev)
 {
        struct dvb_net_priv *priv = dev->priv;
-       int i;
+       int i, ret = 0;
 
        dprintk("%s\n", __FUNCTION__);
+       down(&priv->mutex);
        if (priv->feedtype == DVB_NET_FEEDTYPE_MPE) {
                if (priv->secfeed) {
                        if (priv->secfeed->is_filtering) {
@@ -1019,8 +1025,9 @@ static int dvb_net_feed_stop(struct net_device *dev)
                else
                        printk("%s: no ts feed to stop\n", dev->name);
        } else
-               return -EINVAL;
-       return 0;
+               ret = -EINVAL;
+       up(&priv->mutex);
+       return ret;
 }
 
 
@@ -1044,8 +1051,8 @@ static void wq_set_multicast_list (void *data)
        struct dvb_net_priv *priv = dev->priv;
 
        dvb_net_feed_stop(dev);
-
        priv->rx_mode = RX_MODE_UNI;
+       spin_lock_bh(&dev->xmit_lock);
 
        if (dev->flags & IFF_PROMISC) {
                dprintk("%s: promiscuous mode\n", dev->name);
@@ -1070,6 +1077,7 @@ static void wq_set_multicast_list (void *data)
                }
        }
 
+       spin_unlock_bh(&dev->xmit_lock);
        dvb_net_feed_start(dev);
 }
 
@@ -1121,12 +1129,12 @@ static int dvb_net_stop(struct net_device *dev)
        struct dvb_net_priv *priv = dev->priv;
 
        priv->in_use--;
-        return dvb_net_feed_stop(dev);
+       return dvb_net_feed_stop(dev);
 }
 
 static struct net_device_stats * dvb_net_get_stats(struct net_device *dev)
 {
-        return &((struct dvb_net_priv*) dev->priv)->stats;
+       return &((struct dvb_net_priv*) dev->priv)->stats;
 }
 
 static void dvb_net_setup(struct net_device *dev)
@@ -1200,6 +1208,7 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype)
 
        INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net);
        INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net);
+       init_MUTEX(&priv->mutex);
 
        net->base_addr = pid;
 
@@ -1351,10 +1360,10 @@ static struct file_operations dvb_net_fops = {
 };
 
 static struct dvb_device dvbdev_net = {
-        .priv = NULL,
-        .users = 1,
-        .writers = 1,
-        .fops = &dvb_net_fops,
+       .priv = NULL,
+       .users = 1,
+       .writers = 1,
+       .fops = &dvb_net_fops,
 };
 
 
index fb6d94a69d71f3290814bb73611e12d790345f81..283c6e9339a4651b5b6c954e124d7e38025a1d0a 100644 (file)
 
 void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
 {
-        rbuf->pread=rbuf->pwrite=0;
-        rbuf->data=data;
-        rbuf->size=len;
+       rbuf->pread=rbuf->pwrite=0;
+       rbuf->data=data;
+       rbuf->size=len;
 
-        init_waitqueue_head(&rbuf->queue);
+       init_waitqueue_head(&rbuf->queue);
 
-        spin_lock_init(&(rbuf->lock));
+       spin_lock_init(&(rbuf->lock));
 }
 
 
 
 int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf)
 {
-        return (rbuf->pread==rbuf->pwrite);
+       return (rbuf->pread==rbuf->pwrite);
 }
 
 
 
 ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf)
 {
-        ssize_t free;
+       ssize_t free;
 
-        free = rbuf->pread - rbuf->pwrite;
-        if (free <= 0)
-                free += rbuf->size;
-        return free-1;
+       free = rbuf->pread - rbuf->pwrite;
+       if (free <= 0)
+               free += rbuf->size;
+       return free-1;
 }
 
 
 
 ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)
 {
-        ssize_t avail;
+       ssize_t avail;
 
-        avail = rbuf->pwrite - rbuf->pread;
-        if (avail < 0)
-                avail += rbuf->size;
-        return avail;
+       avail = rbuf->pwrite - rbuf->pread;
+       if (avail < 0)
+               avail += rbuf->size;
+       return avail;
 }
 
 
 
 void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
 {
-        rbuf->pread = rbuf->pwrite;
+       rbuf->pread = rbuf->pwrite;
 }
 
 
 
 void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)
 {
-        unsigned long flags;
+       unsigned long flags;
 
-        spin_lock_irqsave(&rbuf->lock, flags);
-        dvb_ringbuffer_flush(rbuf);
-        spin_unlock_irqrestore(&rbuf->lock, flags);
+       spin_lock_irqsave(&rbuf->lock, flags);
+       dvb_ringbuffer_flush(rbuf);
+       spin_unlock_irqrestore(&rbuf->lock, flags);
 
-        wake_up(&rbuf->queue);
+       wake_up(&rbuf->queue);
 }
 
 
 
 ssize_t dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len, int usermem)
 {
-        size_t todo = len;
-        size_t split;
-
-        split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
-        if (split > 0) {
-                if (!usermem)
-                        memcpy(buf, rbuf->data+rbuf->pread, split);
-                else
-                        if (copy_to_user(buf, rbuf->data+rbuf->pread, split))
-                                return -EFAULT;
-                buf += split;
-                todo -= split;
-                rbuf->pread = 0;
-        }
-        if (!usermem)
-                memcpy(buf, rbuf->data+rbuf->pread, todo);
-        else
-                if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
-                        return -EFAULT;
-
-        rbuf->pread = (rbuf->pread + todo) % rbuf->size;
-
-        return len;
+       size_t todo = len;
+       size_t split;
+
+       split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
+       if (split > 0) {
+               if (!usermem)
+                       memcpy(buf, rbuf->data+rbuf->pread, split);
+               else
+                       if (copy_to_user(buf, rbuf->data+rbuf->pread, split))
+                               return -EFAULT;
+               buf += split;
+               todo -= split;
+               rbuf->pread = 0;
+       }
+       if (!usermem)
+               memcpy(buf, rbuf->data+rbuf->pread, todo);
+       else
+               if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
+                       return -EFAULT;
+
+       rbuf->pread = (rbuf->pread + todo) % rbuf->size;
+
+       return len;
 }
 
 
 
 ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t len)
 {
-        size_t todo = len;
-        size_t split;
+       size_t todo = len;
+       size_t split;
 
-        split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
+       split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
 
-        if (split > 0) {
-                memcpy(rbuf->data+rbuf->pwrite, buf, split);
-                buf += split;
-                todo -= split;
-                rbuf->pwrite = 0;
-        }
-        memcpy(rbuf->data+rbuf->pwrite, buf, todo);
-        rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
+       if (split > 0) {
+               memcpy(rbuf->data+rbuf->pwrite, buf, split);
+               buf += split;
+               todo -= split;
+               rbuf->pwrite = 0;
+       }
+       memcpy(rbuf->data+rbuf->pwrite, buf, todo);
+       rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
 
-        return len;
+       return len;
 }
 
 ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf, size_t len)
 {
-        int status;
-        ssize_t oldpwrite = rbuf->pwrite;
+       int status;
+       ssize_t oldpwrite = rbuf->pwrite;
 
-        DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8);
-        DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff);
-        DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY);
-        status = dvb_ringbuffer_write(rbuf, buf, len);
+       DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8);
+       DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff);
+       DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY);
+       status = dvb_ringbuffer_write(rbuf, buf, len);
 
-        if (status < 0) rbuf->pwrite = oldpwrite;
-        return status;
+       if (status < 0) rbuf->pwrite = oldpwrite;
+       return status;
 }
 
 ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
-                                int offset, u8* buf, size_t len, int usermem)
+                               int offset, u8* buf, size_t len, int usermem)
 {
-        size_t todo;
-        size_t split;
-        size_t pktlen;
-
-        pktlen = rbuf->data[idx] << 8;
-        pktlen |= rbuf->data[(idx + 1) % rbuf->size];
-        if (offset > pktlen) return -EINVAL;
-        if ((offset + len) > pktlen) len = pktlen - offset;
-
-        idx = (idx + DVB_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size;
-        todo = len;
-        split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0;
-        if (split > 0) {
-                if (!usermem)
-                        memcpy(buf, rbuf->data+idx, split);
-                else
-                        if (copy_to_user(buf, rbuf->data+idx, split))
-                                return -EFAULT;
-                buf += split;
-                todo -= split;
-                idx = 0;
-        }
-        if (!usermem)
-                memcpy(buf, rbuf->data+idx, todo);
-        else
-                if (copy_to_user(buf, rbuf->data+idx, todo))
-                        return -EFAULT;
-
-        return len;
+       size_t todo;
+       size_t split;
+       size_t pktlen;
+
+       pktlen = rbuf->data[idx] << 8;
+       pktlen |= rbuf->data[(idx + 1) % rbuf->size];
+       if (offset > pktlen) return -EINVAL;
+       if ((offset + len) > pktlen) len = pktlen - offset;
+
+       idx = (idx + DVB_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size;
+       todo = len;
+       split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0;
+       if (split > 0) {
+               if (!usermem)
+                       memcpy(buf, rbuf->data+idx, split);
+               else
+                       if (copy_to_user(buf, rbuf->data+idx, split))
+                               return -EFAULT;
+               buf += split;
+               todo -= split;
+               idx = 0;
+       }
+       if (!usermem)
+               memcpy(buf, rbuf->data+idx, todo);
+       else
+               if (copy_to_user(buf, rbuf->data+idx, todo))
+                       return -EFAULT;
+
+       return len;
 }
 
 void dvb_ringbuffer_pkt_dispose(struct dvb_ringbuffer *rbuf, size_t idx)
 {
-        size_t pktlen;
-
-        rbuf->data[(idx + 2) % rbuf->size] = PKT_DISPOSED;
-
-        // clean up disposed packets
-        while(dvb_ringbuffer_avail(rbuf) > DVB_RINGBUFFER_PKTHDRSIZE) {
-                if (DVB_RINGBUFFER_PEEK(rbuf, 2) == PKT_DISPOSED) {
-                        pktlen = DVB_RINGBUFFER_PEEK(rbuf, 0) << 8;
-                        pktlen |= DVB_RINGBUFFER_PEEK(rbuf, 1);
-                        DVB_RINGBUFFER_SKIP(rbuf, pktlen + DVB_RINGBUFFER_PKTHDRSIZE);
-                } else {
-                        // first packet is not disposed, so we stop cleaning now
-                        break;
-                }
-        }
+       size_t pktlen;
+
+       rbuf->data[(idx + 2) % rbuf->size] = PKT_DISPOSED;
+
+       // clean up disposed packets
+       while(dvb_ringbuffer_avail(rbuf) > DVB_RINGBUFFER_PKTHDRSIZE) {
+               if (DVB_RINGBUFFER_PEEK(rbuf, 2) == PKT_DISPOSED) {
+                       pktlen = DVB_RINGBUFFER_PEEK(rbuf, 0) << 8;
+                       pktlen |= DVB_RINGBUFFER_PEEK(rbuf, 1);
+                       DVB_RINGBUFFER_SKIP(rbuf, pktlen + DVB_RINGBUFFER_PKTHDRSIZE);
+               } else {
+                       // first packet is not disposed, so we stop cleaning now
+                       break;
+               }
+       }
 }
 
 ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t* pktlen)
 {
-        int consumed;
-        int curpktlen;
-        int curpktstatus;
+       int consumed;
+       int curpktlen;
+       int curpktstatus;
 
-        if (idx == -1) {
+       if (idx == -1) {
               idx = rbuf->pread;
        } else {
-                curpktlen = rbuf->data[idx] << 8;
-                curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
-               idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
+               curpktlen = rbuf->data[idx] << 8;
+               curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
+               idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
        }
 
-        consumed = (idx - rbuf->pread) % rbuf->size;
+       consumed = (idx - rbuf->pread) % rbuf->size;
 
-        while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {
+       while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {
 
-                curpktlen = rbuf->data[idx] << 8;
-                curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
-                curpktstatus = rbuf->data[(idx + 2) % rbuf->size];
+               curpktlen = rbuf->data[idx] << 8;
+               curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
+               curpktstatus = rbuf->data[(idx + 2) % rbuf->size];
 
-                if (curpktstatus == PKT_READY) {
-                        *pktlen = curpktlen;
-                        return idx;
-                }
+               if (curpktstatus == PKT_READY) {
+                       *pktlen = curpktlen;
+                       return idx;
+               }
 
-                consumed += curpktlen + DVB_RINGBUFFER_PKTHDRSIZE;
-                idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
-        }
+               consumed += curpktlen + DVB_RINGBUFFER_PKTHDRSIZE;
+               idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
+       }
 
-        // no packets available
-        return -1;
+       // no packets available
+       return -1;
 }
 
 
index d18e9c4ba9ea31a476c18908738035d495c4d96b..fa476f662f82c453da2028ca8267fee6b6ae11f8 100644 (file)
 #include <linux/wait.h>
 
 struct dvb_ringbuffer {
-        u8               *data;
-        ssize_t           size;
-        ssize_t           pread;
-        ssize_t           pwrite;
+       u8               *data;
+       ssize_t           size;
+       ssize_t           pread;
+       ssize_t           pwrite;
 
-        wait_queue_head_t queue;
-        spinlock_t        lock;
+       wait_queue_head_t queue;
+       spinlock_t        lock;
 };
 
 #define DVB_RINGBUFFER_PKTHDRSIZE 3
@@ -106,7 +106,7 @@ extern void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf);
 ** returns number of bytes transferred or -EFAULT
 */
 extern ssize_t dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf,
-                                   size_t len, int usermem);
+                                  size_t len, int usermem);
 
 
 /* write routines & macros */
@@ -121,7 +121,7 @@ extern ssize_t dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf,
 ** returns number of bytes transferred or -EFAULT
 */
 extern ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf,
-                                    size_t len);
+                                   size_t len);
 
 
 /**
@@ -133,7 +133,7 @@ extern ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf,
  * returns Number of bytes written, or -EFAULT, -ENOMEM, -EVINAL.
  */
 extern ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf,
-                                        size_t len);
+                                       size_t len);
 
 /**
  * Read from a packet in the ringbuffer. Note: unlike dvb_ringbuffer_read(), this
@@ -149,7 +149,7 @@ extern ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf,
  * returns Number of bytes read, or -EFAULT.
  */
 extern ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
-                                       int offset, u8* buf, size_t len, int usermem);
+                                      int offset, u8* buf, size_t len, int usermem);
 
 /**
  * Dispose of a packet in the ring buffer.
index 477b4fa56430ab3c4305561277d489aafec1ef0e..a4aee8665854f49691e2f695b6803fa792a80b33 100644 (file)
@@ -47,7 +47,7 @@ static LIST_HEAD(dvb_adapter_list);
 static DECLARE_MUTEX(dvbdev_register_lock);
 
 static const char * const dnames[] = {
-        "video", "audio", "sec", "frontend", "demux", "dvr", "ca",
+       "video", "audio", "sec", "frontend", "demux", "dvr", "ca",
        "net", "osd"
 };
 
@@ -90,15 +90,15 @@ static int dvb_device_open(struct inode *inode, struct file *file)
 
                file->private_data = dvbdev;
                old_fops = file->f_op;
-                file->f_op = fops_get(dvbdev->fops);
-                if(file->f_op->open)
-                        err = file->f_op->open(inode,file);
-                if (err) {
-                        fops_put(file->f_op);
-                        file->f_op = fops_get(old_fops);
-                }
-                fops_put(old_fops);
-                return err;
+               file->f_op = fops_get(dvbdev->fops);
+               if(file->f_op->open)
+                       err = file->f_op->open(inode,file);
+               if (err) {
+                       fops_put(file->f_op);
+                       file->f_op = fops_get(old_fops);
+               }
+               fops_put(old_fops);
+               return err;
        }
        return -ENODEV;
 }
@@ -117,21 +117,21 @@ static struct cdev dvb_device_cdev = {
 
 int dvb_generic_open(struct inode *inode, struct file *file)
 {
-        struct dvb_device *dvbdev = file->private_data;
+       struct dvb_device *dvbdev = file->private_data;
 
-        if (!dvbdev)
-                return -ENODEV;
+       if (!dvbdev)
+               return -ENODEV;
 
        if (!dvbdev->users)
-                return -EBUSY;
+               return -EBUSY;
 
        if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
-                if (!dvbdev->readers)
-                       return -EBUSY;
+               if (!dvbdev->readers)
+                       return -EBUSY;
                dvbdev->readers--;
        } else {
-                if (!dvbdev->writers)
-                       return -EBUSY;
+               if (!dvbdev->writers)
+                       return -EBUSY;
                dvbdev->writers--;
        }
 
@@ -143,10 +143,10 @@ EXPORT_SYMBOL(dvb_generic_open);
 
 int dvb_generic_release(struct inode *inode, struct file *file)
 {
-        struct dvb_device *dvbdev = file->private_data;
+       struct dvb_device *dvbdev = file->private_data;
 
        if (!dvbdev)
-                return -ENODEV;
+               return -ENODEV;
 
        if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
                dvbdev->readers++;
@@ -163,10 +163,10 @@ EXPORT_SYMBOL(dvb_generic_release);
 int dvb_generic_ioctl(struct inode *inode, struct file *file,
                      unsigned int cmd, unsigned long arg)
 {
-        struct dvb_device *dvbdev = file->private_data;
+       struct dvb_device *dvbdev = file->private_data;
 
-        if (!dvbdev)
-               return -ENODEV;
+       if (!dvbdev)
+               return -ENODEV;
 
        if (!dvbdev->kernel_ioctl)
                return -EINVAL;
@@ -334,63 +334,63 @@ EXPORT_SYMBOL(dvb_unregister_adapter);
    to the v4l "videodev.o" module, which is unnecessary for some
    cards (ie. the budget dvb-cards don't need the v4l module...) */
 int dvb_usercopy(struct inode *inode, struct file *file,
-                    unsigned int cmd, unsigned long arg,
+                    unsigned int cmd, unsigned long arg,
                     int (*func)(struct inode *inode, struct file *file,
                     unsigned int cmd, void *arg))
 {
-        char    sbuf[128];
-        void    *mbuf = NULL;
-        void    *parg = NULL;
-        int     err  = -EINVAL;
-
-        /*  Copy arguments into temp kernel buffer  */
-        switch (_IOC_DIR(cmd)) {
-        case _IOC_NONE:
+       char    sbuf[128];
+       void    *mbuf = NULL;
+       void    *parg = NULL;
+       int     err  = -EINVAL;
+
+       /*  Copy arguments into temp kernel buffer  */
+       switch (_IOC_DIR(cmd)) {
+       case _IOC_NONE:
                /*
                 * For this command, the pointer is actually an integer
                 * argument.
                 */
                parg = (void *) arg;
                break;
-        case _IOC_READ: /* some v4l ioctls are marked wrong ... */
-        case _IOC_WRITE:
-        case (_IOC_WRITE | _IOC_READ):
-                if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
-                        parg = sbuf;
-                } else {
-                        /* too big to allocate from stack */
-                        mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
-                        if (NULL == mbuf)
-                                return -ENOMEM;
-                        parg = mbuf;
-                }
-
-                err = -EFAULT;
-                if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
-                        goto out;
-                break;
-        }
-
-        /* call driver */
-        if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
-                err = -EINVAL;
-
-        if (err < 0)
-                goto out;
-
-        /*  Copy results into user buffer  */
-        switch (_IOC_DIR(cmd))
-        {
-        case _IOC_READ:
-        case (_IOC_WRITE | _IOC_READ):
-                if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
-                        err = -EFAULT;
-                break;
-        }
+       case _IOC_READ: /* some v4l ioctls are marked wrong ... */
+       case _IOC_WRITE:
+       case (_IOC_WRITE | _IOC_READ):
+               if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
+                       parg = sbuf;
+               } else {
+                       /* too big to allocate from stack */
+                       mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
+                       if (NULL == mbuf)
+                               return -ENOMEM;
+                       parg = mbuf;
+               }
+
+               err = -EFAULT;
+               if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
+                       goto out;
+               break;
+       }
+
+       /* call driver */
+       if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
+               err = -EINVAL;
+
+       if (err < 0)
+               goto out;
+
+       /*  Copy results into user buffer  */
+       switch (_IOC_DIR(cmd))
+       {
+       case _IOC_READ:
+       case (_IOC_WRITE | _IOC_READ):
+               if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
+                       err = -EFAULT;
+               break;
+       }
 
 out:
-        kfree(mbuf);
-        return err;
+       kfree(mbuf);
+       return err;
 }
 
 static int __init init_dvbdev(void)
@@ -427,10 +427,10 @@ error:
 
 static void __exit exit_dvbdev(void)
 {
-        devfs_remove("dvb");
+       devfs_remove("dvb");
        class_destroy(dvb_class);
        cdev_del(&dvb_device_cdev);
-        unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
+       unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
 }
 
 module_init(init_dvbdev);
index a251867f30f1cfde7cb3523a1eb2a2f9ba36fa7d..0cc6e4a0e27c7e37924c36be26403822536c6b36 100644 (file)
@@ -68,8 +68,8 @@ struct dvb_device {
        int writers;
        int users;
 
-        /* don't really need those !? -- FIXME: use video_usercopy  */
-        int (*kernel_ioctl)(struct inode *inode, struct file *file,
+       /* don't really need those !? -- FIXME: use video_usercopy  */
+       int (*kernel_ioctl)(struct inode *inode, struct file *file,
                            unsigned int cmd, void *arg);
 
        void *priv;
@@ -97,7 +97,7 @@ we simply define out own dvb_usercopy(), which will hopefully become
 generic_usercopy()  someday... */
 
 extern int dvb_usercopy(struct inode *inode, struct file *file,
-                           unsigned int cmd, unsigned long arg,
+                           unsigned int cmd, unsigned long arg,
                            int (*func)(struct inode *inode, struct file *file,
                            unsigned int cmd, void *arg));
 
index 49f541d9a042bd6448c77dfff3bfc11a627dabd5..ce44aa6bbb838da936e9c41466819a9d226d64cf 100644 (file)
@@ -65,7 +65,7 @@ static struct dvb_usb_rc_key a800_rc_keys[] = {
 
 };
 
-int a800_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
+static int a800_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 {
        u8 key[5];
        if (usb_control_msg(d->udev,usb_rcvctrlpipe(d->udev,0),
@@ -144,7 +144,6 @@ static struct dvb_usb_properties a800_properties = {
 };
 
 static struct usb_driver a800_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_a800",
        .probe          = a800_probe,
        .disconnect = dvb_usb_device_exit,
index 3fe383f4bb4cea3d69a69bc191a4356c6bb0d979..d05fab01cccdb9b34093b0dfdda028b45ad27275 100644 (file)
@@ -241,7 +241,6 @@ static struct dvb_usb_properties cxusb_properties = {
 };
 
 static struct usb_driver cxusb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_cxusb",
        .probe          = cxusb_probe,
        .disconnect = dvb_usb_device_exit,
index 00b946419b408fb1128bd52088f2d5fd034f4811..269d899da488336024e70286a8773b48cff65c77 100644 (file)
@@ -21,9 +21,9 @@ MODULE_LICENSE("GPL");
 int dibusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
 {
        if (d->priv != NULL) {
-               struct dib_fe_xfer_ops *ops = d->priv;
-               if (ops->fifo_ctrl != NULL)
-                       if (ops->fifo_ctrl(d->fe,onoff)) {
+               struct dibusb_state *st = d->priv;
+               if (st->ops.fifo_ctrl != NULL)
+                       if (st->ops.fifo_ctrl(d->fe,onoff)) {
                                err("error while controlling the fifo of the demod.");
                                return -ENODEV;
                        }
@@ -35,9 +35,9 @@ EXPORT_SYMBOL(dibusb_streaming_ctrl);
 int dibusb_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int onoff)
 {
        if (d->priv != NULL) {
-               struct dib_fe_xfer_ops *ops = d->priv;
-               if (d->pid_filtering && ops->pid_ctrl != NULL)
-                       ops->pid_ctrl(d->fe,index,pid,onoff);
+               struct dibusb_state *st = d->priv;
+               if (st->ops.pid_ctrl != NULL)
+                       st->ops.pid_ctrl(d->fe,index,pid,onoff);
        }
        return 0;
 }
@@ -46,9 +46,9 @@ EXPORT_SYMBOL(dibusb_pid_filter);
 int dibusb_pid_filter_ctrl(struct dvb_usb_device *d, int onoff)
 {
        if (d->priv != NULL) {
-               struct dib_fe_xfer_ops *ops = d->priv;
-               if (ops->pid_parse != NULL)
-                       if (ops->pid_parse(d->fe,onoff) < 0)
+               struct dibusb_state *st = d->priv;
+               if (st->ops.pid_parse != NULL)
+                       if (st->ops.pid_parse(d->fe,onoff) < 0)
                                err("could not handle pid_parser");
        }
        return 0;
index aa271a2496d5faaa27cc25c172a4682d6443b099..52ac3e5adf5dd99de63a18821f57e258f8fcab69 100644 (file)
@@ -373,7 +373,6 @@ static struct dvb_usb_properties artec_t1_usb2_properties = {
 };
 
 static struct usb_driver dibusb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_dibusb_mb",
        .probe          = dibusb_probe,
        .disconnect = dvb_usb_device_exit,
index 6a0912eab396085cd99b30064d949362fca6b2b8..55802fba3c29ee71bc320cf056b6fa1a0c665eb7 100644 (file)
@@ -82,7 +82,6 @@ static struct dvb_usb_properties dibusb_mc_properties = {
 };
 
 static struct usb_driver dibusb_mc_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_dibusb_mc",
        .probe          = dibusb_mc_probe,
        .disconnect = dvb_usb_device_exit,
index 74545f82eff1d2df2aca6e02f2577e8c9372827a..450417a9e64b6632fd62cc3affd346a55203da9d 100644 (file)
@@ -148,7 +148,7 @@ static struct dvb_usb_rc_key digitv_rc_keys[] = {
 };
 
 /* TODO is it really the NEC protocol ? */
-int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
+static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 {
        u8 key[5];
 
@@ -233,7 +233,6 @@ static struct dvb_usb_properties digitv_properties = {
 };
 
 static struct usb_driver digitv_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_digitv",
        .probe          = digitv_probe,
        .disconnect = dvb_usb_device_exit,
index b595476332cd9dba9006c6bcb94761122cc7ba97..6e2bac873445700e7d83b1e5317763b3e16263db 100644 (file)
@@ -198,7 +198,6 @@ static struct dvb_usb_properties wt220u_properties = {
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver dtt200u_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_dtt200u",
        .probe          = dtt200u_usb_probe,
        .disconnect = dvb_usb_device_exit,
index a902059812a2fdc7baf6a8a1de6bc9888fb7253f..dd8e0b94edbab6ae619c1a0d91abc667071b5ffc 100644 (file)
@@ -23,7 +23,7 @@ module_param_named(disable_rc_polling, dvb_usb_disable_rc_polling, int, 0644);
 MODULE_PARM_DESC(disable_rc_polling, "disable remote control polling (default: 0).");
 
 /* general initialization functions */
-int dvb_usb_exit(struct dvb_usb_device *d)
+static int dvb_usb_exit(struct dvb_usb_device *d)
 {
        deb_info("state before exiting everything: %x\n",d->state);
        dvb_usb_remote_exit(d);
index 1841a66427bfe550c7ef7d3646b487e24f2c01ce..fac48fc7a4aca3e2b7df0f455be0190d48eb8133 100644 (file)
@@ -202,7 +202,6 @@ static struct dvb_usb_properties nova_t_properties = {
 };
 
 static struct usb_driver nova_t_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_nova_t_usb2",
        .probe          = nova_t_probe,
        .disconnect = dvb_usb_device_exit,
index 6fd67657c2693a277567aa95cdd9fee70514b26a..14f1911c79bb29061817eec9ffb209083677896c 100644 (file)
@@ -128,7 +128,6 @@ static struct dvb_usb_properties umt_properties = {
 };
 
 static struct usb_driver umt_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_umt_010",
        .probe          = umt_probe,
        .disconnect = dvb_usb_device_exit,
index f20d8dbd0be825014ac50440e8058db7597990eb..104b5d016c7b17e3c76376164b8c2464c18e9299 100644 (file)
@@ -190,7 +190,7 @@ static int vp702x_fe_get_frontend(struct dvb_frontend* fe,
 }
 
 static int vp702x_fe_send_diseqc_msg (struct dvb_frontend* fe,
-                                   struct dvb_diseqc_master_cmd *m)
+                                   struct dvb_diseqc_master_cmd *m)
 {
        struct vp702x_fe_state *st = fe->demodulator_priv;
        u8 cmd[8],ibuf[10];
index de13c04e8e64ce66b7806e7872fb85da31bfff5b..afa00fdb5ec0c3686fb3a6e1c49f6ac7ff3dfa9b 100644 (file)
@@ -256,7 +256,6 @@ static struct dvb_usb_properties vp702x_properties = {
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver vp702x_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb-usb-vp702x",
        .probe          = vp702x_usb_probe,
        .disconnect = dvb_usb_device_exit,
index 2746edfeccbaad800bcdec66a149d924503a4a47..83f1de1e7e571daaede818ace9b90c50fbab484a 100644 (file)
@@ -58,7 +58,7 @@ static int vp7045_fe_read_ber(struct dvb_frontend* fe, u32 *ber)
        struct vp7045_fe_state *state = fe->demodulator_priv;
        *ber = (vp7045_read_reg(state->d, 0x0D) << 16) |
               (vp7045_read_reg(state->d, 0x0E) << 8) |
-               vp7045_read_reg(state->d, 0x0F);
+               vp7045_read_reg(state->d, 0x0F);
        return 0;
 }
 
index 75765e3a569c811f2f93f5fd25983caf5437b055..3835235b68dff0f18793c0b711af42c3160ed6cd 100644 (file)
@@ -253,7 +253,6 @@ static struct dvb_usb_properties vp7045_properties = {
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver vp7045_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "dvb_usb_vp7045",
        .probe          = vp7045_usb_probe,
        .disconnect = dvb_usb_device_exit,
index 72a2b5455b0bfd46873e84eb4ec942547f4f28fa..8e0f4b3a141758757035d3ac8161a8cf5a4e111c 100644 (file)
@@ -361,9 +361,9 @@ static int at76c651_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int at76c651_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *fesettings)
 {
-        fesettings->min_delay_ms = 50;
-        fesettings->step_size = 0;
-        fesettings->max_drift = 0;
+       fesettings->min_delay_ms = 50;
+       fesettings->step_size = 0;
+       fesettings->max_drift = 0;
        return 0;
 }
 
index f6d4ee78bdd43d84b63402dba4a42b13e0713c13..8ceb9a33c7af35bb2fdd70cb9aa513f2947dd71d 100644 (file)
@@ -69,7 +69,7 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,2=i2c (|-able)).");
 #define dbufout(b,l,m) {\
            int i; \
            for (i = 0; i < l; i++) \
-               m("%02x ",b[i]); \
+               m("%02x ",b[i]); \
 }
 #define deb_info(args...) dprintk(0x01,args)
 #define deb_i2c(args...)  dprintk(0x02,args)
@@ -827,7 +827,7 @@ static struct dvb_frontend_ops bcm3510_ops = {
                .type = FE_ATSC,
                .frequency_min =  54000000,
                .frequency_max = 803000000,
-                /* stepsize is just a guess */
+               /* stepsize is just a guess */
                .frequency_stepsize = 0,
                .caps =
                        FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
index 0c2ed44386189224518863fb8a28a3e0de5ba8de..755f774f6b7d4262077def4b7a22b4f5b09efec1 100644 (file)
@@ -355,10 +355,10 @@ static int cx22700_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int cx22700_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
 {
-        fesettings->min_delay_ms = 150;
-        fesettings->step_size = 166667;
-        fesettings->max_drift = 166667*2;
-        return 0;
+       fesettings->min_delay_ms = 150;
+       fesettings->step_size = 166667;
+       fesettings->max_drift = 166667*2;
+       return 0;
 }
 
 static void cx22700_release(struct dvb_frontend* fe)
@@ -407,7 +407,7 @@ static struct dvb_frontend_ops cx22700_ops = {
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
                      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
                      FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
-                     FE_CAN_RECOVER
+                     FE_CAN_RECOVER
        },
 
        .release = cx22700_release,
index 9f639297a9f2d7f4ccb50f2af145dfb93b148495..5de0e6d350b1ae7223bee890f9710efda14f87d3 100644 (file)
@@ -2,12 +2,12 @@
     Conexant 22702 DVB OFDM demodulator driver
 
     based on:
-        Alps TDMB7 DVB OFDM demodulator driver
+       Alps TDMB7 DVB OFDM demodulator driver
 
     Copyright (C) 2001-2002 Convergence Integrated Media GmbH
          Holger Waechtler <holger@convergence.de>
 
-    Copyright (C) 2004 Steven Toth <steve@toth.demon.co.uk>
+    Copyright (C) 2004 Steven Toth <stoth@hauppauge.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
index 11f86806756ef76fe48b33890cca8d6b23e589ed..5633976a58f19b9e90cf5b566510c4c481df6ead 100644 (file)
@@ -2,12 +2,12 @@
     Conexant 22702 DVB OFDM demodulator driver
 
     based on:
-        Alps TDMB7 DVB OFDM demodulator driver
+       Alps TDMB7 DVB OFDM demodulator driver
 
     Copyright (C) 2001-2002 Convergence Integrated Media GmbH
          Holger Waechtler <holger@convergence.de>
 
-    Copyright (C) 2004 Steven Toth <steve@toth.demon.co.uk>
+    Copyright (C) 2004 Steven Toth <stoth@hauppauge.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
index 654d7dc879d9fbb7e7d7fd9acdf43620215270e4..0c4db80ec332b7611e210308204e8a808b64e686 100644 (file)
@@ -55,81 +55,81 @@ static int debug;
        } while (0)
 
 static struct {u8 reg; u8 data;} cx24110_regdata[]=
-                      /* Comments beginning with @ denote this value should
-                         be the default */
-        {{0x09,0x01}, /* SoftResetAll */
-         {0x09,0x00}, /* release reset */
-         {0x01,0xe8}, /* MSB of code rate 27.5MS/s */
-         {0x02,0x17}, /* middle byte " */
-         {0x03,0x29}, /* LSB         " */
-         {0x05,0x03}, /* @ DVB mode, standard code rate 3/4 */
-         {0x06,0xa5}, /* @ PLL 60MHz */
-         {0x07,0x01}, /* @ Fclk, i.e. sampling clock, 60MHz */
-         {0x0a,0x00}, /* @ partial chip disables, do not set */
-         {0x0b,0x01}, /* set output clock in gapped mode, start signal low
-                         active for first byte */
-         {0x0c,0x11}, /* no parity bytes, large hold time, serial data out */
-         {0x0d,0x6f}, /* @ RS Sync/Unsync thresholds */
-         {0x10,0x40}, /* chip doc is misleading here: write bit 6 as 1
-                         to avoid starting the BER counter. Reset the
-                         CRC test bit. Finite counting selected */
-         {0x15,0xff}, /* @ size of the limited time window for RS BER
-                         estimation. It is <value>*256 RS blocks, this
-                         gives approx. 2.6 sec at 27.5MS/s, rate 3/4 */
-         {0x16,0x00}, /* @ enable all RS output ports */
-         {0x17,0x04}, /* @ time window allowed for the RS to sync */
-         {0x18,0xae}, /* @ allow all standard DVB code rates to be scanned
-                         for automatically */
-                      /* leave the current code rate and normalization
-                         registers as they are after reset... */
-         {0x21,0x10}, /* @ during AutoAcq, search each viterbi setting
-                         only once */
-         {0x23,0x18}, /* @ size of the limited time window for Viterbi BER
-                         estimation. It is <value>*65536 channel bits, i.e.
-                         approx. 38ms at 27.5MS/s, rate 3/4 */
-         {0x24,0x24}, /* do not trigger Viterbi CRC test. Finite count window */
-                      /* leave front-end AGC parameters at default values */
-                      /* leave decimation AGC parameters at default values */
-         {0x35,0x40}, /* disable all interrupts. They are not connected anyway */
-         {0x36,0xff}, /* clear all interrupt pending flags */
-         {0x37,0x00}, /* @ fully enable AutoAcqq state machine */
-         {0x38,0x07}, /* @ enable fade recovery, but not autostart AutoAcq */
-                      /* leave the equalizer parameters on their default values */
-                      /* leave the final AGC parameters on their default values */
-         {0x41,0x00}, /* @ MSB of front-end derotator frequency */
-         {0x42,0x00}, /* @ middle bytes " */
-         {0x43,0x00}, /* @ LSB          " */
-                      /* leave the carrier tracking loop parameters on default */
-                      /* leave the bit timing loop parameters at gefault */
-         {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */
-                      /* the cx24108 data sheet for symbol rates above 15MS/s */
-         {0x57,0x00}, /* @ Filter sigma delta enabled, positive */
-         {0x61,0x95}, /* GPIO pins 1-4 have special function */
-         {0x62,0x05}, /* GPIO pin 5 has special function, pin 6 is GPIO */
-         {0x63,0x00}, /* All GPIO pins use CMOS output characteristics */
-         {0x64,0x20}, /* GPIO 6 is input, all others are outputs */
-         {0x6d,0x30}, /* tuner auto mode clock freq 62kHz */
-         {0x70,0x15}, /* use auto mode, tuner word is 21 bits long */
-         {0x73,0x00}, /* @ disable several demod bypasses */
-         {0x74,0x00}, /* @  " */
-         {0x75,0x00}  /* @  " */
-                      /* the remaining registers are for SEC */
+                     /* Comments beginning with @ denote this value should
+                        be the default */
+       {{0x09,0x01}, /* SoftResetAll */
+        {0x09,0x00}, /* release reset */
+        {0x01,0xe8}, /* MSB of code rate 27.5MS/s */
+        {0x02,0x17}, /* middle byte " */
+        {0x03,0x29}, /* LSB         " */
+        {0x05,0x03}, /* @ DVB mode, standard code rate 3/4 */
+        {0x06,0xa5}, /* @ PLL 60MHz */
+        {0x07,0x01}, /* @ Fclk, i.e. sampling clock, 60MHz */
+        {0x0a,0x00}, /* @ partial chip disables, do not set */
+        {0x0b,0x01}, /* set output clock in gapped mode, start signal low
+                        active for first byte */
+        {0x0c,0x11}, /* no parity bytes, large hold time, serial data out */
+        {0x0d,0x6f}, /* @ RS Sync/Unsync thresholds */
+        {0x10,0x40}, /* chip doc is misleading here: write bit 6 as 1
+                        to avoid starting the BER counter. Reset the
+                        CRC test bit. Finite counting selected */
+        {0x15,0xff}, /* @ size of the limited time window for RS BER
+                        estimation. It is <value>*256 RS blocks, this
+                        gives approx. 2.6 sec at 27.5MS/s, rate 3/4 */
+        {0x16,0x00}, /* @ enable all RS output ports */
+        {0x17,0x04}, /* @ time window allowed for the RS to sync */
+        {0x18,0xae}, /* @ allow all standard DVB code rates to be scanned
+                        for automatically */
+                     /* leave the current code rate and normalization
+                        registers as they are after reset... */
+        {0x21,0x10}, /* @ during AutoAcq, search each viterbi setting
+                        only once */
+        {0x23,0x18}, /* @ size of the limited time window for Viterbi BER
+                        estimation. It is <value>*65536 channel bits, i.e.
+                        approx. 38ms at 27.5MS/s, rate 3/4 */
+        {0x24,0x24}, /* do not trigger Viterbi CRC test. Finite count window */
+                     /* leave front-end AGC parameters at default values */
+                     /* leave decimation AGC parameters at default values */
+        {0x35,0x40}, /* disable all interrupts. They are not connected anyway */
+        {0x36,0xff}, /* clear all interrupt pending flags */
+        {0x37,0x00}, /* @ fully enable AutoAcqq state machine */
+        {0x38,0x07}, /* @ enable fade recovery, but not autostart AutoAcq */
+                     /* leave the equalizer parameters on their default values */
+                     /* leave the final AGC parameters on their default values */
+        {0x41,0x00}, /* @ MSB of front-end derotator frequency */
+        {0x42,0x00}, /* @ middle bytes " */
+        {0x43,0x00}, /* @ LSB          " */
+                     /* leave the carrier tracking loop parameters on default */
+                     /* leave the bit timing loop parameters at gefault */
+        {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */
+                     /* the cx24108 data sheet for symbol rates above 15MS/s */
+        {0x57,0x00}, /* @ Filter sigma delta enabled, positive */
+        {0x61,0x95}, /* GPIO pins 1-4 have special function */
+        {0x62,0x05}, /* GPIO pin 5 has special function, pin 6 is GPIO */
+        {0x63,0x00}, /* All GPIO pins use CMOS output characteristics */
+        {0x64,0x20}, /* GPIO 6 is input, all others are outputs */
+        {0x6d,0x30}, /* tuner auto mode clock freq 62kHz */
+        {0x70,0x15}, /* use auto mode, tuner word is 21 bits long */
+        {0x73,0x00}, /* @ disable several demod bypasses */
+        {0x74,0x00}, /* @  " */
+        {0x75,0x00}  /* @  " */
+                     /* the remaining registers are for SEC */
        };
 
 
 static int cx24110_writereg (struct cx24110_state* state, int reg, int data)
 {
-        u8 buf [] = { reg, data };
+       u8 buf [] = { reg, data };
        struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
        int err;
 
-        if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
+       if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
                dprintk ("%s: writereg error (err == %i, reg == 0x%02x,"
                         " data == 0x%02x)\n", __FUNCTION__, err, reg, data);
                return -EREMOTEIO;
        }
 
-        return 0;
+       return 0;
 }
 
 static int cx24110_readreg (struct cx24110_state* state, u8 reg)
@@ -153,27 +153,27 @@ static int cx24110_set_inversion (struct cx24110_state* state, fe_spectral_inver
 
        switch (inversion) {
        case INVERSION_OFF:
-                cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
-                /* AcqSpectrInvDis on. No idea why someone should want this */
-                cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)&0xf7);
-                /* Initial value 0 at start of acq */
-                cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)&0xef);
-                /* current value 0 */
-                /* The cx24110 manual tells us this reg is read-only.
-                   But what the heck... set it ayways */
-                break;
+               cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
+               /* AcqSpectrInvDis on. No idea why someone should want this */
+               cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)&0xf7);
+               /* Initial value 0 at start of acq */
+               cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)&0xef);
+               /* current value 0 */
+               /* The cx24110 manual tells us this reg is read-only.
+                  But what the heck... set it ayways */
+               break;
        case INVERSION_ON:
-                cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
-                /* AcqSpectrInvDis on. No idea why someone should want this */
-                cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)|0x08);
-                /* Initial value 1 at start of acq */
-                cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)|0x10);
-                /* current value 1 */
-                break;
+               cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x1);
+               /* AcqSpectrInvDis on. No idea why someone should want this */
+               cx24110_writereg(state,0x5,cx24110_readreg(state,0x5)|0x08);
+               /* Initial value 1 at start of acq */
+               cx24110_writereg(state,0x22,cx24110_readreg(state,0x22)|0x10);
+               /* current value 1 */
+               break;
        case INVERSION_AUTO:
-                cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xfe);
-                /* AcqSpectrInvDis off. Leave initial & current states as is */
-                break;
+               cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xfe);
+               /* AcqSpectrInvDis off. Leave initial & current states as is */
+               break;
        default:
                return -EINVAL;
        }
@@ -185,18 +185,18 @@ static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
 {
 /* fixme (low): error handling */
 
-        static const int rate[]={-1,1,2,3,5,7,-1};
-        static const int g1[]={-1,0x01,0x02,0x05,0x15,0x45,-1};
-        static const int g2[]={-1,0x01,0x03,0x06,0x1a,0x7a,-1};
+       static const int rate[]={-1,1,2,3,5,7,-1};
+       static const int g1[]={-1,0x01,0x02,0x05,0x15,0x45,-1};
+       static const int g2[]={-1,0x01,0x03,0x06,0x1a,0x7a,-1};
 
-        /* Well, the AutoAcq engine of the cx24106 and 24110 automatically
-           searches all enabled viterbi rates, and can handle non-standard
-           rates as well. */
+       /* Well, the AutoAcq engine of the cx24106 and 24110 automatically
+          searches all enabled viterbi rates, and can handle non-standard
+          rates as well. */
 
-        if (fec>FEC_AUTO)
-                fec=FEC_AUTO;
+       if (fec>FEC_AUTO)
+               fec=FEC_AUTO;
 
-        if (fec==FEC_AUTO) { /* (re-)establish AutoAcq behaviour */
+       if (fec==FEC_AUTO) { /* (re-)establish AutoAcq behaviour */
                cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xdf);
                /* clear AcqVitDis bit */
                cx24110_writereg(state,0x18,0xae);
@@ -208,7 +208,7 @@ static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
                cx24110_writereg(state,0x1a,0x05); cx24110_writereg(state,0x1b,0x06);
                /* set the puncture registers for code rate 3/4 */
                return 0;
-        } else {
+       } else {
                cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x20);
                /* set AcqVitDis bit */
                if(rate[fec]>0) {
@@ -219,10 +219,10 @@ static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
                        cx24110_writereg(state,0x1a,g1[fec]);
                        cx24110_writereg(state,0x1b,g2[fec]);
                        /* not sure if this is the right way: I always used AutoAcq mode */
-           } else
+          } else
                   return -EOPNOTSUPP;
 /* fixme (low): which is the correct return code? */
-        };
+       };
        return 0;
 }
 
@@ -245,72 +245,72 @@ static fe_code_rate_t cx24110_get_fec (struct cx24110_state* state)
 static int cx24110_set_symbolrate (struct cx24110_state* state, u32 srate)
 {
 /* fixme (low): add error handling */
-        u32 ratio;
-        u32 tmp, fclk, BDRI;
+       u32 ratio;
+       u32 tmp, fclk, BDRI;
 
-        static const u32 bands[]={5000000UL,15000000UL,90999000UL/2};
-        int i;
+       static const u32 bands[]={5000000UL,15000000UL,90999000UL/2};
+       int i;
 
 dprintk("cx24110 debug: entering %s(%d)\n",__FUNCTION__,srate);
-        if (srate>90999000UL/2)
-                srate=90999000UL/2;
-        if (srate<500000)
-                srate=500000;
+       if (srate>90999000UL/2)
+               srate=90999000UL/2;
+       if (srate<500000)
+               srate=500000;
 
-        for(i=0;(i<sizeof(bands)/sizeof(bands[0]))&&(srate>bands[i]);i++)
+       for(i=0;(i<sizeof(bands)/sizeof(bands[0]))&&(srate>bands[i]);i++)
                ;
-        /* first, check which sample rate is appropriate: 45, 60 80 or 90 MHz,
-           and set the PLL accordingly (R07[1:0] Fclk, R06[7:4] PLLmult,
-           R06[3:0] PLLphaseDetGain */
-        tmp=cx24110_readreg(state,0x07)&0xfc;
-        if(srate<90999000UL/4) { /* sample rate 45MHz*/
+       /* first, check which sample rate is appropriate: 45, 60 80 or 90 MHz,
+          and set the PLL accordingly (R07[1:0] Fclk, R06[7:4] PLLmult,
+          R06[3:0] PLLphaseDetGain */
+       tmp=cx24110_readreg(state,0x07)&0xfc;
+       if(srate<90999000UL/4) { /* sample rate 45MHz*/
                cx24110_writereg(state,0x07,tmp);
                cx24110_writereg(state,0x06,0x78);
                fclk=90999000UL/2;
-        } else if(srate<60666000UL/2) { /* sample rate 60MHz */
+       } else if(srate<60666000UL/2) { /* sample rate 60MHz */
                cx24110_writereg(state,0x07,tmp|0x1);
                cx24110_writereg(state,0x06,0xa5);
                fclk=60666000UL;
-        } else if(srate<80888000UL/2) { /* sample rate 80MHz */
+       } else if(srate<80888000UL/2) { /* sample rate 80MHz */
                cx24110_writereg(state,0x07,tmp|0x2);
                cx24110_writereg(state,0x06,0x87);
                fclk=80888000UL;
-        } else { /* sample rate 90MHz */
+       } else { /* sample rate 90MHz */
                cx24110_writereg(state,0x07,tmp|0x3);
                cx24110_writereg(state,0x06,0x78);
                fclk=90999000UL;
-        };
-        dprintk("cx24110 debug: fclk %d Hz\n",fclk);
-        /* we need to divide two integers with approx. 27 bits in 32 bit
-           arithmetic giving a 25 bit result */
-        /* the maximum dividend is 90999000/2, 0x02b6446c, this number is
-           also the most complex divisor. Hence, the dividend has,
-           assuming 32bit unsigned arithmetic, 6 clear bits on top, the
-           divisor 2 unused bits at the bottom. Also, the quotient is
-           always less than 1/2. Borrowed from VES1893.c, of course */
+       };
+       dprintk("cx24110 debug: fclk %d Hz\n",fclk);
+       /* we need to divide two integers with approx. 27 bits in 32 bit
+          arithmetic giving a 25 bit result */
+       /* the maximum dividend is 90999000/2, 0x02b6446c, this number is
+          also the most complex divisor. Hence, the dividend has,
+          assuming 32bit unsigned arithmetic, 6 clear bits on top, the
+          divisor 2 unused bits at the bottom. Also, the quotient is
+          always less than 1/2. Borrowed from VES1893.c, of course */
 
-        tmp=srate<<6;
-        BDRI=fclk>>2;
-        ratio=(tmp/BDRI);
+       tmp=srate<<6;
+       BDRI=fclk>>2;
+       ratio=(tmp/BDRI);
 
-        tmp=(tmp%BDRI)<<8;
-        ratio=(ratio<<8)+(tmp/BDRI);
+       tmp=(tmp%BDRI)<<8;
+       ratio=(ratio<<8)+(tmp/BDRI);
 
-        tmp=(tmp%BDRI)<<8;
-        ratio=(ratio<<8)+(tmp/BDRI);
+       tmp=(tmp%BDRI)<<8;
+       ratio=(ratio<<8)+(tmp/BDRI);
 
-        tmp=(tmp%BDRI)<<1;
-        ratio=(ratio<<1)+(tmp/BDRI);
+       tmp=(tmp%BDRI)<<1;
+       ratio=(ratio<<1)+(tmp/BDRI);
 
-        dprintk("srate= %d (range %d, up to %d)\n", srate,i,bands[i]);
-        dprintk("fclk = %d\n", fclk);
-        dprintk("ratio= %08x\n", ratio);
+       dprintk("srate= %d (range %d, up to %d)\n", srate,i,bands[i]);
+       dprintk("fclk = %d\n", fclk);
+       dprintk("ratio= %08x\n", ratio);
 
-        cx24110_writereg(state, 0x1, (ratio>>16)&0xff);
-        cx24110_writereg(state, 0x2, (ratio>>8)&0xff);
-        cx24110_writereg(state, 0x3, (ratio)&0xff);
+       cx24110_writereg(state, 0x1, (ratio>>16)&0xff);
+       cx24110_writereg(state, 0x2, (ratio>>8)&0xff);
+       cx24110_writereg(state, 0x3, (ratio)&0xff);
 
-        return 0;
+       return 0;
 
 }
 
@@ -324,48 +324,48 @@ int cx24110_pll_write (struct dvb_frontend* fe, u32 data)
 
        dprintk("cx24110 debug: cx24108_write(%8.8x)\n",data);
 
-        cx24110_writereg(state,0x6d,0x30); /* auto mode at 62kHz */
-        cx24110_writereg(state,0x70,0x15); /* auto mode 21 bits */
+       cx24110_writereg(state,0x6d,0x30); /* auto mode at 62kHz */
+       cx24110_writereg(state,0x70,0x15); /* auto mode 21 bits */
 
-        /* if the auto tuner writer is still busy, clear it out */
-        while (cx24110_readreg(state,0x6d)&0x80)
+       /* if the auto tuner writer is still busy, clear it out */
+       while (cx24110_readreg(state,0x6d)&0x80)
                cx24110_writereg(state,0x72,0);
 
-        /* write the topmost 8 bits */
-        cx24110_writereg(state,0x72,(data>>24)&0xff);
+       /* write the topmost 8 bits */
+       cx24110_writereg(state,0x72,(data>>24)&0xff);
 
-        /* wait for the send to be completed */
-        while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
+       /* wait for the send to be completed */
+       while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
                ;
 
-        /* send another 8 bytes */
-        cx24110_writereg(state,0x72,(data>>16)&0xff);
-        while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
+       /* send another 8 bytes */
+       cx24110_writereg(state,0x72,(data>>16)&0xff);
+       while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
                ;
 
-        /* and the topmost 5 bits of this byte */
-        cx24110_writereg(state,0x72,(data>>8)&0xff);
-        while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
+       /* and the topmost 5 bits of this byte */
+       cx24110_writereg(state,0x72,(data>>8)&0xff);
+       while ((cx24110_readreg(state,0x6d)&0xc0)==0x80)
                ;
 
-        /* now strobe the enable line once */
-        cx24110_writereg(state,0x6d,0x32);
-        cx24110_writereg(state,0x6d,0x30);
+       /* now strobe the enable line once */
+       cx24110_writereg(state,0x6d,0x32);
+       cx24110_writereg(state,0x6d,0x30);
 
-        return 0;
+       return 0;
 }
 
 static int cx24110_initfe(struct dvb_frontend* fe)
 {
        struct cx24110_state *state = fe->demodulator_priv;
 /* fixme (low): error handling */
-        int i;
+       int i;
 
        dprintk("%s: init chip\n", __FUNCTION__);
 
-        for(i=0;i<sizeof(cx24110_regdata)/sizeof(cx24110_regdata[0]);i++) {
+       for(i=0;i<sizeof(cx24110_regdata)/sizeof(cx24110_regdata[0]);i++) {
                cx24110_writereg(state, cx24110_regdata[i].reg, cx24110_regdata[i].data);
-        };
+       };
 
        if (state->config->pll_init) state->config->pll_init(fe);
 
index 19b4bf7c21a752eed6fa9c390ba803826bb1e59c..1c7c91224472ce6f2078aadec88222eacf46dbd2 100644 (file)
@@ -2,7 +2,7 @@
     driver for LSI L64781 COFDM demodulator
 
     Copyright (C) 2001 Holger Waechtler for Convergence Integrated Media GmbH
-                       Marko Kohtala <marko.kohtala@luukku.com>
+                      Marko Kohtala <marko.kohtala@luukku.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
@@ -433,7 +433,7 @@ static int l64781_init(struct dvb_frontend* fe)
 {
        struct l64781_state* state = fe->demodulator_priv;
 
-        reset_and_configure (state);
+       reset_and_configure (state);
 
        /* Power up */
        l64781_writereg (state, 0x3e, 0xa5);
@@ -456,9 +456,9 @@ static int l64781_init(struct dvb_frontend* fe)
        l64781_writereg (state, 0x0d, 0x8c);
 
        /* With ppm=8000, it seems the DTR_SENSITIVITY will result in
-           value of 2 with all possible bandwidths and guard
-           intervals, which is the initial value anyway. */
-        /*l64781_writereg (state, 0x19, 0x92);*/
+          value of 2 with all possible bandwidths and guard
+          intervals, which is the initial value anyway. */
+       /*l64781_writereg (state, 0x19, 0x92);*/
 
        /* Everything is two's complement, soft bit and CSI_OUT too */
        l64781_writereg (state, 0x1e, 0x09);
@@ -477,10 +477,10 @@ static int l64781_init(struct dvb_frontend* fe)
 static int l64781_get_tune_settings(struct dvb_frontend* fe,
                                    struct dvb_frontend_tune_settings* fesettings)
 {
-        fesettings->min_delay_ms = 4000;
-        fesettings->step_size = 0;
-        fesettings->max_drift = 0;
-        return 0;
+       fesettings->min_delay_ms = 4000;
+       fesettings->step_size = 0;
+       fesettings->max_drift = 0;
+       return 0;
 }
 
 static void l64781_release(struct dvb_frontend* fe)
@@ -522,7 +522,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
 
        /* The chip always responds to reads */
        if (i2c_transfer(state->i2c, msg, 2) != 2) {
-               dprintk("No response to read on I2C bus\n");
+               dprintk("No response to read on I2C bus\n");
                goto error;
        }
 
@@ -531,7 +531,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
 
        /* Reading the POWER_DOWN register always returns 0 */
        if (reg0x3e != 0) {
-               dprintk("Device doesn't look like L64781\n");
+               dprintk("Device doesn't look like L64781\n");
                goto error;
        }
 
@@ -540,7 +540,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
 
        /* Responds to all reads with 0 */
        if (l64781_readreg(state, 0x1a) != 0) {
-               dprintk("Read 1 returned unexpcted value\n");
+               dprintk("Read 1 returned unexpcted value\n");
                goto error;
        }
 
@@ -549,7 +549,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
 
        /* Responds with register default value */
        if (l64781_readreg(state, 0x1a) != 0xa1) {
-               dprintk("Read 2 returned unexpcted value\n");
+               dprintk("Read 2 returned unexpcted value\n");
                goto error;
        }
 
index 7e30fb0fdfa78264a806ff30fa13b0a338a01748..947f65f87465441f366a21312631b243bbbe50f4 100644 (file)
@@ -2,7 +2,7 @@
     driver for LSI L64781 COFDM demodulator
 
     Copyright (C) 2001 Holger Waechtler for Convergence Integrated Media GmbH
-                       Marko Kohtala <marko.kohtala@luukku.com>
+                      Marko Kohtala <marko.kohtala@luukku.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
index 6a33f5a19a8d72d96312963f05bc745555f934b5..cb5301865d07e9d0775bb9bb588ff3b05a3483fd 100644 (file)
@@ -301,10 +301,10 @@ static int lgdt330x_set_parameters(struct dvb_frontend* fe,
        static u8 lgdt3303_8vsb_44_data[] = {
                0x04, 0x00,
                0x0d, 0x40,
-        0x0e, 0x87,
-        0x0f, 0x8e,
-        0x10, 0x01,
-        0x47, 0x8b };
+       0x0e, 0x87,
+       0x0f, 0x8e,
+       0x10, 0x01,
+       0x47, 0x8b };
 
        /*
         * Array of byte pairs <address, value>
index 9c67f406d581a7d9a7fe7d964bd1786492ad8c9d..8d672283c93de1ef15c3d500c1fd4896b8a03bb2 100644 (file)
@@ -554,7 +554,7 @@ static int mt312_set_frontend(struct dvb_frontend* fe,
        if ((ret = mt312_write(state, SYM_RATE_H, buf, sizeof(buf))) < 0)
                return ret;
 
-        mt312_reset(state, 0);
+       mt312_reset(state, 0);
 
        return 0;
 }
@@ -695,7 +695,7 @@ static struct dvb_frontend_ops vp310_mt312_ops = {
                    FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
                    FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
                    FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_MUTE_TS |
-                   FE_CAN_RECOVER
+                   FE_CAN_RECOVER
        },
 
        .release = mt312_release,
index 30786b1911bdab48dbec0808f01a44bacb9230e1..52c416043a628f24dd24cc65279a4f45057f306a 100644 (file)
@@ -527,7 +527,7 @@ static int nxt2002_read_snr(struct dvb_frontend* fe, u16* snr)
        else
                snrdb = 1000*0 + ( 1000*(12-0) * ( temp2 - 0 ) / ( 0x7C00 - 0 ) );
 
-        /* the value reported back from the frontend will be FFFF=32db 0000=0db */
+       /* the value reported back from the frontend will be FFFF=32db 0000=0db */
 
        *snr = snrdb * (0xFFFF/32000);
 
@@ -646,7 +646,7 @@ struct dvb_frontend* nxt2002_attach(const struct nxt2002_config* config,
        memcpy(&state->ops, &nxt2002_ops, sizeof(struct dvb_frontend_ops));
        state->initialised = 0;
 
-        /* Check the first 5 registers to ensure this a revision we can handle */
+       /* Check the first 5 registers to ensure this a revision we can handle */
 
        i2c_readbytes(state, 0x00, buf, 5);
        if (buf[0] != 0x04) goto error;         /* device id */
@@ -672,7 +672,7 @@ static struct dvb_frontend_ops nxt2002_ops = {
                .type = FE_ATSC,
                .frequency_min =  54000000,
                .frequency_max = 860000000,
-                /* stepsize is just a guess */
+               /* stepsize is just a guess */
                .frequency_stepsize = 166666,
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
                        FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
index bad0933eb7146663124339b366c53e47295bd4a8..aeafef46e3ebd4b68bd03b94624a0fdb3720d83a 100644 (file)
@@ -44,6 +44,8 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
+#include <linux/slab.h>
+#include <linux/string.h>
 
 #include "dvb_frontend.h"
 #include "dvb-pll.h"
@@ -337,7 +339,7 @@ static int nxt200x_writetuner (struct nxt200x_state* state, u8* data)
        switch (state->demod_chip) {
                case NXT2004:
                        if (i2c_writebytes(state, state->config->pll_address, data, 4))
-                               printk(KERN_WARNING "nxt200x: error writing to tuner\n");
+                               printk(KERN_WARNING "nxt200x: error writing to tuner\n");
                        /* wait until we have a lock */
                        while (count < 20) {
                                i2c_readbytes(state, state->config->pll_address, &buf, 1);
@@ -495,7 +497,7 @@ static int nxt2004_load_firmware (struct dvb_frontend* fe, const struct firmware
 
        /* calculate firmware CRC */
        for (position = 0; position < fw->size; position++) {
-               crc = nxt200x_crc(crc, fw->data[position]);
+               crc = nxt200x_crc(crc, fw->data[position]);
        }
 
        buf[0] = rambase >> 8;
index 88a57b7911124cb58113afd3676d885a221992e1..a458a3bfff7009fa3ed80f99822edcef2e23507d 100644 (file)
@@ -574,11 +574,11 @@ static struct dvb_frontend_ops nxt6000_ops = {
                .symbol_rate_max = 9360000,     /* FIXME */
                .symbol_rate_tolerance = 4000,
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-                       FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
-                       FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
-                       FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-                       FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
-                       FE_CAN_HIERARCHY_AUTO,
+                       FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
+                       FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
+                       FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+                       FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+                       FE_CAN_HIERARCHY_AUTO,
        },
 
        .release = nxt6000_release,
index 78bded861d02bb8d2c0c807bbbb9277f52cc8466..80e0f28127b7bd44b51cb19cc1d7df730983117f 100644 (file)
@@ -503,7 +503,7 @@ static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength)
        rcvr_stat = rec_buf[1];
        usK = (rcvr_stat & 0x10) ? 3 : 0;
 
-        /* The value reported back from the frontend will be FFFF=100% 0000=0% */
+       /* The value reported back from the frontend will be FFFF=100% 0000=0% */
        signal_strength = (((8952 - i20Log10(snr_equ) - usK*100)/3+5)*65535)/1000;
        if (signal_strength > 0xffff)
                *strength = 0xffff;
index f265418e326102ba5c56855a8fc4443aeb3289be..18715091aed8e779e2a64f1241a057aecf642574 100644 (file)
@@ -494,7 +494,7 @@ static int s5h1420_getfreqoffset(struct s5h1420_state* state)
 }
 
 static void s5h1420_setfec_inversion(struct s5h1420_state* state,
-                                    struct dvb_frontend_parameters *p)
+                                    struct dvb_frontend_parameters *p)
 {
        u8 inversion = 0;
 
@@ -521,8 +521,8 @@ static void s5h1420_setfec_inversion(struct s5h1420_state* state,
 
                case FEC_3_4:
                        s5h1420_writereg(state, 0x30, 0x04);
-                        s5h1420_writereg(state, 0x31, 0x12 | inversion);
-                        break;
+                       s5h1420_writereg(state, 0x31, 0x12 | inversion);
+                       break;
 
                case FEC_5_6:
                        s5h1420_writereg(state, 0x30, 0x08);
index 872028ddf2a2df0e76288be17dc4a222dd457c1f..73296f13c324b67910b8f55672395d7e63d3351a 100644 (file)
@@ -39,6 +39,6 @@ struct s5h1420_config
 };
 
 extern struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config,
-             struct i2c_adapter* i2c);
+            struct i2c_adapter* i2c);
 
 #endif // S5H1420_H
index 1c6b2e9264bc15c7b78cd8bac150ef8957abba41..fc06cd6b46c3c843df95422811cb35faf3a44646 100644 (file)
@@ -67,16 +67,16 @@ static int debug;
 
 static int sp8870_writereg (struct sp8870_state* state, u16 reg, u16 data)
 {
-        u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
+       u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
        struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 4 };
        int err;
 
-        if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
+       if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
                dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data);
                return -EREMOTEIO;
        }
 
-        return 0;
+       return 0;
 }
 
 static int sp8870_readreg (struct sp8870_state* state, u16 reg)
@@ -305,7 +305,7 @@ static int sp8870_set_frontend_parameters (struct dvb_frontend* fe,
 static int sp8870_init (struct dvb_frontend* fe)
 {
        struct sp8870_state* state = fe->demodulator_priv;
-        const struct firmware *fw = NULL;
+       const struct firmware *fw = NULL;
 
        sp8870_wake_up(state);
        if (state->initialised) return 0;
@@ -534,10 +534,10 @@ static int sp8870_sleep(struct dvb_frontend* fe)
 
 static int sp8870_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
 {
-        fesettings->min_delay_ms = 350;
-        fesettings->step_size = 0;
-        fesettings->max_drift = 0;
-        return 0;
+       fesettings->min_delay_ms = 350;
+       fesettings->step_size = 0;
+       fesettings->max_drift = 0;
+       return 0;
 }
 
 static void sp8870_release(struct dvb_frontend* fe)
index 73384e75625ee8ea1d0c83eb222142aba7866fa1..e3b6657822432e98f39fe3a6c6630d092a096581 100644 (file)
@@ -80,7 +80,7 @@ static int sp887x_readreg (struct sp887x_state* state, u16 reg)
        u8 b1 [2];
        int ret;
        struct i2c_msg msg[] = {{ .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 2 },
-                        { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 }};
+                        { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 }};
 
        if ((ret = i2c_transfer(state->i2c, msg, 2)) != 2) {
                printk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
@@ -498,7 +498,7 @@ static int sp887x_sleep(struct dvb_frontend* fe)
 static int sp887x_init(struct dvb_frontend* fe)
 {
        struct sp887x_state* state = fe->demodulator_priv;
-        const struct firmware *fw = NULL;
+       const struct firmware *fw = NULL;
        int ret;
 
        if (!state->initialised) {
@@ -528,10 +528,10 @@ static int sp887x_init(struct dvb_frontend* fe)
 
 static int sp887x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
 {
-        fesettings->min_delay_ms = 350;
-        fesettings->step_size = 166666*2;
-        fesettings->max_drift = (166666*2)+1;
-        return 0;
+       fesettings->min_delay_ms = 350;
+       fesettings->step_size = 166666*2;
+       fesettings->max_drift = (166666*2)+1;
+       return 0;
 }
 
 static void sp887x_release(struct dvb_frontend* fe)
@@ -581,7 +581,7 @@ static struct dvb_frontend_ops sp887x_ops = {
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
                        FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
                        FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
-                       FE_CAN_RECOVER
+                       FE_CAN_RECOVER
        },
 
        .release = sp887x_release,
index 29c48665e1309eb1e95500eac5909d663b09f4b1..177d71d56b67ac579ac9111c5397bffcbfa01dbe 100644 (file)
@@ -95,7 +95,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
 
        return stv0299_writeregI(state, reg, data);
 }
@@ -220,7 +220,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        u64 big = srate;
        u32 ratio;
 
@@ -271,7 +271,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        u8 val;
        int i;
 
@@ -301,7 +301,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        u8 val;
 
        dprintk ("%s\n", __FUNCTION__);
@@ -328,7 +328,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        u8 val;
 
        if (stv0299_wait_diseqc_idle (state, 100) < 0)
@@ -350,7 +350,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        u8 reg0x08;
        u8 reg0x0c;
 
@@ -442,7 +442,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        int i;
 
        dprintk("stv0299: init chip\n");
@@ -461,7 +461,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
 
        u8 signal = 0xff - stv0299_readreg (state, 0x18);
        u8 sync = stv0299_readreg (state, 0x1b);
@@ -489,7 +489,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 = 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);
@@ -499,7 +499,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
 
        s32 signal =  0xffff - ((stv0299_readreg (state, 0x18) << 8)
                               | stv0299_readreg (state, 0x19));
@@ -516,7 +516,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
 
        s32 xsnr = 0xffff - ((stv0299_readreg (state, 0x24) << 8)
                           | stv0299_readreg (state, 0x25));
@@ -528,7 +528,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 = 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);
@@ -538,7 +538,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        int invval = 0;
 
        dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__);
@@ -571,7 +571,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
        s32 derot_freq;
        int invval;
 
@@ -596,7 +596,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 = fe->demodulator_priv;
+       struct stv0299_state* state = fe->demodulator_priv;
 
        stv0299_writeregI(state, 0x02, 0x80);
        state->initialised = 0;
@@ -606,7 +606,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 = 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) {
@@ -658,7 +658,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
 
        /* create dvb_frontend */
        state->frontend.ops = &state->ops;
-        state->frontend.demodulator_priv = state;
+       state->frontend.demodulator_priv = state;
        return &state->frontend;
 
 error:
@@ -714,7 +714,7 @@ MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
 
 MODULE_DESCRIPTION("ST STV0299 DVB Demodulator driver");
 MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, "
-              "Andreas Oberritter, Andrew de Quincey, Kenneth Aafløy");
+             "Andreas Oberritter, Andrew de Quincey, Kenneth Aafløy");
 MODULE_LICENSE("GPL");
 
 EXPORT_SYMBOL(stv0299_writereg);
index eaf130e666d8b232b311103a95ebdcb1cfd9db27..425cd19136fe351ed339077cb2e80863a2bf4268 100644 (file)
@@ -1,10 +1,10 @@
 /*
     TDA10021  - Single Chip Cable Channel Receiver driver module
-               used on the the Siemens DVB-C cards
+              used on the the Siemens DVB-C cards
 
     Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
     Copyright (C) 2004 Markus Schulz <msc@antzsystem.de>
-                   Support for TDA10021
+                  Support for TDA10021
 
     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
@@ -76,9 +76,9 @@ static u8 tda10021_inittab[0x40]=
 
 static int tda10021_writereg (struct tda10021_state* state, u8 reg, u8 data)
 {
-        u8 buf[] = { reg, data };
+       u8 buf[] = { reg, data };
        struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
-        int ret;
+       int ret;
 
        ret = i2c_transfer (state->i2c, &msg, 1);
        if (ret != 1)
@@ -95,7 +95,7 @@ static u8 tda10021_readreg (struct tda10021_state* state, u8 reg)
        u8 b0 [] = { reg };
        u8 b1 [] = { 0 };
        struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 1 },
-                                 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+                                 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
        int ret;
 
        ret = i2c_transfer (state->i2c, msg, 2);
index 7d6a51ce291e13d41894f4b9c0d84b73fd60c7f7..53be939e8c5583e679f09e5afd25134224d22aab 100644 (file)
@@ -1,10 +1,10 @@
 /*
     TDA10021  - Single Chip Cable Channel Receiver driver module
-               used on the the Siemens DVB-C cards
+              used on the the Siemens DVB-C cards
 
     Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
     Copyright (C) 2004 Markus Schulz <msc@antzsystem.de>
-                   Support for TDA10021
+                  Support for TDA10021
 
     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
index 7968743826fc50072d3a968baf4a76011cd03525..dd02aff467fe49c4acc7cd2674472cce88a10ad0 100644 (file)
@@ -475,7 +475,7 @@ static int tda10046_fwupload(struct dvb_frontend* fe)
                ret = state->config->request_firmware(fe, &fw, TDA10046_DEFAULT_FIRMWARE);
                if (ret) {
                        printk(KERN_ERR "tda1004x: no firmware upload (timeout or file not found?)\n");
-                       return ret;
+                       return ret;
                }
                tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 8); // going to boot from HOST
                ret = tda1004x_do_upload(state, fw->data, fw->size, TDA10046H_CODE_CPT, TDA10046H_CODE_IN);
index c05cf1861051b3271effd7136625e5cc6b3cd543..91baa9cedd79846c90d58db1e4c12ee23551bb10 100644 (file)
@@ -66,13 +66,13 @@ static int tda8083_writereg (struct tda8083_state* state, u8 reg, u8 data)
        u8 buf [] = { reg, data };
        struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
 
-        ret = i2c_transfer(state->i2c, &msg, 1);
+       ret = i2c_transfer(state->i2c, &msg, 1);
 
-        if (ret != 1)
-                dprintk ("%s: writereg error (reg %02x, ret == %i)\n",
+       if (ret != 1)
+               dprintk ("%s: writereg error (reg %02x, ret == %i)\n",
                        __FUNCTION__, reg, ret);
 
-        return (ret != 1) ? -1 : 0;
+       return (ret != 1) ? -1 : 0;
 }
 
 static int tda8083_readregs (struct tda8083_state* state, u8 reg1, u8 *b, u8 len)
@@ -87,7 +87,7 @@ static int tda8083_readregs (struct tda8083_state* state, u8 reg1, u8 *b, u8 len
                dprintk ("%s: readreg error (reg %02x, ret == %i)\n",
                        __FUNCTION__, reg1, ret);
 
-        return ret == 2 ? 0 : -1;
+       return ret == 2 ? 0 : -1;
 }
 
 static inline u8 tda8083_readreg (struct tda8083_state* state, u8 reg)
@@ -132,14 +132,14 @@ static fe_code_rate_t tda8083_get_fec (struct tda8083_state* state)
 
 static int tda8083_set_symbolrate (struct tda8083_state* state, u32 srate)
 {
-        u32 ratio;
+       u32 ratio;
        u32 tmp;
        u8 filter;
 
        if (srate > 32000000)
-                srate = 32000000;
-        if (srate < 500000)
-                srate = 500000;
+               srate = 32000000;
+       if (srate < 500000)
+               srate = 500000;
 
        filter = 0;
        if (srate < 24000000)
@@ -174,7 +174,7 @@ static void tda8083_wait_diseqc_fifo (struct tda8083_state* state, int timeout)
        unsigned long start = jiffies;
 
        while (jiffies - start < timeout &&
-               !(tda8083_readreg(state, 0x02) & 0x80))
+              !(tda8083_readreg(state, 0x02) & 0x80))
        {
                msleep(50);
        };
index c6d276618e86fab9bdbbc9da7d9d5a71386772ae..ad8647a3c85e69c6caa321e2d2a334afa6e54526 100644 (file)
@@ -140,25 +140,25 @@ static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
        /* yeuch! */
        fpxin = state->config->xin * 10;
        fptmp = fpxin; do_div(fptmp, 123);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 1;
        fptmp = fpxin; do_div(fptmp, 160);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 0;
        fptmp = fpxin; do_div(fptmp, 246);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 1;
        fptmp = fpxin; do_div(fptmp, 320);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 0;
        fptmp = fpxin; do_div(fptmp, 492);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 1;
        fptmp = fpxin; do_div(fptmp, 640);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 0;
        fptmp = fpxin; do_div(fptmp, 984);
-       if (symbolrate < fptmp);
+       if (symbolrate < fptmp)
                SFIL = 1;
 
        fin = state->config->xin >> 4;
index d8bf65877897bd6a0e1650c19e825584ead7ea9c..fa5034a9ecf588ae955b751818b955814fc6eeb3 100644 (file)
@@ -81,6 +81,7 @@ config DVB_BUDGET_CI
        tristate "Budget cards with onboard CI connector"
        depends on DVB_CORE && PCI
        select VIDEO_SAA7146
+       select DVB_STV0297
        select DVB_STV0299
        select DVB_TDA1004X
        help
index 87ea52757a2171243bb7e543d22506ea35a8cb02..7dae91e5863c002c885e4247b8b253dfe37dc90c 100644 (file)
@@ -176,6 +176,9 @@ static void init_av7110_av(struct av7110 *av7110)
                }
        }
 
+       if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000e)
+               av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, SpdifSwitch, 1, 0); // SPDIF on
+
        ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);
        if (ret < 0)
                printk("dvb-ttpci:cannot set volume :%d\n",ret);
@@ -217,10 +220,10 @@ static int arm_thread(void *data)
 
        dprintk(4, "%p\n",av7110);
 
-        lock_kernel();
-        daemonize("arm_mon");
-        sigfillset(&current->blocked);
-        unlock_kernel();
+       lock_kernel();
+       daemonize("arm_mon");
+       sigfillset(&current->blocked);
+       unlock_kernel();
 
        av7110->arm_thread = current;
 
@@ -1535,7 +1538,7 @@ static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
        buf[2] = ((div & 0x18000) >> 10) | 0x95;
        buf[3] = (pwr << 6) | 0x30;
 
-        // NOTE: since we're using a prescaler of 2, we set the
+       // NOTE: since we're using a prescaler of 2, we set the
        // divisor frequency to 62.5kHz and divide by 125 above
 
        if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1)
@@ -1811,7 +1814,7 @@ static struct tda8083_config grundig_29504_451_config = {
 static int philips_cd1516_pll_set(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters* params)
 {
-        struct av7110* av7110 = fe->dvb->priv;
+       struct av7110* av7110 = fe->dvb->priv;
        u32 div;
        u32 f = params->frequency;
        u8 data[4];
@@ -2202,7 +2205,7 @@ static u8 read_pwm(struct av7110* av7110)
        struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
                                 { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
 
-        if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
+       if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
                pwm = 0x48;
 
        return pwm;
@@ -2245,7 +2248,7 @@ static int frontend_init(struct av7110 *av7110)
                        }
 
                        // Try the grundig 29504-451
-                        av7110->fe = tda8083_attach(&grundig_29504_451_config, &av7110->i2c_adap);
+                       av7110->fe = tda8083_attach(&grundig_29504_451_config, &av7110->i2c_adap);
                        if (av7110->fe) {
                                av7110->fe->ops->diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
                                av7110->fe->ops->diseqc_send_burst = av7110_diseqc_send_burst;
@@ -2271,12 +2274,12 @@ static int frontend_init(struct av7110 *av7110)
                case 0x0001: // Hauppauge/TT Nexus-T premium rev1.X
 
                        // ALPS TDLB7
-                        av7110->fe = sp8870_attach(&alps_tdlb7_config, &av7110->i2c_adap);
+                       av7110->fe = sp8870_attach(&alps_tdlb7_config, &av7110->i2c_adap);
                        break;
 
                case 0x0002: // Hauppauge/TT DVB-C premium rev2.X
 
-                        av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
+                       av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
                        break;
 
                case 0x0006: /* Fujitsu-Siemens DVB-S rev 1.6 */
@@ -2421,9 +2424,9 @@ static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_d
 
        dprintk(4, "dev: %p\n", dev);
 
-        /* Set RPS_IRQ to 1 to track rps1 activity.
-         * Enabling this won't send any interrupt to PC CPU.
-         */
+       /* Set RPS_IRQ to 1 to track rps1 activity.
+        * Enabling this won't send any interrupt to PC CPU.
+        */
 #define RPS_IRQ 0
 
        if (budgetpatch == 1) {
index c3801e328fe912d2caf810e775b8129fd4d78d33..6079e8865d5b99d3f3ca4185e20b44014227df9f 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "av7110.h"
 #include "av7110_hw.h"
+#include "av7110_ca.h"
 
 
 void CI_handle(struct av7110 *av7110, u8 *data, u16 len)
index 7442f56a72ecc77320f70d13eb68c5e8b9049f75..87106e8bf35bc83b3fa61c85018caae6c6436687 100644 (file)
@@ -1203,15 +1203,15 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc)
 
 int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap)
 {
-        switch (cap->cmd) {
-        case OSD_CAP_MEMSIZE:
-                if (FW_4M_SDRAM(av7110->arm_app))
-                        cap->val = 1000000;
-                else
-                        cap->val = 92000;
-                return 0;
-        default:
-                return -EINVAL;
-        }
+       switch (cap->cmd) {
+       case OSD_CAP_MEMSIZE:
+               if (FW_4M_SDRAM(av7110->arm_app))
+                       cap->val = 1000000;
+               else
+                       cap->val = 92000;
+               return 0;
+       default:
+               return -EINVAL;
+       }
 }
 #endif /* CONFIG_DVB_AV7110_OSD */
index fedd20f9815d69632f75dbe9918dccce6061a06a..2a5e87ba10521129f04738ea5d9d178598581acd 100644 (file)
@@ -143,7 +143,8 @@ enum av7110_audio_command {
        MainSwitch,
        ADSwitch,
        SendDiSEqC,
-       SetRegister
+       SetRegister,
+       SpdifSwitch
 };
 
 enum av7110_request_command {
index 6af74f78b3e505a931d125814a12490b315b7efb..b5aea4129fa7304aebdd237678f91760cd6aeb48 100644 (file)
@@ -120,8 +120,8 @@ static int ves1820_writereg(struct saa7146_dev *dev, u8 addr, u8 reg, u8 data)
 
 static int stv0297_writereg(struct saa7146_dev *dev, u8 addr, u8 reg, u8 data)
 {
-        u8 buf [] = { reg, data };
-        struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 2 };
+       u8 buf [] = { reg, data };
+       struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 2 };
 
        if (1 != saa7146_i2c_transfer(dev, &msg, 1, 1))
                return -1;
index aa75dc03a0b3ae082179ff5c01a4ad2aa52b84bf..9f51bae7194c26430d98dc0ed86b2478f1a935d6 100644 (file)
@@ -1020,6 +1020,8 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
 
 static struct saa7146_extension budget_extension = {
        .name = "budget_av",
+       .flags = SAA7146_I2C_SHORT_DELAY,
+
        .pci_tbl = pci_tbl,
 
        .module = THIS_MODULE,
index 75fb92d60998128ff1ad9f08e56fe1cb153be8f6..b9b3cd9c0369c16c5521d40d97be29dbc0df39d6 100644 (file)
@@ -1166,7 +1166,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
 
 static struct saa7146_extension budget_extension = {
        .name = "budget_ci dvb\0",
-       .flags = 0,
+       .flags = SAA7146_I2C_SHORT_DELAY,
 
        .module = THIS_MODULE,
        .pci_tbl = &pci_tbl[0],
index 0498a055a4cdfbe2d07df5b782e16c3644d35ebd..017fcbccb8cc8c1eb737e7b41916001c16f2496b 100644 (file)
@@ -87,7 +87,7 @@ static int start_ts_capture(struct budget *budget)
         *      Pitch: 188, NumBytes3: 188, NumLines3: 1024
         */
 
-        switch(budget->card->type) {
+       switch(budget->card->type) {
        case BUDGET_FS_ACTIVY:
                saa7146_write(dev, DD1_INIT, 0x04000000);
                saa7146_write(dev, MC2, (MASK_09 | MASK_25));
index 755df81cbc49af739387b8a7e42cc8f0b41df35d..fc416cf5253ca7dacee87fb17fb76d081f8b048e 100644 (file)
@@ -45,11 +45,11 @@ MAKE_BUDGET_INFO(ttbp, "TT-Budget/Patch DVB-S 1.x PCI", BUDGET_PATCH);
 //MAKE_BUDGET_INFO(satel,"TT-Budget/Patch SATELCO PCI", BUDGET_TT_HW_DISEQC);
 
 static struct pci_device_id pci_tbl[] = {
-        MAKE_EXTENSION_PCI(ttbp,0x13c2, 0x0000),
+       MAKE_EXTENSION_PCI(ttbp,0x13c2, 0x0000),
 //        MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
-        {
-                .vendor    = 0,
-        }
+       {
+               .vendor    = 0,
+       }
 };
 
 /* those lines are for budget-patch to be tried
@@ -165,57 +165,57 @@ static int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t m
 
 static int budget_av7110_send_fw_cmd(struct budget_patch *budget, u16* buf, int length)
 {
-        int i;
-
-        dprintk(2, "budget: %p\n", budget);
-
-        for (i = 2; i < length; i++)
-        {
-                  ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2*i, 2, (u32) buf[i], 0,0);
-                  msleep(5);
-        }
-        if (length)
-                  ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, (u32) buf[1], 0,0);
-        else
-                  ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, 0, 0,0);
-        msleep(5);
-        ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND, 2, (u32) buf[0], 0,0);
-        msleep(5);
-        return 0;
+       int i;
+
+       dprintk(2, "budget: %p\n", budget);
+
+       for (i = 2; i < length; i++)
+       {
+                 ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2*i, 2, (u32) buf[i], 0,0);
+                 msleep(5);
+       }
+       if (length)
+                 ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, (u32) buf[1], 0,0);
+       else
+                 ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND + 2, 2, 0, 0,0);
+       msleep(5);
+       ttpci_budget_debiwrite(budget, DEBINOSWAP, COMMAND, 2, (u32) buf[0], 0,0);
+       msleep(5);
+       return 0;
 }
 
 static void av7110_set22k(struct budget_patch *budget, int state)
 {
-        u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0};
+       u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0};
 
-        dprintk(2, "budget: %p\n", budget);
-        budget_av7110_send_fw_cmd(budget, buf, 2);
+       dprintk(2, "budget: %p\n", budget);
+       budget_av7110_send_fw_cmd(budget, buf, 2);
 }
 
 static int av7110_send_diseqc_msg(struct budget_patch *budget, int len, u8 *msg, int burst)
 {
-        int i;
-        u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) | SendDiSEqC),
-                16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+       int i;
+       u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) | SendDiSEqC),
+               16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
-        dprintk(2, "budget: %p\n", budget);
+       dprintk(2, "budget: %p\n", budget);
 
-        if (len>10)
-                len=10;
+       if (len>10)
+               len=10;
 
-        buf[1] = len+2;
-        buf[2] = len;
+       buf[1] = len+2;
+       buf[2] = len;
 
-        if (burst != -1)
-                buf[3]=burst ? 0x01 : 0x00;
-        else
-                buf[3]=0xffff;
+       if (burst != -1)
+               buf[3]=burst ? 0x01 : 0x00;
+       else
+               buf[3]=0xffff;
 
-        for (i=0; i<len; i++)
-                buf[i+4]=msg[i];
+       for (i=0; i<len; i++)
+               buf[i+4]=msg[i];
 
-        budget_av7110_send_fw_cmd(budget, buf, 18);
-        return 0;
+       budget_av7110_send_fw_cmd(budget, buf, 18);
+       return 0;
 }
 
 static int budget_patch_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
@@ -276,7 +276,7 @@ static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
        buf[2] = ((div & 0x18000) >> 10) | 0x95;
        buf[3] = (pwr << 6) | 0x30;
 
-        // NOTE: since we're using a prescaler of 2, we set the
+       // NOTE: since we're using a prescaler of 2, we set the
        // divisor frequency to 62.5kHz and divide by 125 above
 
        if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
@@ -294,7 +294,7 @@ static u8 alps_bsru6_inittab[] = {
        0x01, 0x15,
        0x02, 0x00,
        0x03, 0x00,
-        0x04, 0x7d,   /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
+       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 */
@@ -413,7 +413,7 @@ static void frontend_init(struct budget_patch* budget)
 {
        switch(budget->dev->pci->subsystem_device) {
        case 0x0000: // Hauppauge/TT WinTV DVB-S rev1.X
-        case 0x1013: // SATELCO Multimedia PCI
+       case 0x1013: // SATELCO Multimedia PCI
 
                // try the ALPS BSRV2 first of all
                budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap);
@@ -463,8 +463,8 @@ static void frontend_init(struct budget_patch* budget)
 /* written by Emard */
 static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
 {
-        struct budget_patch *budget;
-        int err;
+       struct budget_patch *budget;
+       int err;
        int count = 0;
        int detected = 0;
 
@@ -472,12 +472,12 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
 #define RPS_IRQ 0
 #define HPS_SETUP 0
 #if PATCH_RESET
-        saa7146_write(dev, MC1, MASK_31);
-        msleep(40);
+       saa7146_write(dev, MC1, MASK_31);
+       msleep(40);
 #endif
 #if HPS_SETUP
-        // initialize registers. Better to have it like this
-        // than leaving something unconfigured
+       // initialize registers. Better to have it like this
+       // than leaving something unconfigured
        saa7146_write(dev, DD1_STREAM_B, 0);
        // port B VSYNC at rising edge
        saa7146_write(dev, DD1_INIT, 0x00000200);  // have this in budget-core too!
@@ -486,29 +486,29 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
        // debi config
        // saa7146_write(dev, DEBI_CONFIG, MASK_30|MASK_28|MASK_18);
 
-        // zero all HPS registers
-        saa7146_write(dev, HPS_H_PRESCALE, 0);                  // r68
-        saa7146_write(dev, HPS_H_SCALE, 0);                     // r6c
-        saa7146_write(dev, BCS_CTRL, 0);                        // r70
-        saa7146_write(dev, HPS_V_SCALE, 0);                     // r60
-        saa7146_write(dev, HPS_V_GAIN, 0);                      // r64
-        saa7146_write(dev, CHROMA_KEY_RANGE, 0);                // r74
-        saa7146_write(dev, CLIP_FORMAT_CTRL, 0);                // r78
-        // Set HPS prescaler for port B input
-        saa7146_write(dev, HPS_CTRL, (1<<30) | (0<<29) | (1<<28) | (0<<12) );
-        saa7146_write(dev, MC2,
-          0 * (MASK_08 | MASK_24)  |   // BRS control
-          0 * (MASK_09 | MASK_25)  |   // a
-          0 * (MASK_10 | MASK_26)  |   // b
-          1 * (MASK_06 | MASK_22)  |   // HPS_CTRL1
-          1 * (MASK_05 | MASK_21)  |   // HPS_CTRL2
-          0 * (MASK_01 | MASK_15)      // DEBI
-           );
+       // zero all HPS registers
+       saa7146_write(dev, HPS_H_PRESCALE, 0);                  // r68
+       saa7146_write(dev, HPS_H_SCALE, 0);                     // r6c
+       saa7146_write(dev, BCS_CTRL, 0);                        // r70
+       saa7146_write(dev, HPS_V_SCALE, 0);                     // r60
+       saa7146_write(dev, HPS_V_GAIN, 0);                      // r64
+       saa7146_write(dev, CHROMA_KEY_RANGE, 0);                // r74
+       saa7146_write(dev, CLIP_FORMAT_CTRL, 0);                // r78
+       // Set HPS prescaler for port B input
+       saa7146_write(dev, HPS_CTRL, (1<<30) | (0<<29) | (1<<28) | (0<<12) );
+       saa7146_write(dev, MC2,
+         0 * (MASK_08 | MASK_24)  |   // BRS control
+         0 * (MASK_09 | MASK_25)  |   // a
+         0 * (MASK_10 | MASK_26)  |   // b
+         1 * (MASK_06 | MASK_22)  |   // HPS_CTRL1
+         1 * (MASK_05 | MASK_21)  |   // HPS_CTRL2
+         0 * (MASK_01 | MASK_15)      // DEBI
+          );
 #endif
        // Disable RPS1 and RPS0
-        saa7146_write(dev, MC1, ( MASK_29 | MASK_28));
-        // RPS1 timeout disable
-        saa7146_write(dev, RPS_TOV1, 0);
+       saa7146_write(dev, MC1, ( MASK_29 | MASK_28));
+       // RPS1 timeout disable
+       saa7146_write(dev, RPS_TOV1, 0);
 
        // code for autodetection
        // will wait for VBI_B event (vertical blank at port B)
@@ -521,38 +521,38 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
        WRITE_RPS1(cpu_to_le32(CMD_UPLOAD |
          MASK_10 | MASK_09 | MASK_08 | MASK_06 | MASK_05 | MASK_04 | MASK_03 | MASK_02 ));
 #endif
-        WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_VBI_B));
-        WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
-        WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
-        WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
+       WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_VBI_B));
+       WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
+       WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
+       WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
 #if RPS_IRQ
-        // issue RPS1 interrupt to increment counter
-        WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
-        // at least a NOP is neede between two interrupts
-        WRITE_RPS1(cpu_to_le32(CMD_NOP));
-        // interrupt again
-        WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+       // issue RPS1 interrupt to increment counter
+       WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+       // at least a NOP is neede between two interrupts
+       WRITE_RPS1(cpu_to_le32(CMD_NOP));
+       // interrupt again
+       WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
 #endif
-        WRITE_RPS1(cpu_to_le32(CMD_STOP));
+       WRITE_RPS1(cpu_to_le32(CMD_STOP));
 
 #if RPS_IRQ
-        // set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
-        // use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
-        // use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
-        saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
-        // set event counter 1 treshold to maximum allowed value        (rEC p55)
-        saa7146_write(dev, ECT1R,  0x3fff );
+       // set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
+       // use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
+       // use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
+       saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
+       // set event counter 1 treshold to maximum allowed value        (rEC p55)
+       saa7146_write(dev, ECT1R,  0x3fff );
 #endif
-        // Fix VSYNC level
-        saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
-        // Set RPS1 Address register to point to RPS code               (r108 p42)
-        saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
-        // Enable RPS1,                                                 (rFC p33)
-        saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
+       // Fix VSYNC level
+       saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+       // Set RPS1 Address register to point to RPS code               (r108 p42)
+       saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
+       // Enable RPS1,                                                 (rFC p33)
+       saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
 
 
-        mdelay(50);
-        saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
+       mdelay(50);
+       saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
        mdelay(150);
 
 
@@ -560,17 +560,17 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
                detected = 1;
 
 #if RPS_IRQ
-        printk("Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
+       printk("Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
 #endif
        // Disable RPS1
-        saa7146_write(dev, MC1, ( MASK_29 ));
+       saa7146_write(dev, MC1, ( MASK_29 ));
 
        if(detected == 0)
-                printk("budget-patch not detected or saa7146 in non-default state.\n"
-                       "try enabling ressetting of 7146 with MASK_31 in MC1 register\n");
+               printk("budget-patch not detected or saa7146 in non-default state.\n"
+                      "try enabling ressetting of 7146 with MASK_31 in MC1 register\n");
 
        else
-                printk("BUDGET-PATCH DETECTED.\n");
+               printk("BUDGET-PATCH DETECTED.\n");
 
 
 /*      OLD (Original design by Roberto Deza):
@@ -641,83 +641,83 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
 */
 
        // Setup RPS1 "program" (p35)
-        count = 0;
+       count = 0;
 
 
-        // Wait Source Line Counter Threshold                           (p36)
-        WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_HS));
-        // Set GPIO3=1                                                  (p42)
-        WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
-        WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
-        WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTHI<<24));
+       // Wait Source Line Counter Threshold                           (p36)
+       WRITE_RPS1(cpu_to_le32(CMD_PAUSE | EVT_HS));
+       // Set GPIO3=1                                                  (p42)
+       WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
+       WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
+       WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTHI<<24));
 #if RPS_IRQ
-        // issue RPS1 interrupt
-        WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+       // issue RPS1 interrupt
+       WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
 #endif
-        // Wait reset Source Line Counter Threshold                     (p36)
-        WRITE_RPS1(cpu_to_le32(CMD_PAUSE | RPS_INV | EVT_HS));
-        // Set GPIO3=0                                                  (p42)
-        WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
-        WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
-        WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
+       // Wait reset Source Line Counter Threshold                     (p36)
+       WRITE_RPS1(cpu_to_le32(CMD_PAUSE | RPS_INV | EVT_HS));
+       // Set GPIO3=0                                                  (p42)
+       WRITE_RPS1(cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2)));
+       WRITE_RPS1(cpu_to_le32(GPIO3_MSK));
+       WRITE_RPS1(cpu_to_le32(SAA7146_GPIO_OUTLO<<24));
 #if RPS_IRQ
-        // issue RPS1 interrupt
-        WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
+       // issue RPS1 interrupt
+       WRITE_RPS1(cpu_to_le32(CMD_INTERRUPT));
 #endif
-        // Jump to begin of RPS program                                 (p37)
-        WRITE_RPS1(cpu_to_le32(CMD_JUMP));
-        WRITE_RPS1(cpu_to_le32(dev->d_rps1.dma_handle));
-
-        // Fix VSYNC level
-        saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
-        // Set RPS1 Address register to point to RPS code               (r108 p42)
-        saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
-        // Set Source Line Counter Threshold, using BRS                 (rCC p43)
-        // It generates HS event every TS_HEIGHT lines
-        // this is related to TS_WIDTH set in register
-        // NUM_LINE_BYTE3 in budget-core.c. If NUM_LINE_BYTE
-        // low 16 bits are set to TS_WIDTH bytes (TS_WIDTH=2*188
-        //,then RPS_THRESH1
-        // should be set to trigger every TS_HEIGHT (512) lines.
-        //
-        saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
+       // Jump to begin of RPS program                                 (p37)
+       WRITE_RPS1(cpu_to_le32(CMD_JUMP));
+       WRITE_RPS1(cpu_to_le32(dev->d_rps1.dma_handle));
 
-        // saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 );
-        // Enable RPS1                                                  (rFC p33)
-        saa7146_write(dev, MC1, (MASK_13 | MASK_29));
-
-
-        if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
-                return -ENOMEM;
+       // Fix VSYNC level
+       saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+       // Set RPS1 Address register to point to RPS code               (r108 p42)
+       saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
+       // Set Source Line Counter Threshold, using BRS                 (rCC p43)
+       // It generates HS event every TS_HEIGHT lines
+       // this is related to TS_WIDTH set in register
+       // NUM_LINE_BYTE3 in budget-core.c. If NUM_LINE_BYTE
+       // low 16 bits are set to TS_WIDTH bytes (TS_WIDTH=2*188
+       //,then RPS_THRESH1
+       // should be set to trigger every TS_HEIGHT (512) lines.
+       //
+       saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
+
+       // saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 );
+       // Enable RPS1                                                  (rFC p33)
+       saa7146_write(dev, MC1, (MASK_13 | MASK_29));
+
+
+       if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
+               return -ENOMEM;
 
-        dprintk(2, "budget: %p\n", budget);
+       dprintk(2, "budget: %p\n", budget);
 
-        if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) {
-                kfree (budget);
-                return err;
-        }
+       if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) {
+               kfree (budget);
+               return err;
+       }
 
 
-        dev->ext_priv = budget;
+       dev->ext_priv = budget;
 
        budget->dvb_adapter.priv = budget;
        frontend_init(budget);
 
-        return 0;
+       return 0;
 }
 
 static int budget_patch_detach (struct saa7146_dev* dev)
 {
-        struct budget_patch *budget = (struct budget_patch*) dev->ext_priv;
-        int err;
+       struct budget_patch *budget = (struct budget_patch*) dev->ext_priv;
+       int err;
 
        if (budget->dvb_frontend) dvb_unregister_frontend(budget->dvb_frontend);
 
-        err = ttpci_budget_deinit (budget);
+       err = ttpci_budget_deinit (budget);
 
-        kfree (budget);
+       kfree (budget);
 
-        return err;
+       return err;
 }
 
 static int __init budget_patch_init(void)
@@ -727,20 +727,20 @@ static int __init budget_patch_init(void)
 
 static void __exit budget_patch_exit(void)
 {
-        saa7146_unregister_extension(&budget_extension);
+       saa7146_unregister_extension(&budget_extension);
 }
 
 static struct saa7146_extension budget_extension = {
-        .name           = "budget_patch dvb\0",
-        .flags          = 0,
+       .name           = "budget_patch dvb\0",
+       .flags          = 0,
 
-        .module         = THIS_MODULE,
-        .pci_tbl        = pci_tbl,
-        .attach         = budget_patch_attach,
-        .detach         = budget_patch_detach,
+       .module         = THIS_MODULE,
+       .pci_tbl        = pci_tbl,
+       .attach         = budget_patch_attach,
+       .detach         = budget_patch_detach,
 
-        .irq_mask       = MASK_10,
-        .irq_func       = ttpci_budget_irq10_handler,
+       .irq_mask       = MASK_10,
+       .irq_func       = ttpci_budget_irq10_handler,
 };
 
 module_init(budget_patch_init);
@@ -749,4 +749,4 @@ module_exit(budget_patch_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Emard, Roberto Deza, Holger Waechtler, Michael Hunold, others");
 MODULE_DESCRIPTION("Driver for full TS modified DVB-S SAA7146+AV7110 "
-                   "based so-called Budget Patch cards");
+                  "based so-called Budget Patch cards");
index 4fd8bbc47037e7e8effa17ee5a2a4d80aef14bbc..fafe6407b3d0d3deb7ba658ea440321de1da44ee 100644 (file)
@@ -256,7 +256,7 @@ static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_param
        buf[2] = ((div & 0x18000) >> 10) | 0x95;
        buf[3] = (pwr << 6) | 0x30;
 
-        // NOTE: since we're using a prescaler of 2, we set the
+       // NOTE: since we're using a prescaler of 2, we set the
        // divisor frequency to 62.5kHz and divide by 125 above
 
        if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
@@ -565,7 +565,7 @@ static u8 read_pwm(struct budget* budget)
        struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
                                 { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
 
-        if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
+       if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
                pwm = 0x48;
 
        return pwm;
@@ -593,7 +593,7 @@ static void frontend_init(struct budget *budget)
                budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap);
                if (budget->dvb_frontend) {
                        budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
-                       budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
+                       budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
                        budget->dvb_frontend->ops->set_tone = budget_set_tone;
                        break;
                }
@@ -738,7 +738,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
 
 static struct saa7146_extension budget_extension = {
        .name           = "budget dvb\0",
-       .flags          = 0,
+       .flags          = SAA7146_I2C_SHORT_DELAY,
 
        .module         = THIS_MODULE,
        .pci_tbl        = pci_tbl,
index c6ef496ba70a069874cbee3443462f8755cb6691..fdaa3318ad3aef2d773f7e0d9aa783b382c47a97 100644 (file)
@@ -19,7 +19,7 @@ extern int budget_debug;
 #endif
 
 #define dprintk(level,args...) \
-            do { if ((budget_debug & level)) { printk("%s: %s(): ",__stringify(KBUILD_MODNAME), __FUNCTION__); printk(args); } } while (0)
+           do { if ((budget_debug & level)) { printk("%s: %s(): ",__stringify(KBUILD_MODNAME), __FUNCTION__); printk(args); } } while (0)
 
 struct budget_info {
        char *name;
index 0b478db3e7449fe90d4f3d24ad199f99484150f7..c90001d35e7dafcf575db0b6f470bc8d2ee8ec02 100644 (file)
@@ -36,7 +36,7 @@ int main(int argc, char **argv)
     }
 
     fprintf(fd_out, "\n};\n\n");
-    
+
     fclose(fd_in);
     fclose(fd_out);
 
index e9a8457b072791081836b177361063461384a354..18aa22b5478d654d15e37cddd7712c57bd09e609 100644 (file)
@@ -13,7 +13,7 @@
     Holger Waechtler   Convergence
 
     Copyright (C) 2002-2003 Ralph Metzler <rjkm@metzlerbros.de>
-                            Metzler Brothers Systementwicklung GbR
+                           Metzler Brothers Systementwicklung GbR
 
     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
@@ -37,6 +37,7 @@
 #include <linux/string.h>
 #include <linux/i2c.h>
 
+#include "ttpci-eeprom.h"
 
 #if 1
 #define dprintk(x...) do { printk(x); } while (0)
 
 static int check_mac_tt(u8 *buf)
 {
-        int i;
-        u16 tmp = 0xffff;
-
-        for (i = 0; i < 8; i++) {
-                tmp  = (tmp << 8) | ((tmp >> 8) ^ buf[i]);
-                tmp ^= (tmp >> 4) & 0x0f;
-                tmp ^= (tmp << 12) ^ ((tmp & 0xff) << 5);
-        }
-        tmp ^= 0xffff;
-        return (((tmp >> 8) ^ buf[8]) | ((tmp & 0xff) ^ buf[9]));
+       int i;
+       u16 tmp = 0xffff;
+
+       for (i = 0; i < 8; i++) {
+               tmp  = (tmp << 8) | ((tmp >> 8) ^ buf[i]);
+               tmp ^= (tmp >> 4) & 0x0f;
+               tmp ^= (tmp << 12) ^ ((tmp & 0xff) << 5);
+       }
+       tmp ^= 0xffff;
+       return (((tmp >> 8) ^ buf[8]) | ((tmp & 0xff) ^ buf[9]));
 }
 
 static int getmac_tt(u8 * decodedMAC, u8 * encodedMAC)
 {
-        u8 xor[20] = { 0x72, 0x23, 0x68, 0x19, 0x5c, 0xa8, 0x71, 0x2c,
+       u8 xor[20] = { 0x72, 0x23, 0x68, 0x19, 0x5c, 0xa8, 0x71, 0x2c,
                       0x54, 0xd3, 0x7b, 0xf1, 0x9E, 0x23, 0x16, 0xf6,
                       0x1d, 0x36, 0x64, 0x78};
-        u8 data[20];
-        int i;
+       u8 data[20];
+       int i;
 
        /* In case there is a sig check failure have the orig contents available */
        memcpy(data, encodedMAC, 20);
 
        for (i = 0; i < 20; i++)
-                data[i] ^= xor[i];
-        for (i = 0; i < 10; i++)
-                data[i] = ((data[2 * i + 1] << 8) | data[2 * i])
+               data[i] ^= xor[i];
+       for (i = 0; i < 10; i++)
+               data[i] = ((data[2 * i + 1] << 8) | data[2 * i])
                        >> ((data[2 * i + 1] >> 6) & 3);
 
-        if (check_mac_tt(data))
-                return -ENODEV;
+       if (check_mac_tt(data))
+               return -ENODEV;
 
        decodedMAC[0] = data[2]; decodedMAC[1] = data[1]; decodedMAC[2] = data[0];
        decodedMAC[3] = data[6]; decodedMAC[4] = data[5]; decodedMAC[5] = data[4];
-        return 0;
+       return 0;
 }
 
 static int ttpci_eeprom_read_encodedMAC(struct i2c_adapter *adapter, u8 * encodedMAC)
index fd53d6010502fa54d108769b06ea01060da92772..104df610dbe1d59b81b5488f92a65e500a6e7986 100644 (file)
@@ -225,8 +225,8 @@ static int ttusb_i2c_msg(struct ttusb *ttusb,
 
        err = ttusb_result(ttusb, b, 0x20);
 
-        /* check if the i2c transaction was successful */
-        if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
+       /* check if the i2c transaction was successful */
+       if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
 
        if (rcv_len > 0) {
 
@@ -489,27 +489,27 @@ static int ttusb_send_diseqc(struct dvb_frontend* fe,
 
 static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 {
-        struct  ttusb* ttusb = (struct ttusb*)  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(&ttusb->i2c_adap, &msg, 1);
-        return (ret != 1) ? -EIO : 0;
+       struct  ttusb* ttusb = (struct ttusb*)  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(&ttusb->i2c_adap, &msg, 1);
+       return (ret != 1) ? -EIO : 0;
 }
 
 static int ttusb_update_lnb(struct ttusb *ttusb)
@@ -1184,45 +1184,45 @@ static struct tda1004x_config philips_tdm1316l_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, 0xb9,
-        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
+       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, 0xb9,
+       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 u8 alps_bsru6_inittab[] = {
@@ -1350,7 +1350,7 @@ static int ttusb_novas_grundig_29504_491_pll_set(struct dvb_frontend *fe, struct
        u32 div;
        struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
 
-        div = params->frequency / 125;
+       div = params->frequency / 125;
 
        buf[0] = (div >> 8) & 0x7f;
        buf[1] = div & 0xff;
@@ -1487,7 +1487,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
 
        udev = interface_to_usbdev(intf);
 
-        if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
+       if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
 
        if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
                return -ENOMEM;
index 95ee7995455ef5b65f14360a756a5cec625d1f68..8c3cd545e8f416f07d24aec0b38628aa265d27ff 100644 (file)
 #include <asm/types.h>
 
 static u8 dsp_bootcode [] = {
-       0x08, 0xaa, 0x00, 0x18, 0x00, 0x03, 0x08, 0x00, 
-       0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x18, 0x5f, 
-       0x00, 0x00, 0x01, 0x80, 0x77, 0x18, 0x2a, 0xeb, 
-       0x6b, 0xf8, 0x00, 0x18, 0x03, 0xff, 0x68, 0xf8, 
-       0x00, 0x18, 0xff, 0xfe, 0xf7, 0xb8, 0xf7, 0xbe, 
-       0xf6, 0xb9, 0xf4, 0xa0, 0xf6, 0xb7, 0xf6, 0xb5, 
-       0xf6, 0xb6, 0xf0, 0x20, 0x19, 0xdf, 0xf1, 0x00, 
-       0x00, 0x01, 0xf8, 0x4d, 0x01, 0xab, 0xf6, 0xb8, 
-       0xf0, 0x20, 0x19, 0xdf, 0xf0, 0x73, 0x01, 0xa5, 
-       0x7e, 0xf8, 0x00, 0x12, 0xf0, 0x00, 0x00, 0x01, 
-       0x47, 0xf8, 0x00, 0x11, 0x7e, 0x92, 0x00, 0xf8, 
-       0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x7e, 0xf8, 
-       0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x6c, 0x89, 
-       0x01, 0x9a, 0xf7, 0xb8, 0xee, 0xfc, 0xf0, 0x20, 
-       0xff, 0xff, 0xf1, 0x00, 0x00, 0x01, 0xf8, 0x4d, 
-       0x01, 0xbf, 0xf2, 0x73, 0x01, 0xb9, 0x4e, 0x02, 
-       0xf4, 0x95, 0xf5, 0xe3, 0x56, 0x02, 0x7e, 0x00, 
-       0x11, 0x00, 0xfa, 0x4c, 0x01, 0xb7, 0x6b, 0x03, 
-       0x00, 0x01, 0xf6, 0xb8, 0xee, 0x04, 0xf0, 0x74, 
-       0x0d, 0xa7, 0xf0, 0x74, 0x01, 0xc5, 0x4a, 0x11, 
-       0x4a, 0x16, 0x72, 0x11, 0x2a, 0xe6, 0x10, 0xf8, 
-       0x00, 0x11, 0xfa, 0x45, 0x01, 0xdb, 0xf4, 0x95, 
-       0xee, 0xff, 0x48, 0x11, 0xf0, 0x00, 0x2a, 0xc6, 
-       0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0xee, 
-       0xff, 0xff, 0xf4, 0xe3, 0x6c, 0xe9, 0xff, 0xff, 
-       0x01, 0xd5, 0x10, 0xf8, 0x2a, 0xe7, 0xf8, 0x45, 
-       0x01, 0xe2, 0x10, 0xf8, 0x2a, 0xe7, 0xf4, 0xe3, 
-       0xf0, 0x74, 0x01, 0xff, 0xee, 0x01, 0x8a, 0x16, 
-       0x8a, 0x11, 0xfc, 0x00, 0xf7, 0xb8, 0xe9, 0x20, 
-       0x4a, 0x11, 0x09, 0xf8, 0x2a, 0xe6, 0xf8, 0x4e, 
-       0x01, 0xf3, 0xf2, 0x73, 0x01, 0xfd, 0xf4, 0x95, 
-       0xe8, 0x01, 0x72, 0x11, 0x2a, 0xe6, 0x49, 0x11, 
-       0x80, 0xe1, 0x2a, 0xc6, 0xf3, 0x00, 0x00, 0x01, 
-       0xe8, 0x00, 0x81, 0xf8, 0x2a, 0xe6, 0x8a, 0x11, 
-       0xfc, 0x00, 0xf4, 0x95, 0xf0, 0x73, 0x02, 0x00, 
-       0x10, 0xf8, 0x2a, 0x0f, 0xfc, 0x00, 0x4a, 0x11, 
-       0xf0, 0x74, 0x02, 0x02, 0x80, 0xf8, 0x2a, 0x10, 
-       0x73, 0x08, 0x00, 0x09, 0x40, 0xf8, 0x2a, 0x15, 
-       0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10, 
-       0x03, 0xe8, 0xf5, 0xa9, 0xf8, 0x30, 0x02, 0x21, 
-       0x71, 0xf8, 0x2a, 0x10, 0x2a, 0x15, 0x56, 0xf8, 
-       0x2a, 0x0c, 0xf0, 0xe3, 0x4e, 0xf8, 0x2a, 0x16, 
-       0xe8, 0x00, 0x4e, 0xf8, 0x2a, 0x0c, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 
-       0x68, 0xf8, 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 
-       0x00, 0x07, 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 
-       0xff, 0xfc, 0x6b, 0xf8, 0x2a, 0x0f, 0x00, 0x01, 
-       0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x06, 0xf4, 0xeb, 
-       0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x0f, 0x00, 0x00, 
-       0x76, 0x00, 0x00, 0x00, 0xfb, 0x80, 0x19, 0x4c, 
-       0xf4, 0x95, 0xe8, 0x00, 0x80, 0xf8, 0x2a, 0x11, 
-       0xf9, 0x80, 0x19, 0x07, 0x80, 0xf8, 0x2a, 0x0e, 
-       0xf9, 0x80, 0x16, 0x66, 0x76, 0x00, 0x2a, 0x12, 
-       0x10, 0xf8, 0x2a, 0x11, 0xf9, 0x80, 0x18, 0xe3, 
-       0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x66, 
-       0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x87, 
-       0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf6, 0xb8, 
-       0xf4, 0x95, 0xf0, 0x20, 0x80, 0x00, 0x11, 0xf8, 
-       0x2a, 0x5a, 0xf8, 0x4d, 0x02, 0x93, 0x11, 0xf8, 
-       0x2a, 0x9f, 0xf8, 0x4c, 0x02, 0x7c, 0x77, 0x12, 
-       0x2a, 0x39, 0x49, 0x12, 0x01, 0xf8, 0x2a, 0x9f, 
-       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81, 
-       0x00, 0x11, 0x6c, 0xe1, 0xff, 0xab, 0x02, 0x93, 
-       0x6b, 0xf8, 0x2a, 0x9f, 0x00, 0x01, 0xe9, 0x05, 
-       0x01, 0xe2, 0x00, 0x03, 0x81, 0xf8, 0x2a, 0xa0, 
-       0xf0, 0x73, 0x02, 0x95, 0x72, 0x11, 0x2a, 0x9f, 
-       0xf4, 0x95, 0x10, 0xe1, 0x2a, 0x39, 0x6b, 0xf8, 
-       0x2a, 0x9f, 0x00, 0x01, 0x11, 0xf8, 0x2a, 0x9f, 
-       0x09, 0xf8, 0x2a, 0xa0, 0xf8, 0x4c, 0x02, 0x93, 
-       0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 0x76, 0xf8, 
-       0x2a, 0x9f, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa0, 
-       0x00, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x48, 0x11, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
-       0x10, 0xf8, 0x2a, 0x5a, 0xf8, 0x44, 0x02, 0xb2, 
-       0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x01, 0xf0, 0x74, 
-       0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 
-       0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 0x02, 0xb2, 
-       0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 0x80, 0x00, 
-       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0xd6, 
-       0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95, 
-       0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b, 
-       0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11, 
-       0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15, 
-       0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19, 
-       0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a, 
-       0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8, 
-       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
-       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
-       0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe, 
-       0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xfd, 
-       0xf0, 0x74, 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 
-       0x77, 0x10, 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 
-       0x02, 0xef, 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 
-       0x80, 0x00, 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 
-       0x18, 0xd6, 0xee, 0x03, 0x8a, 0x18, 0xf4, 0x95, 
-       0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 0x8a, 0x1a, 
-       0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 0x8a, 0x19, 
-       0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x15, 
-       0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 0x8a, 0x11, 
-       0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 
-       0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 0xf4, 0xeb, 
-       0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 
-       0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 
-       0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 
-       0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 
-       0x00, 0x03, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 
-       0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95, 
-       0xf4, 0x95, 0x10, 0x81, 0x6f, 0xf8, 0x2a, 0x9e, 
-       0x0c, 0x88, 0xe8, 0xff, 0x18, 0xe1, 0x00, 0x01, 
-       0x1a, 0xf8, 0x2a, 0x9e, 0xf0, 0x30, 0x1f, 0xff, 
-       0x80, 0xf8, 0x2a, 0x9e, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 
-       0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x11, 0xe2, 
-       0x00, 0x01, 0x81, 0xe1, 0x00, 0x01, 0x11, 0xe2, 
-       0x00, 0x02, 0x81, 0xe1, 0x00, 0x02, 0x76, 0xe1, 
-       0x00, 0x03, 0x00, 0x02, 0x48, 0x08, 0x6f, 0xe1, 
-       0x00, 0x04, 0x0c, 0x98, 0xf0, 0x30, 0x00, 0xff, 
-       0x80, 0xe1, 0x00, 0x05, 0x76, 0xe1, 0x00, 0x06, 
-       0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 
-       0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 
-       0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 
-       0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 
-       0x76, 0xe1, 0x00, 0x03, 0x00, 0x04, 0x48, 0x11, 
-       0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 0xf4, 0x95, 
-       0x77, 0x13, 0x2a, 0x76, 0xe9, 0x00, 0xe5, 0x98, 
-       0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 0x48, 0x0b, 
-       0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x03, 0x71, 
-       0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xf0, 
-       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81, 
-       0x00, 0x14, 0x71, 0xe1, 0x00, 0x01, 0x00, 0x15, 
-       0x49, 0x11, 0xf3, 0x00, 0x00, 0x02, 0x89, 0x11, 
-       0xe7, 0x82, 0x6d, 0xea, 0x00, 0x04, 0xe7, 0x83, 
-       0x6d, 0xeb, 0x00, 0x0a, 0x77, 0x1a, 0x00, 0x05, 
-       0xf0, 0x72, 0x03, 0xaa, 0x11, 0x81, 0xf2, 0xe8, 
-       0x80, 0x82, 0xe9, 0xff, 0x19, 0xe1, 0x00, 0x01, 
-       0xf1, 0xa0, 0x81, 0x92, 0x11, 0xe1, 0x00, 0x0c, 
-       0xf2, 0xe8, 0x80, 0x83, 0xe9, 0xff, 0x19, 0xe1, 
-       0x00, 0x0d, 0xf1, 0xa0, 0x81, 0x93, 0x6d, 0xe9, 
-       0x00, 0x02, 0x48, 0x18, 0x49, 0x18, 0x70, 0x00, 
-       0x00, 0x15, 0xf0, 0x00, 0x00, 0x04, 0xf3, 0x00, 
-       0x00, 0x0a, 0x80, 0x01, 0x81, 0x02, 0xf2, 0x74, 
-       0x0e, 0x54, 0xf4, 0x95, 0x48, 0x14, 0xee, 0x10, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf0, 0x74, 
-       0x0c, 0x5e, 0x80, 0xf8, 0x2a, 0x5c, 0x77, 0x12, 
-       0x2a, 0x39, 0x76, 0x82, 0x00, 0x55, 0x77, 0x11, 
-       0x2a, 0x18, 0x10, 0xe1, 0x00, 0x01, 0x80, 0xe2, 
-       0x00, 0x01, 0x10, 0xe1, 0x00, 0x02, 0x80, 0xe2, 
-       0x00, 0x02, 0x76, 0xe2, 0x00, 0x03, 0x00, 0x1c, 
-       0xf6, 0xb8, 0x56, 0xf8, 0x2a, 0x16, 0xf0, 0xf0, 
-       0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x07, 0x56, 0xf8, 
-       0x2a, 0x16, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80, 
-       0x80, 0xe2, 0x00, 0x06, 0x56, 0xf8, 0x2a, 0x16, 
-       0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 
-       0x00, 0x05, 0x57, 0xf8, 0x2a, 0x16, 0xe8, 0xff, 
-       0xf2, 0x80, 0x80, 0xe2, 0x00, 0x04, 0x56, 0xf8, 
-       0x27, 0x6c, 0xf0, 0xf0, 0xf0, 0xf8, 0x80, 0xe2, 
-       0x00, 0x0b, 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf0, 
-       0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0a, 
-       0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf8, 0xe8, 0xff, 
-       0xf2, 0x80, 0x80, 0xe2, 0x00, 0x09, 0xe8, 0xff, 
-       0x57, 0xf8, 0x27, 0x6c, 0xf2, 0x80, 0x80, 0xe2, 
-       0x00, 0x08, 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0xf0, 
-       0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x0f, 0x56, 0xf8, 
-       0x27, 0x6a, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80, 
-       0x80, 0xe2, 0x00, 0x0e, 0x56, 0xf8, 0x27, 0x6a, 
-       0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 
-       0x00, 0x0d, 0x57, 0xf8, 0x27, 0x6a, 0xe8, 0xff, 
-       0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0c, 0x76, 0xe2, 
-       0x00, 0x13, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x12, 
-       0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x5c, 0x0c, 0x58, 
-       0x80, 0xe2, 0x00, 0x11, 0xe8, 0xff, 0x18, 0xf8, 
-       0x2a, 0x5c, 0x80, 0xe2, 0x00, 0x10, 0x76, 0xe2, 
-       0x00, 0x17, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x16, 
-       0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x9e, 0x0c, 0x58, 
-       0x80, 0xe2, 0x00, 0x15, 0xe8, 0xff, 0x18, 0xf8, 
-       0x2a, 0x9e, 0x80, 0xe2, 0x00, 0x14, 0x76, 0xe2, 
-       0x00, 0x1b, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1a, 
-       0x00, 0x00, 0x76, 0xe2, 0x00, 0x19, 0x00, 0x00, 
-       0x70, 0xe2, 0x00, 0x18, 0x27, 0x6e, 0x76, 0xe2, 
-       0x00, 0x1f, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1e, 
-       0x00, 0x00, 0x76, 0xe2, 0x00, 0x1d, 0x00, 0x00, 
-       0x76, 0xe2, 0x00, 0x1c, 0x00, 0x00, 0x76, 0xe2, 
-       0x00, 0x20, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
-       0x10, 0xf8, 0x2a, 0x38, 0xf8, 0x45, 0x04, 0xed, 
-       0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x02, 
-       0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x08, 
-       0x6d, 0xe9, 0xff, 0xdf, 0xf6, 0xa9, 0xf8, 0x20, 
-       0x04, 0x75, 0xf0, 0x73, 0x04, 0x7d, 0xf0, 0x10, 
-       0x00, 0x21, 0xf0, 0x00, 0x1a, 0x83, 0x48, 0x08, 
-       0x7e, 0xf8, 0x00, 0x08, 0xf4, 0xe2, 0xf0, 0x74, 
-       0x03, 0x0a, 0xf0, 0x73, 0x04, 0xea, 0x48, 0x12, 
-       0xf2, 0x74, 0x03, 0x23, 0xf0, 0x00, 0x00, 0x04, 
-       0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 
-       0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 
-       0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48, 
-       0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x69, 
-       0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36, 
-       0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 
-       0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48, 
-       0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x41, 
-       0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36, 
-       0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0x57, 
-       0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 0x2a, 0x1c, 
-       0xf0, 0x74, 0x12, 0xa4, 0xf2, 0x74, 0x03, 0x36, 
-       0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 
-       0x48, 0x12, 0xf2, 0x74, 0x03, 0x80, 0xf0, 0x00, 
-       0x00, 0x04, 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 
-       0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 
-       0x2a, 0x1c, 0xf0, 0x74, 0x12, 0xc5, 0xf2, 0x74, 
-       0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 
-       0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 0xe8, 0xff, 
-       0x6f, 0xe1, 0x00, 0x06, 0x0d, 0x48, 0x18, 0xe1, 
-       0x00, 0x07, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0xf2, 0xa0, 0x70, 0x00, 0x00, 0x12, 0x80, 0x01, 
-       0x10, 0xe1, 0x00, 0x04, 0xf0, 0x74, 0x0e, 0x7a, 
-       0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 
-       0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0xbc, 
-       0x76, 0xf8, 0x2a, 0x38, 0x00, 0x00, 0xee, 0x02, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 
-       0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 
-       0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 
-       0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 
-       0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x09, 
-       0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 
-       0xf4, 0x95, 0x77, 0x13, 0x2a, 0x86, 0xe9, 0x00, 
-       0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 
-       0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 
-       0x05, 0x0a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 
-       0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 
-       0x77, 0x13, 0x2a, 0x18, 0x10, 0xe3, 0x00, 0x01, 
-       0x80, 0xe1, 0x00, 0x01, 0x10, 0xe3, 0x00, 0x02, 
-       0x80, 0xe1, 0x00, 0x02, 0x13, 0xe3, 0x00, 0x03, 
-       0x81, 0xe1, 0x00, 0x03, 0x48, 0x11, 0x77, 0x11, 
-       0x00, 0x00, 0xf8, 0x4d, 0x05, 0x44, 0xf0, 0x00, 
-       0x00, 0x04, 0x88, 0x12, 0x48, 0x13, 0xf0, 0x00, 
-       0x00, 0x04, 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 
-       0xe5, 0x98, 0x6d, 0x91, 0xf6, 0xb8, 0x48, 0x11, 
-       0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x05, 0x3a, 
-       0xf0, 0x20, 0x2a, 0x39, 0x49, 0x11, 0xf5, 0x00, 
-       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x76, 0xe1, 
-       0x00, 0x04, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 
-       0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 
-       0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 
-       0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 
-       0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x0c, 
-       0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 
-       0xf4, 0x95, 0x77, 0x13, 0x2a, 0x7a, 0xe9, 0x00, 
-       0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 
-       0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 
-       0x05, 0x6a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 
-       0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 
-       0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 
-       0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 
-       0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 
-       0x00, 0x19, 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 
-       0x88, 0x12, 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x5d, 
-       0xe9, 0x00, 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 
-       0xf6, 0xb8, 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 
-       0xf8, 0x43, 0x05, 0x93, 0x76, 0x82, 0x00, 0xaa, 
-       0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0x88, 0x11, 0x10, 0xf8, 0x2a, 0x38, 
-       0xf8, 0x44, 0x05, 0xe3, 0x10, 0xf8, 0x2a, 0xa1, 
-       0xf8, 0x44, 0x05, 0xba, 0x6c, 0xe1, 0xff, 0x56, 
-       0x05, 0xe3, 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 
-       0x70, 0xe2, 0x2a, 0x18, 0x00, 0x11, 0x6b, 0xf8, 
-       0x2a, 0xa1, 0x00, 0x01, 0xf0, 0x73, 0x05, 0xe3, 
-       0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 0x70, 0xe2, 
-       0x2a, 0x18, 0x00, 0x11, 0x10, 0xf8, 0x2a, 0xa1, 
-       0xf0, 0x00, 0x00, 0x01, 0x88, 0x12, 0xf4, 0x95, 
-       0xf4, 0x95, 0x6e, 0xe2, 0xff, 0xfc, 0x05, 0xd1, 
-       0x73, 0x12, 0x2a, 0xa1, 0x48, 0x11, 0xf0, 0x00, 
-       0x00, 0x05, 0x80, 0xf8, 0x2a, 0xa2, 0x10, 0xf8, 
-       0x2a, 0xa1, 0x08, 0xf8, 0x2a, 0xa2, 0xf8, 0x44, 
-       0x05, 0xe3, 0x6c, 0xe1, 0xff, 0xab, 0x05, 0xdd, 
-       0x76, 0xf8, 0x2a, 0x38, 0x00, 0x01, 0x76, 0xf8, 
-       0x2a, 0xa1, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa2, 
-       0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95, 
-       0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b, 
-       0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11, 
-       0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15, 
-       0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19, 
-       0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a, 
-       0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8, 
-       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
-       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
-       0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe, 
-       0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xff, 
-       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0x04, 
-       0xf0, 0x74, 0x05, 0xa2, 0xee, 0x01, 0x8a, 0x18, 
-       0xf4, 0x95, 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 
-       0x8a, 0x1a, 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 
-       0x8a, 0x19, 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 
-       0x8a, 0x15, 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 
-       0x8a, 0x11, 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 
-       0x8a, 0x0b, 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 
-       0xf4, 0xeb, 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x38, 
-       0x00, 0x00, 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 
-       0xe8, 0x01, 0x4e, 0x00, 0xfb, 0x80, 0x17, 0xd6, 
-       0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x2a, 0x5b, 
-       0x76, 0x00, 0x2a, 0x8f, 0xf9, 0x80, 0x16, 0xaa, 
-       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x5c, 
-       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x6f, 
-       0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1a, 
-       0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1a, 
-       0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1b, 
-       0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1b, 
-       0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 
-       0x13, 0x02, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d, 
-       0x06, 0x6a, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 
-       0xf4, 0x95, 0xf0, 0x72, 0x06, 0x69, 0x1c, 0x91, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 
-       0x12, 0x03, 0x11, 0x02, 0xf8, 0x45, 0x06, 0x79, 
-       0xf0, 0x10, 0x00, 0x01, 0x88, 0x1a, 0xf4, 0x95, 
-       0xf0, 0x72, 0x06, 0x78, 0x81, 0x91, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 
-       0x00, 0x11, 0x11, 0x03, 0x61, 0xf8, 0x00, 0x11, 
-       0x00, 0x01, 0xf8, 0x30, 0x06, 0x91, 0xf6, 0xb8, 
-       0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11, 
-       0xf3, 0xe8, 0xe8, 0xff, 0x18, 0x81, 0xf1, 0xa0, 
-       0x81, 0x81, 0xf0, 0x73, 0x06, 0x9d, 0xf6, 0xb8, 
-       0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11, 
-       0xf3, 0x30, 0x00, 0xff, 0xf0, 0x20, 0xff, 0x00, 
-       0x18, 0x81, 0xf1, 0xa0, 0x81, 0x81, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x11, 0x02, 
-       0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 
-       0x06, 0xb1, 0x49, 0x0b, 0xf6, 0x1f, 0x88, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf2, 0x73, 
-       0x06, 0xb8, 0xf0, 0x30, 0x00, 0xff, 0x49, 0x0b, 
-       0xf6, 0x1f, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
-       0x12, 0x81, 0xf4, 0x78, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x12, 
-       0x13, 0x03, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d, 
-       0x06, 0xcc, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 
-       0xf4, 0x95, 0xf0, 0x72, 0x06, 0xcb, 0x11, 0x92, 
-       0xf2, 0xc0, 0x81, 0x91, 0x8a, 0x11, 0xfc, 0x00, 
-       0x88, 0x12, 0x12, 0x02, 0x71, 0x01, 0x00, 0x13, 
-       0xf8, 0x45, 0x06, 0xdb, 0xf0, 0x10, 0x00, 0x01, 
-       0x88, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xda, 
-       0xe5, 0x98, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
-       0x88, 0x11, 0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 
-       0x00, 0x12, 0x61, 0xf8, 0x00, 0x12, 0x00, 0x01, 
-       0xf8, 0x20, 0x06, 0xea, 0xf0, 0x00, 0x00, 0x01, 
-       0xf6, 0xb8, 0xf0, 0x00, 0x00, 0x01, 0x6f, 0xf8, 
-       0x00, 0x12, 0x0f, 0x1f, 0x48, 0x08, 0x81, 0x00, 
-       0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xba, 
-       0xf4, 0x95, 0x48, 0x11, 0xee, 0x02, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x88, 0x12, 
-       0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 0x00, 0x13, 
-       0x61, 0xf8, 0x00, 0x13, 0x00, 0x01, 0xf8, 0x20, 
-       0x07, 0x09, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 
-       0x00, 0x01, 0x88, 0x11, 0xf6, 0xb8, 0x6f, 0xf8, 
-       0x00, 0x13, 0x0f, 0x1f, 0x81, 0x00, 0x48, 0x11, 
-       0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xce, 
-       0xf4, 0x95, 0x48, 0x12, 0x48, 0x11, 0xf0, 0x30, 
-       0xff, 0xfe, 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xfc, 
-       0xf4, 0x95, 0x80, 0x02, 0x71, 0x08, 0x00, 0x16, 
-       0x10, 0x09, 0x71, 0x0b, 0x00, 0x17, 0x80, 0x03, 
-       0x71, 0x0a, 0x00, 0x11, 0x48, 0x17, 0xf8, 0x45, 
-       0x07, 0x3f, 0x70, 0x00, 0x00, 0x11, 0x10, 0x03, 
-       0xf0, 0x74, 0x06, 0x9f, 0x80, 0x01, 0x70, 0x00, 
-       0x00, 0x16, 0x10, 0x02, 0xf0, 0x74, 0x06, 0x7b, 
-       0x6d, 0x91, 0x6d, 0x96, 0x6c, 0xef, 0xff, 0xff, 
-       0x07, 0x2f, 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
-       0x10, 0xf8, 0x2a, 0xe8, 0x08, 0xf8, 0x2a, 0xe9, 
-       0xf8, 0x45, 0x07, 0x64, 0x76, 0x00, 0x00, 0x01, 
-       0x62, 0xf8, 0x2a, 0xe9, 0x00, 0x5e, 0xf2, 0x74, 
-       0x12, 0x0b, 0xf0, 0x00, 0x30, 0x40, 0x72, 0x11, 
-       0x2a, 0xe9, 0x77, 0x10, 0x00, 0x0f, 0xf5, 0xa9, 
-       0xf8, 0x20, 0x07, 0x61, 0x6b, 0xf8, 0x2a, 0xe9, 
-       0x00, 0x01, 0xf0, 0x73, 0x07, 0x64, 0x76, 0xf8, 
-       0x2a, 0xe9, 0x00, 0x00, 0xee, 0x02, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xe8, 0x00, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x08, 0xe8, 0x00, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x09, 0xf6, 0xb8, 
-       0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 0x75, 0xf8, 
-       0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 0x0c, 0x30, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 0x76, 0xf8, 
-       0x2a, 0xe8, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xe9, 
-       0x00, 0x00, 0x6c, 0x81, 0x07, 0x92, 0x76, 0xf8, 
-       0x2a, 0xea, 0x00, 0x00, 0xfb, 0x80, 0x16, 0x76, 
-       0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 0x75, 0xf8, 
-       0x00, 0x08, 0x00, 0x00, 0xf0, 0x73, 0x07, 0xa8, 
-       0x76, 0xf8, 0x2a, 0xea, 0x00, 0x01, 0xfb, 0x80, 
-       0x16, 0x66, 0xf4, 0x95, 0xe8, 0x10, 0xfb, 0x80, 
-       0x16, 0x87, 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0xf6, 0xb8, 
-       0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 0x75, 0xf8, 
-       0x00, 0x08, 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 
-       0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 
-       0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
-       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
-       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
-       0x10, 0xf8, 0x2a, 0xea, 0xf8, 0x45, 0x07, 0xe1, 
-       0x10, 0xf8, 0x2a, 0xe8, 0xf0, 0x00, 0x00, 0x01, 
-       0xf0, 0x30, 0x00, 0x0f, 0x80, 0xf8, 0x2a, 0xe8, 
-       0x10, 0xf8, 0x2a, 0xe8, 0xf8, 0x44, 0x07, 0xd6, 
-       0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 
-       0x0c, 0x30, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 
-       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 
-       0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x8a, 0x1d, 
-       0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0a, 0x8a, 0x09, 
-       0x8a, 0x08, 0xf4, 0xeb, 0xee, 0xff, 0xf2, 0x74, 
-       0x07, 0x67, 0xf4, 0x95, 0xe8, 0x01, 0xee, 0x01, 
-       0xfc, 0x00, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
-       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
-       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
-       0x8a, 0x1d, 0x8a, 0x07, 0xf4, 0xeb, 0x4a, 0x11, 
-       0x77, 0x11, 0x00, 0x28, 0x76, 0x81, 0x24, 0x00, 
-       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
-       0xf2, 0x74, 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x00, 
-       0x77, 0x11, 0x00, 0x1d, 0x68, 0x81, 0x00, 0x7f, 
-       0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0x80, 
-       0x77, 0x11, 0x00, 0x1d, 0xf0, 0x30, 0x01, 0x00, 
-       0x1a, 0x81, 0x80, 0x81, 0xf0, 0x74, 0x0a, 0x33, 
-       0xf0, 0x74, 0x11, 0xac, 0xf9, 0x80, 0x13, 0x25, 
-       0xf9, 0x80, 0x16, 0x53, 0xf9, 0x80, 0x17, 0x82, 
-       0xf0, 0x74, 0x06, 0x2f, 0xf9, 0x80, 0x14, 0xb2, 
-       0xf9, 0x80, 0x19, 0x10, 0xf0, 0x74, 0x0d, 0xe3, 
-       0xf0, 0x74, 0x07, 0xe8, 0xf0, 0x74, 0x02, 0x36, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x60, 0xf8, 
-       0x27, 0x7b, 0xff, 0xff, 0xf8, 0x30, 0x08, 0x39, 
-       0x71, 0xf8, 0x27, 0x7b, 0x27, 0x79, 0x60, 0xf8, 
-       0x27, 0x79, 0xff, 0xff, 0xf8, 0x30, 0x08, 0xb2, 
-       0x10, 0xf8, 0x29, 0x86, 0x08, 0xf8, 0x27, 0x79, 
-       0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 0xf4, 0x95, 
-       0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x30, 
-       0x08, 0x58, 0x10, 0xf8, 0x27, 0x79, 0x08, 0xf8, 
-       0x27, 0x7a, 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 
-       0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
-       0xf8, 0x20, 0x08, 0x63, 0x76, 0xf8, 0x27, 0x79, 
-       0xff, 0xff, 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 
-       0xf7, 0xb8, 0xf2, 0x73, 0x08, 0xd9, 0xf0, 0x20, 
-       0xff, 0xff, 0xf6, 0xb8, 0x56, 0xf8, 0x27, 0x74, 
-       0xf0, 0xf9, 0x88, 0x11, 0x56, 0xf8, 0x27, 0x72, 
-       0xf0, 0xf9, 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 
-       0xe7, 0x20, 0xf4, 0xa9, 0xf8, 0x30, 0x08, 0x8f, 
-       0xf1, 0x20, 0x27, 0x7c, 0x48, 0x11, 0xf6, 0x00, 
-       0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x83, 
-       0x08, 0xf8, 0x27, 0x79, 0xf0, 0x30, 0x7f, 0xff, 
-       0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 
-       0xf5, 0xab, 0xf8, 0x30, 0x08, 0x8f, 0x6d, 0x91, 
-       0x48, 0x11, 0xf0, 0x30, 0x01, 0xff, 0x88, 0x11, 
-       0xf4, 0x95, 0xe7, 0x20, 0xf7, 0xa9, 0xf8, 0x30, 
-       0x08, 0x74, 0x6d, 0x89, 0x48, 0x11, 0xf0, 0x30, 
-       0x01, 0xff, 0xf0, 0xe7, 0xf4, 0x95, 0x48, 0x08, 
-       0x4e, 0xf8, 0x27, 0x74, 0x48, 0x08, 0xf1, 0xf9, 
-       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 
-       0x27, 0x7c, 0x27, 0x7a, 0x60, 0xf8, 0x27, 0x7b, 
-       0xff, 0xff, 0xf8, 0x30, 0x08, 0xab, 0x48, 0x08, 
-       0x4e, 0xf8, 0x27, 0x72, 0x76, 0xf8, 0x27, 0x7b, 
-       0xff, 0xff, 0x76, 0xf8, 0x27, 0x79, 0xff, 0xff, 
-       0xf2, 0x73, 0x08, 0xd9, 0xf4, 0x95, 0xe8, 0x00, 
-       0x44, 0xf8, 0x27, 0x73, 0x40, 0xf8, 0x27, 0x75, 
-       0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10, 
-       0x80, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xd8, 
-       0xf6, 0xb8, 0x10, 0xf8, 0x27, 0x73, 0xf0, 0x00, 
-       0x80, 0x00, 0x48, 0x08, 0x4e, 0xf8, 0x27, 0x74, 
-       0x48, 0x08, 0xf0, 0xf9, 0x88, 0x11, 0xf4, 0x95, 
-       0xf4, 0x95, 0x71, 0xe1, 0x27, 0x7c, 0x27, 0x7a, 
-       0xf7, 0xb8, 0x57, 0xf8, 0x27, 0x74, 0xf0, 0x62, 
-       0xff, 0xff, 0xf0, 0x40, 0xff, 0x80, 0xf2, 0x80, 
-       0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfb, 
-       0x11, 0xf8, 0x27, 0x71, 0x09, 0xf8, 0x27, 0x73, 
-       0x89, 0x11, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 
-       0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xed, 0xf2, 0x73, 
-       0x09, 0x0e, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0x20, 
-       0x76, 0x00, 0x00, 0x41, 0xf0, 0x74, 0x12, 0xee, 
-       0x88, 0x16, 0xf4, 0x95, 0xf7, 0xb8, 0x6d, 0x96, 
-       0x10, 0xf8, 0x00, 0x16, 0xf8, 0x47, 0x09, 0x0a, 
-       0xe7, 0x61, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 
-       0x00, 0x80, 0x76, 0x02, 0x00, 0xff, 0x76, 0x03, 
-       0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 
-       0xe8, 0x00, 0x6c, 0xe9, 0xff, 0xff, 0x08, 0xfb, 
-       0x73, 0x16, 0x00, 0x0e, 0xf0, 0x66, 0x00, 0x41, 
-       0xee, 0x05, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x13, 
-       0xf6, 0xb8, 0x77, 0x11, 0x7f, 0xff, 0x57, 0xf8, 
-       0x27, 0x72, 0x48, 0x11, 0xf2, 0x80, 0xf0, 0x00, 
-       0x80, 0x00, 0x88, 0x11, 0xf6, 0x40, 0xf0, 0xe0, 
-       0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 0x80, 0xf8, 
-       0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x57, 0xf8, 
-       0x27, 0x72, 0x48, 0x12, 0xf2, 0x80, 0x88, 0x12, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x09, 0x38, 
-       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
-       0xf0, 0x73, 0x09, 0x3d, 0xf0, 0x20, 0x80, 0x01, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x70, 0x81, 
-       0x00, 0x13, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0xf0, 0x30, 0x7f, 0xff, 0x11, 0xf8, 0x29, 0x86, 
-       0xf5, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11, 
-       0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
-       0xf8, 0x20, 0x09, 0x54, 0xf2, 0x73, 0x09, 0x67, 
-       0xf4, 0x95, 0xe8, 0x02, 0x6f, 0xf8, 0x27, 0x7a, 
-       0x0d, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11, 
-       0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
-       0xf8, 0x20, 0x09, 0x64, 0xf2, 0x73, 0x09, 0x67, 
-       0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x27, 0x7b, 
-       0xe8, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0x11, 0xf8, 0x29, 0x86, 0xf5, 0x20, 0xf3, 0x30, 
-       0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 
-       0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x7a, 
-       0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x02, 
-       0x6f, 0xf8, 0x27, 0x7a, 0x0d, 0x20, 0xf3, 0x30, 
-       0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 
-       0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x8a, 
-       0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x01, 
-       0x80, 0xf8, 0x27, 0x79, 0xe8, 0x00, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 
-       0x00, 0x12, 0x88, 0x11, 0xf6, 0xb8, 0x57, 0xf8, 
-       0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80, 
-       0xf0, 0x00, 0x80, 0x00, 0x80, 0x81, 0x57, 0xf8, 
-       0x27, 0x72, 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 
-       0x80, 0xf8, 0x27, 0x78, 0x77, 0x11, 0x80, 0x00, 
-       0x48, 0x11, 0x57, 0xf8, 0x27, 0x72, 0xf2, 0x80, 
-       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 
-       0x09, 0xb5, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
-       0x00, 0x01, 0xf0, 0x73, 0x09, 0xba, 0xf0, 0x20, 
-       0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
-       0x45, 0xf8, 0x27, 0x71, 0x43, 0xf8, 0x27, 0x73, 
-       0x83, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0xe7, 0x20, 
-       0xf6, 0xa9, 0xf8, 0x30, 0x09, 0xc9, 0xf2, 0x73, 
-       0x09, 0xe4, 0x77, 0x12, 0x00, 0x00, 0x57, 0xf8, 
-       0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80, 
-       0x49, 0x12, 0xf5, 0x00, 0xf3, 0x00, 0x80, 0x00, 
-       0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0xf8, 0x30, 
-       0x09, 0xdc, 0xf1, 0x20, 0x80, 0x00, 0xf5, 0x20, 
-       0x89, 0x12, 0xf4, 0x95, 0x48, 0x12, 0x6f, 0xf8, 
-       0x27, 0x73, 0x0d, 0x00, 0xf4, 0x95, 0x49, 0x0b, 
-       0x4f, 0xf8, 0x27, 0x72, 0x8a, 0x11, 0xfe, 0x00, 
-       0x48, 0x12, 0xf4, 0x95, 0x4a, 0x11, 0x4a, 0x16, 
-       0x4a, 0x17, 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x08, 
-       0x00, 0x16, 0x88, 0x17, 0xf0, 0x74, 0x08, 0x30, 
-       0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74, 
-       0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0a, 0x0a, 
-       0xf2, 0x74, 0x08, 0xdb, 0xf4, 0x95, 0x48, 0x16, 
-       0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74, 
-       0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 
-       0x10, 0x02, 0x70, 0x01, 0x00, 0x11, 0x80, 0x00, 
-       0xf2, 0x74, 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 
-       0x49, 0x11, 0x48, 0x17, 0xf6, 0x00, 0x88, 0x17, 
-       0xe7, 0x60, 0xf5, 0xa9, 0xf8, 0x20, 0x0a, 0x2d, 
-       0x48, 0x16, 0xf6, 0x20, 0x88, 0x11, 0x48, 0x18, 
-       0x70, 0x00, 0x00, 0x11, 0xf2, 0x74, 0x09, 0x8f, 
-       0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 0x70, 0x01, 
-       0x00, 0x11, 0x10, 0x02, 0x80, 0x00, 0xf2, 0x74, 
-       0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 0xee, 0x04, 
-       0x48, 0x16, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 
-       0xfc, 0x00, 0xee, 0xfd, 0xe8, 0x00, 0x4e, 0xf8, 
-       0x27, 0x70, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x72, 
-       0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 
-       0x4e, 0xf8, 0x27, 0x76, 0x76, 0xf8, 0x27, 0x79, 
-       0xff, 0xff, 0x76, 0xf8, 0x27, 0x7a, 0x00, 0x00, 
-       0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 0x76, 0xf8, 
-       0x27, 0x78, 0x00, 0x00, 0xe8, 0x00, 0x75, 0xf8, 
-       0x00, 0x08, 0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 
-       0x76, 0x01, 0x02, 0x00, 0xf2, 0x74, 0x12, 0xdc, 
-       0xf0, 0x20, 0x27, 0x7c, 0xee, 0x03, 0xfc, 0x00, 
-       0x4a, 0x11, 0xee, 0xfc, 0xf4, 0x95, 0x4e, 0x00, 
-       0x77, 0x12, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x12, 
-       0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x12, 
-       0xf0, 0xe0, 0xf1, 0xf1, 0x4f, 0x02, 0xe9, 0x01, 
-       0xf4, 0x95, 0x48, 0x0b, 0xf5, 0x40, 0x56, 0x02, 
-       0xf1, 0x80, 0x81, 0xf8, 0x27, 0x78, 0x77, 0x11, 
-       0x80, 0x00, 0x56, 0x00, 0x49, 0x11, 0xf1, 0x80, 
-       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 
-       0x0a, 0x81, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
-       0x00, 0x01, 0xf0, 0x73, 0x0a, 0x86, 0xf0, 0x20, 
-       0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
-       0x10, 0x82, 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0xee, 0xfe, 0xf4, 0x95, 0x4e, 0x00, 
-       0x77, 0x11, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x11, 
-       0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x11, 
-       0xf0, 0xe0, 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 
-       0x80, 0xf8, 0x27, 0x78, 0x56, 0x00, 0xf1, 0x20, 
-       0x80, 0x00, 0xf1, 0x80, 0xf4, 0x95, 0x49, 0x0b, 
-       0xf8, 0x4d, 0x0a, 0xab, 0xf0, 0x20, 0x80, 0x01, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf0, 0x73, 
-       0x0a, 0xaf, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
-       0x00, 0x01, 0xee, 0x02, 0x48, 0x11, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0x88, 0x12, 0x13, 0x02, 
-       0x77, 0x11, 0x00, 0x00, 0xf8, 0x4d, 0x0a, 0xcb, 
-       0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 0xf4, 0x95, 
-       0xf0, 0x72, 0x0a, 0xca, 0x48, 0x11, 0x1c, 0xf8, 
-       0x29, 0x7e, 0x88, 0x11, 0x11, 0xf8, 0x29, 0x7e, 
-       0xf2, 0x00, 0x00, 0x01, 0x80, 0xf8, 0x29, 0x7e, 
-       0x81, 0x92, 0x48, 0x11, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x11, 
-       0x88, 0x12, 0xf6, 0xb8, 0xf0, 0x20, 0x7f, 0xff, 
-       0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0xf0, 0x00, 
-       0x80, 0x00, 0x80, 0x82, 0x57, 0xf8, 0x27, 0x70, 
-       0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 0x80, 0xf8, 
-       0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x48, 0x12, 
-       0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0x88, 0x12, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x0a, 0xf4, 
-       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
-       0xf0, 0x73, 0x0a, 0xf9, 0xf0, 0x20, 0x80, 0x01, 
-       0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x45, 0xf8, 
-       0x27, 0x75, 0xe7, 0x10, 0x43, 0xf8, 0x27, 0x71, 
-       0x83, 0xf8, 0x00, 0x12, 0x6d, 0xe8, 0x00, 0x04, 
-       0x6d, 0x8a, 0xf6, 0xaa, 0xf8, 0x30, 0x0b, 0x0a, 
-       0xf2, 0x73, 0x0b, 0x25, 0x77, 0x11, 0x00, 0x00, 
-       0x57, 0xf8, 0x27, 0x70, 0xf0, 0x20, 0x7f, 0xff, 
-       0xf2, 0x80, 0x49, 0x11, 0xf5, 0x00, 0xf3, 0x00, 
-       0x80, 0x00, 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 
-       0xf8, 0x30, 0x0b, 0x1d, 0xf1, 0x20, 0x80, 0x00, 
-       0xf5, 0x20, 0x89, 0x11, 0xf4, 0x95, 0x48, 0x11, 
-       0x6f, 0xf8, 0x27, 0x71, 0x0d, 0x00, 0xf4, 0x95, 
-       0x49, 0x0b, 0x4f, 0xf8, 0x27, 0x70, 0x48, 0x11, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
-       0x4a, 0x17, 0xee, 0xf0, 0x88, 0x17, 0x10, 0x17, 
-       0x80, 0x05, 0x10, 0x16, 0x80, 0x06, 0x10, 0x15, 
-       0x80, 0x07, 0x71, 0x14, 0x00, 0x11, 0x10, 0x05, 
-       0xf0, 0x30, 0x00, 0x01, 0x88, 0x10, 0x10, 0x06, 
-       0xf0, 0x30, 0x00, 0x01, 0x80, 0x08, 0x49, 0x11, 
-       0x10, 0x05, 0xf6, 0x01, 0x80, 0x09, 0x10, 0x06, 
-       0x61, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf8, 0x20, 
-       0x0b, 0x4b, 0x10, 0x09, 0xf0, 0x00, 0x00, 0x01, 
-       0x80, 0x09, 0x71, 0x08, 0x00, 0x12, 0xf4, 0xaa, 
-       0xf8, 0x30, 0x0b, 0x54, 0x10, 0x09, 0xf0, 0x00, 
-       0x00, 0x01, 0x80, 0x09, 0x12, 0x09, 0x49, 0x11, 
-       0xf4, 0x7f, 0x80, 0x09, 0xf6, 0x20, 0x80, 0x0a, 
-       0x56, 0xf8, 0x27, 0x70, 0x4e, 0x0c, 0x10, 0x09, 
-       0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 
-       0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 0xf4, 0x95, 
-       0xf4, 0x95, 0x6c, 0x86, 0x0b, 0x6d, 0xf2, 0x73, 
-       0x0c, 0x59, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0xb8, 
-       0xf4, 0x95, 0x56, 0x0c, 0xf0, 0xf9, 0x88, 0x12, 
-       0xf4, 0x95, 0xf4, 0x95, 0x70, 0xe2, 0x27, 0x7c, 
-       0x29, 0x86, 0xe8, 0x00, 0x80, 0x0e, 0x48, 0x11, 
-       0xf8, 0x45, 0x0b, 0xcc, 0x77, 0x10, 0x00, 0x01, 
-       0xf4, 0xa9, 0xf8, 0x30, 0x0b, 0x89, 0x6c, 0xe1, 
-       0xff, 0xfd, 0x0b, 0x8b, 0x10, 0xe7, 0x00, 0x02, 
-       0x80, 0x0e, 0xf0, 0x73, 0x0b, 0x8b, 0x10, 0x87, 
-       0x80, 0x0e, 0xe7, 0x10, 0xf5, 0xae, 0xf8, 0x20, 
-       0x0b, 0xb2, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 
-       0x00, 0x16, 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 
-       0x48, 0x17, 0x49, 0x16, 0xf6, 0x00, 0x88, 0x17, 
-       0x48, 0x11, 0xf6, 0x20, 0x88, 0x11, 0x10, 0x09, 
-       0xf6, 0x20, 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 
-       0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 
-       0x10, 0x04, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 
-       0x00, 0x11, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11, 
-       0x00, 0x04, 0x80, 0x04, 0xf0, 0x73, 0x0b, 0xbc, 
-       0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 0x00, 0x11, 
-       0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11, 
-       0x00, 0x04, 0x80, 0x04, 0x49, 0x11, 0x48, 0x16, 
-       0xf6, 0x20, 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 
-       0x6c, 0x86, 0x0b, 0xcc, 0x10, 0x0a, 0x80, 0x00, 
-       0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 
-       0x00, 0x04, 0x88, 0x16, 0x12, 0x0a, 0xf8, 0x45, 
-       0x0c, 0x33, 0x71, 0x0a, 0x00, 0x10, 0xf4, 0xae, 
-       0xf8, 0x30, 0x0c, 0x1c, 0x48, 0x16, 0xf0, 0xe1, 
-       0x88, 0x11, 0x12, 0x08, 0xf8, 0x45, 0x0b, 0xdb, 
-       0x6d, 0x89, 0x12, 0x07, 0xf8, 0x45, 0x0b, 0xe9, 
-       0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11, 
-       0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74, 
-       0x06, 0xdc, 0xf0, 0x73, 0x0b, 0xef, 0x48, 0x11, 
-       0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74, 
-       0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e, 
-       0x10, 0x06, 0x49, 0x11, 0xf6, 0x00, 0x80, 0x06, 
-       0x10, 0x05, 0xf6, 0x20, 0x88, 0x11, 0xf0, 0x00, 
-       0x00, 0x01, 0x48, 0x08, 0x6f, 0x00, 0x0c, 0x9f, 
-       0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 
-       0x00, 0x04, 0x12, 0x07, 0xf8, 0x45, 0x0c, 0x11, 
-       0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11, 
-       0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74, 
-       0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x17, 0x48, 0x11, 
-       0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74, 
-       0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e, 
-       0xf0, 0x73, 0x0c, 0x33, 0x12, 0x07, 0xf8, 0x45, 
-       0x0c, 0x2a, 0x10, 0x07, 0x80, 0x00, 0x10, 0x06, 
-       0x80, 0x01, 0x10, 0x05, 0x80, 0x02, 0x10, 0x04, 
-       0xf0, 0x74, 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x30, 
-       0x12, 0x05, 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 
-       0xf0, 0x74, 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 
-       0x81, 0x0e, 0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 
-       0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 
-       0x71, 0x04, 0x00, 0x11, 0x70, 0x81, 0x29, 0x86, 
-       0x10, 0x0e, 0x1c, 0xf8, 0x29, 0x86, 0x80, 0x0e, 
-       0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 0xf2, 0x74, 
-       0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x10, 0x0e, 
-       0x71, 0x04, 0x00, 0x11, 0x80, 0x81, 0x10, 0xf8, 
-       0x29, 0x86, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x30, 
-       0x7f, 0xff, 0x80, 0xf8, 0x29, 0x86, 0x10, 0x09, 
-       0xf0, 0x00, 0x00, 0x02, 0x80, 0x09, 0xee, 0x10, 
-       0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
-       0x10, 0xf8, 0x27, 0x75, 0x08, 0xf8, 0x27, 0x71, 
-       0xf0, 0x10, 0x00, 0x01, 0x48, 0x08, 0xfc, 0x00, 
-       0x4a, 0x11, 0x4a, 0x16, 0xee, 0xff, 0xf4, 0x95, 
-       0x71, 0x04, 0x00, 0x16, 0xf0, 0x00, 0x00, 0x01, 
-       0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 0x6d, 0xee, 
-       0xff, 0xfd, 0x48, 0x16, 0xf8, 0x45, 0x0c, 0x99, 
-       0x56, 0xf8, 0x29, 0x7c, 0xf0, 0x74, 0x0a, 0x5a, 
-       0x88, 0x11, 0x10, 0xf8, 0x29, 0x7d, 0xf0, 0x00, 
-       0x00, 0x01, 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 
-       0x10, 0xf8, 0x29, 0x82, 0xf0, 0x00, 0x00, 0x01, 
-       0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xa9, 
-       0xfa, 0x30, 0x0c, 0x96, 0x80, 0xf8, 0x29, 0x82, 
-       0x56, 0xf8, 0x29, 0x80, 0xf0, 0x00, 0x00, 0x01, 
-       0x4e, 0xf8, 0x29, 0x80, 0x73, 0x11, 0x29, 0x82, 
-       0x6c, 0xee, 0xff, 0xff, 0x0c, 0x76, 0xee, 0x01, 
-       0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0x76, 0xf8, 0x29, 0x84, 0x00, 0x00, 0x76, 0xf8, 
-       0x29, 0x85, 0x00, 0x01, 0xe8, 0x00, 0x4e, 0xf8, 
-       0x2a, 0x0c, 0x76, 0xf8, 0x29, 0x86, 0x00, 0x00, 
-       0x76, 0xf8, 0x29, 0x87, 0x00, 0x00, 0x77, 0x11, 
-       0x29, 0x88, 0x76, 0x81, 0xaa, 0xaa, 0x76, 0xe1, 
-       0x00, 0x01, 0xaa, 0xaa, 0x76, 0xe1, 0x00, 0x02, 
-       0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0xee, 0xfc, 0xf4, 0x95, 0x71, 0x06, 0x00, 0x14, 
-       0x71, 0x07, 0x00, 0x13, 0x71, 0x08, 0x00, 0x12, 
-       0x71, 0x09, 0x00, 0x15, 0x77, 0x10, 0x00, 0xff, 
-       0xf4, 0xaa, 0xf8, 0x30, 0x0d, 0x44, 0x49, 0x13, 
-       0x53, 0xf8, 0x2a, 0x0c, 0x4f, 0xf8, 0x2a, 0x0c, 
-       0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d, 
-       0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x01, 
-       0x71, 0xe1, 0x24, 0x00, 0x00, 0x11, 0xf4, 0xa9, 
-       0xf8, 0x30, 0x0d, 0x17, 0x77, 0x10, 0x00, 0x02, 
-       0xf4, 0xa9, 0xf8, 0x30, 0x0c, 0xec, 0x77, 0x11, 
-       0x29, 0x8a, 0x76, 0x81, 0x00, 0x00, 0xe8, 0x00, 
-       0x77, 0x14, 0x00, 0x00, 0x77, 0x13, 0x00, 0x00, 
-       0xf0, 0x73, 0x0d, 0x48, 0x6c, 0x83, 0x0c, 0xfa, 
-       0x77, 0x11, 0x29, 0x8a, 0x48, 0x12, 0xf0, 0xe8, 
-       0xf0, 0x40, 0x80, 0x00, 0x80, 0x81, 0xe8, 0x00, 
-       0x77, 0x14, 0x00, 0x00, 0xf0, 0x73, 0x0d, 0x48, 
-       0x49, 0x13, 0xf3, 0x40, 0x80, 0x00, 0x81, 0xf8, 
-       0x29, 0x8a, 0x61, 0xf8, 0x00, 0x15, 0x00, 0x01, 
-       0xf8, 0x20, 0x0d, 0x07, 0x69, 0xf8, 0x29, 0x8a, 
-       0x40, 0x00, 0x61, 0xf8, 0x00, 0x14, 0x00, 0x01, 
-       0xf8, 0x20, 0x0d, 0x0f, 0x69, 0xf8, 0x29, 0x8a, 
-       0x20, 0x00, 0x77, 0x11, 0x29, 0x8a, 0x49, 0x12, 
-       0xf3, 0xe8, 0x1b, 0x81, 0x81, 0x81, 0xf0, 0x73, 
-       0x0d, 0x48, 0x11, 0xf8, 0x29, 0x84, 0xf8, 0x4c, 
-       0x0d, 0x37, 0x77, 0x11, 0x29, 0x88, 0x76, 0x81, 
-       0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 0xf3, 0x10, 
-       0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 0x81, 0xe1, 
-       0x00, 0x01, 0x76, 0x00, 0x00, 0x02, 0x80, 0x01, 
-       0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 0x00, 0x13, 
-       0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0x48, 0x11, 
-       0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 0xf0, 0x73, 
-       0x0d, 0x73, 0x76, 0x00, 0x00, 0x00, 0x80, 0x01, 
-       0x76, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x13, 
-       0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0xe8, 0x00, 
-       0xf0, 0x73, 0x0d, 0x73, 0x77, 0x11, 0x29, 0x8a, 
-       0x70, 0x81, 0x00, 0x13, 0x11, 0xf8, 0x29, 0x84, 
-       0xf8, 0x4c, 0x0d, 0x68, 0x77, 0x11, 0x29, 0x88, 
-       0x76, 0x81, 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 
-       0xf3, 0x10, 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 
-       0x81, 0xe1, 0x00, 0x01, 0x76, 0x00, 0x00, 0x03, 
-       0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 
-       0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 
-       0x48, 0x11, 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 
-       0xf0, 0x73, 0x0d, 0x73, 0x76, 0x00, 0x00, 0x01, 
-       0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 
-       0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 
-       0x48, 0x11, 0x6b, 0xf8, 0x29, 0x84, 0xff, 0xff, 
-       0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0xf5, 0x40, 0xf4, 0x95, 0x48, 0x0b, 0xf4, 0x78, 
-       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe1, 
-       0xff, 0xb9, 0x0d, 0x88, 0xf2, 0x73, 0x0d, 0xa5, 
-       0xf4, 0x95, 0xe8, 0x60, 0xf2, 0x00, 0x00, 0x06, 
-       0x61, 0xf8, 0x00, 0x11, 0x00, 0x20, 0xf8, 0x30, 
-       0x0d, 0x98, 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 
-       0xf8, 0x20, 0x0d, 0xa3, 0xf2, 0x00, 0x00, 0x07, 
-       0xf0, 0x73, 0x0d, 0xa3, 0x61, 0xf8, 0x00, 0x0b, 
-       0x00, 0x01, 0xf8, 0x20, 0x0d, 0xa1, 0xf2, 0x73, 
-       0x0d, 0xa3, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 
-       0x00, 0x02, 0x48, 0x08, 0xf4, 0x7f, 0x8a, 0x11, 
-       0xfc, 0x00, 0xee, 0xff, 0xf0, 0x74, 0x07, 0xfd, 
-       0xf0, 0x74, 0x07, 0x44, 0xf0, 0x74, 0x0d, 0xb4, 
-       0xf0, 0x74, 0x02, 0x05, 0xf0, 0x74, 0x04, 0x60, 
-       0xf0, 0x73, 0x0d, 0xaa, 0xee, 0xfd, 0x10, 0xf8, 
-       0x2a, 0xa3, 0xf8, 0x44, 0x0d, 0xcb, 0x10, 0xf8, 
-       0x2a, 0xa4, 0xf8, 0x45, 0x0d, 0xd7, 0x76, 0x00, 
-       0x02, 0x00, 0xf2, 0x74, 0x09, 0xe8, 0xf0, 0x20, 
-       0x22, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00, 
-       0x76, 0xf8, 0x2a, 0xa7, 0x00, 0x00, 0xf0, 0x73, 
-       0x0d, 0xd7, 0x76, 0x00, 0x02, 0x00, 0xf2, 0x74, 
-       0x09, 0xe8, 0xf0, 0x20, 0x20, 0x00, 0x76, 0xf8, 
-       0x2a, 0xa3, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa7, 
-       0x00, 0x01, 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 
-       0xf0, 0x10, 0x3a, 0x98, 0xf8, 0x47, 0x0d, 0xe1, 
-       0x76, 0xf8, 0x27, 0x6e, 0x00, 0x00, 0xee, 0x03, 
-       0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x77, 0x11, 
-       0x20, 0x00, 0x76, 0x00, 0xaa, 0xaa, 0x76, 0x01, 
-       0x02, 0x00, 0xf2, 0x74, 0x06, 0x6c, 0xf4, 0x95, 
-       0x48, 0x11, 0x76, 0x00, 0x55, 0x55, 0x76, 0x01, 
-       0x02, 0x00, 0x48, 0x11, 0xf2, 0x74, 0x06, 0x6c, 
-       0xf0, 0x00, 0x02, 0x00, 0x76, 0xf8, 0x2a, 0xa3, 
-       0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00, 
-       0xe8, 0x00, 0x4e, 0x00, 0xfb, 0x80, 0x15, 0x3e, 
-       0xf4, 0x95, 0xe8, 0x04, 0x80, 0xf8, 0x2a, 0xa5, 
-       0x76, 0x00, 0x2a, 0xa8, 0xf9, 0x80, 0x14, 0x87, 
-       0x76, 0x00, 0x2a, 0xad, 0xfb, 0x80, 0x13, 0x62, 
-       0xf4, 0x95, 0xe8, 0x02, 0x10, 0xf8, 0x2a, 0xa5, 
-       0xf9, 0x80, 0x14, 0x63, 0xfb, 0x80, 0x16, 0x66, 
-       0xf4, 0x95, 0xe8, 0x1c, 0xfb, 0x80, 0x16, 0x87, 
-       0xf4, 0x95, 0xe8, 0x1c, 0xe8, 0x01, 0x4e, 0x00, 
-       0xfb, 0x80, 0x17, 0xd6, 0xf4, 0x95, 0xe8, 0x00, 
-       0x80, 0xf8, 0x2a, 0xa6, 0x76, 0x00, 0x2a, 0xb7, 
-       0xf9, 0x80, 0x16, 0xaa, 0x10, 0xf8, 0x2a, 0xa6, 
-       0xf9, 0x80, 0x17, 0x5c, 0x10, 0xf8, 0x2a, 0xa6, 
-       0xf9, 0x80, 0x17, 0x6f, 0xee, 0x02, 0x8a, 0x11, 
-       0xfc, 0x00, 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 
-       0x4a, 0x0a, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
-       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
-       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
-       0x10, 0xf8, 0x2a, 0xa7, 0xf8, 0x44, 0x0e, 0x4b, 
-       0x76, 0xf8, 0x2a, 0xa3, 0x00, 0x01, 0xf0, 0x73, 
-       0x0e, 0x4e, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x01, 
-       0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x0a, 0x8a, 0x09, 
-       0x8a, 0x08, 0xf4, 0xeb, 0x4a, 0x11, 0x4a, 0x16, 
-       0x4a, 0x17, 0xee, 0xfe, 0x88, 0x0e, 0x71, 0x08, 
-       0x00, 0x16, 0x71, 0x06, 0x00, 0x17, 0x11, 0x07, 
-       0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 0x25, 0xa0, 
-       0x88, 0x11, 0x76, 0x01, 0x00, 0x06, 0x81, 0x00, 
-       0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 0x00, 0x01, 
-       0x76, 0x01, 0x00, 0x06, 0x70, 0x00, 0x00, 0x16, 
-       0x48, 0x11, 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 
-       0x00, 0x07, 0x70, 0x81, 0x00, 0x17, 0xee, 0x02, 
-       0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
-       0x4a, 0x11, 0x88, 0x0e, 0x71, 0x02, 0x00, 0x12, 
-       0x11, 0x03, 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 
-       0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x70, 0x81, 
-       0x00, 0x12, 0x6e, 0xe2, 0xff, 0xfe, 0x0e, 0x8d, 
-       0xf4, 0x95, 0xe8, 0x00, 0xe8, 0x01, 0x80, 0xe1, 
-       0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 
-       0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0c, 
-       0x00, 0x00, 0x81, 0xe1, 0x00, 0x01, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 0x88, 0x0e, 
-       0xf4, 0x95, 0xf1, 0x66, 0x00, 0x0d, 0xf3, 0x00, 
-       0x24, 0x00, 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
-       0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
-       0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 
-       0x00, 0x00, 0x80, 0x02, 0x76, 0x03, 0x00, 0x00, 
-       0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0xe8, 0x00, 
-       0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0x88, 0x19, 0xf4, 0x95, 0x73, 0x19, 0x00, 0x0e, 
-       0xf1, 0x66, 0x00, 0x0d, 0xf2, 0x00, 0x24, 0x00, 
-       0x77, 0x15, 0x25, 0xa0, 0x77, 0x14, 0x00, 0x00, 
-       0x77, 0x1a, 0x00, 0x1f, 0xf0, 0x72, 0x0f, 0x14, 
-       0xf6, 0xb8, 0x49, 0x19, 0x09, 0x85, 0xf8, 0x4c, 
-       0x0f, 0x13, 0xf1, 0x00, 0x00, 0x05, 0x89, 0x11, 
-       0x49, 0x15, 0xf3, 0x00, 0x00, 0x01, 0x89, 0x13, 
-       0x49, 0x15, 0xf3, 0x00, 0x00, 0x07, 0x89, 0x12, 
-       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
-       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
-       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
-       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
-       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
-       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0f, 0x13, 
-       0x6d, 0x94, 0x6d, 0xed, 0x00, 0x0d, 0x48, 0x14, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
-       0x4a, 0x17, 0xee, 0xf8, 0x88, 0x17, 0x10, 0x0d, 
-       0x80, 0x04, 0x10, 0x0c, 0x80, 0x05, 0x71, 0x0e, 
-       0x00, 0x16, 0x73, 0x17, 0x00, 0x0e, 0xf0, 0x66, 
-       0x00, 0x0d, 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 
-       0x10, 0xf8, 0x27, 0x63, 0xf8, 0x45, 0x0f, 0x32, 
-       0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
-       0x10, 0xf8, 0x27, 0x60, 0xf8, 0x44, 0x0f, 0x3d, 
-       0x60, 0xe1, 0x00, 0x02, 0x00, 0x01, 0xf8, 0x20, 
-       0x0f, 0x6d, 0xf0, 0x73, 0x11, 0x33, 0x10, 0x04, 
-       0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f, 
-       0x11, 0x04, 0xf3, 0x00, 0x00, 0x01, 0x81, 0x04, 
-       0x6d, 0x8e, 0x77, 0x10, 0x00, 0x01, 0x71, 0xe1, 
-       0x00, 0x02, 0x00, 0x12, 0xf4, 0xaa, 0xf8, 0x30, 
-       0x0f, 0x62, 0x77, 0x10, 0x00, 0x02, 0xf4, 0xaa, 
-       0xf8, 0x30, 0x0f, 0x6d, 0x45, 0xe1, 0x00, 0x0b, 
-       0x88, 0x10, 0x43, 0xe1, 0x00, 0x0c, 0x83, 0xf8, 
-       0x00, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xaa, 
-       0xf8, 0x30, 0x0f, 0x6d, 0xf0, 0x73, 0x0f, 0x96, 
-       0xf5, 0x00, 0x81, 0x04, 0x49, 0x16, 0xf5, 0x20, 
-       0x89, 0x16, 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x48, 0x16, 
-       0xf8, 0x45, 0x11, 0x33, 0xf7, 0xb8, 0x71, 0xe1, 
-       0x00, 0x02, 0x00, 0x12, 0x10, 0xf8, 0x00, 0x12, 
-       0xf0, 0x10, 0x00, 0x03, 0xf8, 0x46, 0x0f, 0x8c, 
-       0x10, 0xf8, 0x00, 0x12, 0xf0, 0x10, 0x00, 0x03, 
-       0xf8, 0x45, 0x10, 0x16, 0x77, 0x10, 0x00, 0x01, 
-       0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0x9c, 0x77, 0x10, 
-       0x00, 0x02, 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0xa8, 
-       0xf0, 0x73, 0x0f, 0x96, 0x77, 0x10, 0x00, 0x04, 
-       0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xb7, 0x77, 0x10, 
-       0x00, 0x05, 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xbc, 
-       0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
-       0xf0, 0x73, 0x11, 0x31, 0x76, 0xe1, 0x00, 0x0c, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0x02, 0x00, 0x02, 0x11, 0xe1, 0x00, 0x0c, 
-       0xe8, 0x03, 0xf6, 0x20, 0x89, 0x12, 0xf4, 0x95, 
-       0x77, 0x10, 0x00, 0x03, 0xf5, 0xaa, 0xf8, 0x30, 
-       0x0f, 0xb6, 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 
-       0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf5, 0xae, 
-       0xf8, 0x20, 0x0f, 0xbd, 0x48, 0x16, 0x80, 0x06, 
-       0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x03, 
-       0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xc8, 0x6b, 0xf8, 
-       0x27, 0x6f, 0x00, 0x01, 0x12, 0x06, 0xf8, 0x45, 
-       0x10, 0x00, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00, 
-       0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02, 
-       0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74, 
-       0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06, 
-       0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04, 
-       0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
-       0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04, 
-       0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 
-       0x88, 0x16, 0x89, 0x13, 0xf4, 0x95, 0x77, 0x10, 
-       0x00, 0x03, 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xf5, 
-       0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 0x77, 0x10, 
-       0x00, 0x0c, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 
-       0xf6, 0xab, 0xf8, 0x20, 0x10, 0x00, 0x6b, 0xf8, 
-       0x27, 0x6f, 0x00, 0x01, 0x6c, 0xe2, 0xff, 0xfd, 
-       0x11, 0x31, 0xf6, 0xb8, 0x6f, 0xe1, 0x00, 0x05, 
-       0x0c, 0x48, 0x6f, 0xe1, 0x00, 0x06, 0x0c, 0x18, 
-       0xf0, 0x30, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03, 
-       0x80, 0xe1, 0x00, 0x0b, 0x76, 0xe1, 0x00, 0x02, 
-       0x00, 0x03, 0x48, 0x16, 0xf8, 0x45, 0x11, 0x33, 
-       0x71, 0xe1, 0x00, 0x0c, 0x00, 0x12, 0x10, 0xe1, 
-       0x00, 0x0b, 0x49, 0x12, 0xf6, 0x20, 0x88, 0x13, 
-       0xe8, 0x0c, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95, 
-       0xf4, 0x95, 0xf5, 0xab, 0xf8, 0x20, 0x10, 0x27, 
-       0x48, 0x13, 0x80, 0x06, 0x88, 0x10, 0xf4, 0x95, 
-       0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0x30, 
-       0x70, 0x06, 0x00, 0x16, 0x12, 0x06, 0xf8, 0x45, 
-       0x10, 0x5f, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00, 
-       0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02, 
-       0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74, 
-       0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06, 
-       0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04, 
-       0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
-       0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04, 
-       0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 
-       0x88, 0x16, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x0c, 
-       0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 0xf6, 0xab, 
-       0xf8, 0x20, 0x10, 0x5f, 0x6b, 0xf8, 0x27, 0x6f, 
-       0x00, 0x01, 0x77, 0x10, 0x00, 0x0c, 0xf6, 0xaa, 
-       0xf8, 0x20, 0x10, 0x6b, 0xf2, 0x74, 0x0e, 0x9f, 
-       0xf4, 0x95, 0x48, 0x17, 0x71, 0xe1, 0x00, 0x0c, 
-       0x00, 0x12, 0x77, 0x10, 0x00, 0x0c, 0xf4, 0xaa, 
-       0xf8, 0x30, 0x10, 0x7c, 0x77, 0x10, 0x00, 0x0c, 
-       0x71, 0xe1, 0x00, 0x0b, 0x00, 0x13, 0xf6, 0xab, 
-       0xf8, 0x30, 0x10, 0xb4, 0xe7, 0x30, 0xf7, 0xaa, 
-       0xf8, 0x30, 0x10, 0xb4, 0xf2, 0x74, 0x0e, 0xc1, 
-       0xf4, 0x95, 0x48, 0x17, 0x88, 0x12, 0xf4, 0x95, 
-       0xf4, 0x95, 0x6c, 0x82, 0x10, 0x8d, 0x76, 0xe1, 
-       0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
-       0x00, 0x05, 0xf0, 0x73, 0x10, 0xb4, 0x76, 0xe1, 
-       0x00, 0x02, 0x00, 0x04, 0x77, 0x10, 0x00, 0x0c, 
-       0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf5, 0xaa, 
-       0xf8, 0x20, 0x10, 0x9a, 0xf0, 0x73, 0x10, 0x9c, 
-       0x77, 0x12, 0x00, 0x0c, 0x76, 0x00, 0x00, 0x00, 
-       0x70, 0x01, 0x00, 0x12, 0x70, 0x02, 0x00, 0x17, 
-       0x76, 0x03, 0x00, 0x01, 0x48, 0x11, 0xf2, 0x74, 
-       0x0c, 0xb9, 0xf0, 0x00, 0x00, 0x05, 0x76, 0xe1, 
-       0x00, 0x04, 0x00, 0x00, 0x77, 0x10, 0x00, 0x0c, 
-       0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf6, 0xaa, 
-       0xf8, 0x20, 0x11, 0x1c, 0x48, 0x16, 0xf8, 0x45, 
-       0x11, 0x33, 0x60, 0xe1, 0x00, 0x02, 0x00, 0x05, 
-       0xf8, 0x20, 0x10, 0xdf, 0x10, 0xe1, 0x00, 0x0b, 
-       0x08, 0xe1, 0x00, 0x0c, 0x11, 0xe1, 0x00, 0x04, 
-       0xf8, 0x4d, 0x10, 0xc7, 0x6b, 0xf8, 0x27, 0x6f, 
-       0x00, 0x01, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 
-       0xf5, 0xae, 0xf8, 0x20, 0x10, 0xcf, 0x48, 0x16, 
-       0xf4, 0x95, 0x48, 0x08, 0xf8, 0x45, 0x11, 0x16, 
-       0x6f, 0xe1, 0x00, 0x0c, 0x0d, 0x00, 0x81, 0xe1, 
-       0x00, 0x0c, 0x11, 0x04, 0xf5, 0x00, 0x81, 0x04, 
-       0x49, 0x16, 0xf5, 0x20, 0x89, 0x16, 0xf0, 0x73, 
-       0x11, 0x0e, 0x10, 0xe1, 0x00, 0x0b, 0x71, 0xe1, 
-       0x00, 0x0c, 0x00, 0x12, 0x88, 0x10, 0xf4, 0x95, 
-       0xf4, 0x95, 0xf6, 0xaa, 0xf8, 0x30, 0x11, 0x16, 
-       0x49, 0x12, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95, 
-       0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xf3, 
-       0x48, 0x16, 0x80, 0x06, 0x48, 0x08, 0xf8, 0x45, 
-       0x11, 0x16, 0x10, 0x04, 0x70, 0x02, 0x00, 0x17, 
-       0x80, 0x00, 0x76, 0x03, 0x00, 0x00, 0x10, 0x06, 
-       0x80, 0x01, 0x10, 0x05, 0xf0, 0x74, 0x0c, 0xb9, 
-       0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
-       0x00, 0x0c, 0x11, 0x06, 0x10, 0x04, 0xf6, 0x00, 
-       0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 0x88, 0x16, 
-       0x10, 0xe1, 0x00, 0x0c, 0x08, 0xe1, 0x00, 0x0b, 
-       0xf8, 0x45, 0x11, 0x1c, 0xf0, 0x73, 0x11, 0x31, 
-       0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
-       0xf0, 0x73, 0x11, 0x33, 0x76, 0xe1, 0x00, 0x0c, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x02, 0x00, 0x01, 0x10, 0x04, 
-       0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f, 
-       0x88, 0x12, 0xf4, 0x95, 0x77, 0x10, 0x00, 0xff, 
-       0xf4, 0xaa, 0xf8, 0x30, 0x11, 0x33, 0x6c, 0x86, 
-       0x0f, 0x70, 0xee, 0x08, 0x8a, 0x17, 0x8a, 0x16, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 
-       0xf4, 0x95, 0x71, 0x06, 0x00, 0x12, 0x88, 0x11, 
-       0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d, 
-       0xf3, 0x00, 0x24, 0x00, 0x89, 0x14, 0x13, 0x81, 
-       0xf7, 0x7a, 0xf3, 0x30, 0x00, 0x01, 0x81, 0xf8, 
-       0x27, 0x60, 0x13, 0xe1, 0x00, 0x01, 0xf7, 0x7c, 
-       0xf3, 0x30, 0x00, 0x03, 0x81, 0xf8, 0x27, 0x61, 
-       0xe9, 0x0f, 0x19, 0xe1, 0x00, 0x01, 0x81, 0xf8, 
-       0x27, 0x62, 0x71, 0xe4, 0x00, 0x03, 0x00, 0x13, 
-       0xf6, 0xb8, 0x49, 0x13, 0xf3, 0x00, 0x00, 0x01, 
-       0xf3, 0x30, 0x00, 0x0f, 0x49, 0x0b, 0x09, 0xf8, 
-       0x27, 0x62, 0xf8, 0x4d, 0x11, 0x75, 0x77, 0x10, 
-       0x00, 0xff, 0xf4, 0xab, 0xf8, 0x30, 0x11, 0x75, 
-       0x57, 0xf8, 0x27, 0x6c, 0xf3, 0x00, 0x00, 0x01, 
-       0x4f, 0xf8, 0x27, 0x6c, 0x76, 0xf8, 0x27, 0x63, 
-       0x00, 0x01, 0xf0, 0x73, 0x11, 0x78, 0x76, 0xf8, 
-       0x27, 0x63, 0x00, 0x00, 0x70, 0xe4, 0x00, 0x03, 
-       0x27, 0x62, 0x76, 0xf8, 0x27, 0x64, 0x00, 0x00, 
-       0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 0x00, 0x0b, 
-       0x00, 0x02, 0xf8, 0x20, 0x11, 0x8d, 0xe9, 0x01, 
-       0x6f, 0xe1, 0x00, 0x02, 0x0f, 0x18, 0x81, 0xf8, 
-       0x27, 0x64, 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 
-       0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 0x11, 0xa9, 
-       0x10, 0xf8, 0x27, 0x64, 0xf1, 0x00, 0x00, 0x04, 
-       0x89, 0x13, 0xe9, 0xb8, 0xf5, 0x20, 0x81, 0xf8, 
-       0x27, 0x65, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x20, 
-       0x11, 0xa9, 0x70, 0x00, 0x00, 0x11, 0x70, 0x01, 
-       0x00, 0x13, 0x70, 0x02, 0x27, 0x65, 0xf2, 0x74, 
-       0x0f, 0x18, 0xf4, 0x95, 0x48, 0x12, 0xee, 0x04, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
-       0x4a, 0x17, 0xee, 0xfc, 0xe8, 0x00, 0x4e, 0xf8, 
-       0x27, 0x66, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x68, 
-       0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x6c, 0xe8, 0x00, 
-       0x4e, 0xf8, 0x27, 0x6a, 0x77, 0x12, 0x27, 0x40, 
-       0x77, 0x11, 0x24, 0x00, 0x77, 0x1a, 0x00, 0x1f, 
-       0xf0, 0x72, 0x11, 0xdb, 0x70, 0x92, 0x00, 0x11, 
-       0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 0x76, 0x81, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 0x76, 0xe1, 
-       0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 
-       0x6d, 0xe9, 0x00, 0x0d, 0xf0, 0x20, 0x25, 0xa0, 
-       0xf1, 0x00, 0x00, 0x07, 0x89, 0x11, 0xf1, 0x00, 
-       0x00, 0x01, 0x81, 0x02, 0x88, 0x16, 0xf4, 0x95, 
-       0x77, 0x17, 0x00, 0x20, 0x76, 0x86, 0x00, 0xff, 
-       0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 
-       0x10, 0x02, 0xf0, 0x74, 0x06, 0x6c, 0x76, 0x00, 
-       0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74, 
-       0x06, 0x6c, 0xf4, 0x95, 0x48, 0x11, 0x10, 0x02, 
-       0xf0, 0x00, 0x00, 0x0d, 0x80, 0x02, 0x6d, 0xe9, 
-       0x00, 0x0d, 0x6d, 0xee, 0x00, 0x0d, 0x6c, 0xef, 
-       0xff, 0xff, 0x11, 0xe8, 0xf0, 0x74, 0x0c, 0x9d, 
-       0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 
-       0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 
-       0xee, 0xfa, 0x88, 0x11, 0x10, 0x0a, 0x49, 0x11, 
-       0xf8, 0x4d, 0x12, 0x9f, 0x48, 0x08, 0xf8, 0x45, 
-       0x12, 0x9f, 0x80, 0x04, 0x12, 0x81, 0xf5, 0x78, 
-       0x89, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe2, 
-       0xff, 0xb9, 0x12, 0x8a, 0x61, 0xf8, 0x00, 0x08, 
-       0x00, 0x80, 0xf8, 0x30, 0x12, 0x8a, 0x13, 0xe1, 
-       0x00, 0x01, 0xf0, 0xe8, 0xf7, 0x78, 0xf1, 0xa0, 
-       0xf2, 0x30, 0x1f, 0xff, 0x88, 0x17, 0xf4, 0x95, 
-       0x77, 0x12, 0x24, 0x00, 0x77, 0x16, 0x00, 0x00, 
-       0x77, 0x13, 0x00, 0x20, 0xf6, 0xb8, 0x48, 0x17, 
-       0x08, 0xe2, 0x00, 0x01, 0xf8, 0x45, 0x12, 0x42, 
-       0x6d, 0xea, 0x00, 0x0d, 0x6d, 0x96, 0x6c, 0xeb, 
-       0xff, 0xff, 0x12, 0x34, 0xf0, 0x73, 0x12, 0x90, 
-       0x56, 0xf8, 0x27, 0x6a, 0xf0, 0x00, 0x00, 0x01, 
-       0x4e, 0xf8, 0x27, 0x6a, 0x60, 0x82, 0x00, 0x01, 
-       0xf8, 0x30, 0x12, 0x54, 0x70, 0x00, 0x00, 0x16, 
-       0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11, 
-       0xf0, 0x73, 0x12, 0x90, 0x70, 0x00, 0x00, 0x16, 
-       0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11, 
-       0x72, 0x10, 0x2a, 0x9e, 0xf4, 0x95, 0xf4, 0xaf, 
-       0xf8, 0x30, 0x12, 0x6e, 0x76, 0x00, 0x00, 0x00, 
-       0x76, 0x01, 0x00, 0xbc, 0x70, 0x02, 0x00, 0x16, 
-       0x76, 0x03, 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 
-       0xf4, 0x95, 0x48, 0x11, 0xf0, 0x73, 0x12, 0x90, 
-       0x10, 0xf8, 0x27, 0x6e, 0xf8, 0x44, 0x12, 0x90, 
-       0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0xbc, 
-       0x70, 0x02, 0x00, 0x16, 0x76, 0x03, 0x00, 0x00, 
-       0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0x48, 0x11, 
-       0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 0xf0, 0x10, 
-       0x13, 0x88, 0xf8, 0x42, 0x12, 0x90, 0x76, 0xf8, 
-       0x27, 0x6e, 0x00, 0x01, 0xf0, 0x73, 0x12, 0x90, 
-       0x56, 0xf8, 0x27, 0x66, 0xf0, 0x00, 0x00, 0x01, 
-       0x4e, 0xf8, 0x27, 0x66, 0x6d, 0xe9, 0x00, 0x5e, 
-       0x56, 0xf8, 0x27, 0x68, 0xf0, 0x00, 0x00, 0x01, 
-       0x4e, 0xf8, 0x27, 0x68, 0x71, 0x04, 0x00, 0x12, 
-       0x6e, 0xea, 0xff, 0xff, 0x12, 0x18, 0x70, 0x04, 
-       0x00, 0x12, 0xee, 0x06, 0x8a, 0x17, 0x8a, 0x16, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
-       0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d, 
-       0xf0, 0x00, 0x25, 0xa0, 0x88, 0x11, 0xf4, 0x95, 
-       0xf4, 0x95, 0x76, 0x81, 0x00, 0xff, 0x76, 0x00, 
-       0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74, 
-       0x06, 0x6c, 0xf0, 0x00, 0x00, 0x01, 0x76, 0x00, 
-       0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0x48, 0x11, 
-       0xf2, 0x74, 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x07, 
-       0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
-       0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d, 
-       0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 
-       0xf4, 0x95, 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 
-       0x76, 0x81, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 
-       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 
-       0x13, 0x03, 0x88, 0x11, 0xfa, 0x4d, 0x12, 0xec, 
-       0x71, 0x02, 0x00, 0x12, 0xf3, 0x10, 0x00, 0x01, 
-       0x89, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x12, 0xeb, 
-       0x70, 0x91, 0x00, 0x12, 0x8a, 0x11, 0xfc, 0x00, 
-       0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d, 
-       0xf7, 0xb8, 0xee, 0xfe, 0x10, 0xf8, 0x00, 0x08, 
-       0x11, 0x06, 0xf1, 0xc0, 0x83, 0x00, 0xf4, 0x85, 
-       0x11, 0x06, 0xf7, 0x85, 0x81, 0x06, 0xf6, 0xb8, 
-       0xec, 0x0f, 0x1e, 0x06, 0x61, 0x00, 0x80, 0x00, 
-       0xf8, 0x20, 0x13, 0x05, 0xf4, 0x84, 0xee, 0x02, 
-       0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 
-       0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d, 
-       0xee, 0xfe, 0xf7, 0xb8, 0x80, 0x00, 0x10, 0xf8, 
-       0x00, 0x08, 0xf4, 0x85, 0x11, 0x06, 0xf7, 0x85, 
-       0x81, 0x06, 0xf6, 0xb8, 0xec, 0x0f, 0x1e, 0x06, 
-       0xf0, 0xf0, 0x61, 0x00, 0x80, 0x00, 0xf8, 0x20, 
-       0x13, 0x20, 0xf4, 0x84, 0xee, 0x02, 0x8a, 0x0d, 
-       0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 0x4a, 0x11, 
-       0x77, 0x11, 0x00, 0x7b, 0x76, 0x81, 0x2e, 0xec, 
-       0x77, 0x11, 0x00, 0x7b, 0xee, 0xff, 0x71, 0x81, 
-       0x00, 0x11, 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0x62, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x76, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x92, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x94, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0xb0, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xb3, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0xbe, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0xbf, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0xc1, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc3, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0xc5, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0xc7, 0x00, 0x00, 0x76, 0x81, 
-       0x00, 0x00, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
-       0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xff, 
-       0xf4, 0x95, 0x71, 0x06, 0x00, 0x16, 0xfb, 0x80, 
-       0x16, 0xa2, 0x88, 0x17, 0xf4, 0x95, 0xf7, 0xb8, 
-       0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02, 
-       0xfa, 0x46, 0x13, 0x88, 0x77, 0x11, 0x00, 0x00, 
-       0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02, 
-       0xf8, 0x45, 0x13, 0xf9, 0x10, 0xf8, 0x00, 0x17, 
-       0xf8, 0x45, 0x14, 0x39, 0x10, 0xf8, 0x00, 0x17, 
-       0xf0, 0x10, 0x00, 0x01, 0xf8, 0x45, 0x14, 0x1f, 
-       0xf0, 0x73, 0x14, 0x52, 0x10, 0xf8, 0x00, 0x17, 
-       0xf0, 0x10, 0x00, 0x03, 0xf8, 0x45, 0x13, 0xd3, 
-       0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x06, 
-       0xf8, 0x44, 0x14, 0x52, 0x77, 0x12, 0x00, 0x7b, 
-       0x71, 0x82, 0x00, 0x14, 0x61, 0xe4, 0x00, 0x07, 
-       0x00, 0x40, 0xf8, 0x30, 0x14, 0x52, 0x49, 0x14, 
-       0x48, 0x17, 0xf6, 0x00, 0x88, 0x12, 0xf4, 0x95, 
-       0x77, 0x13, 0x00, 0x55, 0x77, 0x11, 0x00, 0x57, 
-       0x6d, 0xea, 0x00, 0x3b, 0xe5, 0x01, 0x10, 0xe6, 
-       0x00, 0x06, 0x80, 0x81, 0x48, 0x14, 0x00, 0xf8, 
-       0x00, 0x17, 0x88, 0x12, 0xf4, 0x95, 0x77, 0x11, 
-       0x00, 0x55, 0x10, 0xe2, 0x00, 0x40, 0x80, 0x81, 
-       0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x07, 
-       0x80, 0x81, 0x77, 0x11, 0x00, 0x55, 0x10, 0xe2, 
-       0x00, 0x45, 0x80, 0x81, 0x10, 0xe6, 0x00, 0x08, 
-       0x77, 0x11, 0x00, 0x57, 0x80, 0x81, 0x77, 0x11, 
-       0x00, 0x55, 0x10, 0xe2, 0x00, 0x4a, 0x80, 0x81, 
-       0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x09, 
-       0x80, 0x81, 0xf2, 0x73, 0x14, 0x52, 0x77, 0x11, 
-       0x03, 0xc0, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82, 
-       0xf0, 0x00, 0x00, 0x07, 0x88, 0x13, 0xf4, 0x95, 
-       0xf4, 0x95, 0x96, 0x1b, 0xf8, 0x30, 0x14, 0x52, 
-       0x10, 0xe3, 0x00, 0x35, 0x77, 0x12, 0x00, 0x55, 
-       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
-       0x00, 0x04, 0x80, 0x82, 0x77, 0x12, 0x00, 0x55, 
-       0x10, 0xe3, 0x00, 0x37, 0x80, 0x82, 0x77, 0x12, 
-       0x00, 0x57, 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 
-       0x48, 0x11, 0xf0, 0x40, 0x00, 0x10, 0xf2, 0x73, 
-       0x14, 0x50, 0xf0, 0x40, 0x00, 0x20, 0x77, 0x12, 
-       0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07, 
-       0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0d, 
-       0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x34, 
-       0x77, 0x13, 0x00, 0x55, 0x80, 0x83, 0x77, 0x13, 
-       0x00, 0x57, 0x10, 0xe6, 0x00, 0x02, 0x80, 0x83, 
-       0x10, 0xe2, 0x00, 0x36, 0x77, 0x12, 0x00, 0x55, 
-       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
-       0x00, 0x03, 0x80, 0x82, 0x48, 0x11, 0xf0, 0x40, 
-       0x00, 0x04, 0xf2, 0x73, 0x14, 0x50, 0xf0, 0x40, 
-       0x00, 0x08, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82, 
-       0xf0, 0x00, 0x00, 0x07, 0x88, 0x12, 0xf4, 0x95, 
-       0xf4, 0x95, 0x96, 0x0e, 0xf8, 0x30, 0x14, 0x52, 
-       0x10, 0xe2, 0x00, 0x33, 0x77, 0x12, 0x00, 0x55, 
-       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
-       0x00, 0x01, 0x80, 0x82, 0x48, 0x11, 0xf2, 0x73, 
-       0x14, 0x50, 0xf0, 0x40, 0x00, 0x02, 0x77, 0x12, 
-       0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07, 
-       0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0f, 
-       0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x32, 
-       0x77, 0x12, 0x00, 0x55, 0x77, 0x13, 0x00, 0x57, 
-       0x80, 0x82, 0x48, 0x11, 0xe7, 0x62, 0xf0, 0x40, 
-       0x00, 0x01, 0xe5, 0x01, 0x88, 0x11, 0xf4, 0x95, 
-       0x77, 0x12, 0x00, 0x7b, 0x48, 0x11, 0x71, 0x82, 
-       0x00, 0x12, 0x1a, 0xe2, 0x00, 0x07, 0x80, 0xe2, 
-       0x00, 0x07, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
-       0x8a, 0x17, 0x48, 0x11, 0x8a, 0x16, 0x8a, 0x11, 
-       0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0x77, 0x0e, 
-       0x00, 0x05, 0x77, 0x12, 0x00, 0x55, 0xe8, 0x04, 
-       0xf6, 0xb8, 0x28, 0xe1, 0x00, 0x02, 0xee, 0xff, 
-       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0xf0, 0x20, 
-       0x80, 0x00, 0xee, 0x01, 0x1a, 0x82, 0x77, 0x12, 
-       0x00, 0x57, 0x80, 0x82, 0xe8, 0x01, 0x32, 0xe1, 
-       0x00, 0x02, 0xf5, 0x82, 0x77, 0x11, 0x00, 0x54, 
-       0xf6, 0x93, 0x18, 0x81, 0x77, 0x11, 0x00, 0x54, 
-       0xf2, 0xa0, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
-       0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 
-       0x71, 0x04, 0x00, 0x11, 0xfb, 0x80, 0x16, 0xa2, 
-       0x88, 0x16, 0xf4, 0x95, 0x77, 0x12, 0x00, 0x55, 
-       0x10, 0xe6, 0x00, 0x03, 0x80, 0x82, 0x77, 0x12, 
-       0x00, 0x56, 0x10, 0xe1, 0x00, 0x02, 0x77, 0x13, 
-       0x00, 0x56, 0x80, 0x82, 0x77, 0x12, 0x00, 0x56, 
-       0x10, 0xe1, 0x00, 0x03, 0x80, 0x82, 0x10, 0xe1, 
-       0x00, 0x04, 0x77, 0x12, 0x00, 0x56, 0x80, 0x82, 
-       0x77, 0x12, 0x00, 0x56, 0x10, 0xe1, 0x00, 0x01, 
-       0x80, 0x82, 0xe7, 0x12, 0xe5, 0x01, 0xf9, 0x80, 
-       0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 
-       0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xf9, 
-       0x77, 0x11, 0x00, 0x7b, 0x76, 0x00, 0x00, 0x16, 
-       0x76, 0x01, 0x00, 0x17, 0x76, 0x02, 0x00, 0x1a, 
-       0x76, 0x03, 0x00, 0x1b, 0x76, 0x04, 0x00, 0x1c, 
-       0x76, 0x05, 0x00, 0x1d, 0x71, 0x81, 0x00, 0x17, 
-       0x71, 0xe7, 0x00, 0x06, 0x00, 0x11, 0x10, 0x81, 
-       0xf8, 0x44, 0x14, 0xdf, 0xf9, 0x80, 0x16, 0x53, 
-       0xf6, 0xb8, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x20, 
-       0xff, 0xff, 0xf6, 0xb8, 0xfb, 0x80, 0x16, 0x08, 
-       0xf0, 0x20, 0xff, 0xff, 0x77, 0x11, 0x00, 0x7b, 
-       0x71, 0x81, 0x00, 0x17, 0x76, 0xe7, 0x00, 0x06, 
-       0x00, 0x01, 0x48, 0x17, 0x77, 0x16, 0x00, 0x00, 
-       0x77, 0x10, 0x00, 0x04, 0x77, 0x15, 0x00, 0x03, 
-       0x77, 0x14, 0x00, 0x02, 0x77, 0x13, 0x00, 0x01, 
-       0xf0, 0x00, 0x00, 0x39, 0x76, 0xe7, 0x00, 0x08, 
-       0x00, 0x1f, 0x76, 0xe7, 0x00, 0x07, 0x00, 0x00, 
-       0x88, 0x0e, 0x77, 0x1a, 0x00, 0x05, 0x48, 0x17, 
-       0xf0, 0x00, 0x00, 0x09, 0x88, 0x12, 0x48, 0x18, 
-       0x88, 0x19, 0xe8, 0x00, 0xf0, 0x72, 0x15, 0x2c, 
-       0x73, 0x19, 0x00, 0x11, 0x76, 0x82, 0x00, 0x00, 
-       0x11, 0x91, 0x73, 0x11, 0x00, 0x19, 0x70, 0xe2, 
-       0x00, 0x03, 0x00, 0x16, 0x70, 0xe2, 0x00, 0x04, 
-       0x00, 0x13, 0x70, 0xe2, 0x00, 0x05, 0x00, 0x14, 
-       0x81, 0xe2, 0x00, 0x01, 0x70, 0xe2, 0x00, 0x06, 
-       0x00, 0x15, 0x70, 0xe2, 0x00, 0x07, 0x00, 0x10, 
-       0x80, 0xe2, 0x00, 0x02, 0x73, 0x0e, 0x00, 0x11, 
-       0xf1, 0x00, 0x00, 0x1e, 0x6d, 0xee, 0x00, 0x05, 
-       0x6d, 0xeb, 0x00, 0x05, 0x6d, 0xec, 0x00, 0x05, 
-       0x6d, 0xed, 0x00, 0x05, 0x6d, 0xe8, 0x00, 0x05, 
-       0xf0, 0x00, 0x00, 0x01, 0x81, 0x91, 0x6d, 0xea, 
-       0x00, 0x08, 0x73, 0x11, 0x00, 0x0e, 0xee, 0x07, 
-       0x76, 0xe7, 0x00, 0x41, 0x00, 0x24, 0x76, 0xe7, 
-       0x00, 0x46, 0x00, 0x25, 0x76, 0xe7, 0x00, 0x4b, 
-       0x00, 0x26, 0x76, 0xe7, 0x00, 0x50, 0x00, 0x27, 
-       0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 
-       0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfe, 0x88, 0x11, 
-       0x56, 0x06, 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 
-       0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 0xf0, 0x10, 
-       0xff, 0xff, 0xfa, 0x45, 0x15, 0x60, 0x77, 0x16, 
-       0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 0x49, 0x11, 
-       0x10, 0x82, 0xf6, 0x03, 0xf0, 0x00, 0x00, 0x09, 
-       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
-       0xf8, 0x44, 0x15, 0x71, 0xf2, 0x73, 0x15, 0x71, 
-       0xf4, 0x95, 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 
-       0x10, 0x81, 0xf0, 0x00, 0x00, 0x09, 0x88, 0x11, 
-       0xf4, 0x95, 0x77, 0x12, 0x00, 0x06, 0x10, 0x81, 
-       0xf8, 0x45, 0x15, 0x5c, 0x6e, 0xea, 0xff, 0xff, 
-       0x15, 0x69, 0x6d, 0xe9, 0x00, 0x08, 0x76, 0x86, 
-       0x00, 0x01, 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 
-       0x10, 0xf8, 0x00, 0x0b, 0xf8, 0x45, 0x15, 0x7e, 
-       0xfb, 0x80, 0x15, 0x85, 0xf4, 0x95, 0x48, 0x16, 
-       0xf9, 0x80, 0x16, 0x9a, 0xee, 0x02, 0x48, 0x16, 
-       0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 
-       0xee, 0xff, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
-       0xf4, 0x95, 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 
-       0xf8, 0x30, 0x15, 0xc4, 0x10, 0xe1, 0x00, 0x03, 
-       0x77, 0x12, 0x00, 0x55, 0x80, 0x82, 0x77, 0x12, 
-       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
-       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
-       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
-       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
-       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
-       0x00, 0x02, 0xf0, 0x00, 0x00, 0x08, 0x32, 0xf8, 
-       0x00, 0x08, 0x77, 0x12, 0x00, 0x54, 0xe8, 0x01, 
-       0xf4, 0x82, 0xf4, 0x93, 0x18, 0x82, 0x77, 0x12, 
-       0x00, 0x54, 0xf0, 0x40, 0x00, 0x00, 0x80, 0x82, 
-       0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x76, 
-       0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x66, 
-       0xf0, 0x73, 0x16, 0x03, 0x77, 0x11, 0x00, 0x7b, 
-       0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 0x00, 0x07, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
-       0x00, 0x09, 0xf9, 0x80, 0x15, 0x85, 0x77, 0x11, 
-       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
-       0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
-       0x00, 0x08, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81, 
-       0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80, 
-       0x15, 0x85, 0xf0, 0x00, 0x00, 0x10, 0x77, 0x11, 
-       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
-       0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
-       0x00, 0x18, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81, 
-       0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80, 
-       0x15, 0x85, 0xf0, 0x00, 0x00, 0x20, 0x77, 0x11, 
-       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
-       0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
-       0x00, 0x28, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
-       0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 
-       0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 
-       0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 
-       0x16, 0x41, 0x77, 0x11, 0x00, 0x55, 0x76, 0x81, 
-       0x00, 0x1e, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
-       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0xf2, 0x73, 
-       0x16, 0x4e, 0x76, 0x81, 0x00, 0x00, 0x77, 0x11, 
-       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 
-       0x00, 0x07, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 
-       0x10, 0xe1, 0x00, 0x39, 0xf9, 0x80, 0x16, 0x08, 
-       0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 
-       0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 
-       0x10, 0x81, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 
-       0x16, 0x63, 0xf4, 0x95, 0xee, 0xff, 0x76, 0x81, 
-       0x00, 0x01, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4, 
-       0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8, 
-       0x00, 0x08, 0xee, 0xff, 0x77, 0x11, 0x00, 0x01, 
-       0xe8, 0x01, 0xee, 0x01, 0xf4, 0x82, 0x1a, 0x81, 
-       0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
-       0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8, 
-       0x00, 0x08, 0xee, 0xff, 0xe8, 0x01, 0x77, 0x11, 
-       0x00, 0x00, 0xf4, 0x82, 0xee, 0x01, 0xf4, 0x93, 
-       0x18, 0x81, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
-       0xf4, 0xe4, 0x4a, 0x11, 0xf0, 0x10, 0x00, 0x10, 
-       0x77, 0x11, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x08, 
-       0xee, 0xff, 0x11, 0x81, 0xe8, 0x01, 0xee, 0x01, 
-       0x77, 0x11, 0x00, 0x00, 0xf4, 0x82, 0xf2, 0xa0, 
-       0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
-       0xf2, 0x73, 0x16, 0x9e, 0xf6, 0xbb, 0xf4, 0x95, 
-       0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4, 
-       0xf2, 0x73, 0x16, 0xa6, 0xf7, 0xbb, 0xf4, 0x95, 
-       0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4, 
-       0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 0x71, 0x04, 
-       0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
-       0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x0e, 0x10, 0xe6, 0x00, 0x0e, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 
-       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x0d, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
-       0x10, 0xe6, 0x00, 0x0d, 0x80, 0x82, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0c, 
-       0x10, 0xe6, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 0x10, 0xe6, 
-       0x00, 0x0b, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
-       0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x10, 0xe6, 0x00, 0x0a, 0x80, 0x82, 
-       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x09, 0x10, 0xe6, 0x00, 0x09, 0x71, 0xe1, 
-       0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x08, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 
-       0x00, 0x08, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 0x10, 0xe6, 
-       0x00, 0x07, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
-       0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x10, 0xe6, 0x00, 0x06, 0x80, 0x82, 
-       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x05, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
-       0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x04, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 
-       0x00, 0x04, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 0x71, 0xe1, 
-       0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 0x00, 0x03, 
-       0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x02, 0x10, 0xe6, 0x00, 0x02, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 
-       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x01, 0x10, 0xe6, 0x00, 0x01, 0x71, 0xe1, 
-       0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x13, 0xe7, 0x62, 
-       0xe5, 0x01, 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 
-       0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 
-       0x00, 0x12, 0xee, 0xff, 0x76, 0x82, 0x00, 0x00, 
-       0xee, 0x01, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 
-       0x69, 0x81, 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 
-       0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95, 
-       0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0xee, 0xff, 0x76, 0x82, 0x00, 0x01, 0xee, 0x01, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 0x69, 0x81, 
-       0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
-       0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
-       0xf0, 0x00, 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 
-       0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 0x17, 0x9c, 
-       0xf4, 0x95, 0xee, 0xff, 0xf9, 0x80, 0x16, 0x53, 
-       0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 
-       0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
-       0x76, 0x81, 0x00, 0x01, 0xee, 0x01, 0x76, 0xe1, 
-       0x00, 0x01, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
-       0x00, 0x21, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x20, 
-       0x76, 0xe1, 0x00, 0x04, 0x00, 0x23, 0x76, 0xe1, 
-       0x00, 0x05, 0x00, 0x22, 0x76, 0xe1, 0x00, 0x06, 
-       0x00, 0x38, 0x76, 0xe1, 0x00, 0x07, 0x00, 0x39, 
-       0x76, 0xe1, 0x00, 0x08, 0x00, 0x15, 0x76, 0xe1, 
-       0x00, 0x09, 0x00, 0x14, 0x76, 0xe1, 0x00, 0x0a, 
-       0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x41, 
-       0x76, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x76, 0xe1, 
-       0x00, 0x0d, 0x00, 0x43, 0x76, 0xe1, 0x00, 0x0e, 
-       0x00, 0x42, 0x76, 0xe1, 0x00, 0x0f, 0x00, 0x48, 
-       0x76, 0xe1, 0x00, 0x10, 0x00, 0x49, 0x76, 0xe1, 
-       0x00, 0x11, 0x00, 0x1b, 0x76, 0xe1, 0x00, 0x12, 
-       0x00, 0x1a, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
-       0x4a, 0x11, 0xee, 0xfd, 0x88, 0x11, 0x56, 0x06, 
-       0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 0x77, 0x12, 
-       0x00, 0x7b, 0x77, 0x0e, 0x00, 0x09, 0x10, 0x82, 
-       0x28, 0xf8, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x95, 
-       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
-       0xf8, 0x45, 0x17, 0xf0, 0xf2, 0x73, 0x17, 0xfd, 
-       0x77, 0x11, 0xff, 0xff, 0x76, 0x81, 0x00, 0x01, 
-       0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 0x10, 0xf8, 
-       0x00, 0x0b, 0xf8, 0x45, 0x17, 0xfd, 0xfb, 0x80, 
-       0x18, 0x10, 0xf4, 0x95, 0x48, 0x11, 0xf9, 0x80, 
-       0x16, 0x9a, 0xee, 0x03, 0x48, 0x11, 0x8a, 0x11, 
-       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 
-       0xf4, 0x95, 0xee, 0xff, 0x71, 0xe1, 0x00, 0x01, 
-       0x00, 0x11, 0xee, 0x01, 0x10, 0x81, 0x8a, 0x11, 
-       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 
-       0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 
-       0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 
-       0x18, 0xc3, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x02, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x04, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x05, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x20, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x08, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x09, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
-       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0d, 
-       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
-       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
-       0x76, 0x82, 0x00, 0x0e, 0x71, 0xe1, 0x00, 0x06, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
-       0x00, 0x07, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1, 
-       0x00, 0x08, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1, 
-       0x00, 0x07, 0xf9, 0x80, 0x16, 0x66, 0x10, 0xe1, 
-       0x00, 0x08, 0xf9, 0x80, 0x16, 0x66, 0xf0, 0x73, 
-       0x18, 0xd1, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
-       0xfb, 0x80, 0x18, 0x10, 0xf0, 0x00, 0x00, 0x95, 
-       0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xfb, 0x80, 
-       0x18, 0x10, 0xf0, 0x00, 0x00, 0x9e, 0xf9, 0x80, 
-       0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4, 
-       0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 0xf4, 0x95, 
-       0x10, 0x04, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x11, 
-       0xee, 0x01, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
-       0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 
-       0x71, 0x04, 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 
-       0x88, 0x11, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x02, 
-       0x00, 0x12, 0x76, 0x82, 0x00, 0x10, 0x10, 0xe6, 
-       0x00, 0x01, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 
-       0x80, 0x82, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12, 
-       0x10, 0xe6, 0x00, 0x02, 0x80, 0x82, 0xe7, 0x62, 
-       0x71, 0xe1, 0x00, 0x02, 0x00, 0x13, 0xe5, 0x01, 
-       0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 
-       0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 
-       0xee, 0x01, 0x10, 0xe1, 0x00, 0x01, 0x8a, 0x11, 
-       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 
-       0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 
-       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
-       0xfa, 0x44, 0x19, 0x2a, 0xf4, 0x95, 0xee, 0xff, 
-       0xf9, 0x80, 0x16, 0x53, 0x77, 0x11, 0x00, 0x7b, 
-       0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 0x88, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x76, 0x81, 0x00, 0x01, 
-       0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 0x00, 0x00, 
-       0x76, 0xe1, 0x00, 0x02, 0x00, 0x13, 0x76, 0xe1, 
-       0x00, 0x03, 0x00, 0x26, 0x76, 0xe1, 0x00, 0x04, 
-       0x00, 0x25, 0x76, 0xe1, 0x00, 0x05, 0x00, 0x24, 
-       0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1, 
-       0x00, 0x07, 0x00, 0x17, 0x76, 0xe1, 0x00, 0x08, 
-       0x00, 0x32, 0x76, 0xe1, 0x00, 0x09, 0x00, 0x31, 
-       0x76, 0xe1, 0x00, 0x0a, 0x00, 0x30, 0x8a, 0x11, 
-       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 
-       0x4a, 0x17, 0xee, 0xff, 0xf4, 0x95, 0x71, 0x06, 
-       0x00, 0x17, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
-       0xf4, 0x95, 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 
-       0xf0, 0x10, 0xff, 0xff, 0xfa, 0x45, 0x19, 0x73, 
-       0x77, 0x16, 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 
-       0x77, 0x0e, 0x00, 0x05, 0x10, 0x82, 0x28, 0xf8, 
-       0x00, 0x11, 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 
-       0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf8, 0x44, 
-       0x19, 0x84, 0xf2, 0x73, 0x19, 0x84, 0xf4, 0x95, 
-       0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
-       0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 0xf4, 0x95, 
-       0x77, 0x12, 0x00, 0x02, 0x10, 0x81, 0xf8, 0x45, 
-       0x19, 0x6f, 0x6e, 0xea, 0xff, 0xff, 0x19, 0x7c, 
-       0x6d, 0xe9, 0x00, 0x05, 0x61, 0xf8, 0x00, 0x17, 
-       0x00, 0x01, 0xfa, 0x20, 0x19, 0x8f, 0x76, 0x86, 
-       0x00, 0x01, 0xfb, 0x80, 0x19, 0x97, 0xf4, 0x95, 
-       0x48, 0x16, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
-       0x8a, 0x17, 0x48, 0x16, 0x8a, 0x16, 0x8a, 0x11, 
-       0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 0xfb, 0x80, 
-       0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 
-       0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 0x19, 0xcc, 
-       0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 0x69, 0x82, 
-       0x00, 0x10, 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 
-       0x68, 0x82, 0xf7, 0xff, 0x71, 0xe1, 0x00, 0x02, 
-       0x00, 0x12, 0x68, 0x82, 0xfb, 0xff, 0x71, 0xe1, 
-       0x00, 0x02, 0x00, 0x12, 0x68, 0x82, 0xff, 0xf0, 
-       0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 0x76, 0x82, 
-       0xff, 0xff, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12, 
-       0x76, 0x82, 0xff, 0xff, 0x71, 0xe1, 0x00, 0x02, 
-       0x00, 0x12, 0x69, 0x82, 0x00, 0x20, 0x71, 0xe1, 
-       0x00, 0x02, 0x00, 0x11, 0xf2, 0x73, 0x19, 0xda, 
-       0x68, 0x81, 0xff, 0xef, 0x77, 0x11, 0x00, 0x7b, 
-       0x10, 0x81, 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 
-       0x00, 0xb4, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
-       0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 0x00, 0xb9, 
-       0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 
-       0xf4, 0xe4, 0x00, 0xa4, 0x00, 0x00, 0x19, 0xdf, 
-       0x00, 0x01, 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x01, 
-       0x2a, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x2a, 0x12, 
-       0x0c, 0x01, 0xc3, 0x4f, 0x00, 0x00, 0x00, 0x01, 
-       0x2a, 0x15, 0x00, 0x00, 0x00, 0x02, 0x2a, 0x16, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x2a, 0x5d, 
-       0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 
-       0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 
-       0x00, 0x74, 0x00, 0x20, 0x00, 0x54, 0x00, 0x65, 
-       0x00, 0x63, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x6f, 
-       0x00, 0x54, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 
-       0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x47, 
-       0x00, 0x00, 0x00, 0x04, 0x2a, 0x76, 0x00, 0x30, 
-       0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c, 
-       0x2a, 0x7a, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62, 
-       0x00, 0x20, 0x00, 0x32, 0x00, 0x37, 0x00, 0x20, 
-       0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 
-       0x00, 0x00, 0x00, 0x09, 0x2a, 0x86, 0x00, 0x31, 
-       0x00, 0x34, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x35, 
-       0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 
-       0x00, 0x0f, 0x2a, 0x8f, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x2a, 0x9e, 0x00, 0x00, 
-       0x00, 0x01, 0x2a, 0x9f, 0x00, 0x00, 0x00, 0x01, 
-       0x2a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa1, 
-       0x00, 0x00, 0x00, 0x01, 0x2a, 0xa2, 0x00, 0x00, 
-       0x00, 0x01, 0x29, 0x7e, 0x00, 0x00, 0x00, 0x02, 
-       0x29, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x29, 0x82, 0xff, 0xff, 0x00, 0x01, 0x2a, 0xa7, 
-       0x00, 0x00, 0x00, 0x05, 0x2a, 0xa8, 0x71, 0x41, 
-       0x20, 0x00, 0x20, 0x00, 0x00, 0x23, 0x04, 0x00, 
-       0x00, 0x0a, 0x2a, 0xad, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x0f, 0x2a, 0xb7, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x82, 0x40, 
-       0x00, 0x08, 0x30, 0x7f, 0x00, 0x80, 0x01, 0x80, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x27, 0x6e, 0x00, 0x00, 
-       0x00, 0x01, 0x27, 0x6f, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x09, 0x00, 0x00, 0x1a, 0x83, 0x04, 0xe8, 
-       0x04, 0xcf, 0x04, 0xc5, 0x04, 0xba, 0x04, 0xb0, 
-       0x04, 0xac, 0x04, 0x9c, 0x04, 0x8c, 0x04, 0x81, 
-       0x00, 0x78, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xaa, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x02, 0x23, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x05, 0xe5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x02, 0xb5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x0e, 0x33, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
-       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0x00, 0x00, 
+       0x08, 0xaa, 0x00, 0x18, 0x00, 0x03, 0x08, 0x00,
+       0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x18, 0x5f,
+       0x00, 0x00, 0x01, 0x80, 0x77, 0x18, 0x2a, 0xeb,
+       0x6b, 0xf8, 0x00, 0x18, 0x03, 0xff, 0x68, 0xf8,
+       0x00, 0x18, 0xff, 0xfe, 0xf7, 0xb8, 0xf7, 0xbe,
+       0xf6, 0xb9, 0xf4, 0xa0, 0xf6, 0xb7, 0xf6, 0xb5,
+       0xf6, 0xb6, 0xf0, 0x20, 0x19, 0xdf, 0xf1, 0x00,
+       0x00, 0x01, 0xf8, 0x4d, 0x01, 0xab, 0xf6, 0xb8,
+       0xf0, 0x20, 0x19, 0xdf, 0xf0, 0x73, 0x01, 0xa5,
+       0x7e, 0xf8, 0x00, 0x12, 0xf0, 0x00, 0x00, 0x01,
+       0x47, 0xf8, 0x00, 0x11, 0x7e, 0x92, 0x00, 0xf8,
+       0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x7e, 0xf8,
+       0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x6c, 0x89,
+       0x01, 0x9a, 0xf7, 0xb8, 0xee, 0xfc, 0xf0, 0x20,
+       0xff, 0xff, 0xf1, 0x00, 0x00, 0x01, 0xf8, 0x4d,
+       0x01, 0xbf, 0xf2, 0x73, 0x01, 0xb9, 0x4e, 0x02,
+       0xf4, 0x95, 0xf5, 0xe3, 0x56, 0x02, 0x7e, 0x00,
+       0x11, 0x00, 0xfa, 0x4c, 0x01, 0xb7, 0x6b, 0x03,
+       0x00, 0x01, 0xf6, 0xb8, 0xee, 0x04, 0xf0, 0x74,
+       0x0d, 0xa7, 0xf0, 0x74, 0x01, 0xc5, 0x4a, 0x11,
+       0x4a, 0x16, 0x72, 0x11, 0x2a, 0xe6, 0x10, 0xf8,
+       0x00, 0x11, 0xfa, 0x45, 0x01, 0xdb, 0xf4, 0x95,
+       0xee, 0xff, 0x48, 0x11, 0xf0, 0x00, 0x2a, 0xc6,
+       0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0xee,
+       0xff, 0xff, 0xf4, 0xe3, 0x6c, 0xe9, 0xff, 0xff,
+       0x01, 0xd5, 0x10, 0xf8, 0x2a, 0xe7, 0xf8, 0x45,
+       0x01, 0xe2, 0x10, 0xf8, 0x2a, 0xe7, 0xf4, 0xe3,
+       0xf0, 0x74, 0x01, 0xff, 0xee, 0x01, 0x8a, 0x16,
+       0x8a, 0x11, 0xfc, 0x00, 0xf7, 0xb8, 0xe9, 0x20,
+       0x4a, 0x11, 0x09, 0xf8, 0x2a, 0xe6, 0xf8, 0x4e,
+       0x01, 0xf3, 0xf2, 0x73, 0x01, 0xfd, 0xf4, 0x95,
+       0xe8, 0x01, 0x72, 0x11, 0x2a, 0xe6, 0x49, 0x11,
+       0x80, 0xe1, 0x2a, 0xc6, 0xf3, 0x00, 0x00, 0x01,
+       0xe8, 0x00, 0x81, 0xf8, 0x2a, 0xe6, 0x8a, 0x11,
+       0xfc, 0x00, 0xf4, 0x95, 0xf0, 0x73, 0x02, 0x00,
+       0x10, 0xf8, 0x2a, 0x0f, 0xfc, 0x00, 0x4a, 0x11,
+       0xf0, 0x74, 0x02, 0x02, 0x80, 0xf8, 0x2a, 0x10,
+       0x73, 0x08, 0x00, 0x09, 0x40, 0xf8, 0x2a, 0x15,
+       0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10,
+       0x03, 0xe8, 0xf5, 0xa9, 0xf8, 0x30, 0x02, 0x21,
+       0x71, 0xf8, 0x2a, 0x10, 0x2a, 0x15, 0x56, 0xf8,
+       0x2a, 0x0c, 0xf0, 0xe3, 0x4e, 0xf8, 0x2a, 0x16,
+       0xe8, 0x00, 0x4e, 0xf8, 0x2a, 0x0c, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d,
+       0x68, 0xf8, 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8,
+       0x00, 0x07, 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d,
+       0xff, 0xfc, 0x6b, 0xf8, 0x2a, 0x0f, 0x00, 0x01,
+       0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x06, 0xf4, 0xeb,
+       0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x0f, 0x00, 0x00,
+       0x76, 0x00, 0x00, 0x00, 0xfb, 0x80, 0x19, 0x4c,
+       0xf4, 0x95, 0xe8, 0x00, 0x80, 0xf8, 0x2a, 0x11,
+       0xf9, 0x80, 0x19, 0x07, 0x80, 0xf8, 0x2a, 0x0e,
+       0xf9, 0x80, 0x16, 0x66, 0x76, 0x00, 0x2a, 0x12,
+       0x10, 0xf8, 0x2a, 0x11, 0xf9, 0x80, 0x18, 0xe3,
+       0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x66,
+       0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x87,
+       0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf6, 0xb8,
+       0xf4, 0x95, 0xf0, 0x20, 0x80, 0x00, 0x11, 0xf8,
+       0x2a, 0x5a, 0xf8, 0x4d, 0x02, 0x93, 0x11, 0xf8,
+       0x2a, 0x9f, 0xf8, 0x4c, 0x02, 0x7c, 0x77, 0x12,
+       0x2a, 0x39, 0x49, 0x12, 0x01, 0xf8, 0x2a, 0x9f,
+       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81,
+       0x00, 0x11, 0x6c, 0xe1, 0xff, 0xab, 0x02, 0x93,
+       0x6b, 0xf8, 0x2a, 0x9f, 0x00, 0x01, 0xe9, 0x05,
+       0x01, 0xe2, 0x00, 0x03, 0x81, 0xf8, 0x2a, 0xa0,
+       0xf0, 0x73, 0x02, 0x95, 0x72, 0x11, 0x2a, 0x9f,
+       0xf4, 0x95, 0x10, 0xe1, 0x2a, 0x39, 0x6b, 0xf8,
+       0x2a, 0x9f, 0x00, 0x01, 0x11, 0xf8, 0x2a, 0x9f,
+       0x09, 0xf8, 0x2a, 0xa0, 0xf8, 0x4c, 0x02, 0x93,
+       0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 0x76, 0xf8,
+       0x2a, 0x9f, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa0,
+       0x00, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x48, 0x11,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+       0x10, 0xf8, 0x2a, 0x5a, 0xf8, 0x44, 0x02, 0xb2,
+       0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x01, 0xf0, 0x74,
+       0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10,
+       0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 0x02, 0xb2,
+       0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 0x80, 0x00,
+       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0xd6,
+       0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95,
+       0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b,
+       0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11,
+       0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15,
+       0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19,
+       0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a,
+       0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8,
+       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+       0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe,
+       0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xfd,
+       0xf0, 0x74, 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95,
+       0x77, 0x10, 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30,
+       0x02, 0xef, 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff,
+       0x80, 0x00, 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80,
+       0x18, 0xd6, 0xee, 0x03, 0x8a, 0x18, 0xf4, 0x95,
+       0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 0x8a, 0x1a,
+       0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 0x8a, 0x19,
+       0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x15,
+       0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 0x8a, 0x11,
+       0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b,
+       0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 0xf4, 0xeb,
+       0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81,
+       0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2,
+       0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2,
+       0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1,
+       0x00, 0x03, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04,
+       0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95,
+       0xf4, 0x95, 0x10, 0x81, 0x6f, 0xf8, 0x2a, 0x9e,
+       0x0c, 0x88, 0xe8, 0xff, 0x18, 0xe1, 0x00, 0x01,
+       0x1a, 0xf8, 0x2a, 0x9e, 0xf0, 0x30, 0x1f, 0xff,
+       0x80, 0xf8, 0x2a, 0x9e, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81,
+       0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x11, 0xe2,
+       0x00, 0x01, 0x81, 0xe1, 0x00, 0x01, 0x11, 0xe2,
+       0x00, 0x02, 0x81, 0xe1, 0x00, 0x02, 0x76, 0xe1,
+       0x00, 0x03, 0x00, 0x02, 0x48, 0x08, 0x6f, 0xe1,
+       0x00, 0x04, 0x0c, 0x98, 0xf0, 0x30, 0x00, 0xff,
+       0x80, 0xe1, 0x00, 0x05, 0x76, 0xe1, 0x00, 0x06,
+       0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39,
+       0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18,
+       0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01,
+       0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02,
+       0x76, 0xe1, 0x00, 0x03, 0x00, 0x04, 0x48, 0x11,
+       0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 0xf4, 0x95,
+       0x77, 0x13, 0x2a, 0x76, 0xe9, 0x00, 0xe5, 0x98,
+       0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 0x48, 0x0b,
+       0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x03, 0x71,
+       0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xf0,
+       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81,
+       0x00, 0x14, 0x71, 0xe1, 0x00, 0x01, 0x00, 0x15,
+       0x49, 0x11, 0xf3, 0x00, 0x00, 0x02, 0x89, 0x11,
+       0xe7, 0x82, 0x6d, 0xea, 0x00, 0x04, 0xe7, 0x83,
+       0x6d, 0xeb, 0x00, 0x0a, 0x77, 0x1a, 0x00, 0x05,
+       0xf0, 0x72, 0x03, 0xaa, 0x11, 0x81, 0xf2, 0xe8,
+       0x80, 0x82, 0xe9, 0xff, 0x19, 0xe1, 0x00, 0x01,
+       0xf1, 0xa0, 0x81, 0x92, 0x11, 0xe1, 0x00, 0x0c,
+       0xf2, 0xe8, 0x80, 0x83, 0xe9, 0xff, 0x19, 0xe1,
+       0x00, 0x0d, 0xf1, 0xa0, 0x81, 0x93, 0x6d, 0xe9,
+       0x00, 0x02, 0x48, 0x18, 0x49, 0x18, 0x70, 0x00,
+       0x00, 0x15, 0xf0, 0x00, 0x00, 0x04, 0xf3, 0x00,
+       0x00, 0x0a, 0x80, 0x01, 0x81, 0x02, 0xf2, 0x74,
+       0x0e, 0x54, 0xf4, 0x95, 0x48, 0x14, 0xee, 0x10,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf0, 0x74,
+       0x0c, 0x5e, 0x80, 0xf8, 0x2a, 0x5c, 0x77, 0x12,
+       0x2a, 0x39, 0x76, 0x82, 0x00, 0x55, 0x77, 0x11,
+       0x2a, 0x18, 0x10, 0xe1, 0x00, 0x01, 0x80, 0xe2,
+       0x00, 0x01, 0x10, 0xe1, 0x00, 0x02, 0x80, 0xe2,
+       0x00, 0x02, 0x76, 0xe2, 0x00, 0x03, 0x00, 0x1c,
+       0xf6, 0xb8, 0x56, 0xf8, 0x2a, 0x16, 0xf0, 0xf0,
+       0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x07, 0x56, 0xf8,
+       0x2a, 0x16, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80,
+       0x80, 0xe2, 0x00, 0x06, 0x56, 0xf8, 0x2a, 0x16,
+       0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2,
+       0x00, 0x05, 0x57, 0xf8, 0x2a, 0x16, 0xe8, 0xff,
+       0xf2, 0x80, 0x80, 0xe2, 0x00, 0x04, 0x56, 0xf8,
+       0x27, 0x6c, 0xf0, 0xf0, 0xf0, 0xf8, 0x80, 0xe2,
+       0x00, 0x0b, 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf0,
+       0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0a,
+       0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf8, 0xe8, 0xff,
+       0xf2, 0x80, 0x80, 0xe2, 0x00, 0x09, 0xe8, 0xff,
+       0x57, 0xf8, 0x27, 0x6c, 0xf2, 0x80, 0x80, 0xe2,
+       0x00, 0x08, 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0xf0,
+       0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x0f, 0x56, 0xf8,
+       0x27, 0x6a, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80,
+       0x80, 0xe2, 0x00, 0x0e, 0x56, 0xf8, 0x27, 0x6a,
+       0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2,
+       0x00, 0x0d, 0x57, 0xf8, 0x27, 0x6a, 0xe8, 0xff,
+       0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0c, 0x76, 0xe2,
+       0x00, 0x13, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x12,
+       0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x5c, 0x0c, 0x58,
+       0x80, 0xe2, 0x00, 0x11, 0xe8, 0xff, 0x18, 0xf8,
+       0x2a, 0x5c, 0x80, 0xe2, 0x00, 0x10, 0x76, 0xe2,
+       0x00, 0x17, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x16,
+       0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x9e, 0x0c, 0x58,
+       0x80, 0xe2, 0x00, 0x15, 0xe8, 0xff, 0x18, 0xf8,
+       0x2a, 0x9e, 0x80, 0xe2, 0x00, 0x14, 0x76, 0xe2,
+       0x00, 0x1b, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1a,
+       0x00, 0x00, 0x76, 0xe2, 0x00, 0x19, 0x00, 0x00,
+       0x70, 0xe2, 0x00, 0x18, 0x27, 0x6e, 0x76, 0xe2,
+       0x00, 0x1f, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1e,
+       0x00, 0x00, 0x76, 0xe2, 0x00, 0x1d, 0x00, 0x00,
+       0x76, 0xe2, 0x00, 0x1c, 0x00, 0x00, 0x76, 0xe2,
+       0x00, 0x20, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+       0x10, 0xf8, 0x2a, 0x38, 0xf8, 0x45, 0x04, 0xed,
+       0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x02,
+       0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x08,
+       0x6d, 0xe9, 0xff, 0xdf, 0xf6, 0xa9, 0xf8, 0x20,
+       0x04, 0x75, 0xf0, 0x73, 0x04, 0x7d, 0xf0, 0x10,
+       0x00, 0x21, 0xf0, 0x00, 0x1a, 0x83, 0x48, 0x08,
+       0x7e, 0xf8, 0x00, 0x08, 0xf4, 0xe2, 0xf0, 0x74,
+       0x03, 0x0a, 0xf0, 0x73, 0x04, 0xea, 0x48, 0x12,
+       0xf2, 0x74, 0x03, 0x23, 0xf0, 0x00, 0x00, 0x04,
+       0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00,
+       0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18,
+       0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48,
+       0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x69,
+       0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36,
+       0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18,
+       0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48,
+       0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x41,
+       0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36,
+       0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0x57,
+       0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 0x2a, 0x1c,
+       0xf0, 0x74, 0x12, 0xa4, 0xf2, 0x74, 0x03, 0x36,
+       0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea,
+       0x48, 0x12, 0xf2, 0x74, 0x03, 0x80, 0xf0, 0x00,
+       0x00, 0x04, 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95,
+       0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8,
+       0x2a, 0x1c, 0xf0, 0x74, 0x12, 0xc5, 0xf2, 0x74,
+       0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73,
+       0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 0xe8, 0xff,
+       0x6f, 0xe1, 0x00, 0x06, 0x0d, 0x48, 0x18, 0xe1,
+       0x00, 0x07, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0xf2, 0xa0, 0x70, 0x00, 0x00, 0x12, 0x80, 0x01,
+       0x10, 0xe1, 0x00, 0x04, 0xf0, 0x74, 0x0e, 0x7a,
+       0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00,
+       0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0xbc,
+       0x76, 0xf8, 0x2a, 0x38, 0x00, 0x00, 0xee, 0x02,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11,
+       0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12,
+       0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1,
+       0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1,
+       0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x09,
+       0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12,
+       0xf4, 0x95, 0x77, 0x13, 0x2a, 0x86, 0xe9, 0x00,
+       0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8,
+       0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43,
+       0x05, 0x0a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74,
+       0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55,
+       0x77, 0x13, 0x2a, 0x18, 0x10, 0xe3, 0x00, 0x01,
+       0x80, 0xe1, 0x00, 0x01, 0x10, 0xe3, 0x00, 0x02,
+       0x80, 0xe1, 0x00, 0x02, 0x13, 0xe3, 0x00, 0x03,
+       0x81, 0xe1, 0x00, 0x03, 0x48, 0x11, 0x77, 0x11,
+       0x00, 0x00, 0xf8, 0x4d, 0x05, 0x44, 0xf0, 0x00,
+       0x00, 0x04, 0x88, 0x12, 0x48, 0x13, 0xf0, 0x00,
+       0x00, 0x04, 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95,
+       0xe5, 0x98, 0x6d, 0x91, 0xf6, 0xb8, 0x48, 0x11,
+       0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x05, 0x3a,
+       0xf0, 0x20, 0x2a, 0x39, 0x49, 0x11, 0xf5, 0x00,
+       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x76, 0xe1,
+       0x00, 0x04, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11,
+       0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12,
+       0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1,
+       0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1,
+       0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x0c,
+       0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12,
+       0xf4, 0x95, 0x77, 0x13, 0x2a, 0x7a, 0xe9, 0x00,
+       0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8,
+       0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43,
+       0x05, 0x6a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74,
+       0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55,
+       0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01,
+       0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02,
+       0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03,
+       0x00, 0x19, 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04,
+       0x88, 0x12, 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x5d,
+       0xe9, 0x00, 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01,
+       0xf6, 0xb8, 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c,
+       0xf8, 0x43, 0x05, 0x93, 0x76, 0x82, 0x00, 0xaa,
+       0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0x88, 0x11, 0x10, 0xf8, 0x2a, 0x38,
+       0xf8, 0x44, 0x05, 0xe3, 0x10, 0xf8, 0x2a, 0xa1,
+       0xf8, 0x44, 0x05, 0xba, 0x6c, 0xe1, 0xff, 0x56,
+       0x05, 0xe3, 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95,
+       0x70, 0xe2, 0x2a, 0x18, 0x00, 0x11, 0x6b, 0xf8,
+       0x2a, 0xa1, 0x00, 0x01, 0xf0, 0x73, 0x05, 0xe3,
+       0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 0x70, 0xe2,
+       0x2a, 0x18, 0x00, 0x11, 0x10, 0xf8, 0x2a, 0xa1,
+       0xf0, 0x00, 0x00, 0x01, 0x88, 0x12, 0xf4, 0x95,
+       0xf4, 0x95, 0x6e, 0xe2, 0xff, 0xfc, 0x05, 0xd1,
+       0x73, 0x12, 0x2a, 0xa1, 0x48, 0x11, 0xf0, 0x00,
+       0x00, 0x05, 0x80, 0xf8, 0x2a, 0xa2, 0x10, 0xf8,
+       0x2a, 0xa1, 0x08, 0xf8, 0x2a, 0xa2, 0xf8, 0x44,
+       0x05, 0xe3, 0x6c, 0xe1, 0xff, 0xab, 0x05, 0xdd,
+       0x76, 0xf8, 0x2a, 0x38, 0x00, 0x01, 0x76, 0xf8,
+       0x2a, 0xa1, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa2,
+       0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95,
+       0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b,
+       0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11,
+       0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15,
+       0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19,
+       0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a,
+       0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8,
+       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+       0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe,
+       0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xff,
+       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0x04,
+       0xf0, 0x74, 0x05, 0xa2, 0xee, 0x01, 0x8a, 0x18,
+       0xf4, 0x95, 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d,
+       0x8a, 0x1a, 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e,
+       0x8a, 0x19, 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16,
+       0x8a, 0x15, 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12,
+       0x8a, 0x11, 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c,
+       0x8a, 0x0b, 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08,
+       0xf4, 0xeb, 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x38,
+       0x00, 0x00, 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00,
+       0xe8, 0x01, 0x4e, 0x00, 0xfb, 0x80, 0x17, 0xd6,
+       0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x2a, 0x5b,
+       0x76, 0x00, 0x2a, 0x8f, 0xf9, 0x80, 0x16, 0xaa,
+       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x5c,
+       0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x6f,
+       0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1a,
+       0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1a,
+       0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1b,
+       0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1b,
+       0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95,
+       0x13, 0x02, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d,
+       0x06, 0x6a, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a,
+       0xf4, 0x95, 0xf0, 0x72, 0x06, 0x69, 0x1c, 0x91,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11,
+       0x12, 0x03, 0x11, 0x02, 0xf8, 0x45, 0x06, 0x79,
+       0xf0, 0x10, 0x00, 0x01, 0x88, 0x1a, 0xf4, 0x95,
+       0xf0, 0x72, 0x06, 0x78, 0x81, 0x91, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02,
+       0x00, 0x11, 0x11, 0x03, 0x61, 0xf8, 0x00, 0x11,
+       0x00, 0x01, 0xf8, 0x30, 0x06, 0x91, 0xf6, 0xb8,
+       0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11,
+       0xf3, 0xe8, 0xe8, 0xff, 0x18, 0x81, 0xf1, 0xa0,
+       0x81, 0x81, 0xf0, 0x73, 0x06, 0x9d, 0xf6, 0xb8,
+       0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11,
+       0xf3, 0x30, 0x00, 0xff, 0xf0, 0x20, 0xff, 0x00,
+       0x18, 0x81, 0xf1, 0xa0, 0x81, 0x81, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x11, 0x02,
+       0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20,
+       0x06, 0xb1, 0x49, 0x0b, 0xf6, 0x1f, 0x88, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf2, 0x73,
+       0x06, 0xb8, 0xf0, 0x30, 0x00, 0xff, 0x49, 0x0b,
+       0xf6, 0x1f, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95,
+       0x12, 0x81, 0xf4, 0x78, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x12,
+       0x13, 0x03, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d,
+       0x06, 0xcc, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a,
+       0xf4, 0x95, 0xf0, 0x72, 0x06, 0xcb, 0x11, 0x92,
+       0xf2, 0xc0, 0x81, 0x91, 0x8a, 0x11, 0xfc, 0x00,
+       0x88, 0x12, 0x12, 0x02, 0x71, 0x01, 0x00, 0x13,
+       0xf8, 0x45, 0x06, 0xdb, 0xf0, 0x10, 0x00, 0x01,
+       0x88, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xda,
+       0xe5, 0x98, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+       0x88, 0x11, 0x11, 0x04, 0x10, 0x06, 0x71, 0x05,
+       0x00, 0x12, 0x61, 0xf8, 0x00, 0x12, 0x00, 0x01,
+       0xf8, 0x20, 0x06, 0xea, 0xf0, 0x00, 0x00, 0x01,
+       0xf6, 0xb8, 0xf0, 0x00, 0x00, 0x01, 0x6f, 0xf8,
+       0x00, 0x12, 0x0f, 0x1f, 0x48, 0x08, 0x81, 0x00,
+       0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xba,
+       0xf4, 0x95, 0x48, 0x11, 0xee, 0x02, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x88, 0x12,
+       0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 0x00, 0x13,
+       0x61, 0xf8, 0x00, 0x13, 0x00, 0x01, 0xf8, 0x20,
+       0x07, 0x09, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00,
+       0x00, 0x01, 0x88, 0x11, 0xf6, 0xb8, 0x6f, 0xf8,
+       0x00, 0x13, 0x0f, 0x1f, 0x81, 0x00, 0x48, 0x11,
+       0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xce,
+       0xf4, 0x95, 0x48, 0x12, 0x48, 0x11, 0xf0, 0x30,
+       0xff, 0xfe, 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xfc,
+       0xf4, 0x95, 0x80, 0x02, 0x71, 0x08, 0x00, 0x16,
+       0x10, 0x09, 0x71, 0x0b, 0x00, 0x17, 0x80, 0x03,
+       0x71, 0x0a, 0x00, 0x11, 0x48, 0x17, 0xf8, 0x45,
+       0x07, 0x3f, 0x70, 0x00, 0x00, 0x11, 0x10, 0x03,
+       0xf0, 0x74, 0x06, 0x9f, 0x80, 0x01, 0x70, 0x00,
+       0x00, 0x16, 0x10, 0x02, 0xf0, 0x74, 0x06, 0x7b,
+       0x6d, 0x91, 0x6d, 0x96, 0x6c, 0xef, 0xff, 0xff,
+       0x07, 0x2f, 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+       0x10, 0xf8, 0x2a, 0xe8, 0x08, 0xf8, 0x2a, 0xe9,
+       0xf8, 0x45, 0x07, 0x64, 0x76, 0x00, 0x00, 0x01,
+       0x62, 0xf8, 0x2a, 0xe9, 0x00, 0x5e, 0xf2, 0x74,
+       0x12, 0x0b, 0xf0, 0x00, 0x30, 0x40, 0x72, 0x11,
+       0x2a, 0xe9, 0x77, 0x10, 0x00, 0x0f, 0xf5, 0xa9,
+       0xf8, 0x20, 0x07, 0x61, 0x6b, 0xf8, 0x2a, 0xe9,
+       0x00, 0x01, 0xf0, 0x73, 0x07, 0x64, 0x76, 0xf8,
+       0x2a, 0xe9, 0x00, 0x00, 0xee, 0x02, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xe8, 0x00,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x08, 0xe8, 0x00,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x09, 0xf6, 0xb8,
+       0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 0x75, 0xf8,
+       0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 0x0c, 0x30,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 0x76, 0xf8,
+       0x2a, 0xe8, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xe9,
+       0x00, 0x00, 0x6c, 0x81, 0x07, 0x92, 0x76, 0xf8,
+       0x2a, 0xea, 0x00, 0x00, 0xfb, 0x80, 0x16, 0x76,
+       0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 0x75, 0xf8,
+       0x00, 0x08, 0x00, 0x00, 0xf0, 0x73, 0x07, 0xa8,
+       0x76, 0xf8, 0x2a, 0xea, 0x00, 0x01, 0xfb, 0x80,
+       0x16, 0x66, 0xf4, 0x95, 0xe8, 0x10, 0xfb, 0x80,
+       0x16, 0x87, 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0xf6, 0xb8,
+       0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 0x75, 0xf8,
+       0x00, 0x08, 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00,
+       0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a,
+       0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
+       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+       0x10, 0xf8, 0x2a, 0xea, 0xf8, 0x45, 0x07, 0xe1,
+       0x10, 0xf8, 0x2a, 0xe8, 0xf0, 0x00, 0x00, 0x01,
+       0xf0, 0x30, 0x00, 0x0f, 0x80, 0xf8, 0x2a, 0xe8,
+       0x10, 0xf8, 0x2a, 0xe8, 0xf8, 0x44, 0x07, 0xd6,
+       0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20,
+       0x0c, 0x30, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c,
+       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00,
+       0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x8a, 0x1d,
+       0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0a, 0x8a, 0x09,
+       0x8a, 0x08, 0xf4, 0xeb, 0xee, 0xff, 0xf2, 0x74,
+       0x07, 0x67, 0xf4, 0x95, 0xe8, 0x01, 0xee, 0x01,
+       0xfc, 0x00, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
+       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+       0x8a, 0x1d, 0x8a, 0x07, 0xf4, 0xeb, 0x4a, 0x11,
+       0x77, 0x11, 0x00, 0x28, 0x76, 0x81, 0x24, 0x00,
+       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+       0xf2, 0x74, 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x00,
+       0x77, 0x11, 0x00, 0x1d, 0x68, 0x81, 0x00, 0x7f,
+       0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0x80,
+       0x77, 0x11, 0x00, 0x1d, 0xf0, 0x30, 0x01, 0x00,
+       0x1a, 0x81, 0x80, 0x81, 0xf0, 0x74, 0x0a, 0x33,
+       0xf0, 0x74, 0x11, 0xac, 0xf9, 0x80, 0x13, 0x25,
+       0xf9, 0x80, 0x16, 0x53, 0xf9, 0x80, 0x17, 0x82,
+       0xf0, 0x74, 0x06, 0x2f, 0xf9, 0x80, 0x14, 0xb2,
+       0xf9, 0x80, 0x19, 0x10, 0xf0, 0x74, 0x0d, 0xe3,
+       0xf0, 0x74, 0x07, 0xe8, 0xf0, 0x74, 0x02, 0x36,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x60, 0xf8,
+       0x27, 0x7b, 0xff, 0xff, 0xf8, 0x30, 0x08, 0x39,
+       0x71, 0xf8, 0x27, 0x7b, 0x27, 0x79, 0x60, 0xf8,
+       0x27, 0x79, 0xff, 0xff, 0xf8, 0x30, 0x08, 0xb2,
+       0x10, 0xf8, 0x29, 0x86, 0x08, 0xf8, 0x27, 0x79,
+       0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 0xf4, 0x95,
+       0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x30,
+       0x08, 0x58, 0x10, 0xf8, 0x27, 0x79, 0x08, 0xf8,
+       0x27, 0x7a, 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11,
+       0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
+       0xf8, 0x20, 0x08, 0x63, 0x76, 0xf8, 0x27, 0x79,
+       0xff, 0xff, 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff,
+       0xf7, 0xb8, 0xf2, 0x73, 0x08, 0xd9, 0xf0, 0x20,
+       0xff, 0xff, 0xf6, 0xb8, 0x56, 0xf8, 0x27, 0x74,
+       0xf0, 0xf9, 0x88, 0x11, 0x56, 0xf8, 0x27, 0x72,
+       0xf0, 0xf9, 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95,
+       0xe7, 0x20, 0xf4, 0xa9, 0xf8, 0x30, 0x08, 0x8f,
+       0xf1, 0x20, 0x27, 0x7c, 0x48, 0x11, 0xf6, 0x00,
+       0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x83,
+       0x08, 0xf8, 0x27, 0x79, 0xf0, 0x30, 0x7f, 0xff,
+       0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00,
+       0xf5, 0xab, 0xf8, 0x30, 0x08, 0x8f, 0x6d, 0x91,
+       0x48, 0x11, 0xf0, 0x30, 0x01, 0xff, 0x88, 0x11,
+       0xf4, 0x95, 0xe7, 0x20, 0xf7, 0xa9, 0xf8, 0x30,
+       0x08, 0x74, 0x6d, 0x89, 0x48, 0x11, 0xf0, 0x30,
+       0x01, 0xff, 0xf0, 0xe7, 0xf4, 0x95, 0x48, 0x08,
+       0x4e, 0xf8, 0x27, 0x74, 0x48, 0x08, 0xf1, 0xf9,
+       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1,
+       0x27, 0x7c, 0x27, 0x7a, 0x60, 0xf8, 0x27, 0x7b,
+       0xff, 0xff, 0xf8, 0x30, 0x08, 0xab, 0x48, 0x08,
+       0x4e, 0xf8, 0x27, 0x72, 0x76, 0xf8, 0x27, 0x7b,
+       0xff, 0xff, 0x76, 0xf8, 0x27, 0x79, 0xff, 0xff,
+       0xf2, 0x73, 0x08, 0xd9, 0xf4, 0x95, 0xe8, 0x00,
+       0x44, 0xf8, 0x27, 0x73, 0x40, 0xf8, 0x27, 0x75,
+       0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10,
+       0x80, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xd8,
+       0xf6, 0xb8, 0x10, 0xf8, 0x27, 0x73, 0xf0, 0x00,
+       0x80, 0x00, 0x48, 0x08, 0x4e, 0xf8, 0x27, 0x74,
+       0x48, 0x08, 0xf0, 0xf9, 0x88, 0x11, 0xf4, 0x95,
+       0xf4, 0x95, 0x71, 0xe1, 0x27, 0x7c, 0x27, 0x7a,
+       0xf7, 0xb8, 0x57, 0xf8, 0x27, 0x74, 0xf0, 0x62,
+       0xff, 0xff, 0xf0, 0x40, 0xff, 0x80, 0xf2, 0x80,
+       0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfb,
+       0x11, 0xf8, 0x27, 0x71, 0x09, 0xf8, 0x27, 0x73,
+       0x89, 0x11, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95,
+       0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xed, 0xf2, 0x73,
+       0x09, 0x0e, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0x20,
+       0x76, 0x00, 0x00, 0x41, 0xf0, 0x74, 0x12, 0xee,
+       0x88, 0x16, 0xf4, 0x95, 0xf7, 0xb8, 0x6d, 0x96,
+       0x10, 0xf8, 0x00, 0x16, 0xf8, 0x47, 0x09, 0x0a,
+       0xe7, 0x61, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01,
+       0x00, 0x80, 0x76, 0x02, 0x00, 0xff, 0x76, 0x03,
+       0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95,
+       0xe8, 0x00, 0x6c, 0xe9, 0xff, 0xff, 0x08, 0xfb,
+       0x73, 0x16, 0x00, 0x0e, 0xf0, 0x66, 0x00, 0x41,
+       0xee, 0x05, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x13,
+       0xf6, 0xb8, 0x77, 0x11, 0x7f, 0xff, 0x57, 0xf8,
+       0x27, 0x72, 0x48, 0x11, 0xf2, 0x80, 0xf0, 0x00,
+       0x80, 0x00, 0x88, 0x11, 0xf6, 0x40, 0xf0, 0xe0,
+       0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 0x80, 0xf8,
+       0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x57, 0xf8,
+       0x27, 0x72, 0x48, 0x12, 0xf2, 0x80, 0x88, 0x12,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x09, 0x38,
+       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+       0xf0, 0x73, 0x09, 0x3d, 0xf0, 0x20, 0x80, 0x01,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x70, 0x81,
+       0x00, 0x13, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0xf0, 0x30, 0x7f, 0xff, 0x11, 0xf8, 0x29, 0x86,
+       0xf5, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11,
+       0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
+       0xf8, 0x20, 0x09, 0x54, 0xf2, 0x73, 0x09, 0x67,
+       0xf4, 0x95, 0xe8, 0x02, 0x6f, 0xf8, 0x27, 0x7a,
+       0x0d, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11,
+       0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9,
+       0xf8, 0x20, 0x09, 0x64, 0xf2, 0x73, 0x09, 0x67,
+       0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x27, 0x7b,
+       0xe8, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0x11, 0xf8, 0x29, 0x86, 0xf5, 0x20, 0xf3, 0x30,
+       0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10,
+       0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x7a,
+       0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x02,
+       0x6f, 0xf8, 0x27, 0x7a, 0x0d, 0x20, 0xf3, 0x30,
+       0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10,
+       0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x8a,
+       0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x01,
+       0x80, 0xf8, 0x27, 0x79, 0xe8, 0x00, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02,
+       0x00, 0x12, 0x88, 0x11, 0xf6, 0xb8, 0x57, 0xf8,
+       0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80,
+       0xf0, 0x00, 0x80, 0x00, 0x80, 0x81, 0x57, 0xf8,
+       0x27, 0x72, 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80,
+       0x80, 0xf8, 0x27, 0x78, 0x77, 0x11, 0x80, 0x00,
+       0x48, 0x11, 0x57, 0xf8, 0x27, 0x72, 0xf2, 0x80,
+       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81,
+       0x09, 0xb5, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
+       0x00, 0x01, 0xf0, 0x73, 0x09, 0xba, 0xf0, 0x20,
+       0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+       0x45, 0xf8, 0x27, 0x71, 0x43, 0xf8, 0x27, 0x73,
+       0x83, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0xe7, 0x20,
+       0xf6, 0xa9, 0xf8, 0x30, 0x09, 0xc9, 0xf2, 0x73,
+       0x09, 0xe4, 0x77, 0x12, 0x00, 0x00, 0x57, 0xf8,
+       0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80,
+       0x49, 0x12, 0xf5, 0x00, 0xf3, 0x00, 0x80, 0x00,
+       0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0xf8, 0x30,
+       0x09, 0xdc, 0xf1, 0x20, 0x80, 0x00, 0xf5, 0x20,
+       0x89, 0x12, 0xf4, 0x95, 0x48, 0x12, 0x6f, 0xf8,
+       0x27, 0x73, 0x0d, 0x00, 0xf4, 0x95, 0x49, 0x0b,
+       0x4f, 0xf8, 0x27, 0x72, 0x8a, 0x11, 0xfe, 0x00,
+       0x48, 0x12, 0xf4, 0x95, 0x4a, 0x11, 0x4a, 0x16,
+       0x4a, 0x17, 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x08,
+       0x00, 0x16, 0x88, 0x17, 0xf0, 0x74, 0x08, 0x30,
+       0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74,
+       0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0a, 0x0a,
+       0xf2, 0x74, 0x08, 0xdb, 0xf4, 0x95, 0x48, 0x16,
+       0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74,
+       0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11,
+       0x10, 0x02, 0x70, 0x01, 0x00, 0x11, 0x80, 0x00,
+       0xf2, 0x74, 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17,
+       0x49, 0x11, 0x48, 0x17, 0xf6, 0x00, 0x88, 0x17,
+       0xe7, 0x60, 0xf5, 0xa9, 0xf8, 0x20, 0x0a, 0x2d,
+       0x48, 0x16, 0xf6, 0x20, 0x88, 0x11, 0x48, 0x18,
+       0x70, 0x00, 0x00, 0x11, 0xf2, 0x74, 0x09, 0x8f,
+       0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 0x70, 0x01,
+       0x00, 0x11, 0x10, 0x02, 0x80, 0x00, 0xf2, 0x74,
+       0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 0xee, 0x04,
+       0x48, 0x16, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11,
+       0xfc, 0x00, 0xee, 0xfd, 0xe8, 0x00, 0x4e, 0xf8,
+       0x27, 0x70, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x72,
+       0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00,
+       0x4e, 0xf8, 0x27, 0x76, 0x76, 0xf8, 0x27, 0x79,
+       0xff, 0xff, 0x76, 0xf8, 0x27, 0x7a, 0x00, 0x00,
+       0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 0x76, 0xf8,
+       0x27, 0x78, 0x00, 0x00, 0xe8, 0x00, 0x75, 0xf8,
+       0x00, 0x08, 0x00, 0x01, 0x76, 0x00, 0x00, 0x00,
+       0x76, 0x01, 0x02, 0x00, 0xf2, 0x74, 0x12, 0xdc,
+       0xf0, 0x20, 0x27, 0x7c, 0xee, 0x03, 0xfc, 0x00,
+       0x4a, 0x11, 0xee, 0xfc, 0xf4, 0x95, 0x4e, 0x00,
+       0x77, 0x12, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x12,
+       0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x12,
+       0xf0, 0xe0, 0xf1, 0xf1, 0x4f, 0x02, 0xe9, 0x01,
+       0xf4, 0x95, 0x48, 0x0b, 0xf5, 0x40, 0x56, 0x02,
+       0xf1, 0x80, 0x81, 0xf8, 0x27, 0x78, 0x77, 0x11,
+       0x80, 0x00, 0x56, 0x00, 0x49, 0x11, 0xf1, 0x80,
+       0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81,
+       0x0a, 0x81, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
+       0x00, 0x01, 0xf0, 0x73, 0x0a, 0x86, 0xf0, 0x20,
+       0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+       0x10, 0x82, 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0xee, 0xfe, 0xf4, 0x95, 0x4e, 0x00,
+       0x77, 0x11, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x11,
+       0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x11,
+       0xf0, 0xe0, 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80,
+       0x80, 0xf8, 0x27, 0x78, 0x56, 0x00, 0xf1, 0x20,
+       0x80, 0x00, 0xf1, 0x80, 0xf4, 0x95, 0x49, 0x0b,
+       0xf8, 0x4d, 0x0a, 0xab, 0xf0, 0x20, 0x80, 0x01,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf0, 0x73,
+       0x0a, 0xaf, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08,
+       0x00, 0x01, 0xee, 0x02, 0x48, 0x11, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0x88, 0x12, 0x13, 0x02,
+       0x77, 0x11, 0x00, 0x00, 0xf8, 0x4d, 0x0a, 0xcb,
+       0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 0xf4, 0x95,
+       0xf0, 0x72, 0x0a, 0xca, 0x48, 0x11, 0x1c, 0xf8,
+       0x29, 0x7e, 0x88, 0x11, 0x11, 0xf8, 0x29, 0x7e,
+       0xf2, 0x00, 0x00, 0x01, 0x80, 0xf8, 0x29, 0x7e,
+       0x81, 0x92, 0x48, 0x11, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x11,
+       0x88, 0x12, 0xf6, 0xb8, 0xf0, 0x20, 0x7f, 0xff,
+       0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0xf0, 0x00,
+       0x80, 0x00, 0x80, 0x82, 0x57, 0xf8, 0x27, 0x70,
+       0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 0x80, 0xf8,
+       0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x48, 0x12,
+       0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0x88, 0x12,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x0a, 0xf4,
+       0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01,
+       0xf0, 0x73, 0x0a, 0xf9, 0xf0, 0x20, 0x80, 0x01,
+       0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x45, 0xf8,
+       0x27, 0x75, 0xe7, 0x10, 0x43, 0xf8, 0x27, 0x71,
+       0x83, 0xf8, 0x00, 0x12, 0x6d, 0xe8, 0x00, 0x04,
+       0x6d, 0x8a, 0xf6, 0xaa, 0xf8, 0x30, 0x0b, 0x0a,
+       0xf2, 0x73, 0x0b, 0x25, 0x77, 0x11, 0x00, 0x00,
+       0x57, 0xf8, 0x27, 0x70, 0xf0, 0x20, 0x7f, 0xff,
+       0xf2, 0x80, 0x49, 0x11, 0xf5, 0x00, 0xf3, 0x00,
+       0x80, 0x00, 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00,
+       0xf8, 0x30, 0x0b, 0x1d, 0xf1, 0x20, 0x80, 0x00,
+       0xf5, 0x20, 0x89, 0x11, 0xf4, 0x95, 0x48, 0x11,
+       0x6f, 0xf8, 0x27, 0x71, 0x0d, 0x00, 0xf4, 0x95,
+       0x49, 0x0b, 0x4f, 0xf8, 0x27, 0x70, 0x48, 0x11,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
+       0x4a, 0x17, 0xee, 0xf0, 0x88, 0x17, 0x10, 0x17,
+       0x80, 0x05, 0x10, 0x16, 0x80, 0x06, 0x10, 0x15,
+       0x80, 0x07, 0x71, 0x14, 0x00, 0x11, 0x10, 0x05,
+       0xf0, 0x30, 0x00, 0x01, 0x88, 0x10, 0x10, 0x06,
+       0xf0, 0x30, 0x00, 0x01, 0x80, 0x08, 0x49, 0x11,
+       0x10, 0x05, 0xf6, 0x01, 0x80, 0x09, 0x10, 0x06,
+       0x61, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf8, 0x20,
+       0x0b, 0x4b, 0x10, 0x09, 0xf0, 0x00, 0x00, 0x01,
+       0x80, 0x09, 0x71, 0x08, 0x00, 0x12, 0xf4, 0xaa,
+       0xf8, 0x30, 0x0b, 0x54, 0x10, 0x09, 0xf0, 0x00,
+       0x00, 0x01, 0x80, 0x09, 0x12, 0x09, 0x49, 0x11,
+       0xf4, 0x7f, 0x80, 0x09, 0xf6, 0x20, 0x80, 0x0a,
+       0x56, 0xf8, 0x27, 0x70, 0x4e, 0x0c, 0x10, 0x09,
+       0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce,
+       0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 0xf4, 0x95,
+       0xf4, 0x95, 0x6c, 0x86, 0x0b, 0x6d, 0xf2, 0x73,
+       0x0c, 0x59, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0xb8,
+       0xf4, 0x95, 0x56, 0x0c, 0xf0, 0xf9, 0x88, 0x12,
+       0xf4, 0x95, 0xf4, 0x95, 0x70, 0xe2, 0x27, 0x7c,
+       0x29, 0x86, 0xe8, 0x00, 0x80, 0x0e, 0x48, 0x11,
+       0xf8, 0x45, 0x0b, 0xcc, 0x77, 0x10, 0x00, 0x01,
+       0xf4, 0xa9, 0xf8, 0x30, 0x0b, 0x89, 0x6c, 0xe1,
+       0xff, 0xfd, 0x0b, 0x8b, 0x10, 0xe7, 0x00, 0x02,
+       0x80, 0x0e, 0xf0, 0x73, 0x0b, 0x8b, 0x10, 0x87,
+       0x80, 0x0e, 0xe7, 0x10, 0xf5, 0xae, 0xf8, 0x20,
+       0x0b, 0xb2, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01,
+       0x00, 0x16, 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce,
+       0x48, 0x17, 0x49, 0x16, 0xf6, 0x00, 0x88, 0x17,
+       0x48, 0x11, 0xf6, 0x20, 0x88, 0x11, 0x10, 0x09,
+       0xf6, 0x20, 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74,
+       0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16,
+       0x10, 0x04, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01,
+       0x00, 0x11, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11,
+       0x00, 0x04, 0x80, 0x04, 0xf0, 0x73, 0x0b, 0xbc,
+       0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 0x00, 0x11,
+       0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11,
+       0x00, 0x04, 0x80, 0x04, 0x49, 0x11, 0x48, 0x16,
+       0xf6, 0x20, 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95,
+       0x6c, 0x86, 0x0b, 0xcc, 0x10, 0x0a, 0x80, 0x00,
+       0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00,
+       0x00, 0x04, 0x88, 0x16, 0x12, 0x0a, 0xf8, 0x45,
+       0x0c, 0x33, 0x71, 0x0a, 0x00, 0x10, 0xf4, 0xae,
+       0xf8, 0x30, 0x0c, 0x1c, 0x48, 0x16, 0xf0, 0xe1,
+       0x88, 0x11, 0x12, 0x08, 0xf8, 0x45, 0x0b, 0xdb,
+       0x6d, 0x89, 0x12, 0x07, 0xf8, 0x45, 0x0b, 0xe9,
+       0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11,
+       0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74,
+       0x06, 0xdc, 0xf0, 0x73, 0x0b, 0xef, 0x48, 0x11,
+       0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74,
+       0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e,
+       0x10, 0x06, 0x49, 0x11, 0xf6, 0x00, 0x80, 0x06,
+       0x10, 0x05, 0xf6, 0x20, 0x88, 0x11, 0xf0, 0x00,
+       0x00, 0x01, 0x48, 0x08, 0x6f, 0x00, 0x0c, 0x9f,
+       0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00,
+       0x00, 0x04, 0x12, 0x07, 0xf8, 0x45, 0x0c, 0x11,
+       0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11,
+       0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74,
+       0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x17, 0x48, 0x11,
+       0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74,
+       0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e,
+       0xf0, 0x73, 0x0c, 0x33, 0x12, 0x07, 0xf8, 0x45,
+       0x0c, 0x2a, 0x10, 0x07, 0x80, 0x00, 0x10, 0x06,
+       0x80, 0x01, 0x10, 0x05, 0x80, 0x02, 0x10, 0x04,
+       0xf0, 0x74, 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x30,
+       0x12, 0x05, 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04,
+       0xf0, 0x74, 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0,
+       0x81, 0x0e, 0x76, 0x00, 0x00, 0x01, 0x48, 0x18,
+       0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04,
+       0x71, 0x04, 0x00, 0x11, 0x70, 0x81, 0x29, 0x86,
+       0x10, 0x0e, 0x1c, 0xf8, 0x29, 0x86, 0x80, 0x0e,
+       0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 0xf2, 0x74,
+       0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x10, 0x0e,
+       0x71, 0x04, 0x00, 0x11, 0x80, 0x81, 0x10, 0xf8,
+       0x29, 0x86, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x30,
+       0x7f, 0xff, 0x80, 0xf8, 0x29, 0x86, 0x10, 0x09,
+       0xf0, 0x00, 0x00, 0x02, 0x80, 0x09, 0xee, 0x10,
+       0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
+       0x10, 0xf8, 0x27, 0x75, 0x08, 0xf8, 0x27, 0x71,
+       0xf0, 0x10, 0x00, 0x01, 0x48, 0x08, 0xfc, 0x00,
+       0x4a, 0x11, 0x4a, 0x16, 0xee, 0xff, 0xf4, 0x95,
+       0x71, 0x04, 0x00, 0x16, 0xf0, 0x00, 0x00, 0x01,
+       0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 0x6d, 0xee,
+       0xff, 0xfd, 0x48, 0x16, 0xf8, 0x45, 0x0c, 0x99,
+       0x56, 0xf8, 0x29, 0x7c, 0xf0, 0x74, 0x0a, 0x5a,
+       0x88, 0x11, 0x10, 0xf8, 0x29, 0x7d, 0xf0, 0x00,
+       0x00, 0x01, 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c,
+       0x10, 0xf8, 0x29, 0x82, 0xf0, 0x00, 0x00, 0x01,
+       0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xa9,
+       0xfa, 0x30, 0x0c, 0x96, 0x80, 0xf8, 0x29, 0x82,
+       0x56, 0xf8, 0x29, 0x80, 0xf0, 0x00, 0x00, 0x01,
+       0x4e, 0xf8, 0x29, 0x80, 0x73, 0x11, 0x29, 0x82,
+       0x6c, 0xee, 0xff, 0xff, 0x0c, 0x76, 0xee, 0x01,
+       0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0x76, 0xf8, 0x29, 0x84, 0x00, 0x00, 0x76, 0xf8,
+       0x29, 0x85, 0x00, 0x01, 0xe8, 0x00, 0x4e, 0xf8,
+       0x2a, 0x0c, 0x76, 0xf8, 0x29, 0x86, 0x00, 0x00,
+       0x76, 0xf8, 0x29, 0x87, 0x00, 0x00, 0x77, 0x11,
+       0x29, 0x88, 0x76, 0x81, 0xaa, 0xaa, 0x76, 0xe1,
+       0x00, 0x01, 0xaa, 0xaa, 0x76, 0xe1, 0x00, 0x02,
+       0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0xee, 0xfc, 0xf4, 0x95, 0x71, 0x06, 0x00, 0x14,
+       0x71, 0x07, 0x00, 0x13, 0x71, 0x08, 0x00, 0x12,
+       0x71, 0x09, 0x00, 0x15, 0x77, 0x10, 0x00, 0xff,
+       0xf4, 0xaa, 0xf8, 0x30, 0x0d, 0x44, 0x49, 0x13,
+       0x53, 0xf8, 0x2a, 0x0c, 0x4f, 0xf8, 0x2a, 0x0c,
+       0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d,
+       0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x01,
+       0x71, 0xe1, 0x24, 0x00, 0x00, 0x11, 0xf4, 0xa9,
+       0xf8, 0x30, 0x0d, 0x17, 0x77, 0x10, 0x00, 0x02,
+       0xf4, 0xa9, 0xf8, 0x30, 0x0c, 0xec, 0x77, 0x11,
+       0x29, 0x8a, 0x76, 0x81, 0x00, 0x00, 0xe8, 0x00,
+       0x77, 0x14, 0x00, 0x00, 0x77, 0x13, 0x00, 0x00,
+       0xf0, 0x73, 0x0d, 0x48, 0x6c, 0x83, 0x0c, 0xfa,
+       0x77, 0x11, 0x29, 0x8a, 0x48, 0x12, 0xf0, 0xe8,
+       0xf0, 0x40, 0x80, 0x00, 0x80, 0x81, 0xe8, 0x00,
+       0x77, 0x14, 0x00, 0x00, 0xf0, 0x73, 0x0d, 0x48,
+       0x49, 0x13, 0xf3, 0x40, 0x80, 0x00, 0x81, 0xf8,
+       0x29, 0x8a, 0x61, 0xf8, 0x00, 0x15, 0x00, 0x01,
+       0xf8, 0x20, 0x0d, 0x07, 0x69, 0xf8, 0x29, 0x8a,
+       0x40, 0x00, 0x61, 0xf8, 0x00, 0x14, 0x00, 0x01,
+       0xf8, 0x20, 0x0d, 0x0f, 0x69, 0xf8, 0x29, 0x8a,
+       0x20, 0x00, 0x77, 0x11, 0x29, 0x8a, 0x49, 0x12,
+       0xf3, 0xe8, 0x1b, 0x81, 0x81, 0x81, 0xf0, 0x73,
+       0x0d, 0x48, 0x11, 0xf8, 0x29, 0x84, 0xf8, 0x4c,
+       0x0d, 0x37, 0x77, 0x11, 0x29, 0x88, 0x76, 0x81,
+       0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 0xf3, 0x10,
+       0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 0x81, 0xe1,
+       0x00, 0x01, 0x76, 0x00, 0x00, 0x02, 0x80, 0x01,
+       0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 0x00, 0x13,
+       0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0x48, 0x11,
+       0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 0xf0, 0x73,
+       0x0d, 0x73, 0x76, 0x00, 0x00, 0x00, 0x80, 0x01,
+       0x76, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x13,
+       0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0xe8, 0x00,
+       0xf0, 0x73, 0x0d, 0x73, 0x77, 0x11, 0x29, 0x8a,
+       0x70, 0x81, 0x00, 0x13, 0x11, 0xf8, 0x29, 0x84,
+       0xf8, 0x4c, 0x0d, 0x68, 0x77, 0x11, 0x29, 0x88,
+       0x76, 0x81, 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85,
+       0xf3, 0x10, 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00,
+       0x81, 0xe1, 0x00, 0x01, 0x76, 0x00, 0x00, 0x03,
+       0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03,
+       0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95,
+       0x48, 0x11, 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84,
+       0xf0, 0x73, 0x0d, 0x73, 0x76, 0x00, 0x00, 0x01,
+       0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03,
+       0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95,
+       0x48, 0x11, 0x6b, 0xf8, 0x29, 0x84, 0xff, 0xff,
+       0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0xf5, 0x40, 0xf4, 0x95, 0x48, 0x0b, 0xf4, 0x78,
+       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe1,
+       0xff, 0xb9, 0x0d, 0x88, 0xf2, 0x73, 0x0d, 0xa5,
+       0xf4, 0x95, 0xe8, 0x60, 0xf2, 0x00, 0x00, 0x06,
+       0x61, 0xf8, 0x00, 0x11, 0x00, 0x20, 0xf8, 0x30,
+       0x0d, 0x98, 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01,
+       0xf8, 0x20, 0x0d, 0xa3, 0xf2, 0x00, 0x00, 0x07,
+       0xf0, 0x73, 0x0d, 0xa3, 0x61, 0xf8, 0x00, 0x0b,
+       0x00, 0x01, 0xf8, 0x20, 0x0d, 0xa1, 0xf2, 0x73,
+       0x0d, 0xa3, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00,
+       0x00, 0x02, 0x48, 0x08, 0xf4, 0x7f, 0x8a, 0x11,
+       0xfc, 0x00, 0xee, 0xff, 0xf0, 0x74, 0x07, 0xfd,
+       0xf0, 0x74, 0x07, 0x44, 0xf0, 0x74, 0x0d, 0xb4,
+       0xf0, 0x74, 0x02, 0x05, 0xf0, 0x74, 0x04, 0x60,
+       0xf0, 0x73, 0x0d, 0xaa, 0xee, 0xfd, 0x10, 0xf8,
+       0x2a, 0xa3, 0xf8, 0x44, 0x0d, 0xcb, 0x10, 0xf8,
+       0x2a, 0xa4, 0xf8, 0x45, 0x0d, 0xd7, 0x76, 0x00,
+       0x02, 0x00, 0xf2, 0x74, 0x09, 0xe8, 0xf0, 0x20,
+       0x22, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00,
+       0x76, 0xf8, 0x2a, 0xa7, 0x00, 0x00, 0xf0, 0x73,
+       0x0d, 0xd7, 0x76, 0x00, 0x02, 0x00, 0xf2, 0x74,
+       0x09, 0xe8, 0xf0, 0x20, 0x20, 0x00, 0x76, 0xf8,
+       0x2a, 0xa3, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa7,
+       0x00, 0x01, 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0,
+       0xf0, 0x10, 0x3a, 0x98, 0xf8, 0x47, 0x0d, 0xe1,
+       0x76, 0xf8, 0x27, 0x6e, 0x00, 0x00, 0xee, 0x03,
+       0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x77, 0x11,
+       0x20, 0x00, 0x76, 0x00, 0xaa, 0xaa, 0x76, 0x01,
+       0x02, 0x00, 0xf2, 0x74, 0x06, 0x6c, 0xf4, 0x95,
+       0x48, 0x11, 0x76, 0x00, 0x55, 0x55, 0x76, 0x01,
+       0x02, 0x00, 0x48, 0x11, 0xf2, 0x74, 0x06, 0x6c,
+       0xf0, 0x00, 0x02, 0x00, 0x76, 0xf8, 0x2a, 0xa3,
+       0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00,
+       0xe8, 0x00, 0x4e, 0x00, 0xfb, 0x80, 0x15, 0x3e,
+       0xf4, 0x95, 0xe8, 0x04, 0x80, 0xf8, 0x2a, 0xa5,
+       0x76, 0x00, 0x2a, 0xa8, 0xf9, 0x80, 0x14, 0x87,
+       0x76, 0x00, 0x2a, 0xad, 0xfb, 0x80, 0x13, 0x62,
+       0xf4, 0x95, 0xe8, 0x02, 0x10, 0xf8, 0x2a, 0xa5,
+       0xf9, 0x80, 0x14, 0x63, 0xfb, 0x80, 0x16, 0x66,
+       0xf4, 0x95, 0xe8, 0x1c, 0xfb, 0x80, 0x16, 0x87,
+       0xf4, 0x95, 0xe8, 0x1c, 0xe8, 0x01, 0x4e, 0x00,
+       0xfb, 0x80, 0x17, 0xd6, 0xf4, 0x95, 0xe8, 0x00,
+       0x80, 0xf8, 0x2a, 0xa6, 0x76, 0x00, 0x2a, 0xb7,
+       0xf9, 0x80, 0x16, 0xaa, 0x10, 0xf8, 0x2a, 0xa6,
+       0xf9, 0x80, 0x17, 0x5c, 0x10, 0xf8, 0x2a, 0xa6,
+       0xf9, 0x80, 0x17, 0x6f, 0xee, 0x02, 0x8a, 0x11,
+       0xfc, 0x00, 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09,
+       0x4a, 0x0a, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8,
+       0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07,
+       0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc,
+       0x10, 0xf8, 0x2a, 0xa7, 0xf8, 0x44, 0x0e, 0x4b,
+       0x76, 0xf8, 0x2a, 0xa3, 0x00, 0x01, 0xf0, 0x73,
+       0x0e, 0x4e, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x01,
+       0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x0a, 0x8a, 0x09,
+       0x8a, 0x08, 0xf4, 0xeb, 0x4a, 0x11, 0x4a, 0x16,
+       0x4a, 0x17, 0xee, 0xfe, 0x88, 0x0e, 0x71, 0x08,
+       0x00, 0x16, 0x71, 0x06, 0x00, 0x17, 0x11, 0x07,
+       0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 0x25, 0xa0,
+       0x88, 0x11, 0x76, 0x01, 0x00, 0x06, 0x81, 0x00,
+       0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 0x00, 0x01,
+       0x76, 0x01, 0x00, 0x06, 0x70, 0x00, 0x00, 0x16,
+       0x48, 0x11, 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00,
+       0x00, 0x07, 0x70, 0x81, 0x00, 0x17, 0xee, 0x02,
+       0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00,
+       0x4a, 0x11, 0x88, 0x0e, 0x71, 0x02, 0x00, 0x12,
+       0x11, 0x03, 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00,
+       0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x70, 0x81,
+       0x00, 0x12, 0x6e, 0xe2, 0xff, 0xfe, 0x0e, 0x8d,
+       0xf4, 0x95, 0xe8, 0x00, 0xe8, 0x01, 0x80, 0xe1,
+       0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff,
+       0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0c,
+       0x00, 0x00, 0x81, 0xe1, 0x00, 0x01, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 0x88, 0x0e,
+       0xf4, 0x95, 0xf1, 0x66, 0x00, 0x0d, 0xf3, 0x00,
+       0x24, 0x00, 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95,
+       0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+       0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01,
+       0x00, 0x00, 0x80, 0x02, 0x76, 0x03, 0x00, 0x00,
+       0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0xe8, 0x00,
+       0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0x88, 0x19, 0xf4, 0x95, 0x73, 0x19, 0x00, 0x0e,
+       0xf1, 0x66, 0x00, 0x0d, 0xf2, 0x00, 0x24, 0x00,
+       0x77, 0x15, 0x25, 0xa0, 0x77, 0x14, 0x00, 0x00,
+       0x77, 0x1a, 0x00, 0x1f, 0xf0, 0x72, 0x0f, 0x14,
+       0xf6, 0xb8, 0x49, 0x19, 0x09, 0x85, 0xf8, 0x4c,
+       0x0f, 0x13, 0xf1, 0x00, 0x00, 0x05, 0x89, 0x11,
+       0x49, 0x15, 0xf3, 0x00, 0x00, 0x01, 0x89, 0x13,
+       0x49, 0x15, 0xf3, 0x00, 0x00, 0x07, 0x89, 0x12,
+       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13,
+       0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0f, 0x13,
+       0x6d, 0x94, 0x6d, 0xed, 0x00, 0x0d, 0x48, 0x14,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
+       0x4a, 0x17, 0xee, 0xf8, 0x88, 0x17, 0x10, 0x0d,
+       0x80, 0x04, 0x10, 0x0c, 0x80, 0x05, 0x71, 0x0e,
+       0x00, 0x16, 0x73, 0x17, 0x00, 0x0e, 0xf0, 0x66,
+       0x00, 0x0d, 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11,
+       0x10, 0xf8, 0x27, 0x63, 0xf8, 0x45, 0x0f, 0x32,
+       0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
+       0x10, 0xf8, 0x27, 0x60, 0xf8, 0x44, 0x0f, 0x3d,
+       0x60, 0xe1, 0x00, 0x02, 0x00, 0x01, 0xf8, 0x20,
+       0x0f, 0x6d, 0xf0, 0x73, 0x11, 0x33, 0x10, 0x04,
+       0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f,
+       0x11, 0x04, 0xf3, 0x00, 0x00, 0x01, 0x81, 0x04,
+       0x6d, 0x8e, 0x77, 0x10, 0x00, 0x01, 0x71, 0xe1,
+       0x00, 0x02, 0x00, 0x12, 0xf4, 0xaa, 0xf8, 0x30,
+       0x0f, 0x62, 0x77, 0x10, 0x00, 0x02, 0xf4, 0xaa,
+       0xf8, 0x30, 0x0f, 0x6d, 0x45, 0xe1, 0x00, 0x0b,
+       0x88, 0x10, 0x43, 0xe1, 0x00, 0x0c, 0x83, 0xf8,
+       0x00, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xaa,
+       0xf8, 0x30, 0x0f, 0x6d, 0xf0, 0x73, 0x0f, 0x96,
+       0xf5, 0x00, 0x81, 0x04, 0x49, 0x16, 0xf5, 0x20,
+       0x89, 0x16, 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x48, 0x16,
+       0xf8, 0x45, 0x11, 0x33, 0xf7, 0xb8, 0x71, 0xe1,
+       0x00, 0x02, 0x00, 0x12, 0x10, 0xf8, 0x00, 0x12,
+       0xf0, 0x10, 0x00, 0x03, 0xf8, 0x46, 0x0f, 0x8c,
+       0x10, 0xf8, 0x00, 0x12, 0xf0, 0x10, 0x00, 0x03,
+       0xf8, 0x45, 0x10, 0x16, 0x77, 0x10, 0x00, 0x01,
+       0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0x9c, 0x77, 0x10,
+       0x00, 0x02, 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0xa8,
+       0xf0, 0x73, 0x0f, 0x96, 0x77, 0x10, 0x00, 0x04,
+       0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xb7, 0x77, 0x10,
+       0x00, 0x05, 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xbc,
+       0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
+       0xf0, 0x73, 0x11, 0x31, 0x76, 0xe1, 0x00, 0x0c,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0x02, 0x00, 0x02, 0x11, 0xe1, 0x00, 0x0c,
+       0xe8, 0x03, 0xf6, 0x20, 0x89, 0x12, 0xf4, 0x95,
+       0x77, 0x10, 0x00, 0x03, 0xf5, 0xaa, 0xf8, 0x30,
+       0x0f, 0xb6, 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01,
+       0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf5, 0xae,
+       0xf8, 0x20, 0x0f, 0xbd, 0x48, 0x16, 0x80, 0x06,
+       0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x03,
+       0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xc8, 0x6b, 0xf8,
+       0x27, 0x6f, 0x00, 0x01, 0x12, 0x06, 0xf8, 0x45,
+       0x10, 0x00, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00,
+       0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02,
+       0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74,
+       0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06,
+       0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04,
+       0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
+       0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04,
+       0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20,
+       0x88, 0x16, 0x89, 0x13, 0xf4, 0x95, 0x77, 0x10,
+       0x00, 0x03, 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xf5,
+       0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 0x77, 0x10,
+       0x00, 0x0c, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13,
+       0xf6, 0xab, 0xf8, 0x20, 0x10, 0x00, 0x6b, 0xf8,
+       0x27, 0x6f, 0x00, 0x01, 0x6c, 0xe2, 0xff, 0xfd,
+       0x11, 0x31, 0xf6, 0xb8, 0x6f, 0xe1, 0x00, 0x05,
+       0x0c, 0x48, 0x6f, 0xe1, 0x00, 0x06, 0x0c, 0x18,
+       0xf0, 0x30, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03,
+       0x80, 0xe1, 0x00, 0x0b, 0x76, 0xe1, 0x00, 0x02,
+       0x00, 0x03, 0x48, 0x16, 0xf8, 0x45, 0x11, 0x33,
+       0x71, 0xe1, 0x00, 0x0c, 0x00, 0x12, 0x10, 0xe1,
+       0x00, 0x0b, 0x49, 0x12, 0xf6, 0x20, 0x88, 0x13,
+       0xe8, 0x0c, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95,
+       0xf4, 0x95, 0xf5, 0xab, 0xf8, 0x20, 0x10, 0x27,
+       0x48, 0x13, 0x80, 0x06, 0x88, 0x10, 0xf4, 0x95,
+       0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0x30,
+       0x70, 0x06, 0x00, 0x16, 0x12, 0x06, 0xf8, 0x45,
+       0x10, 0x5f, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00,
+       0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02,
+       0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74,
+       0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06,
+       0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04,
+       0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
+       0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04,
+       0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20,
+       0x88, 0x16, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x0c,
+       0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 0xf6, 0xab,
+       0xf8, 0x20, 0x10, 0x5f, 0x6b, 0xf8, 0x27, 0x6f,
+       0x00, 0x01, 0x77, 0x10, 0x00, 0x0c, 0xf6, 0xaa,
+       0xf8, 0x20, 0x10, 0x6b, 0xf2, 0x74, 0x0e, 0x9f,
+       0xf4, 0x95, 0x48, 0x17, 0x71, 0xe1, 0x00, 0x0c,
+       0x00, 0x12, 0x77, 0x10, 0x00, 0x0c, 0xf4, 0xaa,
+       0xf8, 0x30, 0x10, 0x7c, 0x77, 0x10, 0x00, 0x0c,
+       0x71, 0xe1, 0x00, 0x0b, 0x00, 0x13, 0xf6, 0xab,
+       0xf8, 0x30, 0x10, 0xb4, 0xe7, 0x30, 0xf7, 0xaa,
+       0xf8, 0x30, 0x10, 0xb4, 0xf2, 0x74, 0x0e, 0xc1,
+       0xf4, 0x95, 0x48, 0x17, 0x88, 0x12, 0xf4, 0x95,
+       0xf4, 0x95, 0x6c, 0x82, 0x10, 0x8d, 0x76, 0xe1,
+       0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+       0x00, 0x05, 0xf0, 0x73, 0x10, 0xb4, 0x76, 0xe1,
+       0x00, 0x02, 0x00, 0x04, 0x77, 0x10, 0x00, 0x0c,
+       0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf5, 0xaa,
+       0xf8, 0x20, 0x10, 0x9a, 0xf0, 0x73, 0x10, 0x9c,
+       0x77, 0x12, 0x00, 0x0c, 0x76, 0x00, 0x00, 0x00,
+       0x70, 0x01, 0x00, 0x12, 0x70, 0x02, 0x00, 0x17,
+       0x76, 0x03, 0x00, 0x01, 0x48, 0x11, 0xf2, 0x74,
+       0x0c, 0xb9, 0xf0, 0x00, 0x00, 0x05, 0x76, 0xe1,
+       0x00, 0x04, 0x00, 0x00, 0x77, 0x10, 0x00, 0x0c,
+       0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf6, 0xaa,
+       0xf8, 0x20, 0x11, 0x1c, 0x48, 0x16, 0xf8, 0x45,
+       0x11, 0x33, 0x60, 0xe1, 0x00, 0x02, 0x00, 0x05,
+       0xf8, 0x20, 0x10, 0xdf, 0x10, 0xe1, 0x00, 0x0b,
+       0x08, 0xe1, 0x00, 0x0c, 0x11, 0xe1, 0x00, 0x04,
+       0xf8, 0x4d, 0x10, 0xc7, 0x6b, 0xf8, 0x27, 0x6f,
+       0x00, 0x01, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95,
+       0xf5, 0xae, 0xf8, 0x20, 0x10, 0xcf, 0x48, 0x16,
+       0xf4, 0x95, 0x48, 0x08, 0xf8, 0x45, 0x11, 0x16,
+       0x6f, 0xe1, 0x00, 0x0c, 0x0d, 0x00, 0x81, 0xe1,
+       0x00, 0x0c, 0x11, 0x04, 0xf5, 0x00, 0x81, 0x04,
+       0x49, 0x16, 0xf5, 0x20, 0x89, 0x16, 0xf0, 0x73,
+       0x11, 0x0e, 0x10, 0xe1, 0x00, 0x0b, 0x71, 0xe1,
+       0x00, 0x0c, 0x00, 0x12, 0x88, 0x10, 0xf4, 0x95,
+       0xf4, 0x95, 0xf6, 0xaa, 0xf8, 0x30, 0x11, 0x16,
+       0x49, 0x12, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95,
+       0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xf3,
+       0x48, 0x16, 0x80, 0x06, 0x48, 0x08, 0xf8, 0x45,
+       0x11, 0x16, 0x10, 0x04, 0x70, 0x02, 0x00, 0x17,
+       0x80, 0x00, 0x76, 0x03, 0x00, 0x00, 0x10, 0x06,
+       0x80, 0x01, 0x10, 0x05, 0xf0, 0x74, 0x0c, 0xb9,
+       0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1,
+       0x00, 0x0c, 0x11, 0x06, 0x10, 0x04, 0xf6, 0x00,
+       0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 0x88, 0x16,
+       0x10, 0xe1, 0x00, 0x0c, 0x08, 0xe1, 0x00, 0x0b,
+       0xf8, 0x45, 0x11, 0x1c, 0xf0, 0x73, 0x11, 0x31,
+       0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17,
+       0xf0, 0x73, 0x11, 0x33, 0x76, 0xe1, 0x00, 0x0c,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x02, 0x00, 0x01, 0x10, 0x04,
+       0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f,
+       0x88, 0x12, 0xf4, 0x95, 0x77, 0x10, 0x00, 0xff,
+       0xf4, 0xaa, 0xf8, 0x30, 0x11, 0x33, 0x6c, 0x86,
+       0x0f, 0x70, 0xee, 0x08, 0x8a, 0x17, 0x8a, 0x16,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc,
+       0xf4, 0x95, 0x71, 0x06, 0x00, 0x12, 0x88, 0x11,
+       0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d,
+       0xf3, 0x00, 0x24, 0x00, 0x89, 0x14, 0x13, 0x81,
+       0xf7, 0x7a, 0xf3, 0x30, 0x00, 0x01, 0x81, 0xf8,
+       0x27, 0x60, 0x13, 0xe1, 0x00, 0x01, 0xf7, 0x7c,
+       0xf3, 0x30, 0x00, 0x03, 0x81, 0xf8, 0x27, 0x61,
+       0xe9, 0x0f, 0x19, 0xe1, 0x00, 0x01, 0x81, 0xf8,
+       0x27, 0x62, 0x71, 0xe4, 0x00, 0x03, 0x00, 0x13,
+       0xf6, 0xb8, 0x49, 0x13, 0xf3, 0x00, 0x00, 0x01,
+       0xf3, 0x30, 0x00, 0x0f, 0x49, 0x0b, 0x09, 0xf8,
+       0x27, 0x62, 0xf8, 0x4d, 0x11, 0x75, 0x77, 0x10,
+       0x00, 0xff, 0xf4, 0xab, 0xf8, 0x30, 0x11, 0x75,
+       0x57, 0xf8, 0x27, 0x6c, 0xf3, 0x00, 0x00, 0x01,
+       0x4f, 0xf8, 0x27, 0x6c, 0x76, 0xf8, 0x27, 0x63,
+       0x00, 0x01, 0xf0, 0x73, 0x11, 0x78, 0x76, 0xf8,
+       0x27, 0x63, 0x00, 0x00, 0x70, 0xe4, 0x00, 0x03,
+       0x27, 0x62, 0x76, 0xf8, 0x27, 0x64, 0x00, 0x00,
+       0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 0x00, 0x0b,
+       0x00, 0x02, 0xf8, 0x20, 0x11, 0x8d, 0xe9, 0x01,
+       0x6f, 0xe1, 0x00, 0x02, 0x0f, 0x18, 0x81, 0xf8,
+       0x27, 0x64, 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8,
+       0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 0x11, 0xa9,
+       0x10, 0xf8, 0x27, 0x64, 0xf1, 0x00, 0x00, 0x04,
+       0x89, 0x13, 0xe9, 0xb8, 0xf5, 0x20, 0x81, 0xf8,
+       0x27, 0x65, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x20,
+       0x11, 0xa9, 0x70, 0x00, 0x00, 0x11, 0x70, 0x01,
+       0x00, 0x13, 0x70, 0x02, 0x27, 0x65, 0xf2, 0x74,
+       0x0f, 0x18, 0xf4, 0x95, 0x48, 0x12, 0xee, 0x04,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16,
+       0x4a, 0x17, 0xee, 0xfc, 0xe8, 0x00, 0x4e, 0xf8,
+       0x27, 0x66, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x68,
+       0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x6c, 0xe8, 0x00,
+       0x4e, 0xf8, 0x27, 0x6a, 0x77, 0x12, 0x27, 0x40,
+       0x77, 0x11, 0x24, 0x00, 0x77, 0x1a, 0x00, 0x1f,
+       0xf0, 0x72, 0x11, 0xdb, 0x70, 0x92, 0x00, 0x11,
+       0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 0x76, 0x81,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 0x76, 0xe1,
+       0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00,
+       0x6d, 0xe9, 0x00, 0x0d, 0xf0, 0x20, 0x25, 0xa0,
+       0xf1, 0x00, 0x00, 0x07, 0x89, 0x11, 0xf1, 0x00,
+       0x00, 0x01, 0x81, 0x02, 0x88, 0x16, 0xf4, 0x95,
+       0x77, 0x17, 0x00, 0x20, 0x76, 0x86, 0x00, 0xff,
+       0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0x06,
+       0x10, 0x02, 0xf0, 0x74, 0x06, 0x6c, 0x76, 0x00,
+       0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74,
+       0x06, 0x6c, 0xf4, 0x95, 0x48, 0x11, 0x10, 0x02,
+       0xf0, 0x00, 0x00, 0x0d, 0x80, 0x02, 0x6d, 0xe9,
+       0x00, 0x0d, 0x6d, 0xee, 0x00, 0x0d, 0x6c, 0xef,
+       0xff, 0xff, 0x11, 0xe8, 0xf0, 0x74, 0x0c, 0x9d,
+       0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11,
+       0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17,
+       0xee, 0xfa, 0x88, 0x11, 0x10, 0x0a, 0x49, 0x11,
+       0xf8, 0x4d, 0x12, 0x9f, 0x48, 0x08, 0xf8, 0x45,
+       0x12, 0x9f, 0x80, 0x04, 0x12, 0x81, 0xf5, 0x78,
+       0x89, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe2,
+       0xff, 0xb9, 0x12, 0x8a, 0x61, 0xf8, 0x00, 0x08,
+       0x00, 0x80, 0xf8, 0x30, 0x12, 0x8a, 0x13, 0xe1,
+       0x00, 0x01, 0xf0, 0xe8, 0xf7, 0x78, 0xf1, 0xa0,
+       0xf2, 0x30, 0x1f, 0xff, 0x88, 0x17, 0xf4, 0x95,
+       0x77, 0x12, 0x24, 0x00, 0x77, 0x16, 0x00, 0x00,
+       0x77, 0x13, 0x00, 0x20, 0xf6, 0xb8, 0x48, 0x17,
+       0x08, 0xe2, 0x00, 0x01, 0xf8, 0x45, 0x12, 0x42,
+       0x6d, 0xea, 0x00, 0x0d, 0x6d, 0x96, 0x6c, 0xeb,
+       0xff, 0xff, 0x12, 0x34, 0xf0, 0x73, 0x12, 0x90,
+       0x56, 0xf8, 0x27, 0x6a, 0xf0, 0x00, 0x00, 0x01,
+       0x4e, 0xf8, 0x27, 0x6a, 0x60, 0x82, 0x00, 0x01,
+       0xf8, 0x30, 0x12, 0x54, 0x70, 0x00, 0x00, 0x16,
+       0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11,
+       0xf0, 0x73, 0x12, 0x90, 0x70, 0x00, 0x00, 0x16,
+       0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11,
+       0x72, 0x10, 0x2a, 0x9e, 0xf4, 0x95, 0xf4, 0xaf,
+       0xf8, 0x30, 0x12, 0x6e, 0x76, 0x00, 0x00, 0x00,
+       0x76, 0x01, 0x00, 0xbc, 0x70, 0x02, 0x00, 0x16,
+       0x76, 0x03, 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9,
+       0xf4, 0x95, 0x48, 0x11, 0xf0, 0x73, 0x12, 0x90,
+       0x10, 0xf8, 0x27, 0x6e, 0xf8, 0x44, 0x12, 0x90,
+       0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0xbc,
+       0x70, 0x02, 0x00, 0x16, 0x76, 0x03, 0x00, 0x00,
+       0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0x48, 0x11,
+       0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 0xf0, 0x10,
+       0x13, 0x88, 0xf8, 0x42, 0x12, 0x90, 0x76, 0xf8,
+       0x27, 0x6e, 0x00, 0x01, 0xf0, 0x73, 0x12, 0x90,
+       0x56, 0xf8, 0x27, 0x66, 0xf0, 0x00, 0x00, 0x01,
+       0x4e, 0xf8, 0x27, 0x66, 0x6d, 0xe9, 0x00, 0x5e,
+       0x56, 0xf8, 0x27, 0x68, 0xf0, 0x00, 0x00, 0x01,
+       0x4e, 0xf8, 0x27, 0x68, 0x71, 0x04, 0x00, 0x12,
+       0x6e, 0xea, 0xff, 0xff, 0x12, 0x18, 0x70, 0x04,
+       0x00, 0x12, 0xee, 0x06, 0x8a, 0x17, 0x8a, 0x16,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe,
+       0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d,
+       0xf0, 0x00, 0x25, 0xa0, 0x88, 0x11, 0xf4, 0x95,
+       0xf4, 0x95, 0x76, 0x81, 0x00, 0xff, 0x76, 0x00,
+       0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74,
+       0x06, 0x6c, 0xf0, 0x00, 0x00, 0x01, 0x76, 0x00,
+       0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0x48, 0x11,
+       0xf2, 0x74, 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x07,
+       0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11,
+       0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d,
+       0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95,
+       0xf4, 0x95, 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff,
+       0x76, 0x81, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff,
+       0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95,
+       0x13, 0x03, 0x88, 0x11, 0xfa, 0x4d, 0x12, 0xec,
+       0x71, 0x02, 0x00, 0x12, 0xf3, 0x10, 0x00, 0x01,
+       0x89, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x12, 0xeb,
+       0x70, 0x91, 0x00, 0x12, 0x8a, 0x11, 0xfc, 0x00,
+       0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d,
+       0xf7, 0xb8, 0xee, 0xfe, 0x10, 0xf8, 0x00, 0x08,
+       0x11, 0x06, 0xf1, 0xc0, 0x83, 0x00, 0xf4, 0x85,
+       0x11, 0x06, 0xf7, 0x85, 0x81, 0x06, 0xf6, 0xb8,
+       0xec, 0x0f, 0x1e, 0x06, 0x61, 0x00, 0x80, 0x00,
+       0xf8, 0x20, 0x13, 0x05, 0xf4, 0x84, 0xee, 0x02,
+       0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00,
+       0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d,
+       0xee, 0xfe, 0xf7, 0xb8, 0x80, 0x00, 0x10, 0xf8,
+       0x00, 0x08, 0xf4, 0x85, 0x11, 0x06, 0xf7, 0x85,
+       0x81, 0x06, 0xf6, 0xb8, 0xec, 0x0f, 0x1e, 0x06,
+       0xf0, 0xf0, 0x61, 0x00, 0x80, 0x00, 0xf8, 0x20,
+       0x13, 0x20, 0xf4, 0x84, 0xee, 0x02, 0x8a, 0x0d,
+       0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 0x4a, 0x11,
+       0x77, 0x11, 0x00, 0x7b, 0x76, 0x81, 0x2e, 0xec,
+       0x77, 0x11, 0x00, 0x7b, 0xee, 0xff, 0x71, 0x81,
+       0x00, 0x11, 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0x62, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x76,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x92, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x94, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0xb0, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xb3,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0xbe, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0xbf, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0xc1, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc3,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0xc5, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0xc7, 0x00, 0x00, 0x76, 0x81,
+       0x00, 0x00, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+       0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xff,
+       0xf4, 0x95, 0x71, 0x06, 0x00, 0x16, 0xfb, 0x80,
+       0x16, 0xa2, 0x88, 0x17, 0xf4, 0x95, 0xf7, 0xb8,
+       0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02,
+       0xfa, 0x46, 0x13, 0x88, 0x77, 0x11, 0x00, 0x00,
+       0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02,
+       0xf8, 0x45, 0x13, 0xf9, 0x10, 0xf8, 0x00, 0x17,
+       0xf8, 0x45, 0x14, 0x39, 0x10, 0xf8, 0x00, 0x17,
+       0xf0, 0x10, 0x00, 0x01, 0xf8, 0x45, 0x14, 0x1f,
+       0xf0, 0x73, 0x14, 0x52, 0x10, 0xf8, 0x00, 0x17,
+       0xf0, 0x10, 0x00, 0x03, 0xf8, 0x45, 0x13, 0xd3,
+       0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x06,
+       0xf8, 0x44, 0x14, 0x52, 0x77, 0x12, 0x00, 0x7b,
+       0x71, 0x82, 0x00, 0x14, 0x61, 0xe4, 0x00, 0x07,
+       0x00, 0x40, 0xf8, 0x30, 0x14, 0x52, 0x49, 0x14,
+       0x48, 0x17, 0xf6, 0x00, 0x88, 0x12, 0xf4, 0x95,
+       0x77, 0x13, 0x00, 0x55, 0x77, 0x11, 0x00, 0x57,
+       0x6d, 0xea, 0x00, 0x3b, 0xe5, 0x01, 0x10, 0xe6,
+       0x00, 0x06, 0x80, 0x81, 0x48, 0x14, 0x00, 0xf8,
+       0x00, 0x17, 0x88, 0x12, 0xf4, 0x95, 0x77, 0x11,
+       0x00, 0x55, 0x10, 0xe2, 0x00, 0x40, 0x80, 0x81,
+       0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x07,
+       0x80, 0x81, 0x77, 0x11, 0x00, 0x55, 0x10, 0xe2,
+       0x00, 0x45, 0x80, 0x81, 0x10, 0xe6, 0x00, 0x08,
+       0x77, 0x11, 0x00, 0x57, 0x80, 0x81, 0x77, 0x11,
+       0x00, 0x55, 0x10, 0xe2, 0x00, 0x4a, 0x80, 0x81,
+       0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x09,
+       0x80, 0x81, 0xf2, 0x73, 0x14, 0x52, 0x77, 0x11,
+       0x03, 0xc0, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82,
+       0xf0, 0x00, 0x00, 0x07, 0x88, 0x13, 0xf4, 0x95,
+       0xf4, 0x95, 0x96, 0x1b, 0xf8, 0x30, 0x14, 0x52,
+       0x10, 0xe3, 0x00, 0x35, 0x77, 0x12, 0x00, 0x55,
+       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
+       0x00, 0x04, 0x80, 0x82, 0x77, 0x12, 0x00, 0x55,
+       0x10, 0xe3, 0x00, 0x37, 0x80, 0x82, 0x77, 0x12,
+       0x00, 0x57, 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82,
+       0x48, 0x11, 0xf0, 0x40, 0x00, 0x10, 0xf2, 0x73,
+       0x14, 0x50, 0xf0, 0x40, 0x00, 0x20, 0x77, 0x12,
+       0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07,
+       0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0d,
+       0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x34,
+       0x77, 0x13, 0x00, 0x55, 0x80, 0x83, 0x77, 0x13,
+       0x00, 0x57, 0x10, 0xe6, 0x00, 0x02, 0x80, 0x83,
+       0x10, 0xe2, 0x00, 0x36, 0x77, 0x12, 0x00, 0x55,
+       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
+       0x00, 0x03, 0x80, 0x82, 0x48, 0x11, 0xf0, 0x40,
+       0x00, 0x04, 0xf2, 0x73, 0x14, 0x50, 0xf0, 0x40,
+       0x00, 0x08, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82,
+       0xf0, 0x00, 0x00, 0x07, 0x88, 0x12, 0xf4, 0x95,
+       0xf4, 0x95, 0x96, 0x0e, 0xf8, 0x30, 0x14, 0x52,
+       0x10, 0xe2, 0x00, 0x33, 0x77, 0x12, 0x00, 0x55,
+       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6,
+       0x00, 0x01, 0x80, 0x82, 0x48, 0x11, 0xf2, 0x73,
+       0x14, 0x50, 0xf0, 0x40, 0x00, 0x02, 0x77, 0x12,
+       0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07,
+       0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0f,
+       0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x32,
+       0x77, 0x12, 0x00, 0x55, 0x77, 0x13, 0x00, 0x57,
+       0x80, 0x82, 0x48, 0x11, 0xe7, 0x62, 0xf0, 0x40,
+       0x00, 0x01, 0xe5, 0x01, 0x88, 0x11, 0xf4, 0x95,
+       0x77, 0x12, 0x00, 0x7b, 0x48, 0x11, 0x71, 0x82,
+       0x00, 0x12, 0x1a, 0xe2, 0x00, 0x07, 0x80, 0xe2,
+       0x00, 0x07, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
+       0x8a, 0x17, 0x48, 0x11, 0x8a, 0x16, 0x8a, 0x11,
+       0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0x77, 0x0e,
+       0x00, 0x05, 0x77, 0x12, 0x00, 0x55, 0xe8, 0x04,
+       0xf6, 0xb8, 0x28, 0xe1, 0x00, 0x02, 0xee, 0xff,
+       0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0xf0, 0x20,
+       0x80, 0x00, 0xee, 0x01, 0x1a, 0x82, 0x77, 0x12,
+       0x00, 0x57, 0x80, 0x82, 0xe8, 0x01, 0x32, 0xe1,
+       0x00, 0x02, 0xf5, 0x82, 0x77, 0x11, 0x00, 0x54,
+       0xf6, 0x93, 0x18, 0x81, 0x77, 0x11, 0x00, 0x54,
+       0xf2, 0xa0, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
+       0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95,
+       0x71, 0x04, 0x00, 0x11, 0xfb, 0x80, 0x16, 0xa2,
+       0x88, 0x16, 0xf4, 0x95, 0x77, 0x12, 0x00, 0x55,
+       0x10, 0xe6, 0x00, 0x03, 0x80, 0x82, 0x77, 0x12,
+       0x00, 0x56, 0x10, 0xe1, 0x00, 0x02, 0x77, 0x13,
+       0x00, 0x56, 0x80, 0x82, 0x77, 0x12, 0x00, 0x56,
+       0x10, 0xe1, 0x00, 0x03, 0x80, 0x82, 0x10, 0xe1,
+       0x00, 0x04, 0x77, 0x12, 0x00, 0x56, 0x80, 0x82,
+       0x77, 0x12, 0x00, 0x56, 0x10, 0xe1, 0x00, 0x01,
+       0x80, 0x82, 0xe7, 0x12, 0xe5, 0x01, 0xf9, 0x80,
+       0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4,
+       0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xf9,
+       0x77, 0x11, 0x00, 0x7b, 0x76, 0x00, 0x00, 0x16,
+       0x76, 0x01, 0x00, 0x17, 0x76, 0x02, 0x00, 0x1a,
+       0x76, 0x03, 0x00, 0x1b, 0x76, 0x04, 0x00, 0x1c,
+       0x76, 0x05, 0x00, 0x1d, 0x71, 0x81, 0x00, 0x17,
+       0x71, 0xe7, 0x00, 0x06, 0x00, 0x11, 0x10, 0x81,
+       0xf8, 0x44, 0x14, 0xdf, 0xf9, 0x80, 0x16, 0x53,
+       0xf6, 0xb8, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x20,
+       0xff, 0xff, 0xf6, 0xb8, 0xfb, 0x80, 0x16, 0x08,
+       0xf0, 0x20, 0xff, 0xff, 0x77, 0x11, 0x00, 0x7b,
+       0x71, 0x81, 0x00, 0x17, 0x76, 0xe7, 0x00, 0x06,
+       0x00, 0x01, 0x48, 0x17, 0x77, 0x16, 0x00, 0x00,
+       0x77, 0x10, 0x00, 0x04, 0x77, 0x15, 0x00, 0x03,
+       0x77, 0x14, 0x00, 0x02, 0x77, 0x13, 0x00, 0x01,
+       0xf0, 0x00, 0x00, 0x39, 0x76, 0xe7, 0x00, 0x08,
+       0x00, 0x1f, 0x76, 0xe7, 0x00, 0x07, 0x00, 0x00,
+       0x88, 0x0e, 0x77, 0x1a, 0x00, 0x05, 0x48, 0x17,
+       0xf0, 0x00, 0x00, 0x09, 0x88, 0x12, 0x48, 0x18,
+       0x88, 0x19, 0xe8, 0x00, 0xf0, 0x72, 0x15, 0x2c,
+       0x73, 0x19, 0x00, 0x11, 0x76, 0x82, 0x00, 0x00,
+       0x11, 0x91, 0x73, 0x11, 0x00, 0x19, 0x70, 0xe2,
+       0x00, 0x03, 0x00, 0x16, 0x70, 0xe2, 0x00, 0x04,
+       0x00, 0x13, 0x70, 0xe2, 0x00, 0x05, 0x00, 0x14,
+       0x81, 0xe2, 0x00, 0x01, 0x70, 0xe2, 0x00, 0x06,
+       0x00, 0x15, 0x70, 0xe2, 0x00, 0x07, 0x00, 0x10,
+       0x80, 0xe2, 0x00, 0x02, 0x73, 0x0e, 0x00, 0x11,
+       0xf1, 0x00, 0x00, 0x1e, 0x6d, 0xee, 0x00, 0x05,
+       0x6d, 0xeb, 0x00, 0x05, 0x6d, 0xec, 0x00, 0x05,
+       0x6d, 0xed, 0x00, 0x05, 0x6d, 0xe8, 0x00, 0x05,
+       0xf0, 0x00, 0x00, 0x01, 0x81, 0x91, 0x6d, 0xea,
+       0x00, 0x08, 0x73, 0x11, 0x00, 0x0e, 0xee, 0x07,
+       0x76, 0xe7, 0x00, 0x41, 0x00, 0x24, 0x76, 0xe7,
+       0x00, 0x46, 0x00, 0x25, 0x76, 0xe7, 0x00, 0x4b,
+       0x00, 0x26, 0x76, 0xe7, 0x00, 0x50, 0x00, 0x27,
+       0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4,
+       0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfe, 0x88, 0x11,
+       0x56, 0x06, 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2,
+       0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 0xf0, 0x10,
+       0xff, 0xff, 0xfa, 0x45, 0x15, 0x60, 0x77, 0x16,
+       0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 0x49, 0x11,
+       0x10, 0x82, 0xf6, 0x03, 0xf0, 0x00, 0x00, 0x09,
+       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
+       0xf8, 0x44, 0x15, 0x71, 0xf2, 0x73, 0x15, 0x71,
+       0xf4, 0x95, 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b,
+       0x10, 0x81, 0xf0, 0x00, 0x00, 0x09, 0x88, 0x11,
+       0xf4, 0x95, 0x77, 0x12, 0x00, 0x06, 0x10, 0x81,
+       0xf8, 0x45, 0x15, 0x5c, 0x6e, 0xea, 0xff, 0xff,
+       0x15, 0x69, 0x6d, 0xe9, 0x00, 0x08, 0x76, 0x86,
+       0x00, 0x01, 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80,
+       0x10, 0xf8, 0x00, 0x0b, 0xf8, 0x45, 0x15, 0x7e,
+       0xfb, 0x80, 0x15, 0x85, 0xf4, 0x95, 0x48, 0x16,
+       0xf9, 0x80, 0x16, 0x9a, 0xee, 0x02, 0x48, 0x16,
+       0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11,
+       0xee, 0xff, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
+       0xf4, 0x95, 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9,
+       0xf8, 0x30, 0x15, 0xc4, 0x10, 0xe1, 0x00, 0x03,
+       0x77, 0x12, 0x00, 0x55, 0x80, 0x82, 0x77, 0x12,
+       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12,
+       0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
+       0x00, 0x02, 0xf0, 0x00, 0x00, 0x08, 0x32, 0xf8,
+       0x00, 0x08, 0x77, 0x12, 0x00, 0x54, 0xe8, 0x01,
+       0xf4, 0x82, 0xf4, 0x93, 0x18, 0x82, 0x77, 0x12,
+       0x00, 0x54, 0xf0, 0x40, 0x00, 0x00, 0x80, 0x82,
+       0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x76,
+       0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x66,
+       0xf0, 0x73, 0x16, 0x03, 0x77, 0x11, 0x00, 0x7b,
+       0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 0x00, 0x07,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
+       0x00, 0x09, 0xf9, 0x80, 0x15, 0x85, 0x77, 0x11,
+       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
+       0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
+       0x00, 0x08, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81,
+       0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80,
+       0x15, 0x85, 0xf0, 0x00, 0x00, 0x10, 0x77, 0x11,
+       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
+       0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
+       0x00, 0x18, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81,
+       0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80,
+       0x15, 0x85, 0xf0, 0x00, 0x00, 0x20, 0x77, 0x11,
+       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1,
+       0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00,
+       0x00, 0x28, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
+       0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff,
+       0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95,
+       0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30,
+       0x16, 0x41, 0x77, 0x11, 0x00, 0x55, 0x76, 0x81,
+       0x00, 0x1e, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81,
+       0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0xf2, 0x73,
+       0x16, 0x4e, 0x76, 0x81, 0x00, 0x00, 0x77, 0x11,
+       0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1,
+       0x00, 0x07, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00,
+       0x10, 0xe1, 0x00, 0x39, 0xf9, 0x80, 0x16, 0x08,
+       0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11,
+       0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b,
+       0x10, 0x81, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44,
+       0x16, 0x63, 0xf4, 0x95, 0xee, 0xff, 0x76, 0x81,
+       0x00, 0x01, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4,
+       0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8,
+       0x00, 0x08, 0xee, 0xff, 0x77, 0x11, 0x00, 0x01,
+       0xe8, 0x01, 0xee, 0x01, 0xf4, 0x82, 0x1a, 0x81,
+       0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+       0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8,
+       0x00, 0x08, 0xee, 0xff, 0xe8, 0x01, 0x77, 0x11,
+       0x00, 0x00, 0xf4, 0x82, 0xee, 0x01, 0xf4, 0x93,
+       0x18, 0x81, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
+       0xf4, 0xe4, 0x4a, 0x11, 0xf0, 0x10, 0x00, 0x10,
+       0x77, 0x11, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x08,
+       0xee, 0xff, 0x11, 0x81, 0xe8, 0x01, 0xee, 0x01,
+       0x77, 0x11, 0x00, 0x00, 0xf4, 0x82, 0xf2, 0xa0,
+       0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+       0xf2, 0x73, 0x16, 0x9e, 0xf6, 0xbb, 0xf4, 0x95,
+       0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4,
+       0xf2, 0x73, 0x16, 0xa6, 0xf7, 0xbb, 0xf4, 0x95,
+       0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4,
+       0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 0x71, 0x04,
+       0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
+       0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x0e, 0x10, 0xe6, 0x00, 0x0e,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82,
+       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x0d, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+       0x10, 0xe6, 0x00, 0x0d, 0x80, 0x82, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0c,
+       0x10, 0xe6, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 0x10, 0xe6,
+       0x00, 0x0b, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+       0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x10, 0xe6, 0x00, 0x0a, 0x80, 0x82,
+       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x09, 0x10, 0xe6, 0x00, 0x09, 0x71, 0xe1,
+       0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x08,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6,
+       0x00, 0x08, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 0x10, 0xe6,
+       0x00, 0x07, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+       0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x10, 0xe6, 0x00, 0x06, 0x80, 0x82,
+       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x05, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12,
+       0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x04,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6,
+       0x00, 0x04, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 0x71, 0xe1,
+       0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 0x00, 0x03,
+       0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x02, 0x10, 0xe6, 0x00, 0x02,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82,
+       0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x01, 0x10, 0xe6, 0x00, 0x01, 0x71, 0xe1,
+       0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x13, 0xe7, 0x62,
+       0xe5, 0x01, 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16,
+       0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05,
+       0x00, 0x12, 0xee, 0xff, 0x76, 0x82, 0x00, 0x00,
+       0xee, 0x01, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11,
+       0x69, 0x81, 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95,
+       0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95,
+       0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0xee, 0xff, 0x76, 0x82, 0x00, 0x01, 0xee, 0x01,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 0x69, 0x81,
+       0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+       0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+       0xf0, 0x00, 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95,
+       0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 0x17, 0x9c,
+       0xf4, 0x95, 0xee, 0xff, 0xf9, 0x80, 0x16, 0x53,
+       0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00,
+       0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95,
+       0x76, 0x81, 0x00, 0x01, 0xee, 0x01, 0x76, 0xe1,
+       0x00, 0x01, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02,
+       0x00, 0x21, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x20,
+       0x76, 0xe1, 0x00, 0x04, 0x00, 0x23, 0x76, 0xe1,
+       0x00, 0x05, 0x00, 0x22, 0x76, 0xe1, 0x00, 0x06,
+       0x00, 0x38, 0x76, 0xe1, 0x00, 0x07, 0x00, 0x39,
+       0x76, 0xe1, 0x00, 0x08, 0x00, 0x15, 0x76, 0xe1,
+       0x00, 0x09, 0x00, 0x14, 0x76, 0xe1, 0x00, 0x0a,
+       0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x41,
+       0x76, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x76, 0xe1,
+       0x00, 0x0d, 0x00, 0x43, 0x76, 0xe1, 0x00, 0x0e,
+       0x00, 0x42, 0x76, 0xe1, 0x00, 0x0f, 0x00, 0x48,
+       0x76, 0xe1, 0x00, 0x10, 0x00, 0x49, 0x76, 0xe1,
+       0x00, 0x11, 0x00, 0x1b, 0x76, 0xe1, 0x00, 0x12,
+       0x00, 0x1a, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4,
+       0x4a, 0x11, 0xee, 0xfd, 0x88, 0x11, 0x56, 0x06,
+       0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 0x77, 0x12,
+       0x00, 0x7b, 0x77, 0x0e, 0x00, 0x09, 0x10, 0x82,
+       0x28, 0xf8, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x95,
+       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
+       0xf8, 0x45, 0x17, 0xf0, 0xf2, 0x73, 0x17, 0xfd,
+       0x77, 0x11, 0xff, 0xff, 0x76, 0x81, 0x00, 0x01,
+       0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 0x10, 0xf8,
+       0x00, 0x0b, 0xf8, 0x45, 0x17, 0xfd, 0xfb, 0x80,
+       0x18, 0x10, 0xf4, 0x95, 0x48, 0x11, 0xf9, 0x80,
+       0x16, 0x9a, 0xee, 0x03, 0x48, 0x11, 0x8a, 0x11,
+       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11,
+       0xf4, 0x95, 0xee, 0xff, 0x71, 0xe1, 0x00, 0x01,
+       0x00, 0x11, 0xee, 0x01, 0x10, 0x81, 0x8a, 0x11,
+       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff,
+       0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95,
+       0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30,
+       0x18, 0xc3, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x01,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x02, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x03,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x04, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x05,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x07,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x20, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x08, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x09,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1,
+       0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0d,
+       0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82,
+       0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12,
+       0x76, 0x82, 0x00, 0x0e, 0x71, 0xe1, 0x00, 0x06,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1,
+       0x00, 0x07, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1,
+       0x00, 0x08, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1,
+       0x00, 0x07, 0xf9, 0x80, 0x16, 0x66, 0x10, 0xe1,
+       0x00, 0x08, 0xf9, 0x80, 0x16, 0x66, 0xf0, 0x73,
+       0x18, 0xd1, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+       0xfb, 0x80, 0x18, 0x10, 0xf0, 0x00, 0x00, 0x95,
+       0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xfb, 0x80,
+       0x18, 0x10, 0xf0, 0x00, 0x00, 0x9e, 0xf9, 0x80,
+       0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4,
+       0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 0xf4, 0x95,
+       0x10, 0x04, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x11,
+       0xee, 0x01, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95,
+       0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95,
+       0x71, 0x04, 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2,
+       0x88, 0x11, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x02,
+       0x00, 0x12, 0x76, 0x82, 0x00, 0x10, 0x10, 0xe6,
+       0x00, 0x01, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12,
+       0x80, 0x82, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12,
+       0x10, 0xe6, 0x00, 0x02, 0x80, 0x82, 0xe7, 0x62,
+       0x71, 0xe1, 0x00, 0x02, 0x00, 0x13, 0xe5, 0x01,
+       0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11,
+       0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff,
+       0xee, 0x01, 0x10, 0xe1, 0x00, 0x01, 0x8a, 0x11,
+       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11,
+       0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3,
+       0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81,
+       0xfa, 0x44, 0x19, 0x2a, 0xf4, 0x95, 0xee, 0xff,
+       0xf9, 0x80, 0x16, 0x53, 0x77, 0x11, 0x00, 0x7b,
+       0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 0x88, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x76, 0x81, 0x00, 0x01,
+       0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 0x00, 0x00,
+       0x76, 0xe1, 0x00, 0x02, 0x00, 0x13, 0x76, 0xe1,
+       0x00, 0x03, 0x00, 0x26, 0x76, 0xe1, 0x00, 0x04,
+       0x00, 0x25, 0x76, 0xe1, 0x00, 0x05, 0x00, 0x24,
+       0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1,
+       0x00, 0x07, 0x00, 0x17, 0x76, 0xe1, 0x00, 0x08,
+       0x00, 0x32, 0x76, 0xe1, 0x00, 0x09, 0x00, 0x31,
+       0x76, 0xe1, 0x00, 0x0a, 0x00, 0x30, 0x8a, 0x11,
+       0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16,
+       0x4a, 0x17, 0xee, 0xff, 0xf4, 0x95, 0x71, 0x06,
+       0x00, 0x17, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11,
+       0xf4, 0x95, 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11,
+       0xf0, 0x10, 0xff, 0xff, 0xfa, 0x45, 0x19, 0x73,
+       0x77, 0x16, 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b,
+       0x77, 0x0e, 0x00, 0x05, 0x10, 0x82, 0x28, 0xf8,
+       0x00, 0x11, 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11,
+       0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf8, 0x44,
+       0x19, 0x84, 0xf2, 0x73, 0x19, 0x84, 0xf4, 0x95,
+       0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+       0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 0xf4, 0x95,
+       0x77, 0x12, 0x00, 0x02, 0x10, 0x81, 0xf8, 0x45,
+       0x19, 0x6f, 0x6e, 0xea, 0xff, 0xff, 0x19, 0x7c,
+       0x6d, 0xe9, 0x00, 0x05, 0x61, 0xf8, 0x00, 0x17,
+       0x00, 0x01, 0xfa, 0x20, 0x19, 0x8f, 0x76, 0x86,
+       0x00, 0x01, 0xfb, 0x80, 0x19, 0x97, 0xf4, 0x95,
+       0x48, 0x16, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01,
+       0x8a, 0x17, 0x48, 0x16, 0x8a, 0x16, 0x8a, 0x11,
+       0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 0xfb, 0x80,
+       0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10,
+       0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 0x19, 0xcc,
+       0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 0x69, 0x82,
+       0x00, 0x10, 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12,
+       0x68, 0x82, 0xf7, 0xff, 0x71, 0xe1, 0x00, 0x02,
+       0x00, 0x12, 0x68, 0x82, 0xfb, 0xff, 0x71, 0xe1,
+       0x00, 0x02, 0x00, 0x12, 0x68, 0x82, 0xff, 0xf0,
+       0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 0x76, 0x82,
+       0xff, 0xff, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12,
+       0x76, 0x82, 0xff, 0xff, 0x71, 0xe1, 0x00, 0x02,
+       0x00, 0x12, 0x69, 0x82, 0x00, 0x20, 0x71, 0xe1,
+       0x00, 0x02, 0x00, 0x11, 0xf2, 0x73, 0x19, 0xda,
+       0x68, 0x81, 0xff, 0xef, 0x77, 0x11, 0x00, 0x7b,
+       0x10, 0x81, 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00,
+       0x00, 0xb4, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81,
+       0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 0x00, 0xb9,
+       0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11,
+       0xf4, 0xe4, 0x00, 0xa4, 0x00, 0x00, 0x19, 0xdf,
+       0x00, 0x01, 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x01,
+       0x2a, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x2a, 0x12,
+       0x0c, 0x01, 0xc3, 0x4f, 0x00, 0x00, 0x00, 0x01,
+       0x2a, 0x15, 0x00, 0x00, 0x00, 0x02, 0x2a, 0x16,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x2a, 0x5d,
+       0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79,
+       0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68,
+       0x00, 0x74, 0x00, 0x20, 0x00, 0x54, 0x00, 0x65,
+       0x00, 0x63, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x6f,
+       0x00, 0x54, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e,
+       0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x47,
+       0x00, 0x00, 0x00, 0x04, 0x2a, 0x76, 0x00, 0x30,
+       0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c,
+       0x2a, 0x7a, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62,
+       0x00, 0x20, 0x00, 0x32, 0x00, 0x37, 0x00, 0x20,
+       0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31,
+       0x00, 0x00, 0x00, 0x09, 0x2a, 0x86, 0x00, 0x31,
+       0x00, 0x34, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x35,
+       0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00,
+       0x00, 0x0f, 0x2a, 0x8f, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x01, 0x2a, 0x9e, 0x00, 0x00,
+       0x00, 0x01, 0x2a, 0x9f, 0x00, 0x00, 0x00, 0x01,
+       0x2a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa1,
+       0x00, 0x00, 0x00, 0x01, 0x2a, 0xa2, 0x00, 0x00,
+       0x00, 0x01, 0x29, 0x7e, 0x00, 0x00, 0x00, 0x02,
+       0x29, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+       0x29, 0x82, 0xff, 0xff, 0x00, 0x01, 0x2a, 0xa7,
+       0x00, 0x00, 0x00, 0x05, 0x2a, 0xa8, 0x71, 0x41,
+       0x20, 0x00, 0x20, 0x00, 0x00, 0x23, 0x04, 0x00,
+       0x00, 0x0a, 0x2a, 0xad, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x0f, 0x2a, 0xb7, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x82, 0x40,
+       0x00, 0x08, 0x30, 0x7f, 0x00, 0x80, 0x01, 0x80,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x01, 0x27, 0x6e, 0x00, 0x00,
+       0x00, 0x01, 0x27, 0x6f, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x09, 0x00, 0x00, 0x1a, 0x83, 0x04, 0xe8,
+       0x04, 0xcf, 0x04, 0xc5, 0x04, 0xba, 0x04, 0xb0,
+       0x04, 0xac, 0x04, 0x9c, 0x04, 0x8c, 0x04, 0x81,
+       0x00, 0x78, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xaa, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x02, 0x23, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x05, 0xe5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x02, 0xb5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x0e, 0x33, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73,
+       0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0x00, 0x00,
 };
 
index 832d179f26fa417e541d1cf4701256d7aa2e20ea..8abc21890129f18867a12ed07a5dc6b9b478440e 100644 (file)
@@ -1203,7 +1203,7 @@ static int ttusb_init_rc(struct ttusb_dec *dec)
        input_dev->keycode = rc_keys;
 
        for (i = 0; i < ARRAY_SIZE(rc_keys); i++)
-                set_bit(rc_keys[i], input_dev->keybit);
+               set_bit(rc_keys[i], input_dev->keybit);
 
        input_register_device(input_dev);
 
@@ -1529,7 +1529,7 @@ static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
        usb_free_urb(dec->irq_urb);
 
        usb_buffer_free(dec->udev,IRQ_PACKET_SIZE,
-                          dec->irq_buffer, dec->irq_dma_handle);
+                          dec->irq_buffer, dec->irq_dma_handle);
 
        if (dec->rc_input_dev) {
                input_unregister_device(dec->rc_input_dev);
index 1a3b3c7e5e99699815245de164016959b549c6ed..fc87efc5049c0c64ef3e660393ef042840e84a8a 100644 (file)
@@ -26,15 +26,12 @@ config VIDEO_BT848
          module will be called bttv.
 
 config VIDEO_BT848_DVB
-       tristate "DVB/ATSC Support for bt878 based TV cards"
+       bool "DVB/ATSC Support for bt878 based TV cards"
        depends on VIDEO_BT848 && DVB_CORE
        select DVB_BT8XX
        ---help---
          This adds support for DVB/ATSC cards based on the BT878 chip.
 
-         To compile this driver as a module, choose M here: the
-         module will be called dvb-bt8xx.
-
 config VIDEO_SAA6588
        tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards"
        depends on VIDEO_DEV && I2C && VIDEO_BT848
@@ -191,7 +188,7 @@ config VIDEO_ZORAN
 
          To compile this driver as a module, choose M here: the
          module will be called zr36067.
+
 config VIDEO_ZORAN_BUZ
        tristate "Iomega Buz support"
        depends on VIDEO_ZORAN
@@ -207,8 +204,8 @@ config VIDEO_ZORAN_DC10
 
 config VIDEO_ZORAN_DC30
        tristate "Pinnacle/Miro DC30(+) support"
-       depends on VIDEO_ZORAN
-       help
+       depends on VIDEO_ZORAN
+       help
          Support for the Pinnacle/Miro DC30(+) MJPEG capture/playback
          card. This also supports really old DC10 cards based on the
          zr36050 MJPEG codec and zr36016 VFE.
@@ -263,7 +260,7 @@ config VIDEO_MXB
        ---help---
          This is a video4linux driver for the 'Multimedia eXtension Board'
          TV card by Siemens-Nixdorf.
-         
+
          To compile this driver as a module, choose M here: the
          module will be called mxb.
 
@@ -277,7 +274,7 @@ config VIDEO_DPC
          for SAA7146 bases boards, so if you have some unsupported
          saa7146 based, analog video card, chances are good that it
          will work with this skeleton driver.
-         
+
          To compile this driver as a module, choose M here: the
          module will be called dpc7146.
 
@@ -288,7 +285,7 @@ config VIDEO_HEXIUM_ORION
        ---help---
          This is a video4linux driver for the Hexium HV-PCI6 and
          Orion frame grabber cards by Hexium.
-         
+
          To compile this driver as a module, choose M here: the
          module will be called hexium_orion.
 
@@ -300,7 +297,7 @@ config VIDEO_HEXIUM_GEMINI
          This is a video4linux driver for the Hexium Gemini frame
          grabber card by Hexium. Please note that the Gemini Dual
          card is *not* fully supported.
-         
+
          To compile this driver as a module, choose M here: the
          module will be called hexium_gemini.
 
index e4063950ae57d7782ac7ce8d6d71f862acf55372..3ca1d768bfd3b4bb4da818725caa5bf9fa0970a8 100644 (file)
@@ -231,18 +231,18 @@ bt832_command(struct i2c_client *client, unsigned int cmd, void *arg)
 
 static struct i2c_driver driver = {
        .owner          = THIS_MODULE,
-        .name           = "i2c bt832 driver",
-        .id             = -1, /* FIXME */
-        .flags          = I2C_DF_NOTIFY,
-        .attach_adapter = bt832_probe,
-        .detach_client  = bt832_detach,
-        .command        = bt832_command,
+       .name           = "i2c bt832 driver",
+       .id             = -1, /* FIXME */
+       .flags          = I2C_DF_NOTIFY,
+       .attach_adapter = bt832_probe,
+       .detach_client  = bt832_detach,
+       .command        = bt832_command,
 };
 static struct i2c_client client_template =
 {
        .name       = "bt832",
        .flags      = I2C_CLIENT_ALLOW_USE,
-        .driver     = &driver,
+       .driver     = &driver,
 };
 
 
index e31ebb11c4684e552adfd161234ccde8817539e3..012be639aa1861577dc2a5a4d98d6bbdab839068 100644 (file)
@@ -2904,7 +2904,7 @@ void __devinit bttv_idcard(struct bttv *btv)
  */
 
 /* Some Modular Technology cards have an eeprom, but no subsystem ID */
-void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])
+static void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])
 {
        int type = -1;
 
@@ -3879,7 +3879,7 @@ static void __devinit init_PXC200(struct bttv *btv)
  *                error. ERROR_CPLD_Check_Failed.
  */
 /* ----------------------------------------------------------------------- */
-void
+static void
 init_RTV24 (struct bttv *btv)
 {
        uint32_t dataRead = 0;
@@ -4103,7 +4103,7 @@ void tea5757_set_freq(struct bttv *btv, unsigned short freq)
 /* ----------------------------------------------------------------------- */
 /* winview                                                                 */
 
-void winview_audio(struct bttv *btv, struct video_audio *v, int set)
+static void winview_audio(struct bttv *btv, struct video_audio *v, int set)
 {
        /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
        int bits_out, loops, vol, data;
index 709099f03bd20e5903a80e0f113f188824363330..1ddf9ba613ef96c3e8b142dd41d322c02391cb3c 100644 (file)
@@ -727,71 +727,71 @@ void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
 
 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
 {
-        unsigned char fl, fh, fi;
+       unsigned char fl, fh, fi;
 
-        /* prevent overflows */
-        fin/=4;
-        fout/=4;
+       /* prevent overflows */
+       fin/=4;
+       fout/=4;
 
-        fout*=12;
-        fi=fout/fin;
+       fout*=12;
+       fi=fout/fin;
 
-        fout=(fout%fin)*256;
-        fh=fout/fin;
+       fout=(fout%fin)*256;
+       fh=fout/fin;
 
-        fout=(fout%fin)*256;
-        fl=fout/fin;
+       fout=(fout%fin)*256;
+       fl=fout/fin;
 
-        btwrite(fl, BT848_PLL_F_LO);
-        btwrite(fh, BT848_PLL_F_HI);
-        btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
+       btwrite(fl, BT848_PLL_F_LO);
+       btwrite(fh, BT848_PLL_F_HI);
+       btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
 }
 
 static void set_pll(struct bttv *btv)
 {
-        int i;
+       int i;
 
-        if (!btv->pll.pll_crystal)
-                return;
+       if (!btv->pll.pll_crystal)
+               return;
 
        if (btv->pll.pll_ofreq == btv->pll.pll_current) {
                dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
-                return;
-        }
+               return;
+       }
 
-        if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
-                /* no PLL needed */
-                if (btv->pll.pll_current == 0)
-                        return;
+       if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
+               /* no PLL needed */
+               if (btv->pll.pll_current == 0)
+                       return;
                bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
-                           btv->c.nr,btv->pll.pll_ifreq);
-                btwrite(0x00,BT848_TGCTRL);
-                btwrite(0x00,BT848_PLL_XCI);
-                btv->pll.pll_current = 0;
-                return;
-        }
+                       btv->c.nr,btv->pll.pll_ifreq);
+               btwrite(0x00,BT848_TGCTRL);
+               btwrite(0x00,BT848_PLL_XCI);
+               btv->pll.pll_current = 0;
+               return;
+       }
 
        bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
-                   btv->pll.pll_ifreq, btv->pll.pll_ofreq);
+               btv->pll.pll_ifreq, btv->pll.pll_ofreq);
        set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
 
-        for (i=0; i<10; i++) {
+       for (i=0; i<10; i++) {
                /*  Let other people run while the PLL stabilizes */
                bttv_printk(".");
                msleep(10);
 
-                if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
+               if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
                        btwrite(0,BT848_DSTATUS);
-                } else {
-                        btwrite(0x08,BT848_TGCTRL);
-                        btv->pll.pll_current = btv->pll.pll_ofreq;
+               } else {
+                       btwrite(0x08,BT848_TGCTRL);
+                       btv->pll.pll_current = btv->pll.pll_ofreq;
                        bttv_printk(" ok\n");
-                        return;
-                }
-        }
-        btv->pll.pll_current = -1;
+                       return;
+               }
+       }
+       btv->pll.pll_current = -1;
        bttv_printk("failed\n");
-        return;
+       return;
 }
 
 /* used to switch between the bt848's analog/digital video capture modes */
@@ -1720,7 +1720,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
                memset(i,0,sizeof(*i));
                i->index    = n;
                i->type     = V4L2_INPUT_TYPE_CAMERA;
-               i->audioset = 1;
+               i->audioset = 0;
                if (i->index == bttv_tvcards[btv->c.type].tuner) {
                        sprintf(i->name, "Television");
                        i->type  = V4L2_INPUT_TYPE_TUNER;
@@ -1771,11 +1771,19 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
                memset(t,0,sizeof(*t));
                strcpy(t->name, "Television");
                t->type       = V4L2_TUNER_ANALOG_TV;
-               t->rangehigh  = 0xffffffffUL;
                t->capability = V4L2_TUNER_CAP_NORM;
                t->rxsubchans = V4L2_TUNER_SUB_MONO;
                if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
                        t->signal = 0xffff;
+               {
+                       struct video_tuner tuner;
+
+                       memset(&tuner, 0, sizeof (tuner));
+                       tuner.rangehigh = 0xffffffffUL;
+                       bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner);
+                       t->rangelow = tuner.rangelow;
+                       t->rangehigh = tuner.rangehigh;
+               }
                {
                        /* Hmmm ... */
                        struct video_audio va;
@@ -1853,7 +1861,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
        }
        case VIDIOC_LOG_STATUS:
        {
-               bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, 0);
+               bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
                return 0;
        }
 
@@ -1956,7 +1964,7 @@ static int setup_window(struct bttv_fh *fh, struct bttv *btv,
        }
 
        down(&fh->cap.lock);
-       kfree(fh->ov.clips);
+               kfree(fh->ov.clips);
        fh->ov.clips    = clips;
        fh->ov.nclips   = n;
 
@@ -2029,19 +2037,33 @@ static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
        return 0;
 }
 
+static void
+pix_format_set_size     (struct v4l2_pix_format *       f,
+                        const struct bttv_format *     fmt,
+                        unsigned int                   width,
+                        unsigned int                   height)
+{
+       f->width = width;
+       f->height = height;
+
+       if (fmt->flags & FORMAT_FLAGS_PLANAR) {
+               f->bytesperline = width; /* Y plane */
+               f->sizeimage = (width * height * fmt->depth) >> 3;
+       } else {
+               f->bytesperline = (width * fmt->depth) >> 3;
+               f->sizeimage = height * f->bytesperline;
+       }
+}
+
 static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f)
 {
        switch (f->type) {
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
                memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format));
-               f->fmt.pix.width        = fh->width;
-               f->fmt.pix.height       = fh->height;
+               pix_format_set_size (&f->fmt.pix, fh->fmt,
+                                    fh->width, fh->height);
                f->fmt.pix.field        = fh->cap.field;
                f->fmt.pix.pixelformat  = fh->fmt->fourcc;
-               f->fmt.pix.bytesperline =
-                       (f->fmt.pix.width * fh->fmt->depth) >> 3;
-               f->fmt.pix.sizeimage =
-                       f->fmt.pix.height * f->fmt.pix.bytesperline;
                return 0;
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
                memset(&f->fmt.win,0,sizeof(struct v4l2_window));
@@ -2106,11 +2128,9 @@ static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv,
                        f->fmt.pix.width = maxw;
                if (f->fmt.pix.height > maxh)
                        f->fmt.pix.height = maxh;
-               f->fmt.pix.width &= ~0x03;
-               f->fmt.pix.bytesperline =
-                       (f->fmt.pix.width * fmt->depth) >> 3;
-               f->fmt.pix.sizeimage =
-                       f->fmt.pix.height * f->fmt.pix.bytesperline;
+               pix_format_set_size (&f->fmt.pix, fmt,
+                                    f->fmt.pix.width & ~3,
+                                    f->fmt.pix.height);
 
                return 0;
        }
@@ -2278,6 +2298,15 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
                        retval = -EINVAL;
                        goto fh_unlock_and_return;
                }
+               if (fmt->flags & FORMAT_FLAGS_RAW) {
+                       /* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL *
+                          RAW_LINES * 2. F1 is stored at offset 0, F2
+                          at buffer size / 2. */
+                       fh->width = RAW_BPL;
+                       fh->height = gbufsize / RAW_BPL;
+                       btv->init.width  = RAW_BPL;
+                       btv->init.height = gbufsize / RAW_BPL;
+               }
                fh->ovfmt   = fmt;
                fh->fmt     = fmt;
                btv->init.ovfmt   = fmt;
@@ -2589,9 +2618,11 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
 
                if (0 == v4l2)
                        return -EINVAL;
-               strcpy(cap->driver,"bttv");
-               strlcpy(cap->card,btv->video_dev->name,sizeof(cap->card));
-               sprintf(cap->bus_info,"PCI:%s",pci_name(btv->c.pci));
+               memset(cap, 0, sizeof (*cap));
+               strlcpy(cap->driver, "bttv", sizeof (cap->driver));
+               strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card));
+               snprintf(cap->bus_info, sizeof (cap->bus_info),
+                        "PCI:%s", pci_name(btv->c.pci));
                cap->version = BTTV_VERSION_CODE;
                cap->capabilities =
                        V4L2_CAP_VIDEO_CAPTURE |
@@ -2727,7 +2758,7 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
                        fh->ov.w.height = fb->fmt.height;
                        btv->init.ov.w.width  = fb->fmt.width;
                        btv->init.ov.w.height = fb->fmt.height;
-                       kfree(fh->ov.clips);
+                               kfree(fh->ov.clips);
                        fh->ov.clips = NULL;
                        fh->ov.nclips = 0;
 
@@ -2952,6 +2983,8 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait)
                        fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
                        field = videobuf_next_field(&fh->cap);
                        if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
+                               kfree (fh->cap.read_buf);
+                               fh->cap.read_buf = NULL;
                                up(&fh->cap.lock);
                                return POLLERR;
                        }
index 3aa9c6e4fc33b678dd0997cd58d63a8d0dcd7a49..1e6a5632c3c71a48ca479d69efdc4514376608d0 100644 (file)
@@ -45,6 +45,7 @@
 #include <media/tveeprom.h>
 #include <media/ir-common.h>
 
+
 #include "bt848.h"
 #include "bttv.h"
 #include "btcx-risc.h"
index 9774e94d1e7d94ae7e8a8eb46a7e72b936680e8d..1439cb752874c23ef5fdf265c73d136f4f4ba895 100644 (file)
@@ -582,7 +582,6 @@ MODULE_LICENSE("GPL");
 
 
 static struct usb_driver cpia_driver = {
-       .owner          = THIS_MODULE,
        .name           = "cpia",
        .probe          = cpia_probe,
        .disconnect     = cpia_disconnect,
index f6afeec499c509b1a692df5cf3d7353215945bb2..5b93723a1768ce664cabb7b8071b1cf459585fc4 100644 (file)
@@ -208,8 +208,11 @@ static void cx25840_initialize(struct i2c_client *client, int loadfw)
 
 static void input_change(struct i2c_client *client)
 {
+       struct cx25840_state *state = i2c_get_clientdata(client);
        v4l2_std_id std = cx25840_get_v4lstd(client);
 
+       /* Note: perhaps V4L2_STD_PAL_M should be handled as V4L2_STD_NTSC
+          instead of V4L2_STD_PAL. Someone needs to test this. */
        if (std & V4L2_STD_PAL) {
                /* Follow tuner change procedure for PAL */
                cx25840_write(client, 0x808, 0xff);
@@ -220,7 +223,32 @@ static void input_change(struct i2c_client *client)
                cx25840_write(client, 0x80b, 0x10);
        } else if (std & V4L2_STD_NTSC) {
                /* NTSC */
-               cx25840_write(client, 0x808, 0xf6);
+               if (state->cardtype == CARDTYPE_PVR150_WORKAROUND) {
+                       /* Certain Hauppauge PVR150 models have a hardware bug
+                          that causes audio to drop out. For these models the
+                          audio standard must be set explicitly.
+                          To be precise: it affects cards with tuner models
+                          85, 99 and 112 (model numbers from tveeprom). */
+                       if (std == V4L2_STD_NTSC_M_JP) {
+                               /* Japan uses EIAJ audio standard */
+                               cx25840_write(client, 0x808, 0x2f);
+                       } else {
+                               /* Others use the BTSC audio standard */
+                               cx25840_write(client, 0x808, 0x1f);
+                       }
+                       /* South Korea uses the A2-M (aka Zweiton M) audio
+                          standard, and should set 0x808 to 0x3f, but I don't
+                          know how to detect this. */
+               } else if (std == V4L2_STD_NTSC_M_JP) {
+                       /* Japan uses EIAJ audio standard */
+                       cx25840_write(client, 0x808, 0xf7);
+               } else {
+                       /* Others use the BTSC audio standard */
+                       cx25840_write(client, 0x808, 0xf6);
+               }
+               /* South Korea uses the A2-M (aka Zweiton M) audio standard,
+                  and should set 0x808 to 0xf8, but I don't know how to
+                  detect this. */
                cx25840_write(client, 0x80b, 0x00);
        }
 
@@ -241,7 +269,8 @@ static int set_input(struct i2c_client *client, enum cx25840_input input)
        case CX25840_TUNER:
                cx25840_dbg("now setting Tuner input\n");
 
-               if (state->cardtype == CARDTYPE_PVR150) {
+               if (state->cardtype == CARDTYPE_PVR150 ||
+                   state->cardtype == CARDTYPE_PVR150_WORKAROUND) {
                        /* CH_SEL_ADC2=1 */
                        cx25840_and_or(client, 0x102, ~0x2, 0x02);
                }
@@ -304,24 +333,30 @@ static int set_input(struct i2c_client *client, enum cx25840_input input)
 
 static int set_v4lstd(struct i2c_client *client, v4l2_std_id std)
 {
-       u8 fmt;
-
-       switch (std) {
-       /* zero is autodetect */
-       case 0: fmt = 0x0; break;
-       /* default ntsc to ntsc-m */
-       case V4L2_STD_NTSC:
-       case V4L2_STD_NTSC_M: fmt = 0x1; break;
-       case V4L2_STD_NTSC_M_JP: fmt = 0x2; break;
-       case V4L2_STD_NTSC_443: fmt = 0x3; break;
-       case V4L2_STD_PAL: fmt = 0x4; break;
-       case V4L2_STD_PAL_M: fmt = 0x5; break;
-       case V4L2_STD_PAL_N: fmt = 0x6; break;
-       case V4L2_STD_PAL_Nc: fmt = 0x7; break;
-       case V4L2_STD_PAL_60: fmt = 0x8; break;
-       case V4L2_STD_SECAM: fmt = 0xc; break;
-       default:
-               return -ERANGE;
+       u8 fmt=0;       /* zero is autodetect */
+
+       /* First tests should be against specific std */
+       if (std & V4L2_STD_NTSC_M_JP) {
+               fmt=0x2;
+       } else if (std & V4L2_STD_NTSC_443) {
+               fmt=0x3;
+       } else if (std & V4L2_STD_PAL_M) {
+               fmt=0x5;
+       } else if (std & V4L2_STD_PAL_N) {
+               fmt=0x6;
+       } else if (std & V4L2_STD_PAL_Nc) {
+               fmt=0x7;
+       } else if (std & V4L2_STD_PAL_60) {
+               fmt=0x8;
+       } else {
+               /* Then, test against generic ones */
+               if (std & V4L2_STD_NTSC) {
+                       fmt=0x1;
+               } else if (std & V4L2_STD_PAL) {
+                       fmt=0x4;
+               } else if (std & V4L2_STD_SECAM) {
+                       fmt=0xc;
+               }
        }
 
        cx25840_and_or(client, 0x400, ~0xf, fmt);
@@ -363,6 +398,7 @@ static int set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
        case CX25840_CID_CARDTYPE:
                switch (ctrl->value) {
                case CARDTYPE_PVR150:
+               case CARDTYPE_PVR150_WORKAROUND:
                case CARDTYPE_PG600:
                        state->cardtype = ctrl->value;
                        break;
@@ -714,7 +750,7 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
 
 /* ----------------------------------------------------------------------- */
 
-struct i2c_driver i2c_driver_cx25840;
+static struct i2c_driver i2c_driver_cx25840;
 
 static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
                                 int kind)
@@ -807,7 +843,7 @@ static int cx25840_detach_client(struct i2c_client *client)
 
 /* ----------------------------------------------------------------------- */
 
-struct i2c_driver i2c_driver_cx25840 = {
+static struct i2c_driver i2c_driver_cx25840 = {
        .name = "cx25840",
 
        .id = I2C_DRIVERID_CX25840,
index 5c3f0639fb779a4da987a9d6632cc7c5d59e0f62..4932ed1c9b199bcd74fe381d0c48dee2366e3817 100644 (file)
@@ -40,9 +40,16 @@ extern int cx25840_debug;
 
 #define CX25840_CID_CARDTYPE (V4L2_CID_PRIVATE_BASE+0)
 
+/* The CARDTYPE_PVR150_WORKAROUND cardtype activates a workaround for a
+   hardware bug that is present in PVR150 (and possible PVR500) cards that
+   have certain NTSC tuners (tveeprom model numbers 85, 99 and 112). The
+   audio autodetect fails on some channels for these models and the workaround
+   is to select the audio standard explicitly. Many thanks to Hauppauge for
+   providing this information. */
 enum cx25840_cardtype {
        CARDTYPE_PVR150,
-       CARDTYPE_PG600
+       CARDTYPE_PG600,
+       CARDTYPE_PVR150_WORKAROUND,
 };
 
 enum cx25840_input {
index 41818b6205b3b9cc02efafab549426307570d29f..85ba4106dc79456621e090da7aba453808b9f0d5 100644 (file)
@@ -46,8 +46,8 @@ config VIDEO_CX88_DVB_ALL_FRONTENDS
          If you are unsure, choose Y.
 
 config VIDEO_CX88_DVB_MT352
-       tristate "Zarlink MT352 DVB-T Support"
-       default m
+       bool "Zarlink MT352 DVB-T Support"
+       default y
        depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
        select DVB_MT352
        ---help---
@@ -55,8 +55,8 @@ config VIDEO_CX88_DVB_MT352
          Connexant 2388x chip and the MT352 demodulator.
 
 config VIDEO_CX88_DVB_OR51132
-       tristate "OR51132 ATSC Support"
-       default m
+       bool "OR51132 ATSC Support"
+       default y
        depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
        select DVB_OR51132
        ---help---
@@ -64,8 +64,8 @@ config VIDEO_CX88_DVB_OR51132
          Connexant 2388x chip and the OR51132 demodulator.
 
 config VIDEO_CX88_DVB_CX22702
-       tristate "Conexant CX22702 DVB-T Support"
-       default m
+       bool "Conexant CX22702 DVB-T Support"
+       default y
        depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
        select DVB_CX22702
        ---help---
@@ -73,8 +73,8 @@ config VIDEO_CX88_DVB_CX22702
          Connexant 2388x chip and the CX22702 demodulator.
 
 config VIDEO_CX88_DVB_LGDT330X
-       tristate "LG Electronics DT3302/DT3303 ATSC Support"
-       default m
+       bool "LG Electronics DT3302/DT3303 ATSC Support"
+       default y
        depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
        select DVB_LGDT330X
        ---help---
@@ -82,8 +82,8 @@ config VIDEO_CX88_DVB_LGDT330X
          Connexant 2388x chip and the LGDT3302/LGDT3303 demodulator.
 
 config VIDEO_CX88_DVB_NXT200X
-       tristate "NXT2002/NXT2004 ATSC Support"
-       default m
+       bool "NXT2002/NXT2004 ATSC Support"
+       default y
        depends on VIDEO_CX88_DVB && !VIDEO_CX88_DVB_ALL_FRONTENDS
        select DVB_NXT200X
        ---help---
index 0df40b7734548e99fccf79454bba870868a23680..54401b02b7ce75c13dfc24df48c3b85c8d9196a7 100644 (file)
@@ -9,21 +9,12 @@ obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o
 EXTRA_CFLAGS += -I$(src)/..
 EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
 EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
-ifneq ($(CONFIG_VIDEO_BUF_DVB),n)
- EXTRA_CFLAGS += -DHAVE_VIDEO_BUF_DVB=1
-endif
-ifneq ($(CONFIG_DVB_CX22702),n)
- EXTRA_CFLAGS += -DHAVE_CX22702=1
-endif
-ifneq ($(CONFIG_DVB_OR51132),n)
- EXTRA_CFLAGS += -DHAVE_OR51132=1
-endif
-ifneq ($(CONFIG_DVB_LGDT330X),n)
- EXTRA_CFLAGS += -DHAVE_LGDT330X=1
-endif
-ifneq ($(CONFIG_DVB_MT352),n)
- EXTRA_CFLAGS += -DHAVE_MT352=1
-endif
-ifneq ($(CONFIG_DVB_NXT200X),n)
- EXTRA_CFLAGS += -DHAVE_NXT200X=1
-endif
+
+extra-cflags-$(CONFIG_VIDEO_BUF_DVB) += -DHAVE_VIDEO_BUF_DVB=1
+extra-cflags-$(CONFIG_DVB_CX22702)   += -DHAVE_CX22702=1
+extra-cflags-$(CONFIG_DVB_OR51132)   += -DHAVE_OR51132=1
+extra-cflags-$(CONFIG_DVB_LGDT330X)  += -DHAVE_LGDT330X=1
+extra-cflags-$(CONFIG_DVB_MT352)     += -DHAVE_MT352=1
+extra-cflags-$(CONFIG_DVB_NXT200X)   += -DHAVE_NXT200X=1
+
+EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m)
index 4ae3f78cccf2f7fdc512eb38779e25ab003753e5..74e57a53116ff58d5b5bbecc9ad7f9ef3f977db8 100644 (file)
@@ -616,6 +616,8 @@ static int blackbird_load_firmware(struct cx8802_dev *dev)
 
        retval = request_firmware(&firmware, BLACKBIRD_FIRM_ENC_FILENAME,
                                  &dev->pci->dev);
+
+
        if (retval != 0) {
                dprintk(0, "ERROR: Hotplug firmware request failed (%s).\n",
                        BLACKBIRD_FIRM_ENC_FILENAME);
index f2268631b7c01246546cbfb26e53eb28031d9bbe..951709aa88ba37e77fe63f901162736f0306d300 100644 (file)
@@ -567,6 +567,7 @@ struct cx88_board cx88_boards[] = {
                .radio_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
+               .tda9887_conf   = TDA9887_PRESENT,
                .input          = {{
                        .type   = CX88_VMUX_TELEVISION,
                        .vmux   = 0,
@@ -711,6 +712,7 @@ struct cx88_board cx88_boards[] = {
                .radio_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
+               .tda9887_conf   = TDA9887_PRESENT,
                .input          = {{
                        .type   = CX88_VMUX_TELEVISION,
                        .vmux   = 0,
@@ -1083,41 +1085,28 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
        tveeprom_hauppauge_analog(&core->i2c_client, &tv, eeprom_data);
        core->tuner_type = tv.tuner_type;
        core->has_radio  = tv.has_radio;
-}
-
-static int hauppauge_eeprom_dvb(struct cx88_core *core, u8 *ee)
-{
-       int model;
-       int tuner;
 
        /* Make sure we support the board model */
-       model = ee[0x1f] << 24 | ee[0x1e] << 16 | ee[0x1d] << 8 | ee[0x1c];
-       switch(model) {
-       case 90002:
-       case 90500:
-       case 90501:
+       switch (tv.model)
+       {
+       case 90002: /* Nova-T-PCI (9002) */
+       case 92001: /* Nova-S-Plus (Video and IR) */
+       case 92002: /* Nova-S-Plus (Video and IR) */
+       case 90003: /* Nova-T-PCI (9002 No RF out) */
+       case 90500: /* Nova-T-PCI (oem) */
+       case 90501: /* Nova-T-PCI (oem/IR) */
+       case 92000: /* Nova-SE2 (OEM, No Video or IR) */
+
                /* known */
                break;
        default:
                printk("%s: warning: unknown hauppauge model #%d\n",
-                      core->name, model);
+                      core->name, tv.model);
                break;
        }
 
-       /* Make sure we support the tuner */
-       tuner = ee[0x2d];
-       switch(tuner) {
-       case 0x4B: /* dtt 7595 */
-       case 0x4C: /* dtt 7592 */
-               break;
-       default:
-               printk("%s: error: unknown hauppauge tuner 0x%02x\n",
-                      core->name, tuner);
-               return -ENODEV;
-       }
-       printk(KERN_INFO "%s: hauppauge eeprom: model=%d, tuner=%d\n",
-              core->name, model, tuner);
-       return 0;
+       printk(KERN_INFO "%s: hauppauge eeprom: model=%d\n",
+                       core->name, tv.model);
 }
 
 /* ----------------------------------------------------------------------- */
@@ -1201,7 +1190,7 @@ void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
 
 void cx88_card_setup(struct cx88_core *core)
 {
-       static u8 eeprom[128];
+       static u8 eeprom[256];
 
        if (0 == core->i2c_rc) {
                core->i2c_client.addr = 0xa0 >> 1;
@@ -1224,7 +1213,7 @@ void cx88_card_setup(struct cx88_core *core)
                break;
        case CX88_BOARD_HAUPPAUGE_DVB_T1:
                if (0 == core->i2c_rc)
-                       hauppauge_eeprom_dvb(core,eeprom);
+                       hauppauge_eeprom(core,eeprom);
                break;
        case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
        case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
index eb806af17182ad9c9489ff6008be4f8123f58021..bb6eb54e19ceddcb4726ee9dfc5117baa8c73ef1 100644 (file)
@@ -837,6 +837,29 @@ static int set_pll(struct cx88_core *core, int prescale, u32 ofreq)
        return -1;
 }
 
+int cx88_start_audio_dma(struct cx88_core *core)
+{
+       /* setup fifo + format */
+       cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], 128, 0);
+       cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], 128, 0);
+
+       cx_write(MO_AUDD_LNGTH,    128); /* fifo bpl size */
+       cx_write(MO_AUDR_LNGTH,    128); /* fifo bpl size */
+
+       /* start dma */
+       cx_write(MO_AUD_DMACNTRL, 0x0003); /* Up and Down fifo enable */
+
+       return 0;
+}
+
+int cx88_stop_audio_dma(struct cx88_core *core)
+{
+       /* stop dma */
+       cx_write(MO_AUD_DMACNTRL, 0x0000);
+
+       return 0;
+}
+
 static int set_tvaudio(struct cx88_core *core)
 {
        struct cx88_tvnorm *norm = core->tvnorm;
@@ -877,12 +900,16 @@ static int set_tvaudio(struct cx88_core *core)
        cx88_set_tvaudio(core);
        /* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */
 
-       cx_write(MO_AUDD_LNGTH,    128); /* fifo size */
-       cx_write(MO_AUDR_LNGTH,    128); /* fifo size */
-       cx_write(MO_AUD_DMACNTRL, 0x03); /* need audio fifo */
+/*
+   This should be needed only on cx88-alsa. It seems that some cx88 chips have
+   bugs and does require DMA enabled for it to work.
+ */
+       cx88_start_audio_dma(core);
        return 0;
 }
 
+
+
 int cx88_set_tvnorm(struct cx88_core *core, struct cx88_tvnorm *norm)
 {
        u32 fsc8;
@@ -1204,6 +1231,8 @@ EXPORT_SYMBOL(cx88_set_scale);
 EXPORT_SYMBOL(cx88_vdev_init);
 EXPORT_SYMBOL(cx88_core_get);
 EXPORT_SYMBOL(cx88_core_put);
+EXPORT_SYMBOL(cx88_start_audio_dma);
+EXPORT_SYMBOL(cx88_stop_audio_dma);
 
 /*
  * Local variables:
index 38b12ebaa49e0d4ac51e0a5ce2c3e997584d9c79..461019dca90101262f502c6dc44dcfea45882b27 100644 (file)
@@ -453,7 +453,6 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
                input_dev->id.product = pci->device;
        }
        input_dev->cdev.dev = &pci->dev;
-
        /* record handles to ourself */
        ir->core = core;
        core->ir = ir;
@@ -586,7 +585,6 @@ void cx88_ir_irq(struct cx88_core *core)
 MODULE_AUTHOR("Gerd Knorr, Pavel Machek, Chris Pascoe");
 MODULE_DESCRIPTION("input driver for cx88 GPIO-based IR remote controls");
 MODULE_LICENSE("GPL");
-
 /*
  * Local variables:
  * c-basic-offset: 8
index 6d9bec1c583b0ecfb03f28ae70af9c94fb01a238..a1b120c8a9b51f9adc4188f49c420b3b4dc44f8f 100644 (file)
@@ -119,13 +119,10 @@ static void set_audio_registers(struct cx88_core *core, const struct rlist *l)
 
 static void set_audio_start(struct cx88_core *core, u32 mode)
 {
-       // mute
+       /* mute */
        cx_write(AUD_VOL_CTL, (1 << 6));
 
-       // start programming
-       cx_write(MO_AUD_DMACNTRL, 0x0000);
-       msleep(100);
-       //cx_write(AUD_CTL, 0x0000);
+       /* start programming */
        cx_write(AUD_INIT, mode);
        cx_write(AUD_INIT_LD, 0x0001);
        cx_write(AUD_SOFT_RESET, 0x0001);
@@ -135,17 +132,21 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
 {
        u32 volume;
 
+       /* restart dma; This avoids buzz in NICAM and is good in others  */
+       cx88_stop_audio_dma(core);
+       cx_write(AUD_RATE_THRES_DMD, 0x000000C0);
+       cx88_start_audio_dma(core);
+
        if (cx88_boards[core->board].blackbird) {
-               // sets sound input from external adc
+               /* sets sound input from external adc */
                cx_set(AUD_CTL, EN_I2SIN_ENABLE);
-               //cx_write(AUD_I2SINPUTCNTL, 0);
                cx_write(AUD_I2SINPUTCNTL, 4);
                cx_write(AUD_BAUDRATE, 1);
-               // 'pass-thru mode': this enables the i2s output to the mpeg encoder
+               /* 'pass-thru mode': this enables the i2s output to the mpeg encoder */
                cx_set(AUD_CTL, EN_I2SOUT_ENABLE);
                cx_write(AUD_I2SOUTPUTCNTL, 1);
                cx_write(AUD_I2SCNTL, 0);
-               //cx_write(AUD_APB_IN_RATE_ADJ, 0);
+               /* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
        } else {
                ctl |= EN_DAC_ENABLE;
                cx_write(AUD_CTL, ctl);
@@ -153,7 +154,6 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
 
        /* finish programming */
        cx_write(AUD_SOFT_RESET, 0x0000);
-       cx_write(MO_AUD_DMACNTRL, 0x0003);
 
        /* unmute */
        volume = cx_sread(SHADOW_AUD_VOL_CTL);
@@ -313,7 +313,6 @@ static void set_audio_standard_NICAM(struct cx88_core *core, u32 mode)
                {AUD_RATE_ADJ3, 0x00000100},
                {AUD_RATE_ADJ4, 0x00000400},
                {AUD_RATE_ADJ5, 0x00001000},
-               //{ AUD_DMD_RA_DDS,        0x00c0d5ce },
                {AUD_ERRLOGPERIOD_R, 0x00000fff},
                {AUD_ERRINTRPTTHSHLD1_R, 0x000003ff},
                {AUD_ERRINTRPTTHSHLD2_R, 0x000000ff},
@@ -351,12 +350,12 @@ static void set_audio_standard_NICAM(struct cx88_core *core, u32 mode)
                set_audio_registers(core, nicam_l);
                break;
        case WW_I:
-               dprintk("%s PAL-I NICAM (status: devel)\n", __FUNCTION__);
+               dprintk("%s PAL-I NICAM (status: known-good)\n", __FUNCTION__);
                set_audio_registers(core, nicam_bgdki_common);
                set_audio_registers(core, nicam_i);
                break;
        default:
-               dprintk("%s PAL-BGDK NICAM (status: unknown)\n", __FUNCTION__);
+               dprintk("%s PAL-BGDK NICAM (status: known-good)\n", __FUNCTION__);
                set_audio_registers(core, nicam_bgdki_common);
                set_audio_registers(core, nicam_default);
                break;
@@ -715,8 +714,7 @@ int cx88_detect_nicam(struct cx88_core *core)
                /* if bit1=1 then nicam is detected */
                j += ((cx_read(AUD_NICAM_STATUS2) & 0x02) >> 1);
 
-               /* 3x detected: absolutly sure now */
-               if (j == 3) {
+               if (j == 1) {
                        dprintk("nicam is detected.\n");
                        return 1;
                }
index b19d3a9e22981889dd6bc05aaa77faed5f1e6ab2..77beafc5c32764c81d67f89bdf3cfd784935a842 100644 (file)
@@ -411,7 +411,6 @@ struct cx8802_dev {
        struct videobuf_dvb        dvb;
        void*                      fe_handle;
        int                        (*fe_release)(void *handle);
-
        /* for switching modulation types */
        unsigned char              ts_gen_cntrl;
 
@@ -491,6 +490,10 @@ extern struct cx88_core* cx88_core_get(struct pci_dev *pci);
 extern void cx88_core_put(struct cx88_core *core,
                          struct pci_dev *pci);
 
+extern int cx88_start_audio_dma(struct cx88_core *core);
+extern int cx88_stop_audio_dma(struct cx88_core *core);
+
+
 /* ----------------------------------------------------------- */
 /* cx88-vbi.c                                                  */
 
index d54bc0127484547f4908bd3695da352e35b5b947..0cfe75416ec64a7af3242ccec6e8e4722796f35a 100644 (file)
@@ -32,7 +32,7 @@
 
 /* #define ENABLE_DEBUG_ISOC_FRAMES */
 
-unsigned int core_debug;
+static unsigned int core_debug;
 module_param(core_debug,int,0644);
 MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
 
@@ -41,7 +41,7 @@ MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
                printk(KERN_INFO "%s %s :"fmt, \
                         dev->name, __FUNCTION__ , ##arg); } while (0)
 
-unsigned int reg_debug;
+static unsigned int reg_debug;
 module_param(reg_debug,int,0644);
 MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");
 
@@ -50,7 +50,7 @@ MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");
                printk(KERN_INFO "%s %s :"fmt, \
                         dev->name, __FUNCTION__ , ##arg); } while (0)
 
-unsigned int isoc_debug;
+static unsigned int isoc_debug;
 module_param(isoc_debug,int,0644);
 MODULE_PARM_DESC(isoc_debug,"enable debug messages [isoc transfers]");
 
@@ -116,47 +116,6 @@ void em28xx_print_ioctl(char *name, unsigned int cmd)
        }
 }
 
-static void *rvmalloc(size_t size)
-{
-       void *mem;
-       unsigned long adr;
-
-       size = PAGE_ALIGN(size);
-
-       mem = vmalloc_32((unsigned long)size);
-       if (!mem)
-               return NULL;
-
-       memset(mem, 0, size);
-
-       adr = (unsigned long)mem;
-       while (size > 0) {
-               SetPageReserved(vmalloc_to_page((void *)adr));
-               adr += PAGE_SIZE;
-               size -= PAGE_SIZE;
-       }
-
-       return mem;
-}
-
-static void rvfree(void *mem, size_t size)
-{
-       unsigned long adr;
-
-       if (!mem)
-               return;
-
-       size = PAGE_ALIGN(size);
-
-       adr = (unsigned long)mem;
-       while (size > 0) {
-               ClearPageReserved(vmalloc_to_page((void *)adr));
-               adr += PAGE_SIZE;
-               size -= PAGE_SIZE;
-       }
-
-       vfree(mem);
-}
 
 /*
  * em28xx_request_buffers()
@@ -167,14 +126,16 @@ u32 em28xx_request_buffers(struct em28xx *dev, u32 count)
        const size_t imagesize = PAGE_ALIGN(dev->frame_size);   /*needs to be page aligned cause the buffers can be mapped individually! */
        void *buff = NULL;
        u32 i;
-       em28xx_coredbg("requested %i buffers with size %i", count, imagesize);
+       em28xx_coredbg("requested %i buffers with size %zd", count, imagesize);
        if (count > EM28XX_NUM_FRAMES)
                count = EM28XX_NUM_FRAMES;
 
        dev->num_frames = count;
        while (dev->num_frames > 0) {
-               if ((buff = rvmalloc(dev->num_frames * imagesize)))
+               if ((buff = vmalloc_32(dev->num_frames * imagesize))) {
+                       memset(buff, 0, dev->num_frames * imagesize);
                        break;
+               }
                dev->num_frames--;
        }
 
@@ -217,8 +178,7 @@ void em28xx_queue_unusedframes(struct em28xx *dev)
 void em28xx_release_buffers(struct em28xx *dev)
 {
        if (dev->num_frames) {
-               rvfree(dev->frame[0].bufmem,
-                      dev->num_frames * PAGE_ALIGN(dev->frame[0].buf.length));
+               vfree(dev->frame[0].bufmem);
                dev->num_frames = 0;
        }
 }
index b32d9852f34c556b97d961b1c20a36b907edb24c..7f5603054f02b7eaf17b5bebee6355cd9df8b00b 100644 (file)
@@ -41,7 +41,7 @@ module_param(i2c_debug, int, 0644);
 MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
 
 #define dprintk1(lvl,fmt, args...) if (i2c_debug>=lvl) do {\
-                       printk(fmt , ##args); } while (0)
+                       printk(fmt, ##args); } while (0)
 #define dprintk2(lvl,fmt, args...) if (i2c_debug>=lvl) do{ \
                        printk(KERN_DEBUG "%s at %s: " fmt, \
                        dev->name, __FUNCTION__ , ##args); } while (0)
index 57c1826b928ef2b35c6379f149cba7c194c4e4ff..3a56120397aeb45791f36fe23fd14480ca64c84a 100644 (file)
@@ -189,16 +189,6 @@ static DECLARE_RWSEM(em28xx_disconnect);
 
 /*********************  v4l2 interface  ******************************************/
 
-static inline unsigned long kvirt_to_pa(unsigned long adr)
-{
-       unsigned long kva, ret;
-
-       kva = (unsigned long)page_address(vmalloc_to_page((void *)adr));
-       kva |= adr & (PAGE_SIZE - 1);
-       ret = __pa(kva);
-       return ret;
-}
-
 /*
  * em28xx_config()
  * inits registers with sane defaults
@@ -226,7 +216,7 @@ static int em28xx_config(struct em28xx *dev)
  * em28xx_config_i2c()
  * configure i2c attached devices
  */
-void em28xx_config_i2c(struct em28xx *dev)
+static void em28xx_config_i2c(struct em28xx *dev)
 {
        struct v4l2_frequency f;
        struct video_decoder_init em28xx_vdi = {.data = NULL };
@@ -616,7 +606,8 @@ static struct vm_operations_struct em28xx_vm_ops = {
 static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
 {
        unsigned long size = vma->vm_end - vma->vm_start,
-           start = vma->vm_start, pos, page;
+           start = vma->vm_start;
+       void *pos;
        u32 i;
 
        struct em28xx *dev = filp->private_data;
@@ -657,12 +648,10 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
        vma->vm_flags |= VM_IO;
        vma->vm_flags |= VM_RESERVED;   /* avoid to swap out this VMA */
 
-       pos = (unsigned long)dev->frame[i].bufmem;
+       pos = dev->frame[i].bufmem;
        while (size > 0) {      /* size is page-aligned */
-               page = vmalloc_to_pfn((void *)pos);
-               if (remap_pfn_range(vma, start, page, PAGE_SIZE,
-                                   vma->vm_page_prot)) {
-                       em28xx_videodbg("mmap: rename page map failed\n");
+               if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
+                       em28xx_videodbg("mmap: vm_insert_page failed\n");
                        up(&dev->fileop_lock);
                        return -EAGAIN;
                }
@@ -1895,7 +1884,6 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
 }
 
 static struct usb_driver em28xx_usb_driver = {
-       .owner = THIS_MODULE,
        .name = "em28xx",
        .probe = em28xx_usb_probe,
        .disconnect = em28xx_usb_disconnect,
index 5abfc0fbf6de984b6473b990afd5a6ac9280fb66..de1385e5d05ecce6871247c9cffe648a7a1bf0e3 100644 (file)
@@ -291,13 +291,12 @@ struct IR {
        u32                     mask_keycode;
        u32                     mask_keydown;
        u32                     mask_keyup;
-       u32                     polling;
+       u32                     polling;
        u32                     last_gpio;
        struct work_struct      work;
        struct timer_list       timer;
 
        /* RC5 gpio */
-
        u32 rc5_gpio;
        struct timer_list timer_end;    /* timer_end for code completion */
        struct timer_list timer_keyup;  /* timer_end for key release */
@@ -647,7 +646,7 @@ static int ir_probe(struct device *dev)
                driver.any_irq = ir_rc5_irq;
                driver.gpio_irq = NULL;
                ir->rc5_gpio = 1;
-                break;
+               break;
        }
        if (NULL == ir_codes) {
                kfree(ir);
@@ -657,7 +656,7 @@ static int ir_probe(struct device *dev)
 
        if (ir->rc5_gpio) {
                u32 gpio;
-               /* enable remote irq */
+               /* enable remote irq */
                bttv_gpio_inout(sub->core, (1 << 4), 1 << 4);
                gpio = bttv_gpio_read(sub->core);
                bttv_gpio_write(sub->core, gpio & ~(1 << 4));
@@ -673,7 +672,6 @@ static int ir_probe(struct device *dev)
        snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
                 pci_name(sub->core->pci));
 
-       ir->sub = sub;
        ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
        input_dev->name = ir->name;
        input_dev->phys = ir->phys;
@@ -688,6 +686,9 @@ static int ir_probe(struct device *dev)
        }
        input_dev->cdev.dev = &sub->core->pci->dev;
 
+       ir->input = input_dev;
+       ir->sub = sub;
+
        if (ir->polling) {
                INIT_WORK(&ir->work, ir_work, ir);
                init_timer(&ir->timer);
@@ -708,7 +709,6 @@ static int ir_probe(struct device *dev)
        /* all done */
        dev_set_drvdata(dev, ir);
        input_register_device(ir->input);
-       printk(DEVNAME ": %s detected at %s\n",ir->name,ir->phys);
 
        /* the remote isn't as bouncy as a keyboard */
        ir->input->rep[REP_DELAY] = repeat_delay;
@@ -725,6 +725,7 @@ static int ir_remove(struct device *dev)
                del_timer(&ir->timer);
                flush_scheduled_work();
        }
+
        if (ir->rc5_gpio) {
                u32 gpio;
 
index 801c736e9328a5c1368db10b7bd4318d4b738525..740e543311af8c1930c8161332cc6a98395d8b59 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/i2c.h>
 #include <linux/workqueue.h>
 #include <asm/semaphore.h>
+
 #include <media/ir-common.h>
 #include <media/ir-kbd-i2c.h>
 
@@ -278,7 +279,7 @@ static int ir_probe(struct i2c_adapter *adap);
 
 static struct i2c_driver driver = {
        .name           = "ir remote kbd driver",
-       .id             = I2C_DRIVERID_EXP3, /* FIXME */
+       .id             = I2C_DRIVERID_INFRARED,
        .flags          = I2C_DF_NOTIFY,
        .attach_adapter = ir_probe,
        .detach_client  = ir_detach,
@@ -296,15 +297,15 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
        IR_KEYTAB_TYPE *ir_codes = NULL;
        char *name;
        int ir_type;
-        struct IR_i2c *ir;
+       struct IR_i2c *ir;
        struct input_dev *input_dev;
 
-       ir = kzalloc(sizeof(struct IR_i2c), GFP_KERNEL);
+       ir = kzalloc(sizeof(struct IR_i2c),GFP_KERNEL);
        input_dev = input_allocate_device();
        if (!ir || !input_dev) {
                kfree(ir);
                input_free_device(input_dev);
-                return -ENOMEM;
+               return -ENOMEM;
        }
 
        ir->c = client_template;
@@ -360,7 +361,7 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
        /* register i2c device
         * At device register, IR codes may be changed to be
         * board dependent.
-       */
+        */
        i2c_attach_client(&ir->c);
 
        /* If IR not supported or disabled, unregisters driver */
index a23fb0338986c553aa70ababe45d0bbc5051825f..d86f8e92e53413f60e0e64e575d33b0b87d9011f 100644 (file)
@@ -134,7 +134,7 @@ struct msp3400c {
        int rxsubchans;
 
        int muted;
-       int left, right;        /* volume */
+       int left, right;        /* volume */
        int bass, treble;
 
        /* shadow register set */
@@ -882,6 +882,7 @@ static void watch_stereo(struct i2c_client *client)
                msp->watch_stereo = 0;
 }
 
+
 static int msp3400c_thread(void *data)
 {
        struct i2c_client *client = data;
@@ -889,6 +890,7 @@ static int msp3400c_thread(void *data)
        struct CARRIER_DETECT *cd;
        int count, max1,max2,val1,val2, val,this;
 
+
        msp3400_info("msp3400 daemon started\n");
        for (;;) {
                msp3400_dbg_mediumvol("msp3400 thread: sleep\n");
@@ -1162,6 +1164,7 @@ static int msp3410d_thread(void *data)
        int mode,val,i,std;
 
        msp3400_info("msp3410 daemon started\n");
+
        for (;;) {
                msp3400_dbg_mediumvol("msp3410 thread: sleep\n");
                msp34xx_sleep(msp,-1);
@@ -1384,6 +1387,7 @@ static int msp34xxg_thread(void *data)
        int val, std, i;
 
        msp3400_info("msp34xxg daemon started\n");
+
        msp->source = 1; /* default */
        for (;;) {
                msp3400_dbg_mediumvol("msp34xxg thread: sleep\n");
@@ -1559,11 +1563,11 @@ static void msp_wake_thread(struct i2c_client *client);
 static struct i2c_driver driver = {
        .owner          = THIS_MODULE,
        .name           = "msp3400",
-        .id             = I2C_DRIVERID_MSP3400,
-        .flags          = I2C_DF_NOTIFY,
-        .attach_adapter = msp_probe,
-        .detach_client  = msp_detach,
-        .command        = msp_command,
+       .id             = I2C_DRIVERID_MSP3400,
+       .flags          = I2C_DF_NOTIFY,
+       .attach_adapter = msp_probe,
+       .detach_client  = msp_detach,
+       .command        = msp_command,
        .driver = {
                .suspend = msp_suspend,
                .resume  = msp_resume,
@@ -1574,7 +1578,7 @@ static struct i2c_client client_template =
 {
        .name      = "(unset)",
        .flags     = I2C_CLIENT_ALLOW_USE,
-        .driver    = &driver,
+       .driver    = &driver,
 };
 
 static int msp_attach(struct i2c_adapter *adap, int addr, int kind)
index dca3ddfd510fa0aa92170cbe788985fc2d5e08c0..923322503e8fb5441ea5f94d55448ba3cfa88f57 100644 (file)
@@ -422,7 +422,6 @@ static int saa6588_attach(struct i2c_adapter *adap, int addr, int kind)
        s->timer.function = saa6588_timer;
        s->timer.data = (unsigned long)s;
        schedule_work(&s->work);
-
        return 0;
 }
 
index 0235cef07b310a59f1cd0d482daeaed3c56d33f6..e717e30d8187e5cc5927534c147f598589ea1b48 100644 (file)
@@ -771,17 +771,19 @@ static v4l2_std_id saa7115_get_v4lstd(struct i2c_client *client)
 
 static void saa7115_log_status(struct i2c_client *client)
 {
-       static const char * const audclk_freq_strs[] = {
-               "44.1 kHz",
-               "48 kHz",
-               "32 kHz"
-       };
        struct saa7115_state *state = i2c_get_clientdata(client);
+       char *audfreq = "undefined";
        int reg1e, reg1f;
        int signalOk;
        int vcr;
 
-       saa7115_info("Audio frequency: %s\n", audclk_freq_strs[state->audclk_freq]);
+       switch (state->audclk_freq) {
+               case V4L2_AUDCLK_32_KHZ:  audfreq = "32 kHz"; break;
+               case V4L2_AUDCLK_441_KHZ: audfreq = "44.1 kHz"; break;
+               case V4L2_AUDCLK_48_KHZ:  audfreq = "48 kHz"; break;
+       }
+
+       saa7115_info("Audio frequency: %s\n", audfreq);
        if (client->name[6] == '4') {
                /* status for the saa7114 */
                reg1f = saa7115_read(client, 0x1f);
index 25b30f352d84103564e661dca26d6580e5a2afe3..31f7b950b01cef303553dbaf5bf45f9e3019e566 100644 (file)
@@ -59,7 +59,7 @@ MODULE_PARM_DESC(debug, " Set the default Debug level.  Default: 0 (Off) - (0-1)
 #define dprintk(num, format, args...) \
        do { \
                if (debug >= num) \
-                       printk(format , ##args); \
+                       printk(format, ##args); \
        } while (0)
 
 /* ----------------------------------------------------------------------- */
@@ -323,7 +323,7 @@ saa711x_command (struct i2c_client *client,
 
                case VIDEO_MODE_SECAM:
                        saa711x_write(client, 0x08,
-                                     (decoder->reg[0x0e] & 0x3f) | 0x00);
+                                     (decoder->reg[0x08] & 0x3f) | 0x00);
                        saa711x_write(client, 0x0e,
                                      (decoder->reg[0x0e] & 0x8f) | 0x50);
                        break;
index 843431f10e3bf8d1fcdf20c8d0638d0df7b733b7..c36f014f1fdf21bb63c78521608e64e36a60d251 100644 (file)
@@ -223,7 +223,7 @@ static const struct i2c_reg_value saa7127_init_config_60hz[] = {
 };
 
 #define SAA7127_50HZ_DAC_CONTROL 0x02
-struct i2c_reg_value saa7127_init_config_50hz[] = {
+static struct i2c_reg_value saa7127_init_config_50hz[] = {
        { SAA7127_REG_BURST_START,                      0x21 },
        /* BURST_END is also used as a chip ID in saa7127_detect_client */
        { SAA7127_REG_BURST_END,                        0x1d },
@@ -389,7 +389,7 @@ static int saa7127_set_vps(struct i2c_client *client, struct v4l2_sliced_vbi_dat
 static int saa7127_set_cc(struct i2c_client *client, struct v4l2_sliced_vbi_data *data)
 {
        struct saa7127_state *state = i2c_get_clientdata(client);
-       u16 cc = data->data[0] << 8 | data->data[1];
+       u16 cc = data->data[1] << 8 | data->data[0];
        int enable = (data->line != 0);
 
        if (enable && (data->field != 0 || data->line != 21))
@@ -397,7 +397,7 @@ static int saa7127_set_cc(struct i2c_client *client, struct v4l2_sliced_vbi_data
        if (state->cc_enable != enable) {
                saa7127_dbg("Turn CC %s\n", enable ? "on" : "off");
                saa7127_write(client, SAA7127_REG_CLOSED_CAPTION,
-                               (enable << 6) | 0x11);
+                               (state->xds_enable << 7) | (enable << 6) | 0x11);
                state->cc_enable = enable;
        }
        if (!enable)
@@ -423,7 +423,7 @@ static int saa7127_set_xds(struct i2c_client *client, struct v4l2_sliced_vbi_dat
        if (state->xds_enable != enable) {
                saa7127_dbg("Turn XDS %s\n", enable ? "on" : "off");
                saa7127_write(client, SAA7127_REG_CLOSED_CAPTION,
-                               (enable << 7) | 0x11);
+                               (enable << 7) | (state->cc_enable << 6) | 0x11);
                state->xds_enable = enable;
        }
        if (!enable)
@@ -696,7 +696,7 @@ static int saa7127_command(struct i2c_client *client,
 
 /* ----------------------------------------------------------------------- */
 
-struct i2c_driver i2c_driver_saa7127;
+static struct i2c_driver i2c_driver_saa7127;
 
 /* ----------------------------------------------------------------------- */
 
@@ -818,7 +818,7 @@ static int saa7127_detach(struct i2c_client *client)
 
 /* ----------------------------------------------------------------------- */
 
-struct i2c_driver i2c_driver_saa7127 = {
+static struct i2c_driver i2c_driver_saa7127 = {
        .name = "saa7127",
        .id = I2C_DRIVERID_SAA7127,
        .flags = I2C_DF_NOTIFY,
index 7bdeabe638cacef344f30fc933fbb9b1fe6c95c7..8a5c3e71b37d193be112f9da6f65f6c38d0c98ff 100644 (file)
@@ -1,11 +1,10 @@
 config VIDEO_SAA7134
        tristate "Philips SAA7134 support"
-       depends on VIDEO_DEV && PCI && I2C && SOUND && SND
+       depends on VIDEO_DEV && PCI && I2C
        select VIDEO_BUF
        select VIDEO_IR
        select VIDEO_TUNER
        select CRC32
-       select SND_PCM_OSS
        ---help---
          This is a video4linux driver for Philips SAA713x based
          TV cards.
@@ -13,6 +12,29 @@ config VIDEO_SAA7134
          To compile this driver as a module, choose M here: the
          module will be called saa7134.
 
+config VIDEO_SAA7134_ALSA
+       tristate "Philips SAA7134 DMA audio support"
+       depends on VIDEO_SAA7134 && SND
+       select SND_PCM_OSS
+       ---help---
+         This is a video4linux driver for direct (DMA) audio in
+         Philips SAA713x based TV cards using ALSA
+
+         To compile this driver as a module, choose M here: the
+         module will be called saa7134-alsa.
+
+config VIDEO_SAA7134_OSS
+       tristate "Philips SAA7134 DMA audio support (OSS, DEPRECATED)"
+       depends on VIDEO_SAA7134 && SOUND_PRIME && !VIDEO_SAA7134_ALSA
+       ---help---
+         This is a video4linux driver for direct (DMA) audio in
+         Philips SAA713x based TV cards using OSS
+
+         This is deprecated in favor of the ALSA module
+
+         To compile this driver as a module, choose M here: the
+         module will be called saa7134-oss.
+
 config VIDEO_SAA7134_DVB
        tristate "DVB/ATSC Support for saa7134 based TV cards"
        depends on VIDEO_SAA7134 && DVB_CORE
@@ -42,8 +64,8 @@ config VIDEO_SAA7134_DVB_ALL_FRONTENDS
          If you are unsure, choose Y.
 
 config VIDEO_SAA7134_DVB_MT352
-       tristate "Zarlink MT352 DVB-T Support"
-       default m
+       bool "Zarlink MT352 DVB-T Support"
+       default y
        depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
        select DVB_MT352
        ---help---
@@ -51,8 +73,8 @@ config VIDEO_SAA7134_DVB_MT352
          Philips saa7134 chip and the MT352 demodulator.
 
 config VIDEO_SAA7134_DVB_TDA1004X
-       tristate "Phillips TDA10045H/TDA10046H DVB-T Support"
-       default m
+       bool "Phillips TDA10045H/TDA10046H DVB-T Support"
+       default y
        depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
        select DVB_TDA1004X
        ---help---
@@ -60,8 +82,8 @@ config VIDEO_SAA7134_DVB_TDA1004X
          Philips saa7134 chip and the TDA10045H/TDA10046H demodulator.
 
 config VIDEO_SAA7134_DVB_NXT200X
-       tristate "NXT2002/NXT2004 ATSC Support"
-       default m
+       bool "NXT2002/NXT2004 ATSC Support"
+       default y
        depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
        select DVB_NXT200X
        ---help---
index 4226b61cc613a60d5a67ebdb5851aac26ee06619..1ba998424bbdcb376fbf6901028f765031aa1e32 100644 (file)
@@ -4,22 +4,20 @@ saa7134-objs :=       saa7134-cards.o saa7134-core.o saa7134-i2c.o    \
                saa7134-video.o saa7134-input.o
 
 obj-$(CONFIG_VIDEO_SAA7134) +=  saa7134.o saa7134-empress.o \
-                               saa6752hs.o saa7134-alsa.o \
-                               saa7134-oss.o
+                               saa6752hs.o
+
+obj-$(CONFIG_VIDEO_SAA7134_ALSA) += saa7134-alsa.o
+obj-$(CONFIG_VIDEO_SAA7134_OSS) += saa7134-oss.o
+
 obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o
 
 EXTRA_CFLAGS += -I$(src)/..
 EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
 EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
-ifneq ($(CONFIG_VIDEO_BUF_DVB),n)
- EXTRA_CFLAGS += -DHAVE_VIDEO_BUF_DVB=1
-endif
-ifneq ($(CONFIG_DVB_MT352),n)
- EXTRA_CFLAGS += -DHAVE_MT352=1
-endif
-ifneq ($(CONFIG_DVB_TDA1004X),n)
- EXTRA_CFLAGS += -DHAVE_TDA1004X=1
-endif
-ifneq ($(CONFIG_DVB_NXT200X),n)
- EXTRA_CFLAGS += -DHAVE_NXT200X=1
-endif
+
+extra-cflags-$(CONFIG_VIDEO_BUF_DVB) += -DHAVE_VIDEO_BUF_DVB=1
+extra-cflags-$(CONFIG_DVB_MT352)     += -DHAVE_MT352=1
+extra-cflags-$(CONFIG_DVB_TDA1004X)  += -DHAVE_TDA1004X=1
+extra-cflags-$(CONFIG_DVB_NXT200X)   += -DHAVE_NXT200X=1
+
+EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m)
index cdd1ed9c80658d358ebcad24de73fdb79112b0c4..a61d24f588f7007b7173bd6965cd57fa9decda7a 100644 (file)
@@ -523,7 +523,8 @@ static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind)
        h->standard = 0;
 
        i2c_set_clientdata(&h->client, h);
-        i2c_attach_client(&h->client);
+       i2c_attach_client(&h->client);
+
        return 0;
 }
 
@@ -597,19 +598,19 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
 
 static struct i2c_driver driver = {
        .owner          = THIS_MODULE,
-        .name           = "i2c saa6752hs MPEG encoder",
-        .id             = I2C_DRIVERID_SAA6752HS,
-        .flags          = I2C_DF_NOTIFY,
-        .attach_adapter = saa6752hs_probe,
-        .detach_client  = saa6752hs_detach,
-        .command        = saa6752hs_command,
+       .name           = "i2c saa6752hs MPEG encoder",
+       .id             = I2C_DRIVERID_SAA6752HS,
+       .flags          = I2C_DF_NOTIFY,
+       .attach_adapter = saa6752hs_probe,
+       .detach_client  = saa6752hs_detach,
+       .command        = saa6752hs_command,
 };
 
 static struct i2c_client client_template =
 {
        .name       = "saa6752hs",
        .flags      = I2C_CLIENT_ALLOW_USE,
-        .driver     = &driver,
+       .driver     = &driver,
 };
 
 static int __init saa6752hs_init_module(void)
index 5707c666660b724c592ea170cdea7a03186d0e81..ade05f75fdb05d2c23165c42091913ca56f67859 100644 (file)
@@ -51,6 +51,7 @@ MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
 #define MIXER_ADDR_LINE2       2
 #define MIXER_ADDR_LAST                2
 
+
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;     /* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;      /* ID for this card */
 static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
@@ -58,14 +59,15 @@ static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
 module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
 
-int position;
-
 #define dprintk(fmt, arg...)    if (debug) \
-        printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg)
+       printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ##arg)
+
+
 
 /*
  * Main chip structure
  */
+
 typedef struct snd_card_saa7134 {
        snd_card_t *card;
        spinlock_t mixer_lock;
@@ -140,7 +142,8 @@ static void saa7134_dma_start(struct saa7134_dev *dev)
  *
  */
 
-void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
+static void saa7134_irq_alsa_done(struct saa7134_dev *dev,
+                                 unsigned long status)
 {
        int next_blk, reg = 0;
 
@@ -209,8 +212,8 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
 
 static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
-        struct saa7134_dmasound *dmasound = dev_id;
-        struct saa7134_dev *dev = dmasound->priv_data;
+       struct saa7134_dmasound *dmasound = dev_id;
+       struct saa7134_dev *dev = dmasound->priv_data;
 
        unsigned long report, status;
        int loop, handled = 0;
@@ -881,7 +884,7 @@ static void snd_saa7134_free(snd_card_t * card)
  *
  */
 
-int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
+static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
 {
 
        snd_card_t *card;
@@ -945,6 +948,8 @@ int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
        sprintf(card->longname, "%s at 0x%lx irq %d",
                chip->dev->name, chip->iobase, chip->irq);
 
+       printk(KERN_INFO "%s/alsa: %s registered as card %d\n",dev->name,card->longname,index[devnum]);
+
        if ((err = snd_card_register(card)) == 0) {
                snd_saa7134_cards[devnum] = card;
                return 0;
@@ -955,6 +960,22 @@ __nodev:
        return err;
 }
 
+
+static int alsa_device_init(struct saa7134_dev *dev)
+{
+       dev->dmasound.priv_data = dev;
+       alsa_card_saa7134_create(dev,dev->nr);
+       return 1;
+}
+
+static int alsa_device_exit(struct saa7134_dev *dev)
+{
+
+       snd_card_free(snd_saa7134_cards[dev->nr]);
+       snd_saa7134_cards[dev->nr] = NULL;
+       return 1;
+}
+
 /*
  * Module initializer
  *
@@ -968,16 +989,20 @@ static int saa7134_alsa_init(void)
        struct saa7134_dev *dev = NULL;
        struct list_head *list;
 
-       position = 0;
+       if (!dmasound_init && !dmasound_exit) {
+               dmasound_init = alsa_device_init;
+               dmasound_exit = alsa_device_exit;
+       } else {
+               printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
+               return -EBUSY;
+       }
 
-        printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
+       printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
 
        list_for_each(list,&saa7134_devlist) {
                dev = list_entry(list, struct saa7134_dev, devlist);
                if (dev->dmasound.priv_data == NULL) {
-                       dev->dmasound.priv_data = dev;
-                       alsa_card_saa7134_create(dev,position);
-                       position++;
+                       alsa_device_init(dev);
                } else {
                        printk(KERN_ERR "saa7134 ALSA: DMA sound is being handled by OSS. ignoring %s\n",dev->name);
                        return -EBUSY;
@@ -988,13 +1013,14 @@ static int saa7134_alsa_init(void)
                printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");
 
        return 0;
+
 }
 
 /*
  * Module destructor
  */
 
-void saa7134_alsa_exit(void)
+static void saa7134_alsa_exit(void)
 {
        int idx;
 
@@ -1002,12 +1028,18 @@ void saa7134_alsa_exit(void)
                snd_card_free(snd_saa7134_cards[idx]);
        }
 
+       dmasound_init = NULL;
+       dmasound_exit = NULL;
        printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
 
        return;
 }
 
-module_init(saa7134_alsa_init);
+/* We initialize this late, to make sure the sound system is up and running */
+late_initcall(saa7134_alsa_init);
 module_exit(saa7134_alsa_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Ricardo Cerqueira");
+
+
+
index 75abc20b0ccdbdabd0fa69474df09eaaf69adf61..672fb205959f8b21be1f6dc45c4635b8e6907d9e 100644 (file)
@@ -976,7 +976,7 @@ struct saa7134_board saa7134_boards[] = {
                .radio_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
-               .tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
+               .tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_ACTIVE,
                .inputs         = {{
                        .name = name_tv,
                        .vmux = 3,
index 4275d2ddb8640af1e02e83b803ba917b5eda0cb1..23d8747338edee3e11dfb0d8d37ea04645f21cb9 100644 (file)
@@ -71,6 +71,7 @@ static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 static unsigned int tuner[]    = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 static unsigned int card[]     = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
 
+
 module_param_array(video_nr, int, NULL, 0444);
 module_param_array(vbi_nr,   int, NULL, 0444);
 module_param_array(radio_nr, int, NULL, 0444);
@@ -88,6 +89,9 @@ LIST_HEAD(saa7134_devlist);
 static LIST_HEAD(mops_list);
 static unsigned int saa7134_devcount;
 
+int (*dmasound_init)(struct saa7134_dev *dev);
+int (*dmasound_exit)(struct saa7134_dev *dev);
+
 #define dprintk(fmt, arg...)   if (core_debug) \
        printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
 
@@ -184,8 +188,7 @@ void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
 /* ----------------------------------------------------------- */
 /* delayed request_module                                      */
 
-#ifdef CONFIG_MODULES
-
+#if defined(CONFIG_MODULES) && defined(MODULE)
 static int need_empress;
 static int need_dvb;
 static int need_alsa;
@@ -234,9 +237,7 @@ static void request_module_depend(char *name, int *flag)
 }
 
 #else
-
 #define request_module_depend(name,flag)
-
 #endif /* CONFIG_MODULES */
 
 /* ------------------------------------------------------------------ */
@@ -1017,6 +1018,10 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        /* check for signal */
        saa7134_irq_video_intl(dev);
 
+       if (dmasound_init && !dev->dmasound.priv_data) {
+               dmasound_init(dev);
+       }
+
        return 0;
 
  fail4:
@@ -1040,6 +1045,11 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
        struct list_head *item;
        struct saa7134_mpeg_ops *mops;
 
+       /* Release DMA sound modules if present */
+       if (dmasound_exit && dev->dmasound.priv_data) {
+               dmasound_exit(dev);
+       }
+
        /* debugging ... */
        if (irq_debug) {
                u32 report = saa_readl(SAA7134_IRQ_REPORT);
@@ -1071,6 +1081,7 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
        saa7134_i2c_unregister(dev);
        saa7134_unregister_video(dev);
 
+
        /* the DMA sound modules should be unloaded before reaching
           this, but just in case they are still present... */
        if (dev->dmasound.priv_data != NULL) {
@@ -1078,6 +1089,7 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
                dev->dmasound.priv_data = NULL;
        }
 
+
        /* release resources */
        free_irq(pci_dev->irq, dev);
        iounmap(dev->lmmio);
@@ -1149,10 +1161,10 @@ static int saa7134_init(void)
 
 static void saa7134_fini(void)
 {
-#ifdef CONFIG_MODULES
+#if defined(CONFIG_MODULES) && defined(MODULE)
        if (pending_registered)
                unregister_module_notifier(&pending_notifier);
-#endif
+#endif /* CONFIG_MODULES */
        pci_unregister_driver(&saa7134_pci_driver);
 }
 
@@ -1168,6 +1180,8 @@ EXPORT_SYMBOL(saa7134_boards);
 
 /* ----------------- for the DMA sound modules --------------- */
 
+EXPORT_SYMBOL(dmasound_init);
+EXPORT_SYMBOL(dmasound_exit);
 EXPORT_SYMBOL(saa7134_pgtable_free);
 EXPORT_SYMBOL(saa7134_pgtable_build);
 EXPORT_SYMBOL(saa7134_pgtable_alloc);
index e9ec69efb4c92052f4cc90f8ad8ff152324b38e6..575f3e835f91e102aaba4a9719191f4c6cbd1ca8 100644 (file)
@@ -36,6 +36,7 @@ MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
 MODULE_LICENSE("GPL");
 
 static unsigned int empress_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
+
 module_param_array(empress_nr, int, NULL, 0444);
 MODULE_PARM_DESC(empress_nr,"ts device number");
 
index 7575043f0874985c6a38f00c2b9c85c2891098b6..df9dd36721e0a633a56122c89f5471d8dda6599e 100644 (file)
@@ -333,7 +333,7 @@ static int attach_inform(struct i2c_client *client)
        struct tuner_setup tun_setup;
 
        d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
-                client->driver->name, client->addr, client->name);
+               client->driver->name, client->addr, client->name);
 
        /* Am I an i2c remote control? */
 
index e648cc3bc96d33220527a7bd409034370ae72e4c..ab75ca5ac356b16862b0957f9a85d56dd5f650b4 100644 (file)
@@ -713,6 +713,8 @@ int saa7134_input_init1(struct saa7134_dev *dev)
                return -ENOMEM;
        }
 
+       ir->dev = input_dev;
+
        /* init hardware-specific stuff */
        ir->mask_keycode = mask_keycode;
        ir->mask_keydown = mask_keydown;
index fd9ed11ab1e29c844649803003ce8dc01e8b3794..8badd2a9cb2ff08d1e5fe07661999c245e6708eb 100644 (file)
@@ -782,36 +782,36 @@ struct file_operations saa7134_mixer_fops = {
 
 static irqreturn_t saa7134_oss_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
-        struct saa7134_dmasound *dmasound = dev_id;
-        struct saa7134_dev *dev = dmasound->priv_data;
-        unsigned long report, status;
-        int loop, handled = 0;
-
-        for (loop = 0; loop < 10; loop++) {
-                report = saa_readl(SAA7134_IRQ_REPORT);
-                status = saa_readl(SAA7134_IRQ_STATUS);
-
-                if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
-                        handled = 1;
-                        saa_writel(SAA7134_IRQ_REPORT,report);
-                        saa7134_irq_oss_done(dev, status);
-                } else {
-                        goto out;
-                }
-        }
-
-        if (loop == 10) {
-                dprintk("error! looping IRQ!");
-        }
+       struct saa7134_dmasound *dmasound = dev_id;
+       struct saa7134_dev *dev = dmasound->priv_data;
+       unsigned long report, status;
+       int loop, handled = 0;
+
+       for (loop = 0; loop < 10; loop++) {
+               report = saa_readl(SAA7134_IRQ_REPORT);
+               status = saa_readl(SAA7134_IRQ_STATUS);
+
+               if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
+                       handled = 1;
+                       saa_writel(SAA7134_IRQ_REPORT,report);
+                       saa7134_irq_oss_done(dev, status);
+               } else {
+                       goto out;
+               }
+       }
+
+       if (loop == 10) {
+               dprintk("error! looping IRQ!");
+       }
 out:
-        return IRQ_RETVAL(handled);
+       return IRQ_RETVAL(handled);
 }
 
 int saa7134_oss_init1(struct saa7134_dev *dev)
 {
 
-        if ((request_irq(dev->pci->irq, saa7134_oss_irq,
-                         SA_SHIRQ | SA_INTERRUPT, dev->name,
+       if ((request_irq(dev->pci->irq, saa7134_oss_irq,
+                        SA_SHIRQ | SA_INTERRUPT, dev->name,
                        (void*) &dev->dmasound)) < 0)
                return -1;
 
@@ -899,94 +899,120 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
        spin_unlock(&dev->slock);
 }
 
-int saa7134_dsp_create(struct saa7134_dev *dev)
+static int saa7134_dsp_create(struct saa7134_dev *dev)
 {
        int err;
 
-                        err = dev->dmasound.minor_dsp =
-                                register_sound_dsp(&saa7134_dsp_fops,
-                                                   dsp_nr[dev->nr]);
-                        if (err < 0) {
-                                goto fail;
-                        }
-                        printk(KERN_INFO "%s: registered device dsp%d\n",
-                               dev->name,dev->dmasound.minor_dsp >> 4);
-
-                        err = dev->dmasound.minor_mixer =
-                                register_sound_mixer(&saa7134_mixer_fops,
-                                                     mixer_nr[dev->nr]);
-                        if (err < 0)
-                                goto fail;
-                        printk(KERN_INFO "%s: registered device mixer%d\n",
-                               dev->name,dev->dmasound.minor_mixer >> 4);
+       err = dev->dmasound.minor_dsp =
+               register_sound_dsp(&saa7134_dsp_fops,
+                                  dsp_nr[dev->nr]);
+       if (err < 0) {
+               goto fail;
+       }
+       printk(KERN_INFO "%s: registered device dsp%d\n",
+              dev->name,dev->dmasound.minor_dsp >> 4);
+
+       err = dev->dmasound.minor_mixer =
+               register_sound_mixer(&saa7134_mixer_fops,
+                                    mixer_nr[dev->nr]);
+       if (err < 0)
+               goto fail;
+       printk(KERN_INFO "%s: registered device mixer%d\n",
+              dev->name,dev->dmasound.minor_mixer >> 4);
 
        return 0;
 
 fail:
-        unregister_sound_dsp(dev->dmasound.minor_dsp);
+       unregister_sound_dsp(dev->dmasound.minor_dsp);
        return 0;
 
 
 }
 
+static int oss_device_init(struct saa7134_dev *dev)
+{
+       dev->dmasound.priv_data = dev;
+       saa7134_oss_init1(dev);
+       saa7134_dsp_create(dev);
+       return 1;
+}
+
+static int oss_device_exit(struct saa7134_dev *dev)
+{
+
+       unregister_sound_mixer(dev->dmasound.minor_mixer);
+       unregister_sound_dsp(dev->dmasound.minor_dsp);
+
+       saa7134_oss_fini(dev);
+
+       if (dev->pci->irq > 0) {
+               synchronize_irq(dev->pci->irq);
+               free_irq(dev->pci->irq,&dev->dmasound);
+       }
+
+       dev->dmasound.priv_data = NULL;
+       return 1;
+}
+
 static int saa7134_oss_init(void)
 {
-        struct saa7134_dev *dev = NULL;
-        struct list_head *list;
+       struct saa7134_dev *dev = NULL;
+       struct list_head *list;
+
+       if (!dmasound_init && !dmasound_exit) {
+               dmasound_init = oss_device_init;
+               dmasound_exit = oss_device_exit;
+       } else {
+               printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
+               return -EBUSY;
+       }
 
-        printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n");
+       printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n");
 
-        list_for_each(list,&saa7134_devlist) {
-                dev = list_entry(list, struct saa7134_dev, devlist);
+
+       list_for_each(list,&saa7134_devlist) {
+               dev = list_entry(list, struct saa7134_dev, devlist);
                if (dev->dmasound.priv_data == NULL) {
-                       dev->dmasound.priv_data = dev;
-                       saa7134_oss_init1(dev);
-                       saa7134_dsp_create(dev);
+                       oss_device_init(dev);
                } else {
-                       printk(KERN_ERR "saa7134 OSS: DMA sound is being handled by ALSA, ignoring %s\n",dev->name);
+                       printk(KERN_ERR "saa7134 OSS: DMA sound is being handled by ALSA, ignoring %s\n",dev->name);
                        return -EBUSY;
                }
-        }
+       }
 
-        if (dev == NULL)
-                printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n");
+       if (dev == NULL)
+               printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n");
 
-        return 0;
+       return 0;
 
 }
 
-void saa7134_oss_exit(void)
+static void saa7134_oss_exit(void)
 {
-        struct saa7134_dev *dev = NULL;
-        struct list_head *list;
+       struct saa7134_dev *dev = NULL;
+       struct list_head *list;
 
-        list_for_each(list,&saa7134_devlist) {
-                dev = list_entry(list, struct saa7134_dev, devlist);
+       list_for_each(list,&saa7134_devlist) {
+               dev = list_entry(list, struct saa7134_dev, devlist);
 
                /* Device isn't registered by OSS, probably ALSA's */
                if (!dev->dmasound.minor_dsp)
                        continue;
 
-                unregister_sound_mixer(dev->dmasound.minor_mixer);
-                unregister_sound_dsp(dev->dmasound.minor_dsp);
+               oss_device_exit(dev);
 
-               saa7134_oss_fini(dev);
-
-               if (dev->pci->irq > 0) {
-                       synchronize_irq(dev->pci->irq);
-                       free_irq(dev->pci->irq,&dev->dmasound);
-               }
-
-               dev->dmasound.priv_data = NULL;
+       }
 
-        }
+       dmasound_init = NULL;
+       dmasound_exit = NULL;
 
-        printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
+       printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
 
-        return;
+       return;
 }
 
-module_init(saa7134_oss_init);
+/* We initialize this late, to make sure the sound system is up and running */
+late_initcall(saa7134_oss_init);
 module_exit(saa7134_oss_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
index 244e1973081cc2e8ca64de7638ec218423f504c0..add49db1ad41130d9d39408cdcd8975ff0f9c869 100644 (file)
@@ -571,6 +571,10 @@ void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf);
 
 int saa7134_set_dmabits(struct saa7134_dev *dev);
 
+extern int (*dmasound_init)(struct saa7134_dev *dev);
+extern int (*dmasound_exit)(struct saa7134_dev *dev);
+
+
 /* ----------------------------------------------------------- */
 /* saa7134-cards.c                                             */
 
index 4249127c0a1d67c3b144f63f31888caa0609ed05..2f2414e90e8bbe4bb47c22d803355e2ffacde92e 100644 (file)
@@ -12,6 +12,7 @@
 #include <media/audiochip.h>
 #include <media/tuner.h>
 
+
 /* Chips:
    TDA9885 (PAL, NTSC)
    TDA9886 (PAL, SECAM, NTSC)
@@ -819,12 +820,12 @@ static int tda9887_resume(struct device * dev)
 
 static struct i2c_driver driver = {
        .owner          = THIS_MODULE,
-        .name           = "i2c tda9887 driver",
-        .id             = -1, /* FIXME */
-        .flags          = I2C_DF_NOTIFY,
-        .attach_adapter = tda9887_probe,
-        .detach_client  = tda9887_detach,
-        .command        = tda9887_command,
+       .name           = "i2c tda9887 driver",
+       .id             = -1, /* FIXME */
+       .flags          = I2C_DF_NOTIFY,
+       .attach_adapter = tda9887_probe,
+       .detach_client  = tda9887_detach,
+       .command        = tda9887_command,
        .driver = {
                .suspend = tda9887_suspend,
                .resume  = tda9887_resume,
@@ -834,7 +835,7 @@ static struct i2c_client client_template =
 {
        .name      = "tda9887",
        .flags     = I2C_CLIENT_ALLOW_USE,
-        .driver    = &driver,
+       .driver    = &driver,
 };
 
 static int __init tda9887_init_module(void)
index c31bf28b73fe707bb4154639545cc24731a3aa15..5b20e8177cad4942cb21d47d956570d46735c5ed 100644 (file)
@@ -188,7 +188,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
                buffer[1] = val;
                if (2 != i2c_master_send(&chip->c,buffer,2)) {
                        tvaudio_warn("%s: I/O error (write reg%d=0x%x)\n",
-                                               chip->c.name, subaddr, val);
+                       chip->c.name, subaddr, val);
                        return -1;
                }
        }
@@ -216,7 +216,7 @@ static int chip_read(struct CHIPSTATE *chip)
                chip->c.name);
                return -1;
        }
-       tvaudio_dbg("%s: chip_read: 0x%x\n",chip->c.name,buffer);
+       tvaudio_dbg("%s: chip_read: 0x%x\n",chip->c.name, buffer);
        return buffer;
 }
 
@@ -235,7 +235,7 @@ static int chip_read2(struct CHIPSTATE *chip, int subaddr)
                return -1;
        }
        tvaudio_dbg("%s: chip_read2: reg%d=0x%x\n",
-                       chip->c.name,subaddr,read[0]);
+               chip->c.name, subaddr,read[0]);
        return read[0];
 }
 
@@ -248,7 +248,7 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd)
 
        /* update our shadow register set; print bytes if (debug > 0) */
        tvaudio_dbg("%s: chip_cmd(%s): reg=%d, data:",
-               chip->c.name,name,cmd->bytes[0]);
+               chip->c.name, name,cmd->bytes[0]);
        for (i = 1; i < cmd->count; i++) {
                if (debug)
                        printk(" 0x%x",cmd->bytes[i]);
@@ -322,7 +322,7 @@ static void generic_checkmode(struct CHIPSTATE *chip)
        int mode = desc->getmode(chip);
 
        if (mode == chip->prevmode)
-               return;
+       return;
 
        tvaudio_dbg("%s: thread checkmode\n", chip->c.name);
        chip->prevmode = mode;
@@ -1506,18 +1506,18 @@ static int chip_attach(struct i2c_adapter *adap, int addr, int kind)
                return -EIO;
        }
        tvaudio_info("%s found @ 0x%x (%s)\n", desc->name, addr<<1, adap->name);
-        if (desc->flags) {
-                tvaudio_dbg("matches:%s%s%s.\n",
-                        (desc->flags & CHIP_HAS_VOLUME)     ? " volume"      : "",
-                        (desc->flags & CHIP_HAS_BASSTREBLE) ? " bass/treble" : "",
-                        (desc->flags & CHIP_HAS_INPUTSEL)   ? " audiomux"    : "");
-        }
+       if (desc->flags) {
+               tvaudio_dbg("matches:%s%s%s.\n",
+                       (desc->flags & CHIP_HAS_VOLUME)     ? " volume"      : "",
+                       (desc->flags & CHIP_HAS_BASSTREBLE) ? " bass/treble" : "",
+                       (desc->flags & CHIP_HAS_INPUTSEL)   ? " audiomux"    : "");
+       }
 
        /* fill required data structures */
-       strcpy(chip->c.name,desc->name);
+       strcpy(chip->c.name, desc->name);
        chip->type = desc-chiplist;
        chip->shadow.count = desc->registers+1;
-        chip->prevmode = -1;
+       chip->prevmode = -1;
        /* register */
        i2c_attach_client(&chip->c);
 
@@ -1604,7 +1604,7 @@ static int chip_command(struct i2c_client *client,
        struct CHIPSTATE *chip = i2c_get_clientdata(client);
        struct CHIPDESC  *desc = chiplist + chip->type;
 
-       tvaudio_dbg("%s: chip_command 0x%x\n",chip->c.name,cmd);
+       tvaudio_dbg("%s: chip_command 0x%x\n", chip->c.name, cmd);
 
        switch (cmd) {
        case AUDC_SET_INPUT:
@@ -1624,7 +1624,7 @@ static int chip_command(struct i2c_client *client,
 
        /* --- v4l ioctls --- */
        /* take care: bttv does userspace copying, we'll get a
-                                       kernel pointer here... */
+       kernel pointer here... */
        case VIDIOCGAUDIO:
        {
                struct video_audio *va = arg;
index 72e8741e8b595e2d4817b056ff1c87c21ab7c158..5ac235365dd810b2a59f42e74b302685c546f22d 100644 (file)
@@ -81,7 +81,7 @@ hauppauge_tuner_fmt[] =
        { 0x00000010, " PAL(I)" },
        { 0x00400000, " SECAM(L/L')" },
        { 0x00000e00, " PAL(D/K)" },
-       { 0x03000000, " ATSC Digital" },
+       { 0x03000000, " ATSC/DVB Digital" },
 };
 
 /* This is the full list of possible tuners. Many thanks to Hauppauge for
@@ -206,16 +206,30 @@ hauppauge_tuner[] =
        { TUNER_ABSENT,        "TCL 2002MI_3H"},
        { TUNER_TCL_2002N,     "TCL 2002N 5H"},
        /* 100-109 */
-       { TUNER_ABSENT,        "Philips FMD1216ME"},
+       { TUNER_PHILIPS_FMD1216ME_MK3, "Philips FMD1216ME"},
        { TUNER_TEA5767,       "Philips TEA5768HL FM Radio"},
        { TUNER_ABSENT,        "Panasonic ENV57H12D5"},
-       { TUNER_ABSENT,        "TCL MFNM05-4"},
+       { TUNER_PHILIPS_FM1236_MK3, "TCL MFNM05-4"},
        { TUNER_ABSENT,        "TCL MNM05-4"},
        { TUNER_PHILIPS_FM1216ME_MK3, "TCL MPE05-2"},
        { TUNER_ABSENT,        "TCL MQNM05-4"},
        { TUNER_ABSENT,        "LG TAPC-W701D"},
        { TUNER_ABSENT,        "TCL 9886P-WM"},
        { TUNER_ABSENT,        "TCL 1676NM-WM"},
+       /* 110-119 */
+       { TUNER_ABSENT,        "Thompson DTT75105"},
+       { TUNER_ABSENT,        "Conexant_CX24109"},
+       { TUNER_ABSENT,        "TCL M2523_5N_E"},
+       { TUNER_ABSENT,        "TCL M2523_3DB_E"},
+       { TUNER_ABSENT,        "Philips 8275A"},
+       { TUNER_ABSENT,        "Microtune MT2060"},
+       { TUNER_ABSENT,        "Philips FM1236 MK5"},
+       { TUNER_ABSENT,        "Philips FM1216ME MK5"},
+       { TUNER_ABSENT,        "TCL M2523_3DI_E"},
+       { TUNER_ABSENT,        "Samsung THPD5222FG30A"},
+       /* 120-129 */
+       { TUNER_ABSENT,        "Xceive XC3028"},
+       { TUNER_ABSENT,        "Philips FQ1216LME MK5"},
 };
 
 static struct HAUPPAUGE_AUDIOIC
@@ -325,6 +339,7 @@ static int hasRadioTuner(int tunerType)
                case 78: //PNPEnv_TUNER_TDA8275C1_8290_FM:
                case 89: //PNPEnv_TUNER_TCL_MFPE05_2:
                case 92: //PNPEnv_TUNER_PHILIPS_FQ1236A_MK4:
+               case 105:
                return 1;
        }
        return 0;
@@ -368,10 +383,15 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
        memset(tvee, 0, sizeof(*tvee));
        done = len = beenhere = 0;
 
-       /* Hack for processing eeprom for em28xx */
-       if ((eeprom_data[0]==0x1a)&&(eeprom_data[1]==0xeb)&&
-                               (eeprom_data[2]==0x67)&&(eeprom_data[3]==0x95))
-               start=0xa0;
+       /* Hack for processing eeprom for em28xx and cx 2388x*/
+       if ((eeprom_data[0] == 0x1a) && (eeprom_data[1] == 0xeb) &&
+                       (eeprom_data[2] == 0x67) && (eeprom_data[3] == 0x95))
+               start=0xa0; /* Generic em28xx offset */
+       else if (((eeprom_data[0] & 0xf0) == 0x10) &&
+                                       (eeprom_data[1] == 0x00) &&
+                                       (eeprom_data[2] == 0x00) &&
+                                       (eeprom_data[8] == 0x84))
+               start=8; /* Generic cx2388x offset */
        else
                start=0;
 
@@ -448,6 +468,17 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
                                eeprom_data[i+5] +
                                (eeprom_data[i+6] << 8) +
                                (eeprom_data[i+7] << 16);
+
+                               if ( (eeprom_data[i + 8] && 0xf0) &&
+                                       (tvee->serial_number < 0xffffff) ) {
+                                       tvee->MAC_address[0] = 0x00;
+                                       tvee->MAC_address[1] = 0x0D;
+                                       tvee->MAC_address[2] = 0xFE;
+                                       tvee->MAC_address[3] = eeprom_data[i + 7];
+                                       tvee->MAC_address[4] = eeprom_data[i + 6];
+                                       tvee->MAC_address[5] = eeprom_data[i + 5];
+                                       tvee->has_MAC_address = 1;
+                               }
                        break;
 
                case 0x05:
@@ -466,11 +497,14 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
                case 0x06:
                        /* tag 'ModelRev' */
                        tvee->model =
-                               eeprom_data[i+1] +
-                               (eeprom_data[i+2] << 8);
-                       tvee->revision = eeprom_data[i+5] +
-                               (eeprom_data[i+6] << 8) +
-                               (eeprom_data[i+7] << 16);
+                               eeprom_data[i + 1] +
+                               (eeprom_data[i + 2] << 8) +
+                               (eeprom_data[i + 3] << 16) +
+                               (eeprom_data[i + 4] << 24);
+                       tvee->revision =
+                               eeprom_data[i +5 ] +
+                               (eeprom_data[i + 6] << 8) +
+                               (eeprom_data[i + 7] << 16);
                        break;
 
                case 0x07:
@@ -563,6 +597,8 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
                t_name2 = "unknown";
        }
 
+       tvee->tuner_hauppauge_model = tuner1;
+       tvee->tuner2_hauppauge_model = tuner2;
        tvee->tuner_formats = 0;
        tvee->tuner2_formats = 0;
        for (i = j = 0; i < 8; i++) {
@@ -578,6 +614,12 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
 
        tveeprom_info("Hauppauge model %d, rev %s, serial# %d\n",
                tvee->model, tvee->rev_str, tvee->serial_number);
+       if (tvee->has_MAC_address == 1) {
+               tveeprom_info("MAC address is %02X-%02X-%02X-%02X-%02X-%02X\n",
+                       tvee->MAC_address[0], tvee->MAC_address[1],
+                       tvee->MAC_address[2], tvee->MAC_address[3],
+                       tvee->MAC_address[4], tvee->MAC_address[5]);
+       }
        tveeprom_info("tuner model is %s (idx %d, type %d)\n",
                t_name1, tuner1, tvee->tuner_type);
        tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
@@ -711,7 +753,8 @@ tveeprom_detect_client(struct i2c_adapter *adapter,
        client->driver = &i2c_driver_tveeprom;
        client->flags = I2C_CLIENT_ALLOW_USE;
        snprintf(client->name, sizeof(client->name), "tveeprom");
-        i2c_attach_client(client);
+       i2c_attach_client(client);
+
        return 0;
 }
 
index 81e6d4494e7dc95bff0ad37d29e81aac8e28194d..97431e26d22905707be2fae0216d3ab30af06e82 100644 (file)
@@ -31,7 +31,7 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
 #define dprintk(num, format, args...) \
        do { \
                if (debug >= num) \
-                       printk(format , ##args); \
+                       printk(format, ##args); \
        } while (0)
 
 /* supported controls */
@@ -770,7 +770,6 @@ static int tvp5150_detect_client(struct i2c_adapter *adapter,
 
        if (debug > 1)
                dump_reg(client);
-
        return 0;
 }
 
index 55f129e964eb6d91716c681ab845f892c4d1a45a..0a4004a4393c7cf3af7c4f4c013c64b9cdb96633 100644 (file)
@@ -13,6 +13,7 @@
  * (at your option) any later version.
  */
 
+
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/device.h>
@@ -247,3 +248,4 @@ EXPORT_SYMBOL(videobuf_dvb_unregister);
  * compile-command: "make DVB=1"
  * End:
  */
+
index acfd3a103f35ccdfa6cf31c44877d1f217262679..9a6bf287e26ae629497aa0e9c3c206281e817a41 100644 (file)
@@ -753,10 +753,9 @@ videobuf_read_zerocopy(struct videobuf_queue *q, char __user *data,
        int retval;
 
        /* setup stuff */
-       retval = -ENOMEM;
        q->read_buf = videobuf_alloc(q->msize);
        if (NULL == q->read_buf)
-               goto done;
+               return -ENOMEM;
 
        q->read_buf->memory = V4L2_MEMORY_USERPTR;
        q->read_buf->baddr  = (unsigned long)data;
@@ -817,10 +816,14 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
                if (NULL == q->read_buf)
                        goto done;
                q->read_buf->memory = V4L2_MEMORY_USERPTR;
+               q->read_buf->bsize = count; /* preferred size */
                field = videobuf_next_field(q);
                retval = q->ops->buf_prepare(q,q->read_buf,field);
-               if (0 != retval)
+               if (0 != retval) {
+                       kfree (q->read_buf);
+                       q->read_buf = NULL;
                        goto done;
+               }
                spin_lock_irqsave(q->irqlock,flags);
                q->ops->buf_queue(q,q->read_buf);
                spin_unlock_irqrestore(q->irqlock,flags);
index 83c49f9610d0b0bff75209c556eed46062f01d70..6de5b0094b8253bd4a0b1dafc4822f43a1d1f982 100644 (file)
@@ -76,14 +76,14 @@ static void video_release(struct class_device *cd)
 }
 
 static struct class video_class = {
-        .name    = VIDEO_NAME,
+       .name    = VIDEO_NAME,
        .release = video_release,
 };
 
 /*
- *     Active devices 
+ *     Active devices
  */
+
 static struct video_device *video_device[VIDEO_NUM_DEVICES];
 static DECLARE_MUTEX(videodev_lock);
 
@@ -101,7 +101,7 @@ static int video_open(struct inode *inode, struct file *file)
        int err = 0;
        struct video_device *vfl;
        struct file_operations *old_fops;
-       
+
        if(minor>=VIDEO_NUM_DEVICES)
                return -ENODEV;
        down(&videodev_lock);
@@ -189,7 +189,7 @@ video_usercopy(struct inode *inode, struct file *file,
                                return -ENOMEM;
                        parg = mbuf;
                }
-               
+
                err = -EFAULT;
                if (_IOC_DIR(cmd) & _IOC_WRITE)
                        if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
@@ -240,7 +240,7 @@ int video_exclusive_open(struct inode *inode, struct file *file)
 int video_exclusive_release(struct inode *inode, struct file *file)
 {
        struct  video_device *vfl = video_devdata(file);
-       
+
        vfl->users--;
        return 0;
 }
@@ -253,7 +253,7 @@ static struct file_operations video_fops;
  *     @type: type of device to register
  *     @nr:   which device number (0 == /dev/video0, 1 == /dev/video1, ...
  *             -1 == first free)
- *     
+ *
  *     The registration code assigns minor numbers based on the type
  *     requested. -ENFILE is returned in all the device slots for this
  *     category are full. If not then the minor field is set and the
@@ -269,7 +269,7 @@ static struct file_operations video_fops;
  *
  *     %VFL_TYPE_VBI - Vertical blank data (undecoded)
  *
- *     %VFL_TYPE_RADIO - A radio card  
+ *     %VFL_TYPE_RADIO - A radio card
  */
 
 int video_register_device(struct video_device *vfd, int type, int nr)
@@ -278,7 +278,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
        int base;
        int end;
        char *name_base;
-       
+
        switch(type)
        {
                case VFL_TYPE_GRABBER:
@@ -293,7 +293,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
                        break;
                case VFL_TYPE_VBI:
                        base=224;
-                       end=240;
+                       end=256;
                        name_base = "vbi";
                        break;
                case VFL_TYPE_RADIO:
@@ -334,7 +334,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
        init_MUTEX(&vfd->lock);
 
        /* sysfs class */
-        memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));
+       memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));
        if (vfd->dev)
                vfd->class_dev.dev = vfd->dev;
        vfd->class_dev.class       = &video_class;
@@ -360,7 +360,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
  *     This unregisters the passed device and deassigns the minor
  *     number. Future open calls will be met with errors.
  */
+
 void video_unregister_device(struct video_device *vfd)
 {
        down(&videodev_lock);
@@ -384,7 +384,7 @@ static struct file_operations video_fops=
 /*
  *     Initialise video for linux
  */
+
 static int __init videodev_init(void)
 {
        int ret;
index 74022316fc63403392c7783ac13fc8226e098ceb..537836068c493736d1efc7a3139974d16faeacc1 100644 (file)
@@ -91,9 +91,9 @@ static int mfcounter = 0;
  *  Public data...
  */
 int mpt_lan_index = -1;
-static int mpt_stm_index = -1;
+int mpt_stm_index = -1;
 
-static struct proc_dir_entry *mpt_proc_root_dir;
+struct proc_dir_entry *mpt_proc_root_dir;
 
 #define WHOINIT_UNKNOWN                0xAA
 
@@ -313,13 +313,13 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
                u32      log_info = le32_to_cpu(mr->u.reply.IOCLogInfo);
                if (ioc->bus_type == FC)
                        mpt_fc_log_info(ioc, log_info);
-               else if (ioc->bus_type == SCSI)
+               else if (ioc->bus_type == SPI)
                        mpt_sp_log_info(ioc, log_info);
                else if (ioc->bus_type == SAS)
                        mpt_sas_log_info(ioc, log_info);
        }
        if (ioc_stat & MPI_IOCSTATUS_MASK) {
-               if (ioc->bus_type == SCSI &&
+               if (ioc->bus_type == SPI &&
                    cb_idx != mpt_stm_index &&
                    cb_idx != mpt_lan_index)
                        mpt_sp_ioc_info(ioc, (u32)ioc_stat, mf);
@@ -1118,6 +1118,65 @@ mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)
        return -1;
 }
 
+int
+mpt_alt_ioc_wait(MPT_ADAPTER *ioc)
+{
+       int loop_count = 30 * 4;  /* Wait 30 seconds */
+       int status = -1; /* -1 means failed to get board READY */
+
+       do {
+               spin_lock(&ioc->initializing_hba_lock);
+               if (ioc->initializing_hba_lock_flag == 0) {
+                       ioc->initializing_hba_lock_flag=1;
+                       spin_unlock(&ioc->initializing_hba_lock);
+                       status = 0;
+                       break;
+               }
+               spin_unlock(&ioc->initializing_hba_lock);
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(HZ/4);
+       } while (--loop_count);
+
+       return status;
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+ *     mpt_bringup_adapter - This is a wrapper function for mpt_do_ioc_recovery
+ *     @ioc: Pointer to MPT adapter structure
+ *     @sleepFlag: Use schedule if CAN_SLEEP else use udelay.
+ *
+ *     This routine performs all the steps necessary to bring the IOC
+ *     to a OPERATIONAL state.
+ *
+ *      Special Note: This function was added with spin lock's so as to allow
+ *      the dv(domain validation) work thread to succeed on the other channel
+ *      that maybe occuring at the same time when this function is called.
+ *      Without this lock, the dv would fail when message frames were
+ *      requested during hba bringup on the alternate ioc.
+ */
+static int
+mpt_bringup_adapter(MPT_ADAPTER *ioc, int sleepFlag)
+{
+       int r;
+
+       if(ioc->alt_ioc) {
+               if((r=mpt_alt_ioc_wait(ioc->alt_ioc)!=0))
+                       return r;
+       }
+
+       r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP,
+           CAN_SLEEP);
+
+       if(ioc->alt_ioc) {
+               spin_lock(&ioc->alt_ioc->initializing_hba_lock);
+               ioc->alt_ioc->initializing_hba_lock_flag=0;
+               spin_unlock(&ioc->alt_ioc->initializing_hba_lock);
+       }
+
+return r;
+}
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *     mpt_attach - Install a PCI intelligent MPT adapter.
@@ -1186,6 +1245,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
        ioc->pcidev = pdev;
        ioc->diagPending = 0;
        spin_lock_init(&ioc->diagLock);
+       spin_lock_init(&ioc->initializing_hba_lock);
 
        /* Initialize the event logging.
         */
@@ -1316,7 +1376,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
        }
        else if (pdev->device == MPI_MANUFACTPAGE_DEVID_53C1030) {
                ioc->prod_name = "LSI53C1030";
-               ioc->bus_type = SCSI;
+               ioc->bus_type = SPI;
                /* 1030 Chip Fix. Disable Split transactions
                 * for PCIX. Set MOST bits to zero if Rev < C0( = 8).
                 */
@@ -1329,7 +1389,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
        }
        else if (pdev->device == MPI_MANUFACTPAGE_DEVID_1030_53C1035) {
                ioc->prod_name = "LSI53C1035";
-               ioc->bus_type = SCSI;
+               ioc->bus_type = SPI;
        }
        else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1064) {
                ioc->prod_name = "LSISAS1064";
@@ -1408,8 +1468,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
         */
        mpt_detect_bound_ports(ioc, pdev);
 
-       if ((r = mpt_do_ioc_recovery(ioc,
-         MPT_HOSTEVENT_IOC_BRINGUP, CAN_SLEEP)) != 0) {
+       if ((r = mpt_bringup_adapter(ioc, CAN_SLEEP)) != 0){
                printk(KERN_WARNING MYNAM
                  ": WARNING - %s did not initialize properly! (%d)\n",
                  ioc->name, r);
@@ -2983,7 +3042,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
        /* Clear the internal flash bad bit - autoincrementing register,
         * so must do two writes.
         */
-       if (ioc->bus_type == SCSI) {
+       if (ioc->bus_type == SPI) {
                /*
                 * 1030 and 1035 H/W errata, workaround to access
                 * the ClearFlashBadSignatureBit
@@ -3093,7 +3152,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
        int cnt,cntdn;
 
        dinitprintk((KERN_WARNING MYNAM ": KickStarting %s!\n", ioc->name));
-       if (ioc->bus_type == SCSI) {
+       if (ioc->bus_type == SPI) {
                /* Always issue a Msg Unit Reset first. This will clear some
                 * SCSI bus hang conditions.
                 */
@@ -3521,7 +3580,7 @@ initChainBuffers(MPT_ADAPTER *ioc)
        dinitprintk((KERN_INFO MYNAM ": %s Now numSGE=%d num_sge=%d num_chain=%d\n",
                ioc->name, numSGE, num_sge, num_chain));
 
-       if (ioc->bus_type == SCSI)
+       if (ioc->bus_type == SPI)
                num_chain *= MPT_SCSI_CAN_QUEUE;
        else
                num_chain *= MPT_FC_CAN_QUEUE;
@@ -6271,6 +6330,7 @@ EXPORT_SYMBOL(mpt_resume);
 EXPORT_SYMBOL(mpt_suspend);
 #endif
 EXPORT_SYMBOL(ioc_list);
+EXPORT_SYMBOL(mpt_proc_root_dir);
 EXPORT_SYMBOL(mpt_register);
 EXPORT_SYMBOL(mpt_deregister);
 EXPORT_SYMBOL(mpt_event_register);
@@ -6288,6 +6348,7 @@ EXPORT_SYMBOL(mpt_verify_adapter);
 EXPORT_SYMBOL(mpt_GetIocState);
 EXPORT_SYMBOL(mpt_print_ioc_summary);
 EXPORT_SYMBOL(mpt_lan_index);
+EXPORT_SYMBOL(mpt_stm_index);
 EXPORT_SYMBOL(mpt_HardResetHandler);
 EXPORT_SYMBOL(mpt_config);
 EXPORT_SYMBOL(mpt_toolbox);
@@ -6296,6 +6357,7 @@ EXPORT_SYMBOL(mpt_read_ioc_pg_3);
 EXPORT_SYMBOL(mpt_alloc_fw_memory);
 EXPORT_SYMBOL(mpt_free_fw_memory);
 EXPORT_SYMBOL(mptbase_sas_persist_operation);
+EXPORT_SYMBOL(mpt_alt_ioc_wait);
 
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
index 8ad277a9afa16a37906045a522a7b9ca4e21a7f4..6c48d1f54ac92552b4fdf42f4ebbf66c74d5eda9 100644 (file)
@@ -76,8 +76,8 @@
 #define COPYRIGHT      "Copyright (c) 1999-2005 " MODULEAUTHOR
 #endif
 
-#define MPT_LINUX_VERSION_COMMON       "3.03.04"
-#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-3.03.04"
+#define MPT_LINUX_VERSION_COMMON       "3.03.05"
+#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-3.03.05"
 #define WHAT_MAGIC_STRING              "@" "(" "#" ")"
 
 #define show_mptmod_ver(s,ver)  \
@@ -321,7 +321,7 @@ typedef struct _SYSIF_REGS
  *     Dynamic Multi-Pathing specific stuff...
  */
 
-/* VirtDevice negoFlags field */
+/* VirtTarget negoFlags field */
 #define MPT_TARGET_NO_NEGO_WIDE                0x01
 #define MPT_TARGET_NO_NEGO_SYNC                0x02
 #define MPT_TARGET_NO_NEGO_QAS         0x04
@@ -330,8 +330,7 @@ typedef struct _SYSIF_REGS
 /*
  *     VirtDevice - FC LUN device or SCSI target device
  */
-typedef struct _VirtDevice {
-       struct scsi_device      *device;
+typedef struct _VirtTarget {
        u8                       tflags;
        u8                       ioc_id;
        u8                       target_id;
@@ -342,21 +341,18 @@ typedef struct _VirtDevice {
        u8                       negoFlags;     /* bit field, see above */
        u8                       raidVolume;    /* set, if RAID Volume */
        u8                       type;          /* byte 0 of Inquiry data */
-       u8                       cflags;        /* controller flags */
-       u8                       rsvd1raid;
-       u16                      fc_phys_lun;
-       u16                      fc_xlat_lun;
        u32                      num_luns;
        u32                      luns[8];               /* Max LUNs is 256 */
-       u8                       pad[4];
        u8                       inq_data[8];
-               /* IEEE Registered Extended Identifier
-                  obtained via INQUIRY VPD page 0x83 */
-               /* NOTE: Do not separate uniq_prepad and uniq_data
-                  as they are treateed as a single entity in the code */
-       u8                       uniq_prepad[8];
-       u8                       uniq_data[20];
-       u8                       pad2[4];
+} VirtTarget;
+
+typedef struct _VirtDevice {
+       VirtTarget              *vtarget;
+       u8                       ioc_id;
+       u8                       bus_id;
+       u8                       target_id;
+       u8                       configured_lun;
+       u32                      lun;
 } VirtDevice;
 
 /*
@@ -611,6 +607,8 @@ typedef struct _MPT_ADAPTER
        int                      DoneCtx;
        int                      TaskCtx;
        int                      InternalCtx;
+       spinlock_t               initializing_hba_lock;
+       int                      initializing_hba_lock_flag;
        struct list_head         list;
        struct net_device       *netdev;
        struct list_head         sas_topology;
@@ -901,7 +899,7 @@ typedef struct _MPT_LOCAL_REPLY {
 
 typedef enum {
        FC,
-       SCSI,
+       SPI,
        SAS
 } BUS_TYPE;
 
@@ -910,7 +908,7 @@ typedef struct _MPT_SCSI_HOST {
        int                       port;
        u32                       pad0;
        struct scsi_cmnd        **ScsiLookup;
-       VirtDevice              **Targets;
+       VirtTarget              **Targets;
        MPT_LOCAL_REPLY          *pLocal;               /* used for internal commands */
        struct timer_list         timer;
                /* Pool of memory for holding SCpnts before doing
@@ -1001,13 +999,16 @@ extern void       mpt_free_fw_memory(MPT_ADAPTER *ioc);
 extern int      mpt_findImVolumes(MPT_ADAPTER *ioc);
 extern int      mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
 extern int      mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
+extern int      mpt_alt_ioc_wait(MPT_ADAPTER *ioc);
 
 /*
  *  Public data decl's...
  */
 extern struct list_head          ioc_list;
+extern struct proc_dir_entry   *mpt_proc_root_dir;
 
 extern int               mpt_lan_index;        /* needed by mptlan.c */
+extern int               mpt_stm_index;        /* needed by mptstm.c */
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 #endif         /* } __KERNEL__ */
index 602138f8544db665ded8957738b1dcca7208a772..959d2c5951b8beb072b4c00b0fbc34ac836c6acc 100644 (file)
@@ -1245,7 +1245,7 @@ mptctl_gettargetinfo (unsigned long arg)
        MPT_ADAPTER             *ioc;
        struct Scsi_Host        *sh;
        MPT_SCSI_HOST           *hd;
-       VirtDevice              *vdev;
+       VirtTarget              *vdev;
        char                    *pmem;
        int                     *pdata;
        IOCPage2_t              *pIoc2;
@@ -1822,7 +1822,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
        case MPI_FUNCTION_SCSI_IO_REQUEST:
                if (ioc->sh) {
                        SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
-                       VirtDevice      *pTarget = NULL;
+                       VirtTarget      *pTarget = NULL;
                        MPT_SCSI_HOST   *hd = NULL;
                        int qtag = MPI_SCSIIO_CONTROL_UNTAGGED;
                        int scsidir = 0;
index a628be9bbbadd0070326e5af78f9dadfb2f6934a..ba61e18288585679d4915c9ec22abd82804496b7 100644 (file)
@@ -84,13 +84,16 @@ static int  mptfcTaskCtx = -1;
 static int     mptfcInternalCtx = -1; /* Used only for internal commands */
 
 static struct scsi_host_template mptfc_driver_template = {
+       .module                         = THIS_MODULE,
        .proc_name                      = "mptfc",
        .proc_info                      = mptscsih_proc_info,
        .name                           = "MPT FC Host",
        .info                           = mptscsih_info,
        .queuecommand                   = mptscsih_qcmd,
+       .target_alloc                   = mptscsih_target_alloc,
        .slave_alloc                    = mptscsih_slave_alloc,
        .slave_configure                = mptscsih_slave_configure,
+       .target_destroy                 = mptscsih_target_destroy,
        .slave_destroy                  = mptscsih_slave_destroy,
        .change_queue_depth             = mptscsih_change_queue_depth,
        .eh_abort_handler               = mptscsih_abort,
@@ -167,13 +170,15 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                  "Skipping because it's not operational!\n",
                  ioc->name);
-               return -ENODEV;
+               error = -ENODEV;
+               goto out_mptfc_probe;
        }
 
        if (!ioc->active) {
                printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
                  ioc->name);
-               return -ENODEV;
+               error = -ENODEV;
+               goto out_mptfc_probe;
        }
 
        /*  Sanity check - ensure at least 1 port is INITIATOR capable
@@ -198,7 +203,8 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                        "Unable to register controller with SCSI subsystem\n",
                        ioc->name);
-                return -1;
+               error = -1;
+               goto out_mptfc_probe;
         }
 
        spin_lock_irqsave(&ioc->FreeQlock, flags);
@@ -266,7 +272,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        mem = kmalloc(sz, GFP_ATOMIC);
        if (mem == NULL) {
                error = -ENOMEM;
-               goto mptfc_probe_failed;
+               goto out_mptfc_probe;
        }
 
        memset(mem, 0, sz);
@@ -284,14 +290,14 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        mem = kmalloc(sz, GFP_ATOMIC);
        if (mem == NULL) {
                error = -ENOMEM;
-               goto mptfc_probe_failed;
+               goto out_mptfc_probe;
        }
 
        memset(mem, 0, sz);
-       hd->Targets = (VirtDevice **) mem;
+       hd->Targets = (VirtTarget **) mem;
 
        dprintk((KERN_INFO
-         "  Targets @ %p, sz=%d\n", hd->Targets, sz));
+         "  vdev @ %p, sz=%d\n", hd->Targets, sz));
 
        /* Clear the TM flags
         */
@@ -330,13 +336,13 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if(error) {
                dprintk((KERN_ERR MYNAM
                  "scsi_add_host failed\n"));
-               goto mptfc_probe_failed;
+               goto out_mptfc_probe;
        }
 
        scsi_scan_host(sh);
        return 0;
 
-mptfc_probe_failed:
+out_mptfc_probe:
 
        mptscsih_remove(pdev);
        return error;
index e0a8bb8ba7d8f15bfdd3214a63f035884295129b..17e9757e728be780211d1e7a0008aaa9e2724d18 100644 (file)
@@ -228,31 +228,35 @@ static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
  * implement ->target_alloc.
  */
 static int
-mptsas_slave_alloc(struct scsi_device *device)
+mptsas_slave_alloc(struct scsi_device *sdev)
 {
-       struct Scsi_Host        *host = device->host;
+       struct Scsi_Host        *host = sdev->host;
        MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
        struct sas_rphy         *rphy;
        struct mptsas_portinfo  *p;
+       VirtTarget              *vtarget;
        VirtDevice              *vdev;
-       uint                    target = device->id;
+       struct scsi_target      *starget;
        int i;
 
-       if ((vdev = hd->Targets[target]) != NULL)
-               goto out;
-
        vdev = kmalloc(sizeof(VirtDevice), GFP_KERNEL);
        if (!vdev) {
                printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
                                hd->ioc->name, sizeof(VirtDevice));
                return -ENOMEM;
        }
-
        memset(vdev, 0, sizeof(VirtDevice));
-       vdev->tflags = MPT_TARGET_FLAGS_Q_YES|MPT_TARGET_FLAGS_VALID_INQUIRY;
        vdev->ioc_id = hd->ioc->id;
+       sdev->hostdata = vdev;
+       starget = scsi_target(sdev);
+       vtarget = starget->hostdata;
+       vdev->vtarget = vtarget;
+       if (vtarget->num_luns == 0) {
+               vtarget->tflags = MPT_TARGET_FLAGS_Q_YES|MPT_TARGET_FLAGS_VALID_INQUIRY;
+               hd->Targets[sdev->id] = vtarget;
+       }
 
-       rphy = dev_to_rphy(device->sdev_target->dev.parent);
+       rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
        list_for_each_entry(p, &hd->ioc->sas_topology, list) {
                for (i = 0; i < p->num_phys; i++) {
                        if (p->phy_info[i].attached.sas_address ==
@@ -260,7 +264,7 @@ mptsas_slave_alloc(struct scsi_device *device)
                                vdev->target_id =
                                        p->phy_info[i].attached.target;
                                vdev->bus_id = p->phy_info[i].attached.bus;
-                               hd->Targets[device->id] = vdev;
+                               vdev->lun = sdev->lun;
                                goto out;
                        }
                }
@@ -271,19 +275,24 @@ mptsas_slave_alloc(struct scsi_device *device)
        return -ENODEV;
 
  out:
-       vdev->num_luns++;
-       device->hostdata = vdev;
+       vtarget->ioc_id = vdev->ioc_id;
+       vtarget->target_id = vdev->target_id;
+       vtarget->bus_id = vdev->bus_id;
+       vtarget->num_luns++;
        return 0;
 }
 
 static struct scsi_host_template mptsas_driver_template = {
+       .module                         = THIS_MODULE,
        .proc_name                      = "mptsas",
        .proc_info                      = mptscsih_proc_info,
        .name                           = "MPT SPI Host",
        .info                           = mptscsih_info,
        .queuecommand                   = mptscsih_qcmd,
+       .target_alloc                   = mptscsih_target_alloc,
        .slave_alloc                    = mptsas_slave_alloc,
        .slave_configure                = mptscsih_slave_configure,
+       .target_destroy                 = mptscsih_target_destroy,
        .slave_destroy                  = mptscsih_slave_destroy,
        .change_queue_depth             = mptscsih_change_queue_depth,
        .eh_abort_handler               = mptscsih_abort,
@@ -986,7 +995,6 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc, int *index)
                goto out_free_port_info;
 
        list_add_tail(&port_info->list, &ioc->sas_topology);
-
        for (i = 0; i < port_info->num_phys; i++) {
                mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
                        (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
@@ -1133,13 +1141,15 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                  "Skipping because it's not operational!\n",
                  ioc->name);
-               return -ENODEV;
+               error = -ENODEV;
+               goto out_mptsas_probe;
        }
 
        if (!ioc->active) {
                printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
                  ioc->name);
-               return -ENODEV;
+               error = -ENODEV;
+               goto out_mptsas_probe;
        }
 
        /*  Sanity check - ensure at least 1 port is INITIATOR capable
@@ -1163,7 +1173,8 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                        "Unable to register controller with SCSI subsystem\n",
                        ioc->name);
-                return -1;
+               error = -1;
+               goto out_mptsas_probe;
         }
 
        spin_lock_irqsave(&ioc->FreeQlock, flags);
@@ -1237,7 +1248,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        mem = kmalloc(sz, GFP_ATOMIC);
        if (mem == NULL) {
                error = -ENOMEM;
-               goto mptsas_probe_failed;
+               goto out_mptsas_probe;
        }
 
        memset(mem, 0, sz);
@@ -1255,14 +1266,14 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        mem = kmalloc(sz, GFP_ATOMIC);
        if (mem == NULL) {
                error = -ENOMEM;
-               goto mptsas_probe_failed;
+               goto out_mptsas_probe;
        }
 
        memset(mem, 0, sz);
-       hd->Targets = (VirtDevice **) mem;
+       hd->Targets = (VirtTarget **) mem;
 
        dprintk((KERN_INFO
-         "  Targets @ %p, sz=%d\n", hd->Targets, sz));
+         "  vtarget @ %p, sz=%d\n", hd->Targets, sz));
 
        /* Clear the TM flags
         */
@@ -1308,14 +1319,14 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (error) {
                dprintk((KERN_ERR MYNAM
                  "scsi_add_host failed\n"));
-               goto mptsas_probe_failed;
+               goto out_mptsas_probe;
        }
 
        mptsas_scan_sas_topology(ioc);
 
        return 0;
 
-mptsas_probe_failed:
+out_mptsas_probe:
 
        mptscsih_remove(pdev);
        return error;
index 4330ed0cedaaaafbc2a435b73c1b42b4aadc43d9..93a16fa3c4baeab822056108f9e622e906b10d5c 100644 (file)
@@ -150,28 +150,29 @@ static int        mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 tar
 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);
-static void    mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq);
+static void    mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, u8 lun, char *data, int dlen);
+static void    mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *vtarget, char byte56);
 static void    mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *requestedPtr, int *configurationPtr, u8 flags);
-static void    mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id);
+static void    mptscsih_no_negotiate(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc);
 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);
 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);
+static void    mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, VirtDevice *vdevice);
+static void    mptscsih_negotiate_to_asyn_narrow(MPT_SCSI_HOST *hd, VirtTarget *vtarget);
+static int     mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id);
 
 static struct work_struct   mptscsih_persistTask;
 
 #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
 static int     mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io);
 static void    mptscsih_domainValidation(void *hd);
-static int     mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id);
 static void    mptscsih_qas_check(MPT_SCSI_HOST *hd, int id);
 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);
 static void    mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id);
+static void    mptscsih_set_dvflags(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc);
 #endif
 
 void           mptscsih_remove(struct pci_dev *);
@@ -627,7 +628,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                dreplyprintk((KERN_NOTICE "Reply ha=%d id=%d lun=%d:\n"
                        "IOCStatus=%04xh SCSIState=%02xh SCSIStatus=%02xh\n"
                        "resid=%d bufflen=%d xfer_cnt=%d\n",
-                       ioc->id, pScsiReq->TargetID, pScsiReq->LUN[1],
+                       ioc->id, sc->device->id, sc->device->lun,
                        status, scsi_state, scsi_status, sc->resid,
                        sc->request_bufflen, xfer_cnt));
 
@@ -641,7 +642,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                    pScsiReply->ResponseInfo) {
                        printk(KERN_NOTICE "ha=%d id=%d lun=%d: "
                        "FCP_ResponseInfo=%08xh\n",
-                       ioc->id, pScsiReq->TargetID, pScsiReq->LUN[1],
+                       ioc->id, sc->device->id, sc->device->lun,
                        le32_to_cpu(pScsiReply->ResponseInfo));
                }
 
@@ -677,8 +678,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                        sc->result = DID_RESET << 16;
 
                        /* GEM Workaround. */
-                       if (ioc->bus_type == SCSI)
-                               mptscsih_no_negotiate(hd, sc->device->id);
+                       if (ioc->bus_type == SPI)
+                               mptscsih_no_negotiate(hd, sc);
                        break;
 
                case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:      /* 0x0049 */
@@ -892,16 +893,15 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
  *             when a lun is disable by mid-layer.
  *             Do NOT access the referenced scsi_cmnd structure or
  *             members. Will cause either a paging or NULL ptr error.
- *     @hd: Pointer to a SCSI HOST structure
- *     @target: target id
- *     @lun: lun
+ *      @hd: Pointer to a SCSI HOST structure
+ *     @vdevice: per device private data
  *
  *     Returns: None.
  *
  *     Called from slave_destroy.
  */
 static void
-mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, uint target, uint lun)
+mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
 {
        SCSIIORequest_t *mf = NULL;
        int              ii;
@@ -909,7 +909,7 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, uint target, uint lun)
        struct scsi_cmnd *sc;
 
        dsprintk((KERN_INFO MYNAM ": search_running target %d lun %d max %d\n",
-                       target, lun, max));
+                       vdevice->target_id, vdevice->lun, max));
 
        for (ii=0; ii < max; ii++) {
                if ((sc = hd->ScsiLookup[ii]) != NULL) {
@@ -919,7 +919,7 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, uint target, uint lun)
                        dsprintk(( "search_running: found (sc=%p, mf = %p) target %d, lun %d \n",
                                        hd->ScsiLookup[ii], mf, mf->TargetID, mf->LUN[1]));
 
-                       if ((mf->TargetID != ((u8)target)) || (mf->LUN[1] != ((u8) lun)))
+                       if ((mf->TargetID != ((u8)vdevice->target_id)) || (mf->LUN[1] != ((u8) vdevice->lun)))
                                continue;
 
                        /* Cleanup
@@ -993,8 +993,10 @@ mptscsih_remove(struct pci_dev *pdev)
        MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
        struct Scsi_Host        *host = ioc->sh;
        MPT_SCSI_HOST           *hd;
+#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
        int                     count;
        unsigned long           flags;
+#endif 
        int sz1;
 
        if(!host) {
@@ -1075,11 +1077,6 @@ mptscsih_shutdown(struct pci_dev *pdev)
 
        hd = (MPT_SCSI_HOST *)host->hostdata;
 
-       /* Flush the cache of this adapter
-        */
-       if(hd != NULL)
-               mptscsih_synchronize_cache(hd, 0);
-
 }
 
 #ifdef CONFIG_PM
@@ -1286,7 +1283,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        MPT_SCSI_HOST           *hd;
        MPT_FRAME_HDR           *mf;
        SCSIIORequest_t         *pScsiReq;
-       VirtDevice              *pTarget = SCpnt->device->hostdata;
+       VirtDevice              *vdev = SCpnt->device->hostdata;
        int      lun;
        u32      datalen;
        u32      scsictl;
@@ -1341,8 +1338,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        /* Default to untagged. Once a target structure has been allocated,
         * use the Inquiry data to determine if device supports tagged.
         */
-       if (pTarget
-           && (pTarget->tflags & MPT_TARGET_FLAGS_Q_YES)
+       if (vdev
+           && (vdev->vtarget->tflags & MPT_TARGET_FLAGS_Q_YES)
            && (SCpnt->device->tagged_supported)) {
                scsictl = scsidir | MPI_SCSIIO_CONTROL_SIMPLEQ;
        } else {
@@ -1351,8 +1348,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
 
        /* Use the above information to set up the message frame
         */
-       pScsiReq->TargetID = (u8) pTarget->target_id;
-       pScsiReq->Bus = pTarget->bus_id;
+       pScsiReq->TargetID = (u8) vdev->target_id;
+       pScsiReq->Bus = vdev->bus_id;
        pScsiReq->ChainOffset = 0;
        pScsiReq->Function = MPI_FUNCTION_SCSI_IO_REQUEST;
        pScsiReq->CDBLength = SCpnt->cmd_len;
@@ -1403,8 +1400,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        SCpnt->host_scribble = NULL;
 
 #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
-       if (hd->ioc->bus_type == SCSI) {
-               int dvStatus = hd->ioc->spi_data.dvStatus[pTarget->target_id];
+       if (hd->ioc->bus_type == SPI) {
+               int dvStatus = hd->ioc->spi_data.dvStatus[vdev->target_id];
                int issueCmd = 1;
 
                if (dvStatus || hd->ioc->spi_data.forceDv) {
@@ -1437,7 +1434,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
                        /* Set the DV flags.
                         */
                        if (dvStatus & MPT_SCSICFG_DV_NOT_DONE)
-                               mptscsih_set_dvflags(hd, pScsiReq);
+                               mptscsih_set_dvflags(hd, SCpnt);
 
                        if (!issueCmd)
                                goto fail;
@@ -1741,6 +1738,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
        u32              ctx2abort;
        int              scpnt_idx;
        int              retval;
+       VirtDevice       *vdev;
 
        /* If we can't locate our host adapter structure, return FAILED status.
         */
@@ -1790,8 +1788,9 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
 
        hd->abortSCpnt = SCpnt;
 
+       vdev = SCpnt->device->hostdata;
        retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
-               SCpnt->device->channel, SCpnt->device->id, SCpnt->device->lun,
+               vdev->bus_id, vdev->target_id, vdev->lun,
                ctx2abort, 2 /* 2 second timeout */);
 
        printk (KERN_WARNING MYNAM ": %s: task abort: %s (sc=%p)\n",
@@ -1822,6 +1821,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
 {
        MPT_SCSI_HOST   *hd;
        int              retval;
+       VirtDevice       *vdev;
 
        /* If we can't locate our host adapter structure, return FAILED status.
         */
@@ -1839,8 +1839,9 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
               hd->ioc->name, SCpnt);
        scsi_print_command(SCpnt);
 
+       vdev = SCpnt->device->hostdata;
        retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
-               SCpnt->device->channel, SCpnt->device->id,
+               vdev->bus_id, vdev->target_id,
                0, 0, 5 /* 5 second timeout */);
 
        printk (KERN_WARNING MYNAM ": %s: target reset: %s (sc=%p)\n",
@@ -1871,6 +1872,7 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
 {
        MPT_SCSI_HOST   *hd;
        int              retval;
+       VirtDevice       *vdev;
 
        /* If we can't locate our host adapter structure, return FAILED status.
         */
@@ -1888,8 +1890,9 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
        if (hd->timeouts < -1)
                hd->timeouts++;
 
+       vdev = SCpnt->device->hostdata;
        retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
-               SCpnt->device->channel, 0, 0, 0, 5 /* 5 second timeout */);
+               vdev->bus_id, 0, 0, 0, 5 /* 5 second timeout */);
 
        printk (KERN_WARNING MYNAM ": %s: bus reset: %s (sc=%p)\n",
                hd->ioc->name,
@@ -2148,26 +2151,39 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
        return 0;
 }
 
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+ *     OS entry point to allow host driver to alloc memory
+ *     for each scsi target. Called once per device the bus scan.
+ *     Return non-zero if allocation fails.
+ */
+int
+mptscsih_target_alloc(struct scsi_target *starget)
+{
+       VirtTarget              *vtarget;
+
+       vtarget = kmalloc(sizeof(VirtTarget), GFP_KERNEL);
+       if (!vtarget)
+               return -ENOMEM;
+       memset(vtarget, 0, sizeof(VirtTarget));
+       starget->hostdata = vtarget;
+       return 0;
+}
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *     OS entry point to allow host driver to alloc memory
  *     for each scsi device. Called once per device the bus scan.
  *     Return non-zero if allocation fails.
- *     Init memory once per id (not LUN).
  */
 int
-mptscsih_slave_alloc(struct scsi_device *device)
+mptscsih_slave_alloc(struct scsi_device *sdev)
 {
-       struct Scsi_Host        *host = device->host;
+       struct Scsi_Host        *host = sdev->host;
        MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
+       VirtTarget              *vtarget;
        VirtDevice              *vdev;
-       uint                    target = device->id;
-
-       if (hd == NULL)
-               return -ENODEV;
-
-       if ((vdev = hd->Targets[target]) != NULL)
-               goto out;
+       struct scsi_target      *starget;
 
        vdev = kmalloc(sizeof(VirtDevice), GFP_KERNEL);
        if (!vdev) {
@@ -2177,25 +2193,33 @@ mptscsih_slave_alloc(struct scsi_device *device)
        }
 
        memset(vdev, 0, sizeof(VirtDevice));
-       vdev->tflags = MPT_TARGET_FLAGS_Q_YES;
        vdev->ioc_id = hd->ioc->id;
-       vdev->target_id = device->id;
-       vdev->bus_id = device->channel;
-       vdev->raidVolume = 0;
-       hd->Targets[device->id] = vdev;
-       if (hd->ioc->bus_type == SCSI) {
-               if (hd->ioc->raid_data.isRaid & (1 << device->id)) {
-                       vdev->raidVolume = 1;
-                       ddvtprintk((KERN_INFO
-                           "RAID Volume @ id %d\n", device->id));
+       vdev->target_id = sdev->id;
+       vdev->bus_id = sdev->channel;
+       vdev->lun = sdev->lun;
+       sdev->hostdata = vdev;
+
+       starget = scsi_target(sdev);
+       vtarget = starget->hostdata;
+       vdev->vtarget = vtarget;
+
+       if (vtarget->num_luns == 0) {
+               hd->Targets[sdev->id] = vtarget;
+               vtarget->ioc_id = hd->ioc->id;
+               vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
+               vtarget->target_id = sdev->id;
+               vtarget->bus_id = sdev->channel;
+               if (hd->ioc->bus_type == SPI) {
+                       if (hd->ioc->raid_data.isRaid & (1 << sdev->id)) {
+                               vtarget->raidVolume = 1;
+                               ddvtprintk((KERN_INFO
+                                   "RAID Volume @ id %d\n", sdev->id));
+                       }
+               } else {
+                       vtarget->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY;
                }
-       } else {
-               vdev->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY;
        }
-
- out:
-       vdev->num_luns++;
-       device->hostdata = vdev;
+       vtarget->num_luns++;
        return 0;
 }
 
@@ -2204,40 +2228,52 @@ mptscsih_slave_alloc(struct scsi_device *device)
  *     Called if no device present or device being unloaded
  */
 void
-mptscsih_slave_destroy(struct scsi_device *device)
+mptscsih_target_destroy(struct scsi_target *starget)
 {
-       struct Scsi_Host        *host = device->host;
-       MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
-       VirtDevice              *vdev;
-       uint                    target = device->id;
-       uint                    lun = device->lun;
-
-       if (hd == NULL)
-               return;
-
-       mptscsih_search_running_cmds(hd, target, lun);
-
-       vdev = hd->Targets[target];
-       vdev->luns[0] &= ~(1 << lun);
-       if (--vdev->num_luns)
-               return;
-
-       kfree(hd->Targets[target]);
-       hd->Targets[target] = NULL;
-
-       if (hd->ioc->bus_type == SCSI) {
-               if (mptscsih_is_phys_disk(hd->ioc, target)) {
-                       hd->ioc->spi_data.forceDv |= MPT_SCSICFG_RELOAD_IOC_PG3;
-               } else {
-                       hd->ioc->spi_data.dvStatus[target] =
-                               MPT_SCSICFG_NEGOTIATE;
+       if (starget->hostdata)
+               kfree(starget->hostdata);
+       starget->hostdata = NULL;
+}
 
-                       if (!hd->negoNvram) {
-                               hd->ioc->spi_data.dvStatus[target] |=
-                                       MPT_SCSICFG_DV_NOT_DONE;
+/*
+ *     OS entry point to allow for host driver to free allocated memory
+ *     Called if no device present or device being unloaded
+ */
+void
+mptscsih_slave_destroy(struct scsi_device *sdev)
+{
+       struct Scsi_Host        *host = sdev->host;
+       MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
+       VirtTarget              *vtarget;
+       VirtDevice              *vdevice;
+       struct scsi_target      *starget;
+
+       starget = scsi_target(sdev);
+       vtarget = starget->hostdata;
+       vdevice = sdev->hostdata;
+
+       mptscsih_search_running_cmds(hd, vdevice);
+       vtarget->luns[0] &= ~(1 << vdevice->lun);
+       vtarget->num_luns--;
+       if (vtarget->num_luns == 0) {
+               mptscsih_negotiate_to_asyn_narrow(hd, vtarget);
+               if (hd->ioc->bus_type == SPI) {
+                       if (mptscsih_is_phys_disk(hd->ioc, vtarget->target_id)) {
+                               hd->ioc->spi_data.forceDv |= MPT_SCSICFG_RELOAD_IOC_PG3;
+                       } else {
+                               hd->ioc->spi_data.dvStatus[vtarget->target_id] =
+                                       MPT_SCSICFG_NEGOTIATE;
+                               if (!hd->negoNvram) {
+                                       hd->ioc->spi_data.dvStatus[vtarget->target_id] |=
+                                               MPT_SCSICFG_DV_NOT_DONE;
+                               }
                        }
                }
+               hd->Targets[sdev->id] = NULL;
        }
+       mptscsih_synchronize_cache(hd, vdevice);
+       kfree(vdevice);
+       sdev->hostdata = NULL;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -2251,22 +2287,21 @@ mptscsih_slave_destroy(struct scsi_device *device)
 int
 mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
 {
-       MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
-       VirtDevice *pTarget;
-       int     max_depth;
-       int     tagged;
-
-       if (hd == NULL)
-               return 0;
-       if (!(pTarget = hd->Targets[sdev->id]))
-               return 0;
-
-       if (hd->ioc->bus_type == SCSI) {
-               if (pTarget->tflags & MPT_TARGET_FLAGS_VALID_INQUIRY) {
-                       if (!(pTarget->tflags & MPT_TARGET_FLAGS_Q_YES))
+       MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
+       VirtTarget              *vtarget;
+       struct scsi_target      *starget;
+       int                     max_depth;
+       int                     tagged;
+
+       starget = scsi_target(sdev);
+       vtarget = starget->hostdata;
+
+       if (hd->ioc->bus_type == SPI) {
+               if (vtarget->tflags & MPT_TARGET_FLAGS_VALID_INQUIRY) {
+                       if (!(vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))
                                max_depth = 1;
-                       else if (((pTarget->inq_data[0] & 0x1f) == 0x00) &&
-                                (pTarget->minSyncFactor <= MPT_ULTRA160 ))
+                       else if (((vtarget->inq_data[0] & 0x1f) == 0x00) &&
+                                (vtarget->minSyncFactor <= MPT_ULTRA160 ))
                                max_depth = MPT_SCSI_CMD_PER_DEV_HIGH;
                        else
                                max_depth = MPT_SCSI_CMD_PER_DEV_LOW;
@@ -2295,64 +2330,58 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
  *     Return non-zero if fails.
  */
 int
-mptscsih_slave_configure(struct scsi_device *device)
+mptscsih_slave_configure(struct scsi_device *sdev)
 {
-       struct Scsi_Host        *sh = device->host;
-       VirtDevice              *pTarget;
+       struct Scsi_Host        *sh = sdev->host;
+       VirtTarget              *vtarget;
+       VirtDevice              *vdevice;
+       struct scsi_target      *starget;
        MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)sh->hostdata;
+       int                     indexed_lun, lun_index;
 
-       if ((hd == NULL) || (hd->Targets == NULL)) {
-               return 0;
-       }
+       starget = scsi_target(sdev);
+       vtarget = starget->hostdata;
+       vdevice = sdev->hostdata;
 
        dsprintk((MYIOC_s_INFO_FMT
                "device @ %p, id=%d, LUN=%d, channel=%d\n",
-               hd->ioc->name, device, device->id, device->lun, device->channel));
-       dsprintk((MYIOC_s_INFO_FMT
-               "sdtr %d wdtr %d ppr %d inq length=%d\n",
-               hd->ioc->name, device->sdtr, device->wdtr,
-               device->ppr, device->inquiry_len));
-
-       if (device->id > sh->max_id) {
+               hd->ioc->name, sdev, sdev->id, sdev->lun, sdev->channel));
+       if (hd->ioc->bus_type == SPI)
+               dsprintk((MYIOC_s_INFO_FMT
+                   "sdtr %d wdtr %d ppr %d inq length=%d\n",
+                   hd->ioc->name, sdev->sdtr, sdev->wdtr,
+                   sdev->ppr, sdev->inquiry_len));
+
+       if (sdev->id > sh->max_id) {
                /* error case, should never happen */
-               scsi_adjust_queue_depth(device, 0, 1);
-               goto slave_configure_exit;
-       }
-
-       pTarget = hd->Targets[device->id];
-
-       if (pTarget == NULL) {
-               /* Driver doesn't know about this device.
-                * Kernel may generate a "Dummy Lun 0" which
-                * may become a real Lun if a
-                * "scsi add-single-device" command is executed
-                * while the driver is active (hot-plug a
-                * device).  LSI Raid controllers need
-                * queue_depth set to DEV_HIGH for this reason.
-                */
-               scsi_adjust_queue_depth(device, MSG_SIMPLE_TAG,
-                       MPT_SCSI_CMD_PER_DEV_HIGH);
+               scsi_adjust_queue_depth(sdev, 0, 1);
                goto slave_configure_exit;
        }
 
-       mptscsih_initTarget(hd, device->channel, device->id, device->lun,
-               device->inquiry, device->inquiry_len );
-       mptscsih_change_queue_depth(device, MPT_SCSI_CMD_PER_DEV_HIGH);
+       vdevice->configured_lun=1;
+       lun_index = (vdevice->lun >> 5);  /* 32 luns per lun_index */
+       indexed_lun = (vdevice->lun % 32);
+       vtarget->luns[lun_index] |= (1 << indexed_lun);
+       mptscsih_initTarget(hd, vtarget, sdev->lun, sdev->inquiry,
+           sdev->inquiry_len );
+       mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
 
        dsprintk((MYIOC_s_INFO_FMT
                "Queue depth=%d, tflags=%x\n",
-               hd->ioc->name, device->queue_depth, pTarget->tflags));
+               hd->ioc->name, sdev->queue_depth, vtarget->tflags));
 
-       dsprintk((MYIOC_s_INFO_FMT
-               "negoFlags=%x, maxOffset=%x, SyncFactor=%x\n",
-               hd->ioc->name, pTarget->negoFlags, pTarget->maxOffset, pTarget->minSyncFactor));
+       if (hd->ioc->bus_type == SPI)
+               dsprintk((MYIOC_s_INFO_FMT
+                   "negoFlags=%x, maxOffset=%x, SyncFactor=%x\n",
+                   hd->ioc->name, vtarget->negoFlags, vtarget->maxOffset,
+                   vtarget->minSyncFactor));
 
 slave_configure_exit:
 
        dsprintk((MYIOC_s_INFO_FMT
                "tagged %d, simple %d, ordered %d\n",
-               hd->ioc->name,device->tagged_supported, device->simple_tags,
-               device->ordered_tags));
+               hd->ioc->name,sdev->tagged_supported, sdev->simple_tags,
+               sdev->ordered_tags));
 
        return 0;
 }
@@ -2370,16 +2399,14 @@ slave_configure_exit:
 static void
 mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply)
 {
-       VirtDevice      *target;
+       VirtDevice      *vdev;
        SCSIIORequest_t *pReq;
        u32              sense_count = le32_to_cpu(pScsiReply->SenseCount);
-       int              index;
 
        /* Get target structure
         */
        pReq = (SCSIIORequest_t *) mf;
-       index = (int) pReq->TargetID;
-       target = hd->Targets[index];
+       vdev = sc->device->hostdata;
 
        if (sense_count) {
                u8 *sense_data;
@@ -2393,7 +2420,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
                /* Log SMART data (asc = 0x5D, non-IM case only) if required.
                 */
                if ((hd->ioc->events) && (hd->ioc->eventTypes & (1 << MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE))) {
-                       if ((sense_data[12] == 0x5D) && (target->raidVolume == 0)) {
+                       if ((sense_data[12] == 0x5D) && (vdev->vtarget->raidVolume == 0)) {
                                int idx;
                                MPT_ADAPTER *ioc = hd->ioc;
 
@@ -2403,7 +2430,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
 
                                ioc->events[idx].data[0] = (pReq->LUN[1] << 24) ||
                                        (MPI_EVENT_SCSI_DEV_STAT_RC_SMART_DATA << 16) ||
-                                       (pReq->Bus << 8) || pReq->TargetID;
+                                       (sc->device->channel << 8) || sc->device->id;
 
                                ioc->events[idx].data[1] = (sense_data[13] << 8) || sense_data[12];
 
@@ -2503,9 +2530,9 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                /* 2. Chain Buffer initialization
                 */
 
-               /* 4. Renegotiate to all devices, if SCSI
+               /* 4. Renegotiate to all devices, if SPI
                 */
-               if (ioc->bus_type == SCSI) {
+               if (ioc->bus_type == SPI) {
                        dnegoprintk(("writeSDP1: ALL_IDS USE_NVRAM\n"));
                        mptscsih_writeSDP1(hd, 0, 0, MPT_SCSICFG_ALL_IDS | MPT_SCSICFG_USE_NVRAM);
                }
@@ -2534,7 +2561,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
 
                /* 7. Set flag to force DV and re-read IOC Page 3
                 */
-               if (ioc->bus_type == SCSI) {
+               if (ioc->bus_type == SPI) {
                        ioc->spi_data.forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3;
                        ddvtprintk(("Set reload IOC Pg3 Flag\n"));
                }
@@ -2576,7 +2603,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
                break;
        case MPI_EVENT_IOC_BUS_RESET:                   /* 04 */
        case MPI_EVENT_EXT_BUS_RESET:                   /* 05 */
-               if (hd && (ioc->bus_type == SCSI) && (hd->soft_resets < -1))
+               if (hd && (ioc->bus_type == SPI) && (hd->soft_resets < -1))
                        hd->soft_resets++;
                break;
        case MPI_EVENT_LOGOUT:                          /* 09 */
@@ -2597,11 +2624,11 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
 
        case MPI_EVENT_INTEGRATED_RAID:                 /* 0B */
        {
+#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
                pMpiEventDataRaid_t pRaidEventData =
                    (pMpiEventDataRaid_t) pEvReply->Data;
-#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
                /* Domain Validation Needed */
-               if (ioc->bus_type == SCSI &&
+               if (ioc->bus_type == SPI &&
                    pRaidEventData->ReasonCode ==
                    MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED)
                        mptscsih_set_dvflags_raid(hd, pRaidEventData->PhysDiskNum);
@@ -2632,8 +2659,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
 /*
  *     mptscsih_initTarget - Target, LUN alloc/free functionality.
  *     @hd: Pointer to MPT_SCSI_HOST structure
- *     @bus_id: Bus number (?)
- *     @target_id: SCSI target id
+ *     @vtarget: per target private data
  *     @lun: SCSI LUN id
  *     @data: Pointer to data
  *     @dlen: Number of INQUIRY bytes
@@ -2646,15 +2672,14 @@ 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)
+mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, u8 lun, char *data, int dlen)
 {
-       int             indexed_lun, lun_index;
-       VirtDevice      *vdev;
        SpiCfgData      *pSpi;
        char            data_56;
+       int             inq_len;
 
        dinitprintk((MYIOC_s_INFO_FMT "initTarget bus=%d id=%d lun=%d hd=%p\n",
-                       hd->ioc->name, bus_id, target_id, lun, hd));
+               hd->ioc->name, vtarget->bus_id, vtarget->target_id, lun, hd));
 
        /*
         * If the peripheral qualifier filter is enabled then if the target reports a 0x1
@@ -2674,75 +2699,68 @@ mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *
        if (data[0] & 0xe0)
                return;
 
-       if ((vdev = hd->Targets[target_id]) == NULL) {
+       if (vtarget == NULL)
                return;
-       }
 
-       lun_index = (lun >> 5);  /* 32 luns per lun_index */
-       indexed_lun = (lun % 32);
-       vdev->luns[lun_index] |= (1 << indexed_lun);
-
-       if (hd->ioc->bus_type == SCSI) {
-               if ((data[0] == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
-                       /* Treat all Processors as SAF-TE if
-                        * command line option is set */
-                       vdev->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
-                       mptscsih_writeIOCPage4(hd, target_id, bus_id);
-               }else if ((data[0] == TYPE_PROCESSOR) &&
-                       !(vdev->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
-                       if ( dlen > 49 ) {
-                               vdev->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY;
-                               if ( data[44] == 'S' &&
-                                    data[45] == 'A' &&
-                                    data[46] == 'F' &&
-                                    data[47] == '-' &&
-                                    data[48] == 'T' &&
-                                    data[49] == 'E' ) {
-                                       vdev->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
-                                       mptscsih_writeIOCPage4(hd, target_id, bus_id);
-                               }
+       if (data)
+               vtarget->type = data[0];
+
+       if (hd->ioc->bus_type != SPI)
+               return;
+
+       if ((data[0] == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
+               /* Treat all Processors as SAF-TE if
+                * command line option is set */
+               vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
+               mptscsih_writeIOCPage4(hd, vtarget->target_id, vtarget->bus_id);
+       }else if ((data[0] == TYPE_PROCESSOR) &&
+               !(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
+               if ( dlen > 49 ) {
+                       vtarget->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY;
+                       if ( data[44] == 'S' &&
+                            data[45] == 'A' &&
+                            data[46] == 'F' &&
+                            data[47] == '-' &&
+                            data[48] == 'T' &&
+                            data[49] == 'E' ) {
+                               vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
+                               mptscsih_writeIOCPage4(hd, vtarget->target_id, vtarget->bus_id);
                        }
                }
-               if (!(vdev->tflags & MPT_TARGET_FLAGS_VALID_INQUIRY)) {
-                       if ( dlen > 8 ) {
-                               memcpy (vdev->inq_data, data, 8);
-                       } else {
-                               memcpy (vdev->inq_data, data, dlen);
-                       }
+       }
+       if (!(vtarget->tflags & MPT_TARGET_FLAGS_VALID_INQUIRY)) {
+               inq_len = dlen < 8 ? dlen : 8;
+               memcpy (vtarget->inq_data, data, inq_len);
+               /* If have not done DV, set the DV flag.
+                */
+               pSpi = &hd->ioc->spi_data;
+               if ((data[0] == TYPE_TAPE) || (data[0] == TYPE_PROCESSOR)) {
+                       if (pSpi->dvStatus[vtarget->target_id] & MPT_SCSICFG_DV_NOT_DONE)
+                               pSpi->dvStatus[vtarget->target_id] |= MPT_SCSICFG_NEED_DV;
+               }
+               vtarget->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY;
 
-                       /* If have not done DV, set the DV flag.
+               data_56 = 0x0F;  /* Default to full capabilities if Inq data length is < 57 */
+               if (dlen > 56) {
+                       if ( (!(vtarget->tflags & MPT_TARGET_FLAGS_VALID_56))) {
+                       /* Update the target capabilities
                         */
-                       pSpi = &hd->ioc->spi_data;
-                       if ((data[0] == TYPE_TAPE) || (data[0] == TYPE_PROCESSOR)) {
-                               if (pSpi->dvStatus[target_id] & MPT_SCSICFG_DV_NOT_DONE)
-                                       pSpi->dvStatus[target_id] |= MPT_SCSICFG_NEED_DV;
-                       }
-
-                       vdev->tflags |= MPT_TARGET_FLAGS_VALID_INQUIRY;
-
-
-                       data_56 = 0x0F;  /* Default to full capabilities if Inq data length is < 57 */
-                       if (dlen > 56) {
-                               if ( (!(vdev->tflags & MPT_TARGET_FLAGS_VALID_56))) {
-                               /* Update the target capabilities
-                                */
-                                       data_56 = data[56];
-                                       vdev->tflags |= MPT_TARGET_FLAGS_VALID_56;
-                               }
+                               data_56 = data[56];
+                               vtarget->tflags |= MPT_TARGET_FLAGS_VALID_56;
                        }
-                       mptscsih_setTargetNegoParms(hd, vdev, data_56);
-               } else {
-                       /* Initial Inquiry may not request enough data bytes to
-                        * obtain byte 57.  DV will; if target doesn't return
-                        * at least 57 bytes, data[56] will be zero. */
-                       if (dlen > 56) {
-                               if ( (!(vdev->tflags & MPT_TARGET_FLAGS_VALID_56))) {
-                               /* Update the target capabilities
-                                */
-                                       data_56 = data[56];
-                                       vdev->tflags |= MPT_TARGET_FLAGS_VALID_56;
-                                       mptscsih_setTargetNegoParms(hd, vdev, data_56);
-                               }
+               }
+               mptscsih_setTargetNegoParms(hd, vtarget, data_56);
+       } else {
+               /* Initial Inquiry may not request enough data bytes to
+                * obtain byte 57.  DV will; if target doesn't return
+                * at least 57 bytes, data[56] will be zero. */
+               if (dlen > 56) {
+                       if ( (!(vtarget->tflags & MPT_TARGET_FLAGS_VALID_56))) {
+                       /* Update the target capabilities
+                        */
+                               data_56 = data[56];
+                               vtarget->tflags |= MPT_TARGET_FLAGS_VALID_56;
+                               mptscsih_setTargetNegoParms(hd, vtarget, data_56);
                        }
                }
        }
@@ -2755,12 +2773,12 @@ mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *
  *
  */
 static void
-mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
+mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, char byte56)
 {
        SpiCfgData *pspi_data = &hd->ioc->spi_data;
        int  id = (int) target->target_id;
        int  nvram;
-       VirtDevice      *vdev;
+       VirtTarget      *vtarget;
        int ii;
        u8 width = MPT_NARROW;
        u8 factor = MPT_ASYNC;
@@ -2905,9 +2923,9 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
 
                        ddvtprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
                        for (ii = 0; ii < id; ii++) {
-                               if ( (vdev = hd->Targets[ii]) ) {
-                                       vdev->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
-                                       mptscsih_writeSDP1(hd, 0, ii, vdev->negoFlags);
+                               if ( (vtarget = hd->Targets[ii]) ) {
+                                       vtarget->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
+                                       mptscsih_writeSDP1(hd, 0, ii, vtarget->negoFlags);
                                }
                        }
                }
@@ -2925,106 +2943,18 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
        }
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return.
- * Else set the NEED_DV flag after Read Capacity Issued (disks)
- * or Mode Sense (cdroms).
- *
- * 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)
-{
-       MPT_ADAPTER     *ioc = hd->ioc;
-       u8 cmd;
-       SpiCfgData      *pSpi;
-
-       ddvtprintk((MYIOC_s_NOTE_FMT
-               " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n",
-               hd->ioc->name, pReq->TargetID, pReq->LUN[1], hd->negoNvram, pReq->CDB[0]));
-
-       if ((pReq->LUN[1] != 0) || (hd->negoNvram != 0))
-               return;
-
-       cmd = pReq->CDB[0];
-
-       if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) {
-               pSpi = &ioc->spi_data;
-               if ((ioc->raid_data.isRaid & (1 << pReq->TargetID)) && ioc->raid_data.pIocPg3) {
-                       /* Set NEED_DV for all hidden disks
-                        */
-                       Ioc3PhysDisk_t *pPDisk =  ioc->raid_data.pIocPg3->PhysDisk;
-                       int             numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
-
-                       while (numPDisk) {
-                               pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV;
-                               ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID));
-                               pPDisk++;
-                               numPDisk--;
-                       }
-               }
-               pSpi->dvStatus[pReq->TargetID] |= MPT_SCSICFG_NEED_DV;
-               ddvtprintk(("NEED_DV set for visible disk id %d\n", pReq->TargetID));
-       }
-}
-
-/* mptscsih_raid_set_dv_flags()
- *
- * New or replaced disk. Set DV flag and schedule DV.
- */
-static void
-mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id)
-{
-       MPT_ADAPTER     *ioc = hd->ioc;
-       SpiCfgData      *pSpi = &ioc->spi_data;
-       Ioc3PhysDisk_t  *pPDisk;
-       int              numPDisk;
-
-       if (hd->negoNvram != 0)
-               return;
-
-       ddvtprintk(("DV requested for phys disk id %d\n", id));
-       if (ioc->raid_data.pIocPg3) {
-               pPDisk =  ioc->raid_data.pIocPg3->PhysDisk;
-               numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
-               while (numPDisk) {
-                       if (id == pPDisk->PhysDiskNum) {
-                               pSpi->dvStatus[pPDisk->PhysDiskID] =
-                                   (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE);
-                               pSpi->forceDv = MPT_SCSICFG_NEED_DV;
-                               ddvtprintk(("NEED_DV set for phys disk id %d\n",
-                                   pPDisk->PhysDiskID));
-                               break;
-                       }
-                       pPDisk++;
-                       numPDisk--;
-               }
-
-               if (numPDisk == 0) {
-                       /* The physical disk that needs DV was not found
-                        * in the stored IOC Page 3. The driver must reload
-                        * this page. DV routine will set the NEED_DV flag for
-                        * all phys disks that have DV_NOT_DONE set.
-                        */
-                       pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3;
-                       ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id));
-               }
-       }
-}
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  * 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)
+mptscsih_no_negotiate(MPT_SCSI_HOST *hd, struct scsi_cmnd *sc)
 {
+       VirtDevice      *vdev;
 
-       if ((hd->Targets) && (hd->Targets[target_id] == NULL))
-               hd->ioc->spi_data.dvStatus[target_id] |= MPT_SCSICFG_BLK_NEGO;
-
+       if ((vdev = sc->device->hostdata) != NULL)
+               hd->ioc->spi_data.dvStatus[vdev->target_id] |= MPT_SCSICFG_BLK_NEGO;
        return;
 }
 
@@ -3100,7 +3030,7 @@ mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target_id, int flags)
        MPT_ADAPTER             *ioc = hd->ioc;
        Config_t                *pReq;
        SCSIDevicePage1_t       *pData;
-       VirtDevice              *pTarget=NULL;
+       VirtTarget              *vtarget=NULL;
        MPT_FRAME_HDR           *mf;
        dma_addr_t               dataDma;
        u16                      req_idx;
@@ -3180,11 +3110,11 @@ mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target_id, int flags)
                /* If id is not a raid volume, get the updated
                 * transmission settings from the target structure.
                 */
-               if (hd->Targets && (pTarget = hd->Targets[id]) && !pTarget->raidVolume) {
-                       width = pTarget->maxWidth;
-                       factor = pTarget->minSyncFactor;
-                       offset = pTarget->maxOffset;
-                       negoFlags = pTarget->negoFlags;
+               if (hd->Targets && (vtarget = hd->Targets[id]) && !vtarget->raidVolume) {
+                       width = vtarget->maxWidth;
+                       factor = vtarget->minSyncFactor;
+                       offset = vtarget->maxOffset;
+                       negoFlags = vtarget->negoFlags;
                }
 
 #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
@@ -3904,149 +3834,139 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
- *     mptscsih_synchronize_cache - Send SYNCHRONIZE_CACHE to all disks.
- *     @hd: Pointer to MPT_SCSI_HOST structure
- *     @portnum: IOC port number
+ *     mptscsih_negotiate_to_asyn_narrow - Restore devices to default state
+ *     @hd: Pointer to a SCSI HOST structure
+ *     @vtarget: per device private data
  *
  *     Uses the ISR, but with special processing.
  *     MUST be single-threaded.
  *
- *     Return: 0 on completion
  */
-static int
-mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum)
+static void
+mptscsih_negotiate_to_asyn_narrow(MPT_SCSI_HOST *hd, VirtTarget *vtarget)
 {
        MPT_ADAPTER             *ioc= hd->ioc;
-       VirtDevice              *pTarget;
-       SCSIDevicePage1_t       *pcfg1Data = NULL;
-       INTERNAL_CMD             iocmd;
+       SCSIDevicePage1_t       *pcfg1Data;
        CONFIGPARMS              cfg;
-       dma_addr_t               cfg1_dma_addr = -1;
-       ConfigPageHeader_t       header1;
-       int                      bus = 0;
-       int                      id = 0;
-       int                      lun;
-       int                      indexed_lun, lun_index;
-       int                      hostId = ioc->pfacts[portnum].PortSCSIID;
-       int                      max_id;
-       int                      requested, configuration, data;
-       int                      doConfig = 0;
+       dma_addr_t               cfg1_dma_addr;
+       ConfigPageHeader_t       header;
+       int                      id;
+       int                      requested, configuration, data,i;
        u8                       flags, factor;
 
-       max_id = ioc->sh->max_id - 1;
-
-       /* Following parameters will not change
-        * in this routine.
-        */
-       iocmd.cmd = SYNCHRONIZE_CACHE;
-       iocmd.flags = 0;
-       iocmd.physDiskNum = -1;
-       iocmd.data = NULL;
-       iocmd.data_dma = -1;
-       iocmd.size = 0;
-       iocmd.rsvd = iocmd.rsvd2 = 0;
-
-       /* No SCSI hosts
-        */
-       if (hd->Targets == NULL)
-               return 0;
-
-       /* Skip the host
-        */
-       if (id == hostId)
-               id++;
-
-       /* Write SDP1 for all SCSI devices
-        * Alloc memory and set up config buffer
-        */
-       if (ioc->bus_type == SCSI) {
-               if (ioc->spi_data.sdp1length > 0) {
-                       pcfg1Data = (SCSIDevicePage1_t *)pci_alloc_consistent(ioc->pcidev,
-                                        ioc->spi_data.sdp1length * 4, &cfg1_dma_addr);
-
-                       if (pcfg1Data != NULL) {
-                               doConfig = 1;
-                               header1.PageVersion = ioc->spi_data.sdp1version;
-                               header1.PageLength = ioc->spi_data.sdp1length;
-                               header1.PageNumber = 1;
-                               header1.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
-                               cfg.cfghdr.hdr = &header1;
-                               cfg.physAddr = cfg1_dma_addr;
-                               cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
-                               cfg.dir = 1;
-                               cfg.timeout = 0;
-                       }
-               }
-       }
+       if (ioc->bus_type != SPI)
+               return;
 
-       /* loop through all devices on this port
-        */
-       while (bus < MPT_MAX_BUS) {
-               iocmd.bus = bus;
-               iocmd.id = id;
-               pTarget = hd->Targets[(int)id];
+       if (!ioc->spi_data.sdp1length)
+               return;
 
-               if (doConfig) {
+       pcfg1Data = (SCSIDevicePage1_t *)pci_alloc_consistent(ioc->pcidev,
+                ioc->spi_data.sdp1length * 4, &cfg1_dma_addr);
 
-                       /* Set the negotiation flags */
-                       if (pTarget && (pTarget = hd->Targets[id]) && !pTarget->raidVolume) {
-                               flags = pTarget->negoFlags;
-                       } else {
-                               flags = hd->ioc->spi_data.noQas;
-                               if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) {
-                                       data = hd->ioc->spi_data.nvram[id];
+       if (pcfg1Data == NULL)
+               return;
 
-                                       if (data & MPT_NVRAM_WIDE_DISABLE)
-                                               flags |= MPT_TARGET_NO_NEGO_WIDE;
+       header.PageVersion = ioc->spi_data.sdp1version;
+       header.PageLength = ioc->spi_data.sdp1length;
+       header.PageNumber = 1;
+       header.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
+       cfg.cfghdr.hdr = &header;
+       cfg.physAddr = cfg1_dma_addr;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
+       cfg.dir = 1;
+       cfg.timeout = 0;
 
-                                       factor = (data & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
-                                       if ((factor == 0) || (factor == MPT_ASYNC))
-                                               flags |= MPT_TARGET_NO_NEGO_SYNC;
-                               }
+       if (vtarget->raidVolume && ioc->raid_data.pIocPg3) {
+               for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
+                       id = ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID;
+                       flags = hd->ioc->spi_data.noQas;
+                       if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) {
+                               data = hd->ioc->spi_data.nvram[id];
+                               if (data & MPT_NVRAM_WIDE_DISABLE)
+                                       flags |= MPT_TARGET_NO_NEGO_WIDE;
+                               factor = (data & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
+                               if ((factor == 0) || (factor == MPT_ASYNC))
+                                       flags |= MPT_TARGET_NO_NEGO_SYNC;
                        }
-
-                       /* Force to async, narrow */
                        mptscsih_setDevicePage1Flags(0, MPT_ASYNC, 0, &requested,
-                                       &configuration, flags);
+                               &configuration, flags);
                        dnegoprintk(("syncronize cache: id=%d width=0 factor=MPT_ASYNC "
                                "offset=0 negoFlags=%x request=%x config=%x\n",
                                id, flags, requested, configuration));
                        pcfg1Data->RequestedParameters = cpu_to_le32(requested);
                        pcfg1Data->Reserved = 0;
                        pcfg1Data->Configuration = cpu_to_le32(configuration);
-                       cfg.pageAddr = (bus<<8) | id;
+                       cfg.pageAddr = (vtarget->bus_id<<8) | id;
                        mpt_config(hd->ioc, &cfg);
                }
+       } else {
+               flags = vtarget->negoFlags;
+               mptscsih_setDevicePage1Flags(0, MPT_ASYNC, 0, &requested,
+                               &configuration, flags);
+               dnegoprintk(("syncronize cache: id=%d width=0 factor=MPT_ASYNC "
+                       "offset=0 negoFlags=%x request=%x config=%x\n",
+                       vtarget->target_id, flags, requested, configuration));
+               pcfg1Data->RequestedParameters = cpu_to_le32(requested);
+               pcfg1Data->Reserved = 0;
+               pcfg1Data->Configuration = cpu_to_le32(configuration);
+               cfg.pageAddr = (vtarget->bus_id<<8) | vtarget->target_id;
+               mpt_config(hd->ioc, &cfg);
+       }
 
-               /* If target Ptr NULL or if this target is NOT a disk, skip.
-                */
-               if ((pTarget) && (pTarget->inq_data[0] == TYPE_DISK)){
-                       for (lun=0; lun <= MPT_LAST_LUN; lun++) {
-                               /* If LUN present, issue the command
-                                */
-                               lun_index = (lun >> 5);  /* 32 luns per lun_index */
-                               indexed_lun = (lun % 32);
-                               if (pTarget->luns[lun_index] & (1<<indexed_lun)) {
-                                       iocmd.lun = lun;
-                                       (void) mptscsih_do_cmd(hd, &iocmd);
-                               }
-                       }
-               }
+       if (pcfg1Data)
+               pci_free_consistent(ioc->pcidev, header.PageLength * 4, pcfg1Data, cfg1_dma_addr);
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *     mptscsih_synchronize_cache - Send SYNCHRONIZE_CACHE to all disks.
+ *     @hd: Pointer to a SCSI HOST structure
+ *     @vtarget: per device private data
+ *     @lun: lun
+ *
+ *     Uses the ISR, but with special processing.
+ *     MUST be single-threaded.
+ *
+ */
+static void
+mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
+{
+       INTERNAL_CMD             iocmd;
 
-               /* get next relevant device */
-               id++;
+       /* Following parameters will not change
+        * in this routine.
+        */
+       iocmd.cmd = SYNCHRONIZE_CACHE;
+       iocmd.flags = 0;
+       iocmd.physDiskNum = -1;
+       iocmd.data = NULL;
+       iocmd.data_dma = -1;
+       iocmd.size = 0;
+       iocmd.rsvd = iocmd.rsvd2 = 0;
+       iocmd.bus = vdevice->bus_id;
+       iocmd.id = vdevice->target_id;
+       iocmd.lun = (u8)vdevice->lun;
 
-               if (id == hostId)
-                       id++;
+       if ((vdevice->vtarget->type & TYPE_DISK) &&
+           (vdevice->configured_lun))
+               mptscsih_do_cmd(hd, &iocmd);
+}
 
-               if (id > max_id) {
-                       id = 0;
-                       bus++;
-               }
-       }
+/* Search IOC page 3 to determine if this is hidden physical disk
+ */
+/* Search IOC page 3 to determine if this is hidden physical disk
+ */
+static int
+mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
+{
+       int i;
+
+       if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3)
+               return 0;
 
-       if (pcfg1Data) {
-               pci_free_consistent(ioc->pcidev, header1.PageLength * 4, pcfg1Data, cfg1_dma_addr);
+       for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
+               if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID)
+                       return 1;
        }
 
        return 0;
@@ -4101,8 +4021,8 @@ mptscsih_domainValidation(void *arg)
 
                        msleep(250);
 
-                       /* DV only to SCSI adapters */
-                       if (ioc->bus_type != SCSI)
+                       /* DV only to SPI adapters */
+                       if (ioc->bus_type != SPI)
                                continue;
 
                        /* Make sure everything looks ok */
@@ -4162,6 +4082,12 @@ mptscsih_domainValidation(void *arg)
                                                }
                                        }
 
+                                       if(mpt_alt_ioc_wait(hd->ioc)!=0) {
+                                               ddvprintk((MYIOC_s_WARN_FMT "alt_ioc busy!\n",
+                                                   hd->ioc->name));
+                                               continue;
+                                       }
+
                                        if (mptscsih_doDv(hd, 0, id) == 1) {
                                                /* Untagged device was busy, try again
                                                 */
@@ -4173,6 +4099,10 @@ mptscsih_domainValidation(void *arg)
                                                hd->ioc->spi_data.dvStatus[id] &= ~(MPT_SCSICFG_DV_NOT_DONE | MPT_SCSICFG_DV_PENDING);
                                        }
 
+                                       spin_lock(&hd->ioc->initializing_hba_lock);
+                                       hd->ioc->initializing_hba_lock_flag=0;
+                                       spin_unlock(&hd->ioc->initializing_hba_lock);
+
                                        if (isPhysDisk) {
                                                for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) {
                                                        if (hd->ioc->raid_data.isRaid & (1 << ii)) {
@@ -4195,32 +4125,12 @@ mptscsih_domainValidation(void *arg)
        return;
 }
 
-/* Search IOC page 3 to determine if this is hidden physical disk
- */
-/* Search IOC page 3 to determine if this is hidden physical disk
- */
-static int
-mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
-{
-       int i;
-
-       if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3)
-               return 0;
-
-       for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
-               if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID)
-                       return 1;
-       }
-
-       return 0;
-}
-
 /* Write SDP1 if no QAS has been enabled
  */
 static void
 mptscsih_qas_check(MPT_SCSI_HOST *hd, int id)
 {
-       VirtDevice *pTarget;
+       VirtTarget *vtarget;
        int ii;
 
        if (hd->Targets == NULL)
@@ -4233,11 +4143,11 @@ mptscsih_qas_check(MPT_SCSI_HOST *hd, int id)
                if ((hd->ioc->spi_data.dvStatus[ii] & MPT_SCSICFG_DV_NOT_DONE) != 0)
                        continue;
 
-               pTarget = hd->Targets[ii];
+               vtarget = hd->Targets[ii];
 
-               if ((pTarget != NULL) && (!pTarget->raidVolume)) {
-                       if ((pTarget->negoFlags & hd->ioc->spi_data.noQas) == 0) {
-                               pTarget->negoFlags |= hd->ioc->spi_data.noQas;
+               if ((vtarget != NULL) && (!vtarget->raidVolume)) {
+                       if ((vtarget->negoFlags & hd->ioc->spi_data.noQas) == 0) {
+                               vtarget->negoFlags |= hd->ioc->spi_data.noQas;
                                dnegoprintk(("writeSDP1: id=%d flags=0\n", id));
                                mptscsih_writeSDP1(hd, 0, ii, 0);
                        }
@@ -4277,7 +4187,7 @@ static int
 mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
 {
        MPT_ADAPTER             *ioc = hd->ioc;
-       VirtDevice              *pTarget;
+       VirtTarget              *vtarget;
        SCSIDevicePage1_t       *pcfg1Data;
        SCSIDevicePage0_t       *pcfg0Data;
        u8                      *pbuf1;
@@ -4348,12 +4258,12 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
        iocmd.physDiskNum = -1;
        iocmd.rsvd = iocmd.rsvd2 = 0;
 
-       pTarget = hd->Targets[id];
+       vtarget = hd->Targets[id];
 
        /* Use tagged commands if possible.
         */
-       if (pTarget) {
-               if (pTarget->tflags & MPT_TARGET_FLAGS_Q_YES)
+       if (vtarget) {
+               if (vtarget->tflags & MPT_TARGET_FLAGS_Q_YES)
                        iocmd.flags |= MPT_ICFLAG_TAGGED_CMD;
                else {
                        if (hd->ioc->facts.FWVersion.Word < 0x01000600)
@@ -4569,7 +4479,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
                /* Reset the size for disks
                 */
                inq0 = (*pbuf1) & 0x1F;
-               if ((inq0 == 0) && pTarget && !pTarget->raidVolume) {
+               if ((inq0 == 0) && vtarget && !vtarget->raidVolume) {
                        sz = 0x40;
                        iocmd.size = sz;
                }
@@ -4579,8 +4489,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
                 */
                if (inq0 == TYPE_PROCESSOR) {
                        mptscsih_initTarget(hd,
-                               bus,
-                               id,
+                               vtarget,
                                lun,
                                pbuf1,
                                sz);
@@ -4594,22 +4503,22 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
                        goto target_done;
 
                if (sz == 0x40) {
-                       if ((pTarget->maxWidth == 1) && (pTarget->maxOffset) && (nfactor < 0x0A)
-                               && (pTarget->minSyncFactor > 0x09)) {
+                       if ((vtarget->maxWidth == 1) && (vtarget->maxOffset) && (nfactor < 0x0A)
+                               && (vtarget->minSyncFactor > 0x09)) {
                                if ((pbuf1[56] & 0x04) == 0)
                                        ;
                                else if ((pbuf1[56] & 0x01) == 1) {
-                                       pTarget->minSyncFactor =
+                                       vtarget->minSyncFactor =
                                            nfactor > MPT_ULTRA320 ? nfactor : MPT_ULTRA320;
                                } else {
-                                       pTarget->minSyncFactor =
+                                       vtarget->minSyncFactor =
                                            nfactor > MPT_ULTRA160 ? nfactor : MPT_ULTRA160;
                                }
 
-                               dv.max.factor = pTarget->minSyncFactor;
+                               dv.max.factor = vtarget->minSyncFactor;
 
                                if ((pbuf1[56] & 0x02) == 0) {
-                                       pTarget->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
+                                       vtarget->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
                                        hd->ioc->spi_data.noQas = MPT_TARGET_NO_NEGO_QAS;
                                        ddvprintk((MYIOC_s_NOTE_FMT
                                            "DV: Start Basic noQas on id=%d due to pbuf1[56]=%x\n",
@@ -4692,8 +4601,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
                                                    "DV:Inquiry compared id=%d, calling initTarget\n", ioc->name, id));
                                                hd->ioc->spi_data.dvStatus[id] &= ~MPT_SCSICFG_DV_NOT_DONE;
                                                mptscsih_initTarget(hd,
-                                                       bus,
-                                                       id,
+                                                       vtarget,
                                                        lun,
                                                        pbuf1,
                                                        sz);
@@ -5194,7 +5102,7 @@ target_done:
 static void
 mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage)
 {
-       VirtDevice              *pTarget;
+       VirtTarget              *vtarget;
        SCSIDevicePage0_t       *pPage0;
        SCSIDevicePage1_t       *pPage1;
        int                     val = 0, data, configuration;
@@ -5214,11 +5122,11 @@ mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage)
                 * already throttled back.
                 */
                negoFlags = hd->ioc->spi_data.noQas;
-               if ((hd->Targets)&&((pTarget = hd->Targets[(int)id]) != NULL) && !pTarget->raidVolume) {
-                       width = pTarget->maxWidth;
-                       offset = pTarget->maxOffset;
-                       factor = pTarget->minSyncFactor;
-                       negoFlags |= pTarget->negoFlags;
+               if ((hd->Targets)&&((vtarget = hd->Targets[(int)id]) != NULL) && !vtarget->raidVolume) {
+                       width = vtarget->maxWidth;
+                       offset = vtarget->maxOffset;
+                       factor = vtarget->minSyncFactor;
+                       negoFlags |= vtarget->negoFlags;
                } else {
                        if (hd->ioc->spi_data.nvram && (hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) {
                                data = hd->ioc->spi_data.nvram[id];
@@ -5420,11 +5328,11 @@ mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage)
                 * or overwrite nvram (phys disks only).
                 */
 
-               if ((hd->Targets)&&((pTarget = hd->Targets[(int)id]) != NULL) && !pTarget->raidVolume ) {
-                       pTarget->maxWidth = dv->now.width;
-                       pTarget->maxOffset = dv->now.offset;
-                       pTarget->minSyncFactor = dv->now.factor;
-                       pTarget->negoFlags = dv->now.flags;
+               if ((hd->Targets)&&((vtarget = hd->Targets[(int)id]) != NULL) && !vtarget->raidVolume ) {
+                       vtarget->maxWidth = dv->now.width;
+                       vtarget->maxOffset = dv->now.offset;
+                       vtarget->minSyncFactor = dv->now.factor;
+                       vtarget->negoFlags = dv->now.flags;
                } else {
                        /* Preserv all flags, use
                         * read-modify-write algorithm
@@ -5578,6 +5486,94 @@ mptscsih_fillbuf(char *buffer, int size, int index, int width)
                break;
        }
 }
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return.
+ * Else set the NEED_DV flag after Read Capacity Issued (disks)
+ * or Mode Sense (cdroms).
+ *
+ * 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, struct scsi_cmnd *sc)
+{
+       MPT_ADAPTER     *ioc = hd->ioc;
+       u8 cmd;
+       SpiCfgData      *pSpi;
+
+       ddvtprintk((MYIOC_s_NOTE_FMT
+               " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n",
+               hd->ioc->name, sc->device->id, sc->device->lun , hd->negoNvram, sc->cmnd[0]));
+
+       if ((sc->device->lun != 0) || (hd->negoNvram != 0))
+               return;
+
+       cmd = sc->cmnd[0];
+
+       if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) {
+               pSpi = &ioc->spi_data;
+               if ((ioc->raid_data.isRaid & (1 << sc->device->id)) && ioc->raid_data.pIocPg3) {
+                       /* Set NEED_DV for all hidden disks
+                        */
+                       Ioc3PhysDisk_t *pPDisk =  ioc->raid_data.pIocPg3->PhysDisk;
+                       int             numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
+
+                       while (numPDisk) {
+                               pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV;
+                               ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID));
+                               pPDisk++;
+                               numPDisk--;
+                       }
+               }
+               pSpi->dvStatus[sc->device->id] |= MPT_SCSICFG_NEED_DV;
+               ddvtprintk(("NEED_DV set for visible disk id %d\n", sc->device->id));
+       }
+}
+
+/* mptscsih_raid_set_dv_flags()
+ *
+ * New or replaced disk. Set DV flag and schedule DV.
+ */
+static void
+mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id)
+{
+       MPT_ADAPTER     *ioc = hd->ioc;
+       SpiCfgData      *pSpi = &ioc->spi_data;
+       Ioc3PhysDisk_t  *pPDisk;
+       int              numPDisk;
+
+       if (hd->negoNvram != 0)
+               return;
+
+       ddvtprintk(("DV requested for phys disk id %d\n", id));
+       if (ioc->raid_data.pIocPg3) {
+               pPDisk =  ioc->raid_data.pIocPg3->PhysDisk;
+               numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
+               while (numPDisk) {
+                       if (id == pPDisk->PhysDiskNum) {
+                               pSpi->dvStatus[pPDisk->PhysDiskID] =
+                                   (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE);
+                               pSpi->forceDv = MPT_SCSICFG_NEED_DV;
+                               ddvtprintk(("NEED_DV set for phys disk id %d\n",
+                                   pPDisk->PhysDiskID));
+                               break;
+                       }
+                       pPDisk++;
+                       numPDisk--;
+               }
+
+               if (numPDisk == 0) {
+                       /* The physical disk that needs DV was not found
+                        * in the stored IOC Page 3. The driver must reload
+                        * this page. DV routine will set the NEED_DV flag for
+                        * all phys disks that have DV_NOT_DONE set.
+                        */
+                       pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3;
+                       ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id));
+               }
+       }
+}
 #endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */
 
 EXPORT_SYMBOL(mptscsih_remove);
@@ -5589,7 +5585,9 @@ EXPORT_SYMBOL(mptscsih_resume);
 EXPORT_SYMBOL(mptscsih_proc_info);
 EXPORT_SYMBOL(mptscsih_info);
 EXPORT_SYMBOL(mptscsih_qcmd);
+EXPORT_SYMBOL(mptscsih_target_alloc);
 EXPORT_SYMBOL(mptscsih_slave_alloc);
+EXPORT_SYMBOL(mptscsih_target_destroy);
 EXPORT_SYMBOL(mptscsih_slave_destroy);
 EXPORT_SYMBOL(mptscsih_slave_configure);
 EXPORT_SYMBOL(mptscsih_abort);
index 971fda4b8b57998c56ffeb2fb7aaa3a2d4ae5236..d3cba12f4bd95c38c110327bfbde76d9d6ecf1af 100644 (file)
@@ -91,7 +91,9 @@ extern int mptscsih_resume(struct pci_dev *pdev);
 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_target_alloc(struct scsi_target *starget);
 extern int mptscsih_slave_alloc(struct scsi_device *device);
+extern void mptscsih_target_destroy(struct scsi_target *starget);
 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);
index 5c0e307d1d5d4c4c9440b5625b754b0ead959ff1..ce332a6085e5345e2b64a259da1d44a04eec693d 100644 (file)
@@ -103,13 +103,16 @@ static int        mptspiTaskCtx = -1;
 static int     mptspiInternalCtx = -1; /* Used only for internal commands */
 
 static struct scsi_host_template mptspi_driver_template = {
+       .module                         = THIS_MODULE,
        .proc_name                      = "mptspi",
        .proc_info                      = mptscsih_proc_info,
        .name                           = "MPT SPI Host",
        .info                           = mptscsih_info,
        .queuecommand                   = mptscsih_qcmd,
+       .target_alloc                   = mptscsih_target_alloc,
        .slave_alloc                    = mptscsih_slave_alloc,
        .slave_configure                = mptscsih_slave_configure,
+       .target_destroy                 = mptscsih_target_destroy,
        .slave_destroy                  = mptscsih_slave_destroy,
        .change_queue_depth             = mptscsih_change_queue_depth,
        .eh_abort_handler               = mptscsih_abort,
@@ -177,13 +180,15 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                  "Skipping because it's not operational!\n",
                  ioc->name);
-               return -ENODEV;
+               error = -ENODEV;
+               goto out_mptspi_probe;
        }
 
        if (!ioc->active) {
                printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
                  ioc->name);
-               return -ENODEV;
+               error = -ENODEV;
+               goto out_mptspi_probe;
        }
 
        /*  Sanity check - ensure at least 1 port is INITIATOR capable
@@ -208,7 +213,8 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                        "Unable to register controller with SCSI subsystem\n",
                        ioc->name);
-                return -1;
+               error = -1;
+               goto out_mptspi_probe;
         }
 
        spin_lock_irqsave(&ioc->FreeQlock, flags);
@@ -286,7 +292,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        mem = kmalloc(sz, GFP_ATOMIC);
        if (mem == NULL) {
                error = -ENOMEM;
-               goto mptspi_probe_failed;
+               goto out_mptspi_probe;
        }
 
        memset(mem, 0, sz);
@@ -304,14 +310,14 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        mem = kmalloc(sz, GFP_ATOMIC);
        if (mem == NULL) {
                error = -ENOMEM;
-               goto mptspi_probe_failed;
+               goto out_mptspi_probe;
        }
 
        memset(mem, 0, sz);
-       hd->Targets = (VirtDevice **) mem;
+       hd->Targets = (VirtTarget **) mem;
 
        dprintk((KERN_INFO
-         "  Targets @ %p, sz=%d\n", hd->Targets, sz));
+         "  vdev @ %p, sz=%d\n", hd->Targets, sz));
 
        /* Clear the TM flags
         */
@@ -385,13 +391,13 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if(error) {
                dprintk((KERN_ERR MYNAM
                  "scsi_add_host failed\n"));
-               goto mptspi_probe_failed;
+               goto out_mptspi_probe;
        }
 
        scsi_scan_host(sh);
        return 0;
 
-mptspi_probe_failed:
+out_mptspi_probe:
 
        mptscsih_remove(pdev);
        return error;
index 66c03e8825703a408b21c239ff5e4781fab71ffc..ee7075fa1ec3e5ad31e5c3de88b295b2dea4663a 100644 (file)
@@ -303,6 +303,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,
        struct i2o_controller *c;
        int rc;
        struct pci_dev *i960 = NULL;
+       int pci_dev_busy = 0;
 
        printk(KERN_INFO "i2o: Checking for PCI I2O controllers...\n");
 
@@ -395,6 +396,8 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,
        if ((rc = i2o_pci_alloc(c))) {
                printk(KERN_ERR "%s: DMA / IO allocation for I2O controller "
                       " failed\n", c->name);
+               if (rc == -ENODEV)
+                       pci_dev_busy = 1;
                goto free_controller;
        }
 
@@ -421,11 +424,12 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,
        i2o_pci_free(c);
 
       free_controller:
-       i2o_iop_free(c);
        put_device(c->device.parent);
+       i2o_iop_free(c);
 
       disable:
-       pci_disable_device(pdev);
+       if (!pci_dev_busy)
+               pci_disable_device(pdev);
 
        return rc;
 }
index a984c0efabf0e39837ef40816b1c79c26eb20c57..551061c2eadfea93be0743d02528c51a9047b00c 100644 (file)
@@ -59,16 +59,18 @@ static int adcsync;
 
 static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y)
 {
-       input_report_abs(ts->idev, ABS_X, x);
-       input_report_abs(ts->idev, ABS_Y, y);
-       input_report_abs(ts->idev, ABS_PRESSURE, pressure);
-       input_sync(ts->idev);
+       struct input_dev *idev = ts->idev;
+       input_report_abs(idev, ABS_X, x);
+       input_report_abs(idev, ABS_Y, y);
+       input_report_abs(idev, ABS_PRESSURE, pressure);
+       input_sync(idev);
 }
 
 static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts)
 {
-       input_report_abs(ts->idev, ABS_PRESSURE, 0);
-       input_sync(ts->idev);
+       struct input_dev *idev = ts->idev;
+       input_report_abs(idev, ABS_PRESSURE, 0);
+       input_sync(idev);
 }
 
 /*
@@ -297,7 +299,7 @@ static void ucb1x00_ts_irq(int idx, void *id)
 
 static int ucb1x00_ts_open(struct input_dev *idev)
 {
-       struct ucb1x00_ts *ts = (struct ucb1x00_ts *)idev;
+       struct ucb1x00_ts *ts = idev->private;
        int ret = 0;
 
        BUG_ON(ts->rtask);
@@ -334,7 +336,7 @@ static int ucb1x00_ts_open(struct input_dev *idev)
  */
 static void ucb1x00_ts_close(struct input_dev *idev)
 {
-       struct ucb1x00_ts *ts = (struct ucb1x00_ts *)idev;
+       struct ucb1x00_ts *ts = idev->private;
 
        if (ts->rtask)
                kthread_stop(ts->rtask);
@@ -386,6 +388,7 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
        ts->ucb = dev->ucb;
        ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC;
 
+       ts->idev->private = ts;
        ts->idev->name       = "Touchscreen panel";
        ts->idev->id.product = ts->ucb->id;
        ts->idev->open       = ucb1x00_ts_open;
index da528390acf87293292237abddf2bf5cf66b600c..eb41391e06e938a5a0607b90defab00f82fd9827 100644 (file)
@@ -679,7 +679,15 @@ static void mmc_idle_cards(struct mmc_host *host)
 }
 
 /*
- * Apply power to the MMC stack.
+ * Apply power to the MMC stack.  This is a two-stage process.
+ * First, we enable power to the card without the clock running.
+ * We then wait a bit for the power to stabilise.  Finally,
+ * enable the bus drivers and clock to the card.
+ *
+ * We must _NOT_ enable the clock prior to power stablising.
+ *
+ * If a host does all the power sequencing itself, ignore the
+ * initial MMC_POWER_UP stage.
  */
 static void mmc_power_up(struct mmc_host *host)
 {
@@ -816,7 +824,7 @@ static void mmc_discover_cards(struct mmc_host *host)
 
                        cmd.opcode = SD_SEND_RELATIVE_ADDR;
                        cmd.arg = 0;
-                       cmd.flags = MMC_RSP_R1;
+                       cmd.flags = MMC_RSP_R6;
 
                        err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
                        if (err != MMC_ERR_NONE)
@@ -932,8 +940,9 @@ static void mmc_read_scrs(struct mmc_host *host)
 
                sg_init_one(&sg, (u8*)card->raw_scr, 8);
 
-               err = mmc_wait_for_req(host, &mrq);
-               if (err != MMC_ERR_NONE) {
+               mmc_wait_for_req(host, &mrq);
+
+               if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) {
                        mmc_card_set_dead(card);
                        continue;
                }
index d91fcf7c3178294fbef7bdfd1394efeb35bb4014..abcf19116d70af5af3289551fbb5d5317d000be1 100644 (file)
@@ -359,7 +359,12 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
                md->block_bits = card->csd.read_blkbits;
 
                blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits);
-               set_capacity(md->disk, card->csd.capacity);
+
+               /*
+                * The CSD capacity field is in units of read_blkbits.
+                * set_capacity takes units of 512 bytes.
+                */
+               set_capacity(md->disk, card->csd.capacity << (card->csd.read_blkbits - 9));
        }
  out:
        return md;
@@ -373,7 +378,7 @@ mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card)
 
        mmc_card_claim_host(card);
        cmd.opcode = MMC_SET_BLOCKLEN;
-       cmd.arg = 1 << card->csd.read_blkbits;
+       cmd.arg = 1 << md->block_bits;
        cmd.flags = MMC_RSP_R1;
        err = mmc_wait_for_cmd(card->host, &cmd, 5);
        mmc_card_release_host(card);
@@ -412,10 +417,9 @@ static int mmc_blk_probe(struct mmc_card *card)
        if (err)
                goto out;
 
-       printk(KERN_INFO "%s: %s %s %dKiB %s\n",
+       printk(KERN_INFO "%s: %s %s %luKiB %s\n",
                md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
-               (card->csd.capacity << card->csd.read_blkbits) / 1024,
-               mmc_blk_readonly(card)?"(ro)":"");
+               get_capacity(md->disk) >> 1, mmc_blk_readonly(card)?"(ro)":"");
 
        mmc_set_drvdata(card, md);
        add_disk(md->disk);
index 143f01a4c1705343a2406c53f1aff0f71b4feb28..69c04945591f935e72a6416dc55a3d09201c6b0a 100644 (file)
@@ -4,7 +4,7 @@
  *
  * (C) 2000 Red Hat. GPL'd
  *
- * $Id: cfi_cmdset_0001.c,v 1.185 2005/11/07 11:14:22 gleixner Exp $
+ * $Id: cfi_cmdset_0001.c,v 1.186 2005/11/23 22:07:52 nico Exp $
  *
  *
  * 10/10/2000  Nicolas Pitre <nico@cam.org>
@@ -644,9 +644,8 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
                 *
                 * - contension arbitration is handled in the owner's context.
                 *
-                * The 'shared' struct can be read when its lock is taken.
-                * However any writes to it can only be made when the current
-                * owner's lock is also held.
+                * The 'shared' struct can be read and/or written only when
+                * its lock is taken.
                 */
                struct flchip_shared *shared = chip->priv;
                struct flchip *contender;
@@ -675,14 +674,13 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
                        }
                        timeo = jiffies + HZ;
                        spin_lock(&shared->lock);
+                       spin_unlock(contender->mutex);
                }
 
                /* We now own it */
                shared->writing = chip;
                if (mode == FL_ERASING)
                        shared->erasing = chip;
-               if (contender && contender != chip)
-                       spin_unlock(contender->mutex);
                spin_unlock(&shared->lock);
        }
 
index 90eb30e06b7c9322fd4e71b81a794976d5f95c4a..e636aa86bc24825dca9278511e5c38e82a00f4fb 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Common Flash Interface probe code.
    (C) 2000 Red Hat. GPL'd.
-   $Id: cfi_probe.c,v 1.84 2005/11/07 11:14:23 gleixner Exp $
+   $Id: cfi_probe.c,v 1.86 2005/11/29 14:48:31 gleixner Exp $
 */
 
 #include <linux/config.h>
@@ -230,8 +230,8 @@ static int __xipram cfi_chip_setup(struct map_info *map,
        cfi_send_gen_cmd(0xaa, 0x555, base, map, cfi, cfi->device_type, NULL);
        cfi_send_gen_cmd(0x55, 0x2aa, base, map, cfi, cfi->device_type, NULL);
        cfi_send_gen_cmd(0x90, 0x555, base, map, cfi, cfi->device_type, NULL);
-       cfi->mfr = cfi_read_query(map, base);
-       cfi->id = cfi_read_query(map, base + ofs_factor);
+       cfi->mfr = cfi_read_query16(map, base);
+       cfi->id = cfi_read_query16(map, base + ofs_factor);
 
        /* Put it back into Read Mode */
        cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL);
@@ -426,7 +426,7 @@ static struct mtd_chip_driver cfi_chipdrv = {
        .module         = THIS_MODULE
 };
 
-int __init cfi_probe_init(void)
+static int __init cfi_probe_init(void)
 {
        register_mtd_chip_driver(&cfi_chipdrv);
        return 0;
index 2d26bdef82d5c9fe4fe64ad4406719edcb5b12c0..36f61a6a766e64b1421cb5d0c11a660a2924d33c 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright 2000,2001 David A. Schleef <ds@schleef.org>
  *           2000,2001 Lineo, Inc.
  *
- * $Id: sharp.c,v 1.16 2005/11/07 11:14:23 gleixner Exp $
+ * $Id: sharp.c,v 1.17 2005/11/29 14:28:28 gleixner Exp $
  *
  * Devices supported:
  *   LH28F016SCT Symmetrical block flash memory, 2Mx8
@@ -160,22 +160,28 @@ struct mtd_info *sharp_probe(struct map_info *map)
        return mtd;
 }
 
+static inline void sharp_send_cmd(struct map_info *map, unsigned long cmd, unsigned long adr)
+{
+       map_word map_cmd;
+       map_cmd.x[0] = cmd;
+       map_write(map, map_cmd, adr);
+}
+
 static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd)
 {
-       unsigned long tmp;
+       map_word tmp, read0, read4;
        unsigned long base = 0;
-       u32 read0, read4;
        int width = 4;
 
-       tmp = map_read32(map, base+0);
+       tmp = map_read(map, base+0);
 
-       map_write32(map, CMD_READ_ID, base+0);
+       sharp_send_cmd(map, CMD_READ_ID, base+0);
 
-       read0=map_read32(map, base+0);
-       read4=map_read32(map, base+4);
-       if(read0 == 0x89898989){
+       read0 = map_read(map, base+0);
+       read4 = map_read(map, base+4);
+       if(read0.x[0] == 0x89898989){
                printk("Looks like sharp flash\n");
-               switch(read4){
+               switch(read4.x[0]){
                case 0xaaaaaaaa:
                case 0xa0a0a0a0:
                        /* aa - LH28F016SCT-L95 2Mx8, 32 64k blocks*/
@@ -197,16 +203,16 @@ static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd)
                        return width;
 #endif
                default:
-                       printk("Sort-of looks like sharp flash, 0x%08x 0x%08x\n",
-                               read0,read4);
+                       printk("Sort-of looks like sharp flash, 0x%08lx 0x%08lx\n",
+                               read0.x[0], read4.x[0]);
                }
-       }else if((map_read32(map, base+0) == CMD_READ_ID)){
+       }else if((map_read(map, base+0).x[0] == CMD_READ_ID)){
                /* RAM, probably */
                printk("Looks like RAM\n");
-               map_write32(map, tmp, base+0);
+               map_write(map, tmp, base+0);
        }else{
-               printk("Doesn't look like sharp flash, 0x%08x 0x%08x\n",
-                       read0,read4);
+               printk("Doesn't look like sharp flash, 0x%08lx 0x%08lx\n",
+                       read0.x[0], read4.x[0]);
        }
 
        return 0;
@@ -215,7 +221,8 @@ static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd)
 /* This function returns with the chip->mutex lock held. */
 static int sharp_wait(struct map_info *map, struct flchip *chip)
 {
-       int status, i;
+       int i;
+       map_word status;
        unsigned long timeo = jiffies + HZ;
        DECLARE_WAITQUEUE(wait, current);
        int adr = 0;
@@ -225,12 +232,12 @@ retry:
 
        switch(chip->state){
        case FL_READY:
-               map_write32(map,CMD_READ_STATUS,adr);
+               sharp_send_cmd(map, CMD_READ_STATUS, adr);
                chip->state = FL_STATUS;
        case FL_STATUS:
                for(i=0;i<100;i++){
-                       status = map_read32(map,adr);
-                       if((status & SR_READY)==SR_READY)
+                       status = map_read(map, adr);
+                       if((status.x[0] & SR_READY)==SR_READY)
                                break;
                        udelay(1);
                }
@@ -254,7 +261,7 @@ retry:
                goto retry;
        }
 
-       map_write32(map,CMD_RESET, adr);
+       sharp_send_cmd(map, CMD_RESET, adr);
 
        chip->state = FL_READY;
 
@@ -351,37 +358,39 @@ static int sharp_write_oneword(struct map_info *map, struct flchip *chip,
        int timeo;
        int try;
        int i;
-       int status = 0;
+       map_word data, status;
 
+       status.x[0] = 0;
        ret = sharp_wait(map,chip);
 
        for(try=0;try<10;try++){
-               map_write32(map,CMD_BYTE_WRITE,adr);
+               sharp_send_cmd(map, CMD_BYTE_WRITE, adr);
                /* cpu_to_le32 -> hack to fix the writel be->le conversion */
-               map_write32(map,cpu_to_le32(datum),adr);
+               data.x[0] = cpu_to_le32(datum);
+               map_write(map, data, adr);
 
                chip->state = FL_WRITING;
 
                timeo = jiffies + (HZ/2);
 
-               map_write32(map,CMD_READ_STATUS,adr);
+               sharp_send_cmd(map, CMD_READ_STATUS, adr);
                for(i=0;i<100;i++){
-                       status = map_read32(map,adr);
-                       if((status & SR_READY)==SR_READY)
+                       status = map_read(map, adr);
+                       if((status.x[0] & SR_READY) == SR_READY)
                                break;
                }
                if(i==100){
                        printk("sharp: timed out writing\n");
                }
 
-               if(!(status&SR_ERRORS))
+               if(!(status.x[0] & SR_ERRORS))
                        break;
 
-               printk("sharp: error writing byte at addr=%08lx status=%08x\n",adr,status);
+               printk("sharp: error writing byte at addr=%08lx status=%08lx\n", adr, status.x[0]);
 
-               map_write32(map,CMD_CLEAR_STATUS,adr);
+               sharp_send_cmd(map, CMD_CLEAR_STATUS, adr);
        }
-       map_write32(map,CMD_RESET,adr);
+       sharp_send_cmd(map, CMD_RESET, adr);
        chip->state = FL_READY;
 
        wake_up(&chip->wq);
@@ -434,18 +443,18 @@ static int sharp_do_wait_for_ready(struct map_info *map, struct flchip *chip,
 {
        int ret;
        unsigned long timeo;
-       int status;
+       map_word status;
        DECLARE_WAITQUEUE(wait, current);
 
-       map_write32(map,CMD_READ_STATUS,adr);
-       status = map_read32(map,adr);
+       sharp_send_cmd(map, CMD_READ_STATUS, adr);
+       status = map_read(map, adr);
 
        timeo = jiffies + HZ;
 
        while(time_before(jiffies, timeo)){
-               map_write32(map,CMD_READ_STATUS,adr);
-               status = map_read32(map,adr);
-               if((status & SR_READY)==SR_READY){
+               sharp_send_cmd(map, CMD_READ_STATUS, adr);
+               status = map_read(map, adr);
+               if((status.x[0] & SR_READY)==SR_READY){
                        ret = 0;
                        goto out;
                }
@@ -476,7 +485,7 @@ static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip,
 {
        int ret;
        //int timeo;
-       int status;
+       map_word status;
        //int i;
 
 //printk("sharp_erase_oneblock()\n");
@@ -486,26 +495,26 @@ static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip,
        sharp_unlock_oneblock(map,chip,adr);
 #endif
 
-       map_write32(map,CMD_BLOCK_ERASE_1,adr);
-       map_write32(map,CMD_BLOCK_ERASE_2,adr);
+       sharp_send_cmd(map, CMD_BLOCK_ERASE_1, adr);
+       sharp_send_cmd(map, CMD_BLOCK_ERASE_2, adr);
 
        chip->state = FL_ERASING;
 
        ret = sharp_do_wait_for_ready(map,chip,adr);
        if(ret<0)return ret;
 
-       map_write32(map,CMD_READ_STATUS,adr);
-       status = map_read32(map,adr);
+       sharp_send_cmd(map, CMD_READ_STATUS, adr);
+       status = map_read(map, adr);
 
-       if(!(status&SR_ERRORS)){
-               map_write32(map,CMD_RESET,adr);
+       if(!(status.x[0] & SR_ERRORS)){
+               sharp_send_cmd(map, CMD_RESET, adr);
                chip->state = FL_READY;
                //spin_unlock_bh(chip->mutex);
                return 0;
        }
 
-       printk("sharp: error erasing block at addr=%08lx status=%08x\n",adr,status);
-       map_write32(map,CMD_CLEAR_STATUS,adr);
+       printk("sharp: error erasing block at addr=%08lx status=%08lx\n", adr, status.x[0]);
+       sharp_send_cmd(map, CMD_CLEAR_STATUS, adr);
 
        //spin_unlock_bh(chip->mutex);
 
@@ -517,20 +526,20 @@ static void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip,
        unsigned long adr)
 {
        int i;
-       int status;
+       map_word status;
 
-       map_write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr);
-       map_write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr);
+       sharp_send_cmd(map, CMD_CLEAR_BLOCK_LOCKS_1, adr);
+       sharp_send_cmd(map, CMD_CLEAR_BLOCK_LOCKS_2, adr);
 
        udelay(100);
 
-       status = map_read32(map,adr);
-       printk("status=%08x\n",status);
+       status = map_read(map, adr);
+       printk("status=%08lx\n", status.x[0]);
 
        for(i=0;i<1000;i++){
-               //map_write32(map,CMD_READ_STATUS,adr);
-               status = map_read32(map,adr);
-               if((status & SR_READY)==SR_READY)
+               //sharp_send_cmd(map, CMD_READ_STATUS, adr);
+               status = map_read(map, adr);
+               if((status.x[0] & SR_READY) == SR_READY)
                        break;
                udelay(100);
        }
@@ -538,14 +547,14 @@ static void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip,
                printk("sharp: timed out unlocking block\n");
        }
 
-       if(!(status&SR_ERRORS)){
-               map_write32(map,CMD_RESET,adr);
+       if(!(status.x[0] & SR_ERRORS)){
+               sharp_send_cmd(map, CMD_RESET, adr);
                chip->state = FL_READY;
                return;
        }
 
-       printk("sharp: error unlocking block at addr=%08lx status=%08x\n",adr,status);
-       map_write32(map,CMD_CLEAR_STATUS,adr);
+       printk("sharp: error unlocking block at addr=%08lx status=%08lx\n", adr, status.x[0]);
+       sharp_send_cmd(map, CMD_CLEAR_STATUS, adr);
 }
 #endif
 
index f9db52f6bf00f40156ece013ffd6f37e60769aee..04f864d238db20dace05912914d10d4347c9068a 100644 (file)
@@ -113,7 +113,7 @@ static int bi_write_complete(struct bio *bio, unsigned int bytes_done, int error
                        ClearPageUptodate(page);
                        SetPageError(page);
                }
-               ClearPageDirty(page);
+               clear_page_dirty(page);
                unlock_page(page);
                page_cache_release(page);
        } while (bvec >= bio->bi_io_vec);
@@ -289,7 +289,7 @@ static int write_pages(struct blkmtd_dev *dev, const u_char *buf, loff_t to,
                        BUG();
                }
                memcpy(page_address(page)+offset, buf, start_len);
-               SetPageDirty(page);
+               set_page_dirty(page);
                SetPageUptodate(page);
                buf += start_len;
                thislen = start_len;
@@ -336,7 +336,7 @@ static int write_pages(struct blkmtd_dev *dev, const u_char *buf, loff_t to,
                        }
                        pagenr++;
                        pagecnt--;
-                       SetPageDirty(page);
+                       set_page_dirty(page);
                        SetPageUptodate(page);
                        pagesc--;
                        thislen += PAGE_SIZE;
@@ -357,7 +357,7 @@ static int write_pages(struct blkmtd_dev *dev, const u_char *buf, loff_t to,
                        BUG();
                }
                memcpy(page_address(page), buf, end_len);
-               SetPageDirty(page);
+               set_page_dirty(page);
                SetPageUptodate(page);
                DEBUG(3, "blkmtd: write: writing out partial end\n");
                thislen += end_len;
index 0aaa0ced9aba0acd7d5105d16a4fe90b4323be73..7ff403b2a0a056588ff97c3963211cc708ff0e98 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: block2mtd.c,v 1.29 2005/11/07 11:14:24 gleixner Exp $
+ * $Id: block2mtd.c,v 1.30 2005/11/29 14:48:32 gleixner Exp $
  *
  * block2mtd.c - create an mtd from a block device
  *
@@ -19,7 +19,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/buffer_head.h>
 
-#define VERSION "$Revision: 1.29 $"
+#define VERSION "$Revision: 1.30 $"
 
 
 #define ERROR(fmt, args...) printk(KERN_ERR "block2mtd: " fmt "\n" , ## args)
@@ -40,7 +40,7 @@ static LIST_HEAD(blkmtd_device_list);
 
 
 #define PAGE_READAHEAD 64
-void cache_readahead(struct address_space *mapping, int index)
+static void cache_readahead(struct address_space *mapping, int index)
 {
        filler_t *filler = (filler_t*)mapping->a_ops->readpage;
        int i, pagei;
index f5026cee087fa22925365d0b662267ba1b73f8e9..0ff2e4378244c0603a39a03bd40664d207ec7c7a 100644 (file)
@@ -6,7 +6,7 @@
  *     as published by the Free Software Foundation; either version
  *     2 of the License, or (at your option) any later version.
  *
- *     $Id: ms02-nv.c,v 1.10 2005/06/20 12:24:41 macro Exp $
+ *     $Id: ms02-nv.c,v 1.11 2005/11/14 13:41:47 macro Exp $
  */
 
 #include <linux/init.h>
@@ -293,13 +293,13 @@ static int __init ms02nv_init(void)
 
        switch (mips_machtype) {
        case MACH_DS5000_200:
-               csr = (volatile u32 *)KN02_CSR_BASE;
+               csr = (volatile u32 *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_CSR);
                if (*csr & KN02_CSR_BNK32M)
                        stride = 2;
                break;
        case MACH_DS5000_2X0:
        case MACH_DS5900:
-               csr = (volatile u32 *)KN03_MCR_BASE;
+               csr = (volatile u32 *)CKSEG1ADDR(KN03_SLOT_BASE + IOASIC_MCR);
                if (*csr & KN03_MCR_BNK32M)
                        stride = 2;
                break;
index de7e231d6d180deb3528caeb62593555ba09f363..8a878b34eca0b34c090f2ec41f6c72d41d4f307c 100644 (file)
@@ -1,5 +1,5 @@
 /* This version ported to the Linux-MTD system by dwmw2@infradead.org
- * $Id: ftl.c,v 1.58 2005/11/07 11:14:19 gleixner Exp $
+ * $Id: ftl.c,v 1.59 2005/11/29 14:48:31 gleixner Exp $
  *
  * Fixes: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  * - fixes some leaks on failure in build_maps and ftl_notify_add, cleanups
@@ -1084,9 +1084,9 @@ struct mtd_blktrans_ops ftl_tr = {
        .owner          = THIS_MODULE,
 };
 
-int init_ftl(void)
+static int init_ftl(void)
 {
-       DEBUG(0, "$Id: ftl.c,v 1.58 2005/11/07 11:14:19 gleixner Exp $\n");
+       DEBUG(0, "$Id: ftl.c,v 1.59 2005/11/29 14:48:31 gleixner Exp $\n");
 
        return register_mtd_blktrans(&ftl_tr);
 }
index 846a533323a8ee845da72d8299b6425f6a47ffcd..b9b77cf39a18af4460f85c1e13d514da0c9f8848 100644 (file)
@@ -62,7 +62,7 @@ config MTD_PHYSMAP_BANKWIDTH
 
 config MTD_SUN_UFLASH
        tristate "Sun Microsystems userflash support"
-       depends on (SPARC32 || SPARC64) && MTD_CFI
+       depends on SPARC && MTD_CFI
        help
          This provides a 'mapping' driver which supports the way in
          which user-programmable flash chips are connected on various
@@ -538,12 +538,6 @@ config MTD_MPC1211
          This enables access to the flash chips on the Interface MPC-1211(CTP/PCI/MPC-SH02).
          If you have such a board, say 'Y'.
 
-config MTD_PQ2FADS
-       tristate "JEDEC flash SIMM mapped on PQ2FADS and 8272ADS boards"
-       depends on (ADS8272 || PQ2FADS) && MTD_PARTITIONS && MTD_JEDECPROBE && MTD_PHYSMAP && MTD_CFI_GEOMETRY && MTD_CFI_INTELEXT
-       help
-        This enables access to flash SIMM on PQ2FADS-like boards
-
 config MTD_OMAP_NOR
        tristate "TI OMAP board mappings"
        depends on MTD_CFI && ARCH_OMAP
index 7d9e940a1dcd7e5ddc20621bcae3ece4f5f0739e..2f7e254912f0f21126df4703e55b9d8d0b612618 100644 (file)
@@ -70,6 +70,5 @@ obj-$(CONFIG_MTD_DMV182)      += dmv182.o
 obj-$(CONFIG_MTD_SHARP_SL)     += sharpsl-flash.o
 obj-$(CONFIG_MTD_PLATRAM)      += plat-ram.o
 obj-$(CONFIG_MTD_OMAP_NOR)     += omap_nor.o
-obj-$(CONFIG_MTD_PQ2FADS)      += pq2fads.o
 obj-$(CONFIG_MTD_MTX1)         += mtx-1_flash.o
 obj-$(CONFIG_MTD_TQM834x)      += tqm834x.o
index 35097c9bbf50c5bb560fe5fce3b039a3a4c4eba3..b8ccb0a9578984221c5ad3caad30ee3caa9d03d3 100644 (file)
@@ -246,7 +246,7 @@ int __init ipaq_mtd_init(void)
                        ipaq_map[i].size = h3xxx_max_flash_size;
                        ipaq_map[i].set_vpp = h3xxx_set_vpp;
                        ipaq_map[i].phys = cs_phys[i];
-                       ipaq_map[i].virt = __ioremap(cs_phys[i], 0x04000000, 0, 1);
+                       ipaq_map[i].virt = ioremap(cs_phys[i], 0x04000000);
                        if (machine_is_h3100 () || machine_is_h1900())
                                ipaq_map[i].bankwidth = 2;
                }
@@ -280,7 +280,7 @@ int __init ipaq_mtd_init(void)
                nb_parts = ARRAY_SIZE(jornada_partitions);
                ipaq_map[0].size = jornada_max_flash_size;
                ipaq_map[0].set_vpp = jornada56x_set_vpp;
-               ipaq_map[0].virt = (__u32)__ioremap(0x0, 0x04000000, 0, 1);
+               ipaq_map[0].virt = (__u32)ioremap(0x0, 0x04000000);
        }
 #endif
 #ifdef CONFIG_SA1100_JORNADA720
@@ -442,7 +442,7 @@ static int __init h1900_special_case(void)
        ipaq_map[0].size = 0x80000;
        ipaq_map[0].set_vpp = h3xxx_set_vpp;
        ipaq_map[0].phys = 0x0;
-       ipaq_map[0].virt = __ioremap(0x0, 0x04000000, 0, 1);
+       ipaq_map[0].virt = ioremap(0x0, 0x04000000);
        ipaq_map[0].bankwidth = 2;
 
        printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt);
index fc7a78e31735bc4ea35f56f9a34480e79aa23101..2c9cc7f37e9216fcf5cae2d8e526514114e178b1 100644 (file)
@@ -159,12 +159,12 @@ static int ixp2000_flash_probe(struct platform_device *dev)
                return -ENODEV;
 
        window_size = dev->resource->end - dev->resource->start + 1;
-       dev_info(_dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n",
-                       ixp_data->nr_banks, ((u32)window_size >> 20));
+       dev_info(&dev->dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n",
+                ixp_data->nr_banks, ((u32)window_size >> 20));
 
        if (plat->width != 1) {
-               dev_err(_dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n",
-                               plat->width * 8);
+               dev_err(&dev->dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n",
+                       plat->width * 8);
                return -EIO;
        }
 
@@ -202,7 +202,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
                        dev->resource->end - dev->resource->start + 1,
                        dev->dev.bus_id);
        if (!info->res) {
-               dev_err(_dev, "Could not reserve memory region\n");
+               dev_err(&dev->dev, "Could not reserve memory region\n");
                err = -ENOMEM;
                goto Error;
        }
@@ -210,7 +210,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
        info->map.map_priv_1 = (unsigned long) ioremap(dev->resource->start,
                                dev->resource->end - dev->resource->start + 1);
        if (!info->map.map_priv_1) {
-               dev_err(_dev, "Failed to ioremap flash region\n");
+               dev_err(&dev->dev, "Failed to ioremap flash region\n");
                err = -EIO;
                goto Error;
        }
@@ -221,13 +221,13 @@ static int ixp2000_flash_probe(struct platform_device *dev)
         */
 
        erratum44_workaround = ixp2000_has_broken_slowport();
-       dev_info(_dev, "Erratum 44 workaround %s\n",
+       dev_info(&dev->dev, "Erratum 44 workaround %s\n",
               erratum44_workaround ? "enabled" : "disabled");
 #endif
 
        info->mtd = do_map_probe(plat->map_name, &info->map);
        if (!info->mtd) {
-               dev_err(_dev, "map_probe failed\n");
+               dev_err(&dev->dev, "map_probe failed\n");
                err = -ENXIO;
                goto Error;
        }
@@ -237,7 +237,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
        if (err > 0) {
                err = add_mtd_partitions(info->mtd, info->partitions, err);
                if(err)
-                       dev_err(_dev, "Could not parse partitions\n");
+                       dev_err(&dev->dev, "Could not parse partitions\n");
        }
 
        if (err)
@@ -251,8 +251,8 @@ Error:
 }
 
 static struct platform_driver ixp2000_flash_driver = {
-       .probe          = &ixp2000_flash_probe,
-       .remove         = &ixp2000_flash_remove
+       .probe          = ixp2000_flash_probe,
+       .remove         = ixp2000_flash_remove,
        .driver         = {
                .name   = "IXP2000-Flash",
        },
index a59f8027903c5d632975bbb28e23ad91f369b35f..986c586283907b517ec236cd13b7d6fd0225c3cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ixp4xx.c,v 1.12 2005/11/07 11:14:27 gleixner Exp $
+ * $Id: ixp4xx.c,v 1.13 2005/11/16 16:23:21 dvrabel Exp $
  *
  * drivers/mtd/maps/ixp4xx.c
  *
 
 #include <linux/reboot.h>
 
+/*
+ * Read/write a 16 bit word from flash address 'addr'.
+ *
+ * When the cpu is in little-endian mode it swizzles the address lines
+ * ('address coherency') so we need to undo the swizzling to ensure commands
+ * and the like end up on the correct flash address.
+ *
+ * To further complicate matters, due to the way the expansion bus controller
+ * handles 32 bit reads, the byte stream ABCD is stored on the flash as:
+ *     D15    D0
+ *     +---+---+
+ *     | A | B | 0
+ *     +---+---+
+ *     | C | D | 2
+ *     +---+---+
+ * This means that on LE systems each 16 bit word must be swapped. Note that
+ * this requires CONFIG_MTD_CFI_BE_BYTE_SWAP to be enabled to 'unswap' the CFI
+ * data and other flash commands which are always in D7-D0.
+ */
 #ifndef __ARMEB__
+#ifndef CONFIG_MTD_CFI_BE_BYTE_SWAP
+#  error CONFIG_MTD_CFI_BE_BYTE_SWAP required
+#endif
+
+static inline u16 flash_read16(void __iomem *addr)
+{
+       return be16_to_cpu(__raw_readw((void __iomem *)((unsigned long)addr ^ 0x2)));
+}
+
+static inline void flash_write16(u16 d, void __iomem *addr)
+{
+       __raw_writew(cpu_to_be16(d), (void __iomem *)((unsigned long)addr ^ 0x2));
+}
+
 #define        BYTE0(h)        ((h) & 0xFF)
 #define        BYTE1(h)        (((h) >> 8) & 0xFF)
+
 #else
+
+static inline u16 flash_read16(const void __iomem *addr)
+{
+       return __raw_readw(addr);
+}
+
+static inline void flash_write16(u16 d, void __iomem *addr)
+{
+       __raw_writew(d, addr);
+}
+
 #define        BYTE0(h)        (((h) >> 8) & 0xFF)
 #define        BYTE1(h)        ((h) & 0xFF)
 #endif
@@ -45,7 +90,7 @@
 static map_word ixp4xx_read16(struct map_info *map, unsigned long ofs)
 {
        map_word val;
-       val.x[0] = le16_to_cpu(readw(map->virt + ofs));
+       val.x[0] = flash_read16(map->virt + ofs);
        return val;
 }
 
@@ -57,19 +102,28 @@ static map_word ixp4xx_read16(struct map_info *map, unsigned long ofs)
 static void ixp4xx_copy_from(struct map_info *map, void *to,
                             unsigned long from, ssize_t len)
 {
-       int i;
        u8 *dest = (u8 *) to;
        void __iomem *src = map->virt + from;
-       u16 data;
 
-       for (i = 0; i < (len / 2); i++) {
-               data = le16_to_cpu(readw(src + 2*i));
-               dest[i * 2] = BYTE0(data);
-               dest[i * 2 + 1] = BYTE1(data);
+       if (len <= 0)
+               return;
+
+       if (from & 1) {
+               *dest++ = BYTE1(flash_read16(src));
+                src++;
+               --len;
        }
 
-       if (len & 1)
-               dest[len - 1] = BYTE0(le16_to_cpu(readw(src + 2*i)));
+       while (len >= 2) {
+               u16 data = flash_read16(src);
+               *dest++ = BYTE0(data);
+               *dest++ = BYTE1(data);
+               src += 2;
+               len -= 2;
+        }
+
+       if (len > 0)
+               *dest++ = BYTE0(flash_read16(src));
 }
 
 /*
@@ -79,7 +133,7 @@ static void ixp4xx_copy_from(struct map_info *map, void *to,
 static void ixp4xx_probe_write16(struct map_info *map, map_word d, unsigned long adr)
 {
        if (!(adr & 1))
-               writew(cpu_to_le16(d.x[0]), map->virt + adr);
+               flash_write16(d.x[0], map->virt + adr);
 }
 
 /*
@@ -87,7 +141,7 @@ static void ixp4xx_probe_write16(struct map_info *map, map_word d, unsigned long
  */
 static void ixp4xx_write16(struct map_info *map, map_word d, unsigned long adr)
 {
-       writew(cpu_to_le16(d.x[0]), map->virt + adr);
+       flash_write16(d.x[0], map->virt + adr);
 }
 
 struct ixp4xx_flash_info {
index f00ee7e54dba7dbdaa17a30d3e2ff013d3f3eb6d..632eb2aa968f476b9686bd46cea03157ed5cb376 100644 (file)
@@ -6,7 +6,7 @@
  *      (C) Copyright 2000-2001, Greg Ungerer (gerg@snapgear.com)
  *      (C) Copyright 2001-2002, SnapGear (www.snapgear.com)
  *
- *     $Id: nettel.c,v 1.11 2005/11/07 11:14:27 gleixner Exp $
+ *     $Id: nettel.c,v 1.12 2005/11/29 14:30:00 gleixner Exp $
  */
 
 /****************************************************************************/
@@ -479,7 +479,7 @@ void __exit nettel_cleanup(void)
        }
        if (nettel_intel_map.virt) {
                iounmap(nettel_intel_map.virt);
-               nettel_intel_map.virt = 0;
+               nettel_intel_map.virt = NULL;
        }
 #endif
 }
index 8b3570b090954bd27f8034d69620d0dc9baf2fd3..21822c2edbe40126198990635473c902c06e7dc0 100644 (file)
@@ -7,7 +7,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- *  $Id: pci.c,v 1.13 2005/11/07 11:14:27 gleixner Exp $
+ *  $Id: pci.c,v 1.14 2005/11/17 08:20:27 dwmw2 Exp $
  *
  * Generic PCI memory map driver.  We support the following boards:
  *  - Intel IQ80310 ATU.
@@ -102,7 +102,7 @@ static void mtd_pci_copyto(struct map_info *_map, unsigned long to, const void *
        memcpy_toio(map->base + map->translate(map, to), from, len);
 }
 
-static struct map_info mtd_pci_map = {
+static const struct map_info mtd_pci_map = {
        .phys =         NO_XIP,
        .copy_from =    mtd_pci_copyfrom,
        .copy_to =      mtd_pci_copyto,
index 9ee760f97bc6ae58da80183fe3de17cdc77e80d4..f49ebc3c4606c89dbc60605cbbf31dd33a6bf93f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: physmap.c,v 1.38 2005/11/07 11:14:28 gleixner Exp $
+ * $Id: physmap.c,v 1.39 2005/11/29 14:49:36 gleixner Exp $
  *
  * Normal mappings of chips in physical memory
  *
@@ -19,6 +19,7 @@
 #include <linux/mtd/map.h>
 #include <linux/config.h>
 #include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
 
 static struct mtd_info *mymtd;
 
index 6fb9f3c57aabe1fc9fc443675d0bd82c5dd741ff..ed92afadd8a91b4e13183c314b62ea8b88085406 100644 (file)
@@ -16,7 +16,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  *
- * $Id: sc520cdp.c,v 1.22 2005/11/07 11:14:28 gleixner Exp $
+ * $Id: sc520cdp.c,v 1.23 2005/11/17 08:20:27 dwmw2 Exp $
  *
  *
  * The SC520CDP is an evaluation board for the Elan SC520 processor available
@@ -164,7 +164,7 @@ struct sc520_par_table
        unsigned long default_address;
 };
 
-static struct sc520_par_table par_table[NUM_FLASH_BANKS] =
+static const struct sc520_par_table par_table[NUM_FLASH_BANKS] =
 {
        {       /* Flash Bank #0: selected by ROMCS0 */
                SC520_PAR_ROMCS0,
index 041e4b3358fbce2d953ef14d77e4c5e9e609e048..f68f7a99a6309bafb051d76b634654f52c0bbe7e 100644 (file)
@@ -112,7 +112,7 @@ static int __init h1910_init (void)
        if (!machine_is_h1900())
                return -ENODEV;
 
-       nandaddr = __ioremap(0x08000000, 0x1000, 0, 1);
+       nandaddr = ioremap(0x08000000, 0x1000);
        if (!nandaddr) {
                printk("Failed to ioremap nand flash.\n");
                return -ENOMEM;
index de4500395300065d99e3489e4d445947c64b1fed..a0af92cc7efd787624f6848d93d618eca898ce84 100644 (file)
@@ -1486,7 +1486,7 @@ ns_nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
 /*
  * Module initialization function
  */
-int __init ns_init_module(void)
+static int __init ns_init_module(void)
 {
        struct nand_chip *chip;
        struct nandsim *nand;
index 48cce431f89f3ebe498fc8673ee69606c5017848..45c077d0f0630289f9763e35beeccf11ca285cc4 100644 (file)
@@ -12,9 +12,9 @@
  *   This is a device driver for the OneNAND flash for generic boards.
  */
 
-#include <linux/device.h>
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/onenand.h>
 #include <linux/mtd/partitions.h>
@@ -39,7 +39,7 @@ static int __devinit generic_onenand_probe(struct device *dev)
 {
        struct onenand_info *info;
        struct platform_device *pdev = to_platform_device(dev);
-       struct onenand_platform_data *pdata = pdev->dev.platform_data;
+       struct flash_platform_data *pdata = pdev->dev.platform_data;
        struct resource *res = pdev->resource;
        unsigned long size = res->end - res->start + 1;
        int err;
index f67d5d6eb9a68aa1f290b4e580429c13017cd5c1..a53a73fc2a5af0d0a07a8f880793e2b8c37c4489 100644 (file)
@@ -940,7 +940,7 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
        u_char *eccbuf, struct nand_oobinfo *oobsel)
 {
        struct onenand_chip *this = mtd->priv;
-       unsigned char buffer[MAX_ONENAND_PAGESIZE], *pbuf;
+       unsigned char *pbuf;
        size_t total_len, len;
        int i, written = 0;
        int ret = 0;
@@ -975,7 +975,7 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
        /* Loop until all keve's data has been written */
        len = 0;
        while (count) {
-               pbuf = buffer;
+               pbuf = this->page_buf;
                /*
                 * If the given tuple is >= pagesize then
                 * write it out from the iov
@@ -995,7 +995,7 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
                        int cnt = 0, thislen;
                        while (cnt < mtd->oobblock) {
                                thislen = min_t(int, mtd->oobblock - cnt, vecs->iov_len - len);
-                               memcpy(buffer + cnt, vecs->iov_base + len, thislen);
+                               memcpy(this->page_buf + cnt, vecs->iov_base + len, thislen);
                                cnt += thislen;
                                len += thislen;
 
@@ -1296,6 +1296,12 @@ static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len)
 
        /* Block lock scheme */
        for (block = start; block < end; block++) {
+               /* Set block address */
+               value = onenand_block_address(this, block);
+               this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
+               /* Select DataRAM for DDP */
+               value = onenand_bufferram_address(this, block);
+               this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
                /* Set start block address */
                this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
                /* Write unlock command */
@@ -1309,10 +1315,6 @@ static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len)
                    & ONENAND_CTRL_ONGO)
                        continue;
 
-               /* Set block address for read block status */
-               value = onenand_block_address(this, block);
-               this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
-
                /* Check lock status */
                status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
                if (!(status & ONENAND_WP_US))
@@ -1346,7 +1348,6 @@ static void onenand_print_device_info(int device)
 
 static const struct onenand_manufacturers onenand_manuf_ids[] = {
         {ONENAND_MFR_SAMSUNG, "Samsung"},
-        {ONENAND_MFR_UNKNOWN, "Unknown"}
 };
 
 /**
@@ -1357,17 +1358,22 @@ static const struct onenand_manufacturers onenand_manuf_ids[] = {
  */
 static int onenand_check_maf(int manuf)
 {
+       int size = ARRAY_SIZE(onenand_manuf_ids);
+       char *name;
         int i;
 
-        for (i = 0; onenand_manuf_ids[i].id; i++) {
+       for (i = 0; i < size; i++)
                 if (manuf == onenand_manuf_ids[i].id)
                         break;
-        }
 
-        printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n",
-                onenand_manuf_ids[i].name, manuf);
+       if (i < size)
+               name = onenand_manuf_ids[i].name;
+       else
+               name = "Unknown";
+
+       printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
 
-        return (i != ONENAND_MFR_UNKNOWN);
+       return (i == size);
 }
 
 /**
@@ -1513,6 +1519,18 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
                this->read_bufferram = onenand_sync_read_bufferram;
        }
 
+       /* Allocate buffers, if necessary */
+       if (!this->page_buf) {
+               size_t len;
+               len = mtd->oobblock + mtd->oobsize;
+               this->page_buf = kmalloc(len, GFP_KERNEL);
+               if (!this->page_buf) {
+                       printk(KERN_ERR "onenand_scan(): Can't allocate page_buf\n");
+                       return -ENOMEM;
+               }
+               this->options |= ONENAND_PAGEBUF_ALLOC;
+       }
+
        this->state = FL_READY;
        init_waitqueue_head(&this->wq);
        spin_lock_init(&this->chip_lock);
@@ -1574,12 +1592,21 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
  */
 void onenand_release(struct mtd_info *mtd)
 {
+       struct onenand_chip *this = mtd->priv;
+
 #ifdef CONFIG_MTD_PARTITIONS
        /* Deregister partitions */
        del_mtd_partitions (mtd);
 #endif
        /* Deregister the device */
        del_mtd_device (mtd);
+
+       /* Free bad block table memory, if allocated */
+       if (this->bbm)
+               kfree(this->bbm);
+       /* Buffer allocated by onenand_scan */
+       if (this->options & ONENAND_PAGEBUF_ALLOC)
+               kfree(this->page_buf);
 }
 
 EXPORT_SYMBOL_GPL(onenand_scan);
index f40190f499e120416f9ba795a210ad357d8ad203..4510d3361eaa82f77ddca510bb4fa460a26cb3f1 100644 (file)
@@ -118,10 +118,10 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
  */
 static inline int onenand_memory_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd)
 {
-       unsigned char data_buf[MAX_ONENAND_PAGESIZE];
+       struct onenand_chip *this = mtd->priv;
 
         bd->options &= ~NAND_BBT_SCANEMPTY;
-        return create_bbt(mtd, data_buf, bd, -1);
+       return create_bbt(mtd, this->page_buf, bd, -1);
 }
 
 /**
index 0ab8d29caeea07ecaf4e0434cfa7b2fd512496e7..20ce212638fcc33178c4ff939cd505bf05d21060 100644 (file)
@@ -30,11 +30,9 @@ MODULE_PARM_DESC(block_size, "Block size to use by RFD, defaults to erase unit s
 
 #define PREFIX "rfd_ftl: "
 
-/* Major device # for FTL device */
-
-/* A request for this major has been sent to device@lanana.org */
+/* This major has been assigned by device@lanana.org */
 #ifndef RFD_FTL_MAJOR
-#define RFD_FTL_MAJOR          95
+#define RFD_FTL_MAJOR          256
 #endif
 
 /* Maximum number of partitions in an FTL region */
index 30bee11c48bd2d8364ac8f8e93abe47c5467593e..d2102a27d3071492dd4c3cd686e286c6dffaf8f4 100644 (file)
@@ -586,16 +586,16 @@ struct rtl8139_private {
        dma_addr_t tx_bufs_dma;
        signed char phys[4];            /* MII device addresses. */
        char twistie, twist_row, twist_col;     /* Twister tune state. */
-       unsigned int default_port:4;    /* Last dev->if_port value. */
+       unsigned int default_port : 4;  /* Last dev->if_port value. */
+       unsigned int have_thread : 1;
        spinlock_t lock;
        spinlock_t rx_lock;
        chip_t chipset;
-       pid_t thr_pid;
-       wait_queue_head_t thr_wait;
-       struct completion thr_exited;
        u32 rx_config;
        struct rtl_extra_stats xstats;
-       int time_to_die;
+
+       struct work_struct thread;
+
        struct mii_if_info mii;
        unsigned int regs_len;
        unsigned long fifo_copy_timeout;
@@ -620,7 +620,7 @@ 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,
                        int val);
-static void rtl8139_start_thread(struct net_device *dev);
+static void rtl8139_start_thread(struct rtl8139_private *tp);
 static void rtl8139_tx_timeout (struct net_device *dev);
 static void rtl8139_init_ring (struct net_device *dev);
 static int rtl8139_start_xmit (struct sk_buff *skb,
@@ -637,6 +637,7 @@ static struct net_device_stats *rtl8139_get_stats (struct net_device *dev);
 static void rtl8139_set_rx_mode (struct net_device *dev);
 static void __set_rx_mode (struct net_device *dev);
 static void rtl8139_hw_start (struct net_device *dev);
+static void rtl8139_thread (void *_data);
 static struct ethtool_ops rtl8139_ethtool_ops;
 
 /* write MMIO register, with flush */
@@ -1007,8 +1008,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
                (debug < 0 ? RTL8139_DEF_MSG_ENABLE : ((1 << debug) - 1));
        spin_lock_init (&tp->lock);
        spin_lock_init (&tp->rx_lock);
-       init_waitqueue_head (&tp->thr_wait);
-       init_completion (&tp->thr_exited);
+       INIT_WORK(&tp->thread, rtl8139_thread, dev);
        tp->mii.dev = dev;
        tp->mii.mdio_read = mdio_read;
        tp->mii.mdio_write = mdio_write;
@@ -1345,7 +1345,7 @@ static int rtl8139_open (struct net_device *dev)
                        dev->irq, RTL_R8 (MediaStatus),
                        tp->mii.full_duplex ? "full" : "half");
 
-       rtl8139_start_thread(dev);
+       rtl8139_start_thread(tp);
 
        return 0;
 }
@@ -1594,55 +1594,43 @@ static inline void rtl8139_thread_iter (struct net_device *dev,
                 RTL_R8 (Config1));
 }
 
-static int rtl8139_thread (void *data)
+static void rtl8139_thread (void *_data)
 {
-       struct net_device *dev = data;
+       struct net_device *dev = _data;
        struct rtl8139_private *tp = netdev_priv(dev);
-       unsigned long timeout;
-
-       daemonize("%s", dev->name);
-       allow_signal(SIGTERM);
-
-       while (1) {
-               timeout = next_tick;
-               do {
-                       timeout = interruptible_sleep_on_timeout (&tp->thr_wait, timeout);
-                       /* make swsusp happy with our thread */
-                       try_to_freeze();
-               } while (!signal_pending (current) && (timeout > 0));
-
-               if (signal_pending (current)) {
-                       flush_signals(current);
-               }
+       unsigned long thr_delay;
 
-               if (tp->time_to_die)
-                       break;
-
-               if (rtnl_lock_interruptible ())
-                       break;
+       if (rtnl_shlock_nowait() == 0) {
                rtl8139_thread_iter (dev, tp, tp->mmio_addr);
                rtnl_unlock ();
+
+               thr_delay = next_tick;
+       } else {
+               /* unlikely race.  mitigate with fast poll. */
+               thr_delay = HZ / 2;
        }
 
-       complete_and_exit (&tp->thr_exited, 0);
+       schedule_delayed_work(&tp->thread, thr_delay);
 }
 
-static void rtl8139_start_thread(struct net_device *dev)
+static void rtl8139_start_thread(struct rtl8139_private *tp)
 {
-       struct rtl8139_private *tp = netdev_priv(dev);
-
-       tp->thr_pid = -1;
        tp->twistie = 0;
-       tp->time_to_die = 0;
        if (tp->chipset == CH_8139_K)
                tp->twistie = 1;
        else if (tp->drv_flags & HAS_LNK_CHNG)
                return;
 
-       tp->thr_pid = kernel_thread(rtl8139_thread, dev, CLONE_FS|CLONE_FILES);
-       if (tp->thr_pid < 0) {
-               printk (KERN_WARNING "%s: unable to start kernel thread\n",
-                       dev->name);
+       tp->have_thread = 1;
+
+       schedule_delayed_work(&tp->thread, next_tick);
+}
+
+static void rtl8139_stop_thread(struct rtl8139_private *tp)
+{
+       if (tp->have_thread) {
+               cancel_rearming_delayed_work(&tp->thread);
+               tp->have_thread = 0;
        }
 }
 
@@ -2224,22 +2212,12 @@ static int rtl8139_close (struct net_device *dev)
 {
        struct rtl8139_private *tp = netdev_priv(dev);
        void __iomem *ioaddr = tp->mmio_addr;
-       int ret = 0;
        unsigned long flags;
 
        netif_stop_queue (dev);
 
-       if (tp->thr_pid >= 0) {
-               tp->time_to_die = 1;
-               wmb();
-               ret = kill_proc (tp->thr_pid, SIGTERM, 1);
-               if (ret) {
-                       printk (KERN_ERR "%s: unable to signal thread\n", dev->name);
-                       return ret;
-               }
-               wait_for_completion (&tp->thr_exited);
-       }
-       
+       rtl8139_stop_thread(tp);
+
        if (netif_msg_ifdown(tp))
                printk(KERN_DEBUG "%s: Shutting down ethercard, status was 0x%4.4x.\n",
                        dev->name, RTL_R16 (IntrStatus));
index ebd7313d7fc1c1652d26c37e9c984b92c57bcbe7..e2fa29b612cdffbea7c7488ebcd0a77ddf62f726 100644 (file)
@@ -1901,6 +1901,8 @@ config E1000_NAPI
 
          If in doubt, say N.
 
+source "drivers/net/ixp2000/Kconfig"
+
 config MYRI_SBUS
        tristate "MyriCOM Gigabit Ethernet support"
        depends on SBUS
@@ -2008,7 +2010,18 @@ config SKGE
 
          It does not support the link failover and network management 
          features that "portable" vendor supplied sk98lin driver does.
-       
+
+
+config SKY2
+       tristate "SysKonnect Yukon2 support (EXPERIMENTAL)"
+       depends on PCI && EXPERIMENTAL
+       select CRC32
+       ---help---
+         This driver support the Marvell Yukon 2 Gigabit Ethernet adapter.
+
+         To compile this driver as a module, choose M here: the module
+         will be called sky2.  This is recommended.
+
 config SK98LIN
        tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
        depends on PCI
@@ -2120,7 +2133,7 @@ config BNX2
 
 config SPIDER_NET
        tristate "Spider Gigabit Ethernet driver"
-       depends on PCI && PPC_BPA
+       depends on PCI && PPC_CELL
        help
          This driver supports the Gigabit Ethernet chips present on the
          Cell Processor-Based Blades from IBM.
index 4cffd34442aafaddc00865df86c26f410ccd61a2..b74a7cb5bae6e163c518199e28eb6269b5dc15d5 100644 (file)
@@ -13,7 +13,10 @@ obj-$(CONFIG_CHELSIO_T1) += chelsio/
 obj-$(CONFIG_BONDING) += bonding/
 obj-$(CONFIG_GIANFAR) += gianfar_driver.o
 
-gianfar_driver-objs := gianfar.o gianfar_ethtool.o gianfar_mii.o
+gianfar_driver-objs := gianfar.o \
+               gianfar_ethtool.o \
+               gianfar_mii.o \
+               gianfar_sysfs.o
 
 #
 # link order important here
@@ -59,6 +62,7 @@ spidernet-y += spider_net.o spider_net_ethtool.o sungem_phy.o
 obj-$(CONFIG_SPIDER_NET) += spidernet.o
 obj-$(CONFIG_TC35815) += tc35815.o
 obj-$(CONFIG_SKGE) += skge.o
+obj-$(CONFIG_SKY2) += sky2.o
 obj-$(CONFIG_SK98LIN) += sk98lin/
 obj-$(CONFIG_SKFP) += skfp/
 obj-$(CONFIG_VIA_RHINE) += via-rhine.o
@@ -202,6 +206,7 @@ obj-$(CONFIG_NET_TULIP) += tulip/
 obj-$(CONFIG_HAMRADIO) += hamradio/
 obj-$(CONFIG_IRDA) += irda/
 obj-$(CONFIG_ETRAX_ETHERNET) += cris/
+obj-$(CONFIG_ENP2611_MSF_NET) += ixp2000/
 
 obj-$(CONFIG_NETCONSOLE) += netconsole.o
 
index c53848f787ebb600632d4f8b05964de4b7b919dd..7aa49b974dc5510cb17a46099186ea43335ab22b 100644 (file)
@@ -28,8 +28,8 @@
 
 #define DRV_MODULE_NAME                "b44"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "0.96"
-#define DRV_MODULE_RELDATE     "Nov 8, 2005"
+#define DRV_MODULE_VERSION     "0.97"
+#define DRV_MODULE_RELDATE     "Nov 30, 2005"
 
 #define B44_DEF_MSG_ENABLE       \
        (NETIF_MSG_DRV          | \
@@ -1417,6 +1417,7 @@ static int b44_open(struct net_device *dev)
        add_timer(&bp->timer);
 
        b44_enable_ints(bp);
+       netif_start_queue(dev);
 out:
        return err;
 }
@@ -1837,12 +1838,15 @@ static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
        struct mii_ioctl_data *data = if_mii(ifr);
        struct b44 *bp = netdev_priv(dev);
-       int err;
+       int err = -EINVAL;
+
+       if (!netif_running(dev))
+               goto out;
 
        spin_lock_irq(&bp->lock);
        err = generic_mii_ioctl(&bp->mii_if, data, cmd, NULL);
        spin_unlock_irq(&bp->lock);
-
+out:
        return err;
 }
 
@@ -2113,6 +2117,7 @@ static int b44_resume(struct pci_dev *pdev)
        add_timer(&bp->timer);
 
        b44_enable_ints(bp);
+       netif_wake_queue(dev);
        return 0;
 }
 
index cf50384b469e9c83f8e3ed81c4258f706176e017..5cdae2bc055a9c27d679af0793d97bce459c0fd1 100644 (file)
@@ -4,5 +4,5 @@
 
 obj-$(CONFIG_BONDING) += bonding.o
 
-bonding-objs := bond_main.o bond_3ad.o bond_alb.o
+bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o
 
index d2f34d5a80835c786122a4ba359164d524b5bde6..f3f5825469d63c43b58df4851e8c56754ba7e800 100644 (file)
  * The full GNU General Public License is included in this distribution in the
  * file called LICENSE.
  *
- *
- * Changes:
- *
- * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Amir Noam <amir.noam at intel dot com>
- *     - Added support for lacp_rate module param.
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Based on discussion on mailing list, changed locking scheme
- *       to use lock/unlock or lock_bh/unlock_bh appropriately instead
- *       of lock_irqsave/unlock_irqrestore. The new scheme helps exposing
- *       hidden bugs and solves system hangs that occurred due to the fact
- *       that holding lock_irqsave doesn't prevent softirqs from running.
- *       This also increases total throughput since interrupts are not
- *       blocked on each transmitted packets or monitor timeout.
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Renamed bond_3ad_link_status_changed() to
- *       bond_3ad_handle_link_change() for compatibility with TLB.
- *
- * 2003/05/20 - Amir Noam <amir.noam at intel dot com>
- *     - Fix long fail over time when releasing last slave of an active
- *       aggregator - send LACPDU on unbind of slave to tell partner this
- *       port is no longer aggregatable.
- *
- * 2003/06/25 - Tsippy Mendelson <tsippy.mendelson at intel dot com>
- *     - Send LACPDU as highest priority packet to further fix the above
- *       problem on very high Tx traffic load where packets may get dropped
- *       by the slave.
- *
- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Code cleanup and style changes
  */
 
 //#define BONDING_DEBUG 1
@@ -1198,10 +1166,10 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
                        // detect loopback situation
                        if (!MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->actor_system))) {
                                // INFO_RECEIVED_LOOPBACK_FRAMES
-                               printk(KERN_ERR DRV_NAME ": An illegal loopback occurred on adapter (%s)\n",
-                                               port->slave->dev->name);
-                               printk(KERN_ERR "Check the configuration to verify that all Adapters "
-                                               "are connected to 802.3ad compliant switch ports\n");
+                               printk(KERN_ERR DRV_NAME ": %s: An illegal loopback occurred on "
+                                      "adapter (%s). Check the configuration to verify that all "
+                                      "Adapters are connected to 802.3ad compliant switch ports\n",
+                                      port->slave->dev->master->name, port->slave->dev->name);
                                __release_rx_machine_lock(port);
                                return;
                        }
@@ -1378,8 +1346,9 @@ static void ad_port_selection_logic(struct port *port)
                        }
                }
                if (!curr_port) { // meaning: the port was related to an aggregator but was not on the aggregator port list
-                       printk(KERN_WARNING DRV_NAME ": Warning: Port %d (on %s) was "
+                       printk(KERN_WARNING DRV_NAME ": %s: Warning: Port %d (on %s) was "
                               "related to aggregator %d but was not on its port list\n",
+                              port->slave->dev->master->name,
                               port->actor_port_number, port->slave->dev->name,
                               port->aggregator->aggregator_identifier);
                }
@@ -1450,7 +1419,8 @@ static void ad_port_selection_logic(struct port *port)
 
                        dprintk("Port %d joined LAG %d(new LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
                } else {
-                       printk(KERN_ERR DRV_NAME ": Port %d (on %s) did not find a suitable aggregator\n",
+                       printk(KERN_ERR DRV_NAME ": %s: Port %d (on %s) did not find a suitable aggregator\n",
+                              port->slave->dev->master->name,
                               port->actor_port_number, port->slave->dev->name);
                }
        }
@@ -1582,8 +1552,9 @@ static void ad_agg_selection_logic(struct aggregator *aggregator)
 
                // check if any partner replys
                if (best_aggregator->is_individual) {
-                       printk(KERN_WARNING DRV_NAME ": Warning: No 802.3ad response from the link partner "
-                                       "for any adapters in the bond\n");
+                       printk(KERN_WARNING DRV_NAME ": %s: Warning: No 802.3ad response from "
+                              "the link partner for any adapters in the bond\n",
+                              best_aggregator->slave->dev->master->name);
                }
 
                // check if there are more than one aggregator
@@ -1915,7 +1886,8 @@ int bond_3ad_bind_slave(struct slave *slave)
        struct aggregator *aggregator;
 
        if (bond == NULL) {
-               printk(KERN_ERR "The slave %s is not attached to its bond\n", slave->dev->name);
+               printk(KERN_ERR DRV_NAME ": %s: The slave %s is not attached to its bond\n",
+                      slave->dev->master->name, slave->dev->name);
                return -1;
        }
 
@@ -1990,7 +1962,9 @@ void bond_3ad_unbind_slave(struct slave *slave)
 
        // if slave is null, the whole port is not initialized
        if (!port->slave) {
-               printk(KERN_WARNING DRV_NAME ": Trying to unbind an uninitialized port on %s\n", slave->dev->name);
+               printk(KERN_WARNING DRV_NAME ": Warning: %s: Trying to "
+                      "unbind an uninitialized port on %s\n",
+                      slave->dev->master->name, slave->dev->name);
                return;
        }
 
@@ -2021,7 +1995,8 @@ void bond_3ad_unbind_slave(struct slave *slave)
                                dprintk("Some port(s) related to LAG %d - replaceing with LAG %d\n", aggregator->aggregator_identifier, new_aggregator->aggregator_identifier);
 
                                if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) {
-                                       printk(KERN_INFO DRV_NAME ": Removing an active aggregator\n");
+                                       printk(KERN_INFO DRV_NAME ": %s: Removing an active aggregator\n",
+                                              aggregator->slave->dev->master->name);
                                        // select new active aggregator
                                         select_new_active_agg = 1;
                                }
@@ -2051,15 +2026,17 @@ void bond_3ad_unbind_slave(struct slave *slave)
                                        ad_agg_selection_logic(__get_first_agg(port));
                                }
                        } else {
-                               printk(KERN_WARNING DRV_NAME ": Warning: unbinding aggregator, "
-                                      "and could not find a new aggregator for its ports\n");
+                               printk(KERN_WARNING DRV_NAME ": %s: Warning: unbinding aggregator, "
+                                      "and could not find a new aggregator for its ports\n",
+                                      slave->dev->master->name);
                        }
                } else { // in case that the only port related to this aggregator is the one we want to remove
                        select_new_active_agg = aggregator->is_active;
                        // clear the aggregator
                        ad_clear_agg(aggregator);
                        if (select_new_active_agg) {
-                               printk(KERN_INFO "Removing an active aggregator\n");
+                               printk(KERN_INFO DRV_NAME ": %s: Removing an active aggregator\n",
+                                      slave->dev->master->name);
                                // select new active aggregator
                                ad_agg_selection_logic(__get_first_agg(port));
                        }
@@ -2085,7 +2062,8 @@ void bond_3ad_unbind_slave(struct slave *slave)
                                        // clear the aggregator
                                        ad_clear_agg(temp_aggregator);
                                        if (select_new_active_agg) {
-                                               printk(KERN_INFO "Removing an active aggregator\n");
+                                               printk(KERN_INFO DRV_NAME ": %s: Removing an active aggregator\n",
+                                                      slave->dev->master->name);
                                                // select new active aggregator
                                                ad_agg_selection_logic(__get_first_agg(port));
                                        }
@@ -2131,7 +2109,8 @@ void bond_3ad_state_machine_handler(struct bonding *bond)
                // select the active aggregator for the bond
                if ((port = __get_first_port(bond))) {
                        if (!port->slave) {
-                               printk(KERN_WARNING DRV_NAME ": Warning: bond's first port is uninitialized\n");
+                               printk(KERN_WARNING DRV_NAME ": %s: Warning: bond's first port is "
+                                      "uninitialized\n", bond->dev->name);
                                goto re_arm;
                        }
 
@@ -2143,7 +2122,8 @@ void bond_3ad_state_machine_handler(struct bonding *bond)
        // for each port run the state machines
        for (port = __get_first_port(bond); port; port = __get_next_port(port)) {
                if (!port->slave) {
-                       printk(KERN_WARNING DRV_NAME ": Warning: Found an uninitialized port\n");
+                       printk(KERN_WARNING DRV_NAME ": %s: Warning: Found an uninitialized "
+                              "port\n", bond->dev->name);
                        goto re_arm;
                }
 
@@ -2184,7 +2164,8 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u
                port = &(SLAVE_AD_INFO(slave).port);
 
                if (!port->slave) {
-                       printk(KERN_WARNING DRV_NAME ": Warning: port of slave %s is uninitialized\n", slave->dev->name);
+                       printk(KERN_WARNING DRV_NAME ": %s: Warning: port of slave %s is "
+                              "uninitialized\n", slave->dev->name, slave->dev->master->name);
                        return;
                }
 
@@ -2230,8 +2211,9 @@ void bond_3ad_adapter_speed_changed(struct slave *slave)
 
        // if slave is null, the whole port is not initialized
        if (!port->slave) {
-               printk(KERN_WARNING DRV_NAME ": Warning: speed changed for uninitialized port on %s\n",
-                      slave->dev->name);
+               printk(KERN_WARNING DRV_NAME ": Warning: %s: speed "
+                      "changed for uninitialized port on %s\n",
+                      slave->dev->master->name, slave->dev->name);
                return;
        }
 
@@ -2257,8 +2239,9 @@ void bond_3ad_adapter_duplex_changed(struct slave *slave)
 
        // if slave is null, the whole port is not initialized
        if (!port->slave) {
-               printk(KERN_WARNING DRV_NAME ": Warning: duplex changed for uninitialized port on %s\n",
-                      slave->dev->name);
+               printk(KERN_WARNING DRV_NAME ": %s: Warning: duplex changed "
+                      "for uninitialized port on %s\n",
+                      slave->dev->master->name, slave->dev->name);
                return;
        }
 
@@ -2285,8 +2268,9 @@ void bond_3ad_handle_link_change(struct slave *slave, char link)
 
        // if slave is null, the whole port is not initialized
        if (!port->slave) {
-               printk(KERN_WARNING DRV_NAME ": Warning: link status changed for uninitialized port on %s\n",
-                       slave->dev->name);
+               printk(KERN_WARNING DRV_NAME ": Warning: %s: link status changed for "
+                      "uninitialized port on %s\n",
+                       slave->dev->master->name, slave->dev->name);
                return;
        }
 
@@ -2363,7 +2347,8 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
        }
 
        if (bond_3ad_get_active_agg_info(bond, &ad_info)) {
-               printk(KERN_DEBUG "ERROR: bond_3ad_get_active_agg_info failed\n");
+               printk(KERN_DEBUG DRV_NAME ": %s: Error: "
+                      "bond_3ad_get_active_agg_info failed\n", dev->name);
                goto out;
        }
 
@@ -2372,7 +2357,9 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
 
        if (slaves_in_agg == 0) {
                /*the aggregator is empty*/
-               printk(KERN_DEBUG "ERROR: active aggregator is empty\n");
+               printk(KERN_DEBUG DRV_NAME ": %s: Error: active "
+                      "aggregator is empty\n",
+                      dev->name);
                goto out;
        }
 
@@ -2390,7 +2377,8 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
        }
 
        if (slave_agg_no >= 0) {
-               printk(KERN_ERR DRV_NAME ": Error: Couldn't find a slave to tx on for aggregator ID %d\n", agg_id);
+               printk(KERN_ERR DRV_NAME ": %s: Error: Couldn't find a slave to tx on "
+                      "for aggregator ID %d\n", dev->name, agg_id);
                goto out;
        }
 
index 673a30af5660f58a096f1253c34fb10bd40bcbec..5ee2cef5b037f9d5f0b41ff2015a34c3067af2a0 100644 (file)
  * The full GNU General Public License is included in this distribution in the
  * file called LICENSE.
  *
- *
- * Changes:
- *
- * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Amir Noam <amir.noam at intel dot com>
- *     - Added support for lacp_rate module param.
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Renamed bond_3ad_link_status_changed() to
- *       bond_3ad_handle_link_change() for compatibility with TLB.
- *
- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Code cleanup and style changes
  */
 
 #ifndef __BOND_3AD_H__
index f8fce39611972f18fefdd8524368955425d84466..854ddfb90da19139bfcdbbe47810117772c4f8ef 100644 (file)
  * The full GNU General Public License is included in this distribution in the
  * file called LICENSE.
  *
- *
- * Changes:
- *
- * 2003/06/25 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Fixed signed/unsigned calculation errors that caused load sharing
- *       to collapse to one slave under very heavy UDP Tx stress.
- *
- * 2003/08/06 - Amir Noam <amir.noam at intel dot com>
- *     - Add support for setting bond's MAC address with special
- *       handling required for ALB/TLB.
- *
- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Code cleanup and style changes
- *
- * 2003/12/30 - Amir Noam <amir.noam at intel dot com>
- *     - Fixed: Cannot remove and re-enslave the original active slave.
- *
- * 2004/01/14 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Add capability to tag self generated packets in ALB/TLB modes.
  */
 
 //#define BONDING_DEBUG 1
@@ -198,20 +179,21 @@ static int tlb_initialize(struct bonding *bond)
 {
        struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
        int size = TLB_HASH_TABLE_SIZE * sizeof(struct tlb_client_info);
+       struct tlb_client_info *new_hashtbl;
        int i;
 
        spin_lock_init(&(bond_info->tx_hashtbl_lock));
 
-       _lock_tx_hashtbl(bond);
-
-       bond_info->tx_hashtbl = kmalloc(size, GFP_KERNEL);
-       if (!bond_info->tx_hashtbl) {
+       new_hashtbl = kmalloc(size, GFP_KERNEL);
+       if (!new_hashtbl) {
                printk(KERN_ERR DRV_NAME
-                      ": Error: %s: Failed to allocate TLB hash table\n",
+                      ": %s: Error: Failed to allocate TLB hash table\n",
                       bond->dev->name);
-               _unlock_tx_hashtbl(bond);
                return -1;
        }
+       _lock_tx_hashtbl(bond);
+
+       bond_info->tx_hashtbl = new_hashtbl;
 
        memset(bond_info->tx_hashtbl, 0, size);
 
@@ -513,7 +495,8 @@ static void rlb_update_client(struct rlb_client_info *client_info)
                                 client_info->mac_dst);
                if (!skb) {
                        printk(KERN_ERR DRV_NAME
-                              ": Error: failed to create an ARP packet\n");
+                              ": %s: Error: failed to create an ARP packet\n",
+                              client_info->slave->dev->master->name);
                        continue;
                }
 
@@ -523,7 +506,8 @@ static void rlb_update_client(struct rlb_client_info *client_info)
                        skb = vlan_put_tag(skb, client_info->vlan_id);
                        if (!skb) {
                                printk(KERN_ERR DRV_NAME
-                                      ": Error: failed to insert VLAN tag\n");
+                                      ": %s: Error: failed to insert VLAN tag\n",
+                                      client_info->slave->dev->master->name);
                                continue;
                        }
                }
@@ -606,8 +590,9 @@ static void rlb_req_update_subnet_clients(struct bonding *bond, u32 src_ip)
 
                if (!client_info->slave) {
                        printk(KERN_ERR DRV_NAME
-                              ": Error: found a client with no channel in "
-                              "the client's hash table\n");
+                              ": %s: Error: found a client with no channel in "
+                              "the client's hash table\n",
+                              bond->dev->name);
                        continue;
                }
                /*update all clients using this src_ip, that are not assigned
@@ -797,21 +782,22 @@ static int rlb_initialize(struct bonding *bond)
 {
        struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
        struct packet_type *pk_type = &(BOND_ALB_INFO(bond).rlb_pkt_type);
+       struct rlb_client_info  *new_hashtbl;
        int size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info);
        int i;
 
        spin_lock_init(&(bond_info->rx_hashtbl_lock));
 
-       _lock_rx_hashtbl(bond);
-
-       bond_info->rx_hashtbl = kmalloc(size, GFP_KERNEL);
-       if (!bond_info->rx_hashtbl) {
+       new_hashtbl = kmalloc(size, GFP_KERNEL);
+       if (!new_hashtbl) {
                printk(KERN_ERR DRV_NAME
-                      ": Error: %s: Failed to allocate RLB hash table\n",
+                      ": %s: Error: Failed to allocate RLB hash table\n",
                       bond->dev->name);
-               _unlock_rx_hashtbl(bond);
                return -1;
        }
+       _lock_rx_hashtbl(bond);
+
+       bond_info->rx_hashtbl = new_hashtbl;
 
        bond_info->rx_hashtbl_head = RLB_NULL_INDEX;
 
@@ -927,7 +913,8 @@ static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[])
                        skb = vlan_put_tag(skb, vlan->vlan_id);
                        if (!skb) {
                                printk(KERN_ERR DRV_NAME
-                                      ": Error: failed to insert VLAN tag\n");
+                                      ": %s: Error: failed to insert VLAN tag\n",
+                                      bond->dev->name);
                                continue;
                        }
                }
@@ -956,11 +943,11 @@ static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw)
        s_addr.sa_family = dev->type;
        if (dev_set_mac_address(dev, &s_addr)) {
                printk(KERN_ERR DRV_NAME
-                      ": Error: dev_set_mac_address of dev %s failed! ALB "
+                      ": %s: Error: dev_set_mac_address of dev %s failed! ALB "
                       "mode requires that the base driver support setting "
                       "the hw address also when the network device's "
                       "interface is open\n",
-                      dev->name);
+                      dev->master->name, dev->name);
                return -EOPNOTSUPP;
        }
        return 0;
@@ -1153,16 +1140,16 @@ static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slav
                                       bond->alb_info.rlb_enabled);
 
                printk(KERN_WARNING DRV_NAME
-                      ": Warning: the hw address of slave %s is in use by "
+                      ": %s: Warning: the hw address of slave %s is in use by "
                       "the bond; giving it the hw address of %s\n",
-                      slave->dev->name, free_mac_slave->dev->name);
+                      bond->dev->name, slave->dev->name, free_mac_slave->dev->name);
 
        } else if (has_bond_addr) {
                printk(KERN_ERR DRV_NAME
-                      ": Error: the hw address of slave %s is in use by the "
+                      ": %s: Error: the hw address of slave %s is in use by the "
                       "bond; couldn't find a slave with a free hw address to "
                       "give it (this should not have happened)\n",
-                      slave->dev->name);
+                      bond->dev->name, slave->dev->name);
                return -EFAULT;
        }
 
@@ -1250,6 +1237,8 @@ int bond_alb_initialize(struct bonding *bond, int rlb_enabled)
                        tlb_deinitialize(bond);
                        return res;
                }
+       } else {
+               bond->alb_info.rlb_enabled = 0;
        }
 
        return 0;
@@ -1409,7 +1398,7 @@ void bond_alb_monitor(struct bonding *bond)
                read_lock(&bond->curr_slave_lock);
 
                bond_for_each_slave(bond, slave, i) {
-                       alb_send_learning_packets(slave,slave->dev->dev_addr);
+                       alb_send_learning_packets(slave, slave->dev->dev_addr);
                }
 
                read_unlock(&bond->curr_slave_lock);
index e4091cd8d6547e6474c622f71283f794c8557f5e..28f2a2fd1b5a956cb896561d2646690ed49bf230 100644 (file)
  * The full GNU General Public License is included in this distribution in the
  * file called LICENSE.
  *
- *
- * Changes:
- *
- * 2003/08/06 - Amir Noam <amir.noam at intel dot com>
- *     - Add support for setting bond's MAC address with special
- *       handling required for ALB/TLB.
- *
- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Code cleanup and style changes
  */
 
 #ifndef __BOND_ALB_H__
index 94cec3cf2a1304b994b8279daf0cd01cbf7c2dbc..2582d98ef5c3308c16214b75f520ec1abb1b97e4 100644 (file)
  *     b: if a hw mac address already is there, eth0's hw mac address
  *        will then be set from bond0.
  *
- * v0.1 - first working version.
- * v0.2 - changed stats to be calculated by summing slaves stats.
- *
- * Changes:
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
- * - fix leaks on failure at bond_init
- *
- * 2000/09/30 - Willy Tarreau <willy at meta-x.org>
- *     - added trivial code to release a slave device.
- *     - fixed security bug (CAP_NET_ADMIN not checked)
- *     - implemented MII link monitoring to disable dead links :
- *       All MII capable slaves are checked every <miimon> milliseconds
- *       (100 ms seems good). This value can be changed by passing it to
- *       insmod. A value of zero disables the monitoring (default).
- *     - fixed an infinite loop in bond_xmit_roundrobin() when there's no
- *       good slave.
- *     - made the code hopefully SMP safe
- *
- * 2000/10/03 - Willy Tarreau <willy at meta-x.org>
- *     - optimized slave lists based on relevant suggestions from Thomas Davis
- *     - implemented active-backup method to obtain HA with two switches:
- *       stay as long as possible on the same active interface, while we
- *       also monitor the backup one (MII link status) because we want to know
- *       if we are able to switch at any time. ( pass "mode=1" to insmod )
- *     - lots of stress testings because we need it to be more robust than the
- *       wires ! :->
- *
- * 2000/10/09 - Willy Tarreau <willy at meta-x.org>
- *     - added up and down delays after link state change.
- *     - optimized the slaves chaining so that when we run forward, we never
- *       repass through the bond itself, but we can find it by searching
- *       backwards. Renders the deletion more difficult, but accelerates the
- *       scan.
- *     - smarter enslaving and releasing.
- *     - finer and more robust SMP locking
- *
- * 2000/10/17 - Willy Tarreau <willy at meta-x.org>
- *     - fixed two potential SMP race conditions
- *
- * 2000/10/18 - Willy Tarreau <willy at meta-x.org>
- *     - small fixes to the monitoring FSM in case of zero delays
- * 2000/11/01 - Willy Tarreau <willy at meta-x.org>
- *     - fixed first slave not automatically used in trunk mode.
- * 2000/11/10 : spelling of "EtherChannel" corrected.
- * 2000/11/13 : fixed a race condition in case of concurrent accesses to ioctl().
- * 2000/12/16 : fixed improper usage of rtnl_exlock_nowait().
- *
- * 2001/1/3 - Chad N. Tindel <ctindel at ieee dot org>
- *     - The bonding driver now simulates MII status monitoring, just like
- *       a normal network device.  It will show that the link is down iff
- *       every slave in the bond shows that their links are down.  If at least
- *       one slave is up, the bond's MII status will appear as up.
- *
- * 2001/2/7 - Chad N. Tindel <ctindel at ieee dot org>
- *     - Applications can now query the bond from user space to get
- *       information which may be useful.  They do this by calling
- *       the BOND_INFO_QUERY ioctl.  Once the app knows how many slaves
- *       are in the bond, it can call the BOND_SLAVE_INFO_QUERY ioctl to
- *       get slave specific information (# link failures, etc).  See
- *       <linux/if_bonding.h> for more details.  The structs of interest
- *       are ifbond and ifslave.
- *
- * 2001/4/5 - Chad N. Tindel <ctindel at ieee dot org>
- *     - Ported to 2.4 Kernel
- *
- * 2001/5/2 - Jeffrey E. Mast <jeff at mastfamily dot com>
- *     - When a device is detached from a bond, the slave device is no longer
- *       left thinking that is has a master.
- *
- * 2001/5/16 - Jeffrey E. Mast <jeff at mastfamily dot com>
- *     - memset did not appropriately initialized the bond rw_locks. Used
- *       rwlock_init to initialize to unlocked state to prevent deadlock when
- *       first attempting a lock
- *     - Called SET_MODULE_OWNER for bond device
- *
- * 2001/5/17 - Tim Anderson <tsa at mvista.com>
- *     - 2 paths for releasing for slave release; 1 through ioctl
- *       and 2) through close. Both paths need to release the same way.
- *     - the free slave in bond release is changing slave status before
- *       the free. The netdev_set_master() is intended to change slave state
- *       so it should not be done as part of the release process.
- *     - Simple rule for slave state at release: only the active in A/B and
- *       only one in the trunked case.
- *
- * 2001/6/01 - Tim Anderson <tsa at mvista.com>
- *     - Now call dev_close when releasing a slave so it doesn't screw up
- *       out routing table.
- *
- * 2001/6/01 - Chad N. Tindel <ctindel at ieee dot org>
- *     - Added /proc support for getting bond and slave information.
- *       Information is in /proc/net/<bond device>/info.
- *     - Changed the locking when calling bond_close to prevent deadlock.
- *
- * 2001/8/05 - Janice Girouard <girouard at us.ibm.com>
- *     - correct problem where refcnt of slave is not incremented in bond_ioctl
- *       so the system hangs when halting.
- *     - correct locking problem when unable to malloc in bond_enslave.
- *     - adding bond_xmit_xor logic.
- *     - adding multiple bond device support.
- *
- * 2001/8/13 - Erik Habbinga <erik_habbinga at hp dot com>
- *     - correct locking problem with rtnl_exlock_nowait
- *
- * 2001/8/23 - Janice Girouard <girouard at us.ibm.com>
- *     - bzero initial dev_bonds, to correct oops
- *     - convert SIOCDEVPRIVATE to new MII ioctl calls
- *
- * 2001/9/13 - Takao Indoh <indou dot takao at jp dot fujitsu dot com>
- *     - Add the BOND_CHANGE_ACTIVE ioctl implementation
- *
- * 2001/9/14 - Mark Huth <mhuth at mvista dot com>
- *     - Change MII_LINK_READY to not check for end of auto-negotiation,
- *       but only for an up link.
- *
- * 2001/9/20 - Chad N. Tindel <ctindel at ieee dot org>
- *     - Add the device field to bonding_t.  Previously the net_device
- *       corresponding to a bond wasn't available from the bonding_t
- *       structure.
- *
- * 2001/9/25 - Janice Girouard <girouard at us.ibm.com>
- *     - add arp_monitor for active backup mode
- *
- * 2001/10/23 - Takao Indoh <indou dot takao at jp dot fujitsu dot com>
- *     - Various memory leak fixes
- *
- * 2001/11/5 - Mark Huth <mark dot huth at mvista dot com>
- *     - Don't take rtnl lock in bond_mii_monitor as it deadlocks under
- *       certain hotswap conditions.
- *       Note:  this same change may be required in bond_arp_monitor ???
- *     - Remove possibility of calling bond_sethwaddr with NULL slave_dev ptr
- *     - Handle hot swap ethernet interface deregistration events to remove
- *       kernel oops following hot swap of enslaved interface
- *
- * 2002/1/2 - Chad N. Tindel <ctindel at ieee dot org>
- *     - Restore original slave flags at release time.
- *
- * 2002/02/18 - Erik Habbinga <erik_habbinga at hp dot com>
- *     - bond_release(): calling kfree on our_slave after call to
- *       bond_restore_slave_flags, not before
- *     - bond_enslave(): saving slave flags into original_flags before
- *       call to netdev_set_master, so the IFF_SLAVE flag doesn't end
- *       up in original_flags
- *
- * 2002/04/05 - Mark Smith <mark.smith at comdev dot cc> and
- *              Steve Mead <steve.mead at comdev dot cc>
- *     - Port Gleb Natapov's multicast support patchs from 2.4.12
- *       to 2.4.18 adding support for multicast.
- *
- * 2002/06/10 - Tony Cureington <tony.cureington * hp_com>
- *     - corrected uninitialized pointer (ifr.ifr_data) in bond_check_dev_link;
- *       actually changed function to use MIIPHY, then MIIREG, and finally
- *       ETHTOOL to determine the link status
- *     - fixed bad ifr_data pointer assignments in bond_ioctl
- *     - corrected mode 1 being reported as active-backup in bond_get_info;
- *       also added text to distinguish type of load balancing (rr or xor)
- *     - change arp_ip_target module param from "1-12s" (array of 12 ptrs)
- *       to "s" (a single ptr)
- *
- * 2002/08/30 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - Removed acquisition of xmit_lock in set_multicast_list; caused
- *       deadlock on SMP (lock is held by caller).
- *     - Revamped SIOCGMIIPHY, SIOCGMIIREG portion of bond_check_dev_link().
- *
- * 2002/09/18 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - Fixed up bond_check_dev_link() (and callers): removed some magic
- *      numbers, banished local MII_ defines, wrapped ioctl calls to
- *      prevent EFAULT errors
- *
- * 2002/9/30 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - make sure the ip target matches the arp_target before saving the
- *      hw address.
- *
- * 2002/9/30 - Dan Eisner <eisner at 2robots dot com>
- *     - make sure my_ip is set before taking down the link, since
- *      not all switches respond if the source ip is not set.
- *
- * 2002/10/8 - Janice Girouard <girouard at us dot ibm dot com>
- *     - read in the local ip address when enslaving a device
- *     - add primary support
- *     - make sure 2*arp_interval has passed when a new device
- *       is brought on-line before taking it down.
- *
- * 2002/09/11 - Philippe De Muyter <phdm at macqel dot be>
- *     - Added bond_xmit_broadcast logic.
- *     - Added bond_mode() support function.
- *
- * 2002/10/26 - Laurent Deniel <laurent.deniel at free.fr>
- *     - allow to register multicast addresses only on active slave
- *       (useful in active-backup mode)
- *     - add multicast module parameter
- *     - fix deletion of multicast groups after unloading module
- *
- * 2002/11/06 - Kameshwara Rayaprolu <kameshwara.rao * wipro_com>
- *     - Changes to prevent panic from closing the device twice; if we close
- *       the device in bond_release, we must set the original_flags to down
- *       so it won't be closed again by the network layer.
- *
- * 2002/11/07 - Tony Cureington <tony.cureington * hp_com>
- *     - Fix arp_target_hw_addr memory leak
- *     - Created activebackup_arp_monitor function to handle arp monitoring
- *       in active backup mode - the bond_arp_monitor had several problems...
- *       such as allowing slaves to tx arps sequentially without any delay
- *       for a response
- *     - Renamed bond_arp_monitor to loadbalance_arp_monitor and re-wrote
- *       this function to just handle arp monitoring in load-balancing mode;
- *       it is a lot more compact now
- *     - Changes to ensure one and only one slave transmits in active-backup
- *       mode
- *     - Robustesize parameters; warn users about bad combinations of
- *       parameters; also if miimon is specified and a network driver does
- *       not support MII or ETHTOOL, inform the user of this
- *     - Changes to support link_failure_count when in arp monitoring mode
- *     - Fix up/down delay reported in /proc
- *     - Added version; log version; make version available from "modinfo -d"
- *     - Fixed problem in bond_check_dev_link - if the first IOCTL (SIOCGMIIPH)
- *      failed, the ETHTOOL ioctl never got a chance
- *
- * 2002/11/16 - Laurent Deniel <laurent.deniel at free.fr>
- *     - fix multicast handling in activebackup_arp_monitor
- *     - remove one unnecessary and confusing curr_active_slave == slave test
- *      in activebackup_arp_monitor
- *
- *  2002/11/17 - Laurent Deniel <laurent.deniel at free.fr>
- *     - fix bond_slave_info_query when slave_id = num_slaves
- *
- *  2002/11/19 - Janice Girouard <girouard at us dot ibm dot com>
- *     - correct ifr_data reference.  Update ifr_data reference
- *       to mii_ioctl_data struct values to avoid confusion.
- *
- *  2002/11/22 - Bert Barbe <bert.barbe at oracle dot com>
- *      - Add support for multiple arp_ip_target
- *
- *  2002/12/13 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - Changed to allow text strings for mode and multicast, e.g.,
- *       insmod bonding mode=active-backup.  The numbers still work.
- *       One change: an invalid choice will cause module load failure,
- *       rather than the previous behavior of just picking one.
- *     - Minor cleanups; got rid of dup ctype stuff, atoi function
- *
- * 2003/02/07 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - Added use_carrier module parameter that causes miimon to
- *       use netif_carrier_ok() test instead of MII/ETHTOOL ioctls.
- *     - Minor cleanups; consolidated ioctl calls to one function.
- *
- * 2003/02/07 - Tony Cureington <tony.cureington * hp_com>
- *     - Fix bond_mii_monitor() logic error that could result in
- *       bonding round-robin mode ignoring links after failover/recovery
- *
- * 2003/03/17 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - kmalloc fix (GFP_KERNEL to GFP_ATOMIC) reported by
- *       Shmulik dot Hen at intel.com.
- *     - Based on discussion on mailing list, changed use of
- *       update_slave_cnt(), created wrapper functions for adding/removing
- *       slaves, changed bond_xmit_xor() to check slave_cnt instead of
- *       checking slave and slave->dev (which only worked by accident).
- *     - Misc code cleanup: get arp_send() prototype from header file,
- *       add max_bonds to bonding.txt.
- *
- * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Shmulik Hen <shmulik.hen at intel dot com>
- *     - Make sure only bond_attach_slave() and bond_detach_slave() can
- *       manipulate the slave list, including slave_cnt, even when in
- *       bond_release_all().
- *     - Fixed hang in bond_release() with traffic running:
- *       netdev_set_master() must not be called from within the bond lock.
- *
- * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Shmulik Hen <shmulik.hen at intel dot com>
- *     - Fixed hang in bond_enslave() with traffic running:
- *       netdev_set_master() must not be called from within the bond lock.
- *
- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>
- *     - Added support for getting slave's speed and duplex via ethtool.
- *       Needed for 802.3ad and other future modes.
- *
- * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Shmulik Hen <shmulik.hen at intel dot com>
- *     - Enable support of modes that need to use the unique mac address of
- *       each slave.
- *       * bond_enslave(): Moved setting the slave's mac address, and
- *         openning it, from the application to the driver. This breaks
- *         backward comaptibility with old versions of ifenslave that open
- *          the slave before enalsving it !!!.
- *       * bond_release(): The driver also takes care of closing the slave
- *         and restoring its original mac address.
- *     - Removed the code that restores all base driver's flags.
- *       Flags are automatically restored once all undo stages are done
- *       properly.
- *     - Block possibility of enslaving before the master is up. This
- *       prevents putting the system in an unstable state.
- *
- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>,
- *             Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Shmulik Hen <shmulik.hen at intel dot com>
- *     - Added support for IEEE 802.3ad Dynamic link aggregation mode.
- *
- * 2003/05/01 - Amir Noam <amir.noam at intel dot com>
- *     - Added ABI version control to restore compatibility between
- *       new/old ifenslave and new/old bonding.
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Fixed bug in bond_release_all(): save old value of curr_active_slave
- *       before setting it to NULL.
- *     - Changed driver versioning scheme to include version number instead
- *       of release date (that is already in another field). There are 3
- *       fields X.Y.Z where:
- *             X - Major version - big behavior changes
- *             Y - Minor version - addition of features
- *             Z - Extra version - minor changes and bug fixes
- *       The current version is 1.0.0 as a base line.
- *
- * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Amir Noam <amir.noam at intel dot com>
- *     - Added support for lacp_rate module param.
- *     - Code beautification and style changes (mainly in comments).
- *       new version - 1.0.1
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Based on discussion on mailing list, changed locking scheme
- *       to use lock/unlock or lock_bh/unlock_bh appropriately instead
- *       of lock_irqsave/unlock_irqrestore. The new scheme helps exposing
- *       hidden bugs and solves system hangs that occurred due to the fact
- *       that holding lock_irqsave doesn't prevent softirqs from running.
- *       This also increases total throughput since interrupts are not
- *       blocked on each transmitted packets or monitor timeout.
- *       new version - 2.0.0
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Added support for Transmit load balancing mode.
- *     - Concentrate all assignments of curr_active_slave to a single point
- *       so specific modes can take actions when the primary adapter is
- *       changed.
- *     - Take the updelay parameter into consideration during bond_enslave
- *       since some adapters loose their link during setting the device.
- *     - Renamed bond_3ad_link_status_changed() to
- *       bond_3ad_handle_link_change() for compatibility with TLB.
- *       new version - 2.1.0
- *
- * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com>
- *     - Added support for Adaptive load balancing mode which is
- *       equivalent to Transmit load balancing + Receive load balancing.
- *       new version - 2.2.0
- *
- * 2003/05/15 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - Applied fix to activebackup_arp_monitor posted to bonding-devel
- *       by Tony Cureington <tony.cureington * hp_com>.  Fixes ARP
- *       monitor endless failover bug.  Version to 2.2.10
- *
- * 2003/05/20 - Amir Noam <amir.noam at intel dot com>
- *     - Fixed bug in ABI version control - Don't commit to a specific
- *       ABI version if receiving unsupported ioctl commands.
- *
- * 2003/05/22 - Jay Vosburgh <fubar at us dot ibm dot com>
- *     - Fix ifenslave -c causing bond to loose existing routes;
- *       added bond_set_mac_address() that doesn't require the
- *       bond to be down.
- *     - In conjunction with fix for ifenslave -c, in
- *       bond_change_active(), changing to the already active slave
- *       is no longer an error (it successfully does nothing).
- *
- * 2003/06/30 - Amir Noam <amir.noam at intel dot com>
- *     - Fixed bond_change_active() for ALB/TLB modes.
- *       Version to 2.2.14.
- *
- * 2003/07/29 - Amir Noam <amir.noam at intel dot com>
- *     - Fixed ARP monitoring bug.
- *       Version to 2.2.15.
- *
- * 2003/07/31 - Willy Tarreau <willy at ods dot org>
- *     - Fixed kernel panic when using ARP monitoring without
- *       setting bond's IP address.
- *       Version to 2.2.16.
- *
- * 2003/08/06 - Amir Noam <amir.noam at intel dot com>
- *     - Back port from 2.6: use alloc_netdev(); fix /proc handling;
- *       made stats a part of bond struct so no need to allocate
- *       and free it separately; use standard list operations instead
- *       of pre-allocated array of bonds.
- *       Version to 2.3.0.
- *
- * 2003/08/07 - Jay Vosburgh <fubar at us dot ibm dot com>,
- *            Amir Noam <amir.noam at intel dot com> and
- *            Shmulik Hen <shmulik.hen at intel dot com>
- *     - Propagating master's settings: Distinguish between modes that
- *       use a primary slave from those that don't, and propagate settings
- *       accordingly; Consolidate change_active opeartions and add
- *       reselect_active and find_best opeartions; Decouple promiscuous
- *       handling from the multicast mode setting; Add support for changing
- *       HW address and MTU with proper unwind; Consolidate procfs code,
- *       add CHANGENAME handler; Enhance netdev notification handling.
- *       Version to 2.4.0.
- *
- * 2003/09/15 - Stephen Hemminger <shemminger at osdl dot org>,
- *            Amir Noam <amir.noam at intel dot com>
- *     - Convert /proc to seq_file interface.
- *       Change /proc/net/bondX/info to /proc/net/bonding/bondX.
- *       Set version to 2.4.1.
- *
- * 2003/11/20 - Amir Noam <amir.noam at intel dot com>
- *     - Fix /proc creation/destruction.
- *
- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Massive cleanup - Set version to 2.5.0
- *       Code changes:
- *       o Consolidate format of prints and debug prints.
- *       o Remove bonding_t/slave_t typedefs and consolidate all casts.
- *       o Remove dead code and unnecessary checks.
- *       o Consolidate starting/stopping timers.
- *       o Consolidate handling of primary module param throughout the code.
- *       o Removed multicast module param support - all settings are done
- *         according to mode.
- *       o Slave list iteration - bond is no longer part of the list,
- *         added cyclic list iteration macros.
- *       o Consolidate error handling in all xmit functions.
- *       Style changes:
- *       o Consolidate function naming and declarations.
- *       o Consolidate function params and local variables names.
- *       o Consolidate return values.
- *       o Consolidate curly braces.
- *       o Consolidate conditionals format.
- *       o Change struct member names and types.
- *       o Chomp trailing spaces, remove empty lines, fix indentations.
- *       o Re-organize code according to context.
- *
- * 2003/12/30 - Amir Noam <amir.noam at intel dot com>
- *     - Fixed: Cannot remove and re-enslave the original active slave.
- *     - Fixed: Releasing the original active slave causes mac address
- *              duplication.
- *     - Add support for slaves that use ethtool_ops.
- *       Set version to 2.5.3.
- *
- * 2004/01/05 - Amir Noam <amir.noam at intel dot com>
- *     - Save bonding parameters per bond instead of using the global values.
- *       Set version to 2.5.4.
- *
- * 2004/01/14 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Enhance VLAN support:
- *       * Add support for VLAN hardware acceleration capable slaves.
- *       * Add capability to tag self generated packets in ALB/TLB modes.
- *       Set version to 2.6.0.
- * 2004/10/29 - Mitch Williams <mitch.a.williams at intel dot com>
- *      - Fixed bug when unloading module while using 802.3ad.  If
- *        spinlock debugging is turned on, this causes a stack dump.
- *        Solution is to move call to dev_remove_pack outside of the
- *        spinlock.
- *        Set version to 2.6.1.
- * 2005/06/05 - Jay Vosburgh <fubar@us.ibm.com>
- *     - Support for generating gratuitous ARPs in active-backup mode.
- *       Includes support for VLAN tagging all bonding-generated ARPs
- *       as needed.  Set version to 2.6.2.
- * 2005/06/08 - Jason Gabler <jygabler at lbl dot gov>
- *     - alternate hashing policy support for mode 2
- *       * Added kernel parameter "xmit_hash_policy" to allow the selection
- *         of different hashing policies for mode 2.  The original mode 2
- *         policy is the default, now found in xmit_hash_policy_layer2().
- *       * Added xmit_hash_policy_layer34()
- *     - Modified by Jay Vosburgh <fubar@us.ibm.com> to also support mode 4.
- *       Set version to 2.6.3.
- * 2005/09/26 - Jay Vosburgh <fubar@us.ibm.com>
- *     - Removed backwards compatibility for old ifenslaves.  Version 2.6.4.
  */
 
 //#define BONDING_DEBUG 1
@@ -557,6 +97,7 @@ static char *lacp_rate       = NULL;
 static char *xmit_hash_policy = NULL;
 static int arp_interval = BOND_LINK_ARP_INTERV;
 static char *arp_ip_target[BOND_MAX_ARP_TARGETS] = { NULL, };
+struct bond_params bonding_defaults;
 
 module_param(max_bonds, int, 0);
 MODULE_PARM_DESC(max_bonds, "Max number of bonded devices");
@@ -565,17 +106,24 @@ MODULE_PARM_DESC(miimon, "Link check interval in milliseconds");
 module_param(updelay, int, 0);
 MODULE_PARM_DESC(updelay, "Delay before considering link up, in milliseconds");
 module_param(downdelay, int, 0);
-MODULE_PARM_DESC(downdelay, "Delay before considering link down, in milliseconds");
+MODULE_PARM_DESC(downdelay, "Delay before considering link down, "
+                           "in milliseconds");
 module_param(use_carrier, int, 0);
-MODULE_PARM_DESC(use_carrier, "Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default)");
+MODULE_PARM_DESC(use_carrier, "Use netif_carrier_ok (vs MII ioctls) in miimon; "
+                             "0 for off, 1 for on (default)");
 module_param(mode, charp, 0);
-MODULE_PARM_DESC(mode, "Mode of operation : 0 for round robin, 1 for active-backup, 2 for xor");
+MODULE_PARM_DESC(mode, "Mode of operation : 0 for balance-rr, "
+                      "1 for active-backup, 2 for balance-xor, "
+                      "3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, "
+                      "6 for balance-alb");
 module_param(primary, charp, 0);
 MODULE_PARM_DESC(primary, "Primary network device to use");
 module_param(lacp_rate, charp, 0);
-MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner (slow/fast)");
+MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner "
+                           "(slow/fast)");
 module_param(xmit_hash_policy, charp, 0);
-MODULE_PARM_DESC(xmit_hash_policy, "XOR hashing method : 0 for layer 2 (default), 1 for layer 3+4");
+MODULE_PARM_DESC(xmit_hash_policy, "XOR hashing method: 0 for layer 2 (default)"
+                                  ", 1 for layer 3+4");
 module_param(arp_interval, int, 0);
 MODULE_PARM_DESC(arp_interval, "arp interval in milliseconds");
 module_param_array(arp_ip_target, charp, NULL, 0);
@@ -586,30 +134,27 @@ MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form");
 static const char *version =
        DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n";
 
-static LIST_HEAD(bond_dev_list);
+LIST_HEAD(bond_dev_list);
 
 #ifdef CONFIG_PROC_FS
 static struct proc_dir_entry *bond_proc_dir = NULL;
 #endif
 
+extern struct rw_semaphore bonding_rwsem;
 static u32 arp_target[BOND_MAX_ARP_TARGETS] = { 0, } ;
 static int arp_ip_count        = 0;
 static int bond_mode   = BOND_MODE_ROUNDROBIN;
 static int xmit_hashtype= BOND_XMIT_POLICY_LAYER2;
 static int lacp_fast   = 0;
 
-struct bond_parm_tbl {
-       char *modename;
-       int mode;
-};
 
-static struct bond_parm_tbl bond_lacp_tbl[] = {
+struct bond_parm_tbl bond_lacp_tbl[] = {
 {      "slow",         AD_LACP_SLOW},
 {      "fast",         AD_LACP_FAST},
 {      NULL,           -1},
 };
 
-static struct bond_parm_tbl bond_mode_tbl[] = {
+struct bond_parm_tbl bond_mode_tbl[] = {
 {      "balance-rr",           BOND_MODE_ROUNDROBIN},
 {      "active-backup",        BOND_MODE_ACTIVEBACKUP},
 {      "balance-xor",          BOND_MODE_XOR},
@@ -620,7 +165,7 @@ static struct bond_parm_tbl bond_mode_tbl[] = {
 {      NULL,                   -1},
 };
 
-static struct bond_parm_tbl xmit_hashtype_tbl[] = {
+struct bond_parm_tbl xmit_hashtype_tbl[] = {
 {      "layer2",               BOND_XMIT_POLICY_LAYER2},
 {      "layer3+4",             BOND_XMIT_POLICY_LAYER34},
 {      NULL,                   -1},
@@ -628,12 +173,11 @@ static struct bond_parm_tbl xmit_hashtype_tbl[] = {
 
 /*-------------------------- Forward declarations ---------------------------*/
 
-static inline void bond_set_mode_ops(struct bonding *bond, int mode);
 static void bond_send_gratuitous_arp(struct bonding *bond);
 
 /*---------------------------- General routines -----------------------------*/
 
-static const char *bond_mode_name(int mode)
+const char *bond_mode_name(int mode)
 {
        switch (mode) {
        case BOND_MODE_ROUNDROBIN :
@@ -910,7 +454,7 @@ static void bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid)
        res = bond_add_vlan(bond, vid);
        if (res) {
                printk(KERN_ERR DRV_NAME
-                      ": %s: Failed to add vlan id %d\n",
+                      ": %s: Error: Failed to add vlan id %d\n",
                       bond_dev->name, vid);
        }
 }
@@ -944,7 +488,7 @@ static void bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid)
        res = bond_del_vlan(bond, vid);
        if (res) {
                printk(KERN_ERR DRV_NAME
-                      ": %s: Failed to remove vlan id %d\n",
+                      ": %s: Error: Failed to remove vlan id %d\n",
                       bond_dev->name, vid);
        }
 }
@@ -1449,7 +993,7 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
  *
  * Warning: Caller must hold curr_slave_lock for writing.
  */
-static void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
+void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
 {
        struct slave *old_active = bond->curr_active_slave;
 
@@ -1523,7 +1067,7 @@ static void bond_change_active_slave(struct bonding *bond, struct slave *new_act
  *
  * Warning: Caller must hold curr_slave_lock for writing.
  */
-static void bond_select_active_slave(struct bonding *bond)
+void bond_select_active_slave(struct bonding *bond)
 {
        struct slave *best_slave;
 
@@ -1591,7 +1135,7 @@ static void bond_detach_slave(struct bonding *bond, struct slave *slave)
 
 /*---------------------------------- IOCTL ----------------------------------*/
 
-static int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev)
+int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev)
 {
        dprintk("bond_dev=%p\n", bond_dev);
        dprintk("slave_dev=%p\n", slave_dev);
@@ -1631,7 +1175,7 @@ static int bond_compute_features(struct bonding *bond)
 }
 
 /* enslave device <slave> to bond device <master> */
-static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
+int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
 {
        struct bonding *bond = bond_dev->priv;
        struct slave *new_slave = NULL;
@@ -1644,8 +1188,8 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
        if (!bond->params.use_carrier && slave_dev->ethtool_ops == NULL &&
                slave_dev->do_ioctl == NULL) {
                printk(KERN_WARNING DRV_NAME
-                      ": Warning : no link monitoring support for %s\n",
-                      slave_dev->name);
+                      ": %s: Warning: no link monitoring support for %s\n",
+                      bond_dev->name, slave_dev->name);
        }
 
        /* bond must be initialized by bond_open() before enslaving */
@@ -1666,17 +1210,17 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
                dprintk("%s: NETIF_F_VLAN_CHALLENGED\n", slave_dev->name);
                if (!list_empty(&bond->vlan_list)) {
                        printk(KERN_ERR DRV_NAME
-                              ": Error: cannot enslave VLAN "
+                              ": %s: Error: cannot enslave VLAN "
                               "challenged slave %s on VLAN enabled "
-                              "bond %s\n", slave_dev->name,
+                              "bond %s\n", bond_dev->name, slave_dev->name,
                               bond_dev->name);
                        return -EPERM;
                } else {
                        printk(KERN_WARNING DRV_NAME
-                              ": Warning: enslaved VLAN challenged "
+                              ": %s: Warning: enslaved VLAN challenged "
                               "slave %s. Adding VLANs will be blocked as "
                               "long as %s is part of bond %s\n",
-                              slave_dev->name, slave_dev->name,
+                              bond_dev->name, slave_dev->name, slave_dev->name,
                               bond_dev->name);
                        bond_dev->features |= NETIF_F_VLAN_CHALLENGED;
                }
@@ -1706,12 +1250,11 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
 
        if (slave_dev->set_mac_address == NULL) {
                printk(KERN_ERR DRV_NAME
-                      ": Error: The slave device you specified does "
-                      "not support setting the MAC address.\n");
-               printk(KERN_ERR
-                      "Your kernel likely does not support slave devices.\n");
-
-               res = -EOPNOTSUPP;
+                       ": %s: Error: The slave device you specified does "
+                       "not support setting the MAC address. "
+                       "Your kernel likely does not support slave "
+                       "devices.\n", bond_dev->name);
+               res = -EOPNOTSUPP;
                goto err_undo_flags;
        }
 
@@ -1827,21 +1370,21 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
                         * the messages for netif_carrier.
                         */
                        printk(KERN_WARNING DRV_NAME
-                              ": Warning: MII and ETHTOOL support not "
+                              ": %s: Warning: MII and ETHTOOL support not "
                               "available for interface %s, and "
                               "arp_interval/arp_ip_target module parameters "
                               "not specified, thus bonding will not detect "
                               "link failures! see bonding.txt for details.\n",
-                              slave_dev->name);
+                              bond_dev->name, slave_dev->name);
                } else if (link_reporting == -1) {
                        /* unable get link status using mii/ethtool */
                        printk(KERN_WARNING DRV_NAME
-                              ": Warning: can't get link status from "
+                              ": %s: Warning: can't get link status from "
                               "interface %s; the network driver associated "
                               "with this interface does not support MII or "
                               "ETHTOOL link status reporting, thus miimon "
                               "has no effect on this interface.\n",
-                              slave_dev->name);
+                              bond_dev->name, slave_dev->name);
                }
        }
 
@@ -1868,15 +1411,15 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
        if (bond_update_speed_duplex(new_slave) &&
            (new_slave->link != BOND_LINK_DOWN)) {
                printk(KERN_WARNING DRV_NAME
-                      ": Warning: failed to get speed and duplex from %s, "
+                      ": %s: Warning: failed to get speed and duplex from %s, "
                       "assumed to be 100Mb/sec and Full.\n",
-                      new_slave->dev->name);
+                      bond_dev->name, new_slave->dev->name);
 
                if (bond->params.mode == BOND_MODE_8023AD) {
-                       printk(KERN_WARNING
-                              "Operation of 802.3ad mode requires ETHTOOL "
+                       printk(KERN_WARNING DRV_NAME
+                              ": %s: Warning: Operation of 802.3ad mode requires ETHTOOL "
                               "support in base driver for proper aggregator "
-                              "selection.\n");
+                              "selection.\n", bond_dev->name);
                }
        }
 
@@ -1958,6 +1501,10 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
 
        write_unlock_bh(&bond->lock);
 
+       res = bond_create_slave_symlinks(bond_dev, slave_dev);
+       if (res)
+               goto err_unset_master;
+
        printk(KERN_INFO DRV_NAME
               ": %s: enslaving %s as a%s interface with a%s link.\n",
               bond_dev->name, slave_dev->name,
@@ -1999,7 +1546,7 @@ err_undo_flags:
  *   for Bonded connections:
  *     The first up interface should be left on and all others downed.
  */
-static int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
+int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
 {
        struct bonding *bond = bond_dev->priv;
        struct slave *slave, *oldcurrent;
@@ -2010,7 +1557,7 @@ static int bond_release(struct net_device *bond_dev, struct net_device *slave_de
        if (!(slave_dev->flags & IFF_SLAVE) ||
            (slave_dev->master != bond_dev)) {
                printk(KERN_ERR DRV_NAME
-                      ": Error: %s: cannot release %s.\n",
+                      ": %s: Error: cannot release %s.\n",
                       bond_dev->name, slave_dev->name);
                return -EINVAL;
        }
@@ -2031,11 +1578,12 @@ static int bond_release(struct net_device *bond_dev, struct net_device *slave_de
                                 ETH_ALEN);
        if (!mac_addr_differ && (bond->slave_cnt > 1)) {
                printk(KERN_WARNING DRV_NAME
-                      ": Warning: the permanent HWaddr of %s "
+                      ": %s: Warning: the permanent HWaddr of %s "
                       "- %02X:%02X:%02X:%02X:%02X:%02X - is "
                       "still in use by %s. Set the HWaddr of "
                       "%s to a different address to avoid "
                       "conflicts.\n",
+                      bond_dev->name,
                       slave_dev->name,
                       slave->perm_hwaddr[0],
                       slave->perm_hwaddr[1],
@@ -2111,24 +1659,28 @@ static int bond_release(struct net_device *bond_dev, struct net_device *slave_de
                        bond_dev->features |= NETIF_F_VLAN_CHALLENGED;
                } else {
                        printk(KERN_WARNING DRV_NAME
-                              ": Warning: clearing HW address of %s while it "
+                              ": %s: Warning: clearing HW address of %s while it "
                               "still has VLANs.\n",
-                              bond_dev->name);
+                              bond_dev->name, bond_dev->name);
                        printk(KERN_WARNING DRV_NAME
-                              ": When re-adding slaves, make sure the bond's "
-                              "HW address matches its VLANs'.\n");
+                              ": %s: When re-adding slaves, make sure the bond's "
+                              "HW address matches its VLANs'.\n",
+                              bond_dev->name);
                }
        } else if ((bond_dev->features & NETIF_F_VLAN_CHALLENGED) &&
                   !bond_has_challenged_slaves(bond)) {
                printk(KERN_INFO DRV_NAME
-                      ": last VLAN challenged slave %s "
+                      ": %s: last VLAN challenged slave %s "
                       "left bond %s. VLAN blocking is removed\n",
-                      slave_dev->name, bond_dev->name);
+                      bond_dev->name, slave_dev->name, bond_dev->name);
                bond_dev->features &= ~NETIF_F_VLAN_CHALLENGED;
        }
 
        write_unlock_bh(&bond->lock);
 
+       /* must do this from outside any spinlocks */
+       bond_destroy_slave_symlinks(bond_dev, slave_dev);
+
        bond_del_vlans_from_slave(bond, slave_dev);
 
        /* If the mode USES_PRIMARY, then we should only remove its
@@ -2220,6 +1772,7 @@ static int bond_release_all(struct net_device *bond_dev)
                 */
                write_unlock_bh(&bond->lock);
 
+               bond_destroy_slave_symlinks(bond_dev, slave_dev);
                bond_del_vlans_from_slave(bond, slave_dev);
 
                /* If the mode USES_PRIMARY, then we should only remove its
@@ -2274,12 +1827,13 @@ static int bond_release_all(struct net_device *bond_dev)
                bond_dev->features |= NETIF_F_VLAN_CHALLENGED;
        } else {
                printk(KERN_WARNING DRV_NAME
-                      ": Warning: clearing HW address of %s while it "
+                      ": %s: Warning: clearing HW address of %s while it "
                       "still has VLANs.\n",
-                      bond_dev->name);
+                      bond_dev->name, bond_dev->name);
                printk(KERN_WARNING DRV_NAME
-                      ": When re-adding slaves, make sure the bond's "
-                      "HW address matches its VLANs'.\n");
+                      ": %s: When re-adding slaves, make sure the bond's "
+                      "HW address matches its VLANs'.\n",
+                      bond_dev->name);
        }
 
        printk(KERN_INFO DRV_NAME
@@ -2397,7 +1951,7 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in
 /*-------------------------------- Monitoring -------------------------------*/
 
 /* this function is called regularly to monitor each slave's link. */
-static void bond_mii_monitor(struct net_device *bond_dev)
+void bond_mii_monitor(struct net_device *bond_dev)
 {
        struct bonding *bond = bond_dev->priv;
        struct slave *slave, *oldcurrent;
@@ -2596,8 +2150,11 @@ static void bond_mii_monitor(struct net_device *bond_dev)
                        break;
                default:
                        /* Should not happen */
-                       printk(KERN_ERR "bonding: Error: %s  Illegal value (link=%d)\n",
-                              slave->dev->name, slave->link);
+                       printk(KERN_ERR DRV_NAME
+                              ": %s: Error: %s Illegal value (link=%d)\n",
+                              bond_dev->name,
+                              slave->dev->name,
+                              slave->link);
                        goto out;
                } /* end of switch (slave->link) */
 
@@ -2721,7 +2278,9 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
        struct flowi fl;
        struct rtable *rt;
 
-       for (i = 0; (i < BOND_MAX_ARP_TARGETS) && targets[i]; i++) {
+       for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
+               if (!targets[i])
+                       continue;
                dprintk("basa: target %x\n", targets[i]);
                if (list_empty(&bond->vlan_list)) {
                        dprintk("basa: empty vlan: arp_send\n");
@@ -2825,7 +2384,7 @@ static void bond_send_gratuitous_arp(struct bonding *bond)
  * arp is transmitted to generate traffic. see activebackup_arp_monitor for
  * arp monitoring in active backup mode.
  */
-static void bond_loadbalance_arp_mon(struct net_device *bond_dev)
+void bond_loadbalance_arp_mon(struct net_device *bond_dev)
 {
        struct bonding *bond = bond_dev->priv;
        struct slave *slave, *oldcurrent;
@@ -2963,7 +2522,7 @@ out:
  * may have received.
  * see loadbalance_arp_monitor for arp monitoring in load balancing mode
  */
-static void bond_activebackup_arp_mon(struct net_device *bond_dev)
+void bond_activebackup_arp_mon(struct net_device *bond_dev)
 {
        struct bonding *bond = bond_dev->priv;
        struct slave *slave;
@@ -3249,6 +2808,8 @@ static void bond_info_show_master(struct seq_file *seq)
 {
        struct bonding *bond = seq->private;
        struct slave *curr;
+       int i;
+       u32 target;
 
        read_lock(&bond->curr_slave_lock);
        curr = bond->curr_active_slave;
@@ -3257,10 +2818,17 @@ static void bond_info_show_master(struct seq_file *seq)
        seq_printf(seq, "Bonding Mode: %s\n",
                   bond_mode_name(bond->params.mode));
 
+       if (bond->params.mode == BOND_MODE_XOR ||
+               bond->params.mode == BOND_MODE_8023AD) {
+               seq_printf(seq, "Transmit Hash Policy: %s (%d)\n",
+                       xmit_hashtype_tbl[bond->params.xmit_policy].modename,
+                       bond->params.xmit_policy);
+       }
+
        if (USES_PRIMARY(bond->params.mode)) {
                seq_printf(seq, "Primary Slave: %s\n",
-                          (bond->params.primary[0]) ?
-                               bond->params.primary : "None");
+                          (bond->primary_slave) ?
+                          bond->primary_slave->dev->name : "None");
 
                seq_printf(seq, "Currently Active Slave: %s\n",
                           (curr) ? curr->dev->name : "None");
@@ -3273,6 +2841,27 @@ static void bond_info_show_master(struct seq_file *seq)
        seq_printf(seq, "Down Delay (ms): %d\n",
                   bond->params.downdelay * bond->params.miimon);
 
+
+       /* ARP information */
+       if(bond->params.arp_interval > 0) {
+               int printed=0;
+               seq_printf(seq, "ARP Polling Interval (ms): %d\n",
+                               bond->params.arp_interval);
+
+               seq_printf(seq, "ARP IP target/s (n.n.n.n form):");
+
+               for(i = 0; (i < BOND_MAX_ARP_TARGETS) ;i++) {
+                       if (!bond->params.arp_targets[i])
+                               continue;
+                       if (printed)
+                               seq_printf(seq, ",");
+                       target = ntohl(bond->params.arp_targets[i]);
+                       seq_printf(seq, " %d.%d.%d.%d", HIPQUAD(target));
+                       printed = 1;
+               }
+               seq_printf(seq, "\n");
+       }
+
        if (bond->params.mode == BOND_MODE_8023AD) {
                struct ad_info ad_info;
 
@@ -3478,7 +3067,10 @@ static int bond_event_changename(struct bonding *bond)
        bond_remove_proc_entry(bond);
        bond_create_proc_entry(bond);
 #endif
-
+       down_write(&(bonding_rwsem));
+        bond_destroy_sysfs_entry(bond);
+        bond_create_sysfs_entry(bond);
+       up_write(&(bonding_rwsem));
        return NOTIFY_DONE;
 }
 
@@ -3955,6 +3547,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
                return -EPERM;
        }
 
+       down_write(&(bonding_rwsem));
        slave_dev = dev_get_by_name(ifr->ifr_slave);
 
        dprintk("slave_dev=%p: \n", slave_dev);
@@ -3987,6 +3580,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
                dev_put(slave_dev);
        }
 
+       up_write(&(bonding_rwsem));
        return res;
 }
 
@@ -4071,6 +3665,7 @@ static int bond_change_mtu(struct net_device *bond_dev, int new_mtu)
        bond_for_each_slave(bond, slave, i) {
                dprintk("s %p s->p %p c_m %p\n", slave,
                        slave->prev, slave->dev->change_mtu);
+
                res = dev_set_mtu(slave->dev, new_mtu);
 
                if (res) {
@@ -4397,8 +3992,9 @@ static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *bond_dev)
                                struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
                                if (!skb2) {
                                        printk(KERN_ERR DRV_NAME
-                                              ": Error: bond_xmit_broadcast(): "
-                                              "skb_clone() failed\n");
+                                              ": %s: Error: bond_xmit_broadcast(): "
+                                              "skb_clone() failed\n",
+                                              bond_dev->name);
                                        continue;
                                }
 
@@ -4431,7 +4027,7 @@ out:
 /*
  * set bond mode specific net device operations
  */
-static inline void bond_set_mode_ops(struct bonding *bond, int mode)
+void bond_set_mode_ops(struct bonding *bond, int mode)
 {
        struct net_device *bond_dev = bond->dev;
 
@@ -4467,7 +4063,8 @@ static inline void bond_set_mode_ops(struct bonding *bond, int mode)
        default:
                /* Should never happen, mode already checked */
                printk(KERN_ERR DRV_NAME
-                      ": Error: Unknown bonding mode %d\n",
+                      ": %s: Error: Unknown bonding mode %d\n",
+                      bond_dev->name,
                       mode);
                break;
        }
@@ -4491,7 +4088,7 @@ static struct ethtool_ops bond_ethtool_ops = {
  * Does not allocate but creates a /proc entry.
  * Allowed to fail.
  */
-static int __init bond_init(struct net_device *bond_dev, struct bond_params *params)
+static int bond_init(struct net_device *bond_dev, struct bond_params *params)
 {
        struct bonding *bond = bond_dev->priv;
 
@@ -4565,7 +4162,7 @@ static int __init bond_init(struct net_device *bond_dev, struct bond_params *par
 /* De-initialize device specific data.
  * Caller must hold rtnl_lock.
  */
-static inline void bond_deinit(struct net_device *bond_dev)
+void bond_deinit(struct net_device *bond_dev)
 {
        struct bonding *bond = bond_dev->priv;
 
@@ -4601,7 +4198,7 @@ static void bond_free_all(void)
  * Convert string input module parms.  Accept either the
  * number of the mode or its string name.
  */
-static inline int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl)
+int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl)
 {
        int i;
 
@@ -4670,7 +4267,7 @@ static int bond_check_params(struct bond_params *params)
        if (max_bonds < 1 || max_bonds > INT_MAX) {
                printk(KERN_WARNING DRV_NAME
                       ": Warning: max_bonds (%d) not in range %d-%d, so it "
-                      "was reset to BOND_DEFAULT_MAX_BONDS (%d)",
+                      "was reset to BOND_DEFAULT_MAX_BONDS (%d)\n",
                       max_bonds, 1, INT_MAX, BOND_DEFAULT_MAX_BONDS);
                max_bonds = BOND_DEFAULT_MAX_BONDS;
        }
@@ -4881,81 +4478,96 @@ static int bond_check_params(struct bond_params *params)
        return 0;
 }
 
+/* Create a new bond based on the specified name and bonding parameters.
+ * Caller must NOT hold rtnl_lock; we need to release it here before we
+ * set up our sysfs entries.
+ */
+int bond_create(char *name, struct bond_params *params, struct bonding **newbond)
+{
+       struct net_device *bond_dev;
+       int res;
+
+       rtnl_lock();
+       bond_dev = alloc_netdev(sizeof(struct bonding), name, ether_setup);
+       if (!bond_dev) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: eek! can't alloc netdev!\n",
+                      name);
+               res = -ENOMEM;
+               goto out_rtnl;
+       }
+
+       /* bond_init() must be called after dev_alloc_name() (for the
+        * /proc files), but before register_netdevice(), because we
+        * need to set function pointers.
+        */
+
+       res = bond_init(bond_dev, params);
+       if (res < 0) {
+               goto out_netdev;
+       }
+
+       SET_MODULE_OWNER(bond_dev);
+
+       res = register_netdevice(bond_dev);
+       if (res < 0) {
+               goto out_bond;
+       }
+       if (newbond)
+               *newbond = bond_dev->priv;
+
+       rtnl_unlock(); /* allows sysfs registration of net device */
+       res = bond_create_sysfs_entry(bond_dev->priv);
+       goto done;
+out_bond:
+       bond_deinit(bond_dev);
+out_netdev:
+       free_netdev(bond_dev);
+out_rtnl:
+       rtnl_unlock();
+done:
+       return res;
+}
+
 static int __init bonding_init(void)
 {
-       struct bond_params params;
        int i;
        int res;
+       char new_bond_name[8];  /* Enough room for 999 bonds at init. */
 
        printk(KERN_INFO "%s", version);
 
-       res = bond_check_params(&params);
+       res = bond_check_params(&bonding_defaults);
        if (res) {
-               return res;
+               goto out;
        }
 
-       rtnl_lock();
-
 #ifdef CONFIG_PROC_FS
        bond_create_proc_dir();
 #endif
-
        for (i = 0; i < max_bonds; i++) {
-               struct net_device *bond_dev;
-
-               bond_dev = alloc_netdev(sizeof(struct bonding), "", ether_setup);
-               if (!bond_dev) {
-                       res = -ENOMEM;
-                       goto out_err;
-               }
-
-               res = dev_alloc_name(bond_dev, "bond%d");
-               if (res < 0) {
-                       free_netdev(bond_dev);
-                       goto out_err;
-               }
-
-               /* bond_init() must be called after dev_alloc_name() (for the
-                * /proc files), but before register_netdevice(), because we
-                * need to set function pointers.
-                */
-               res = bond_init(bond_dev, &params);
-               if (res < 0) {
-                       free_netdev(bond_dev);
-                       goto out_err;
-               }
-
-               SET_MODULE_OWNER(bond_dev);
-
-               res = register_netdevice(bond_dev);
-               if (res < 0) {
-                       bond_deinit(bond_dev);
-                       free_netdev(bond_dev);
-                       goto out_err;
-               }
+               sprintf(new_bond_name, "bond%d",i);
+               res = bond_create(new_bond_name,&bonding_defaults, NULL);
+               if (res)
+                       goto err;
        }
 
-       rtnl_unlock();
+       res = bond_create_sysfs();
+       if (res)
+               goto err;
+
        register_netdevice_notifier(&bond_netdev_notifier);
        register_inetaddr_notifier(&bond_inetaddr_notifier);
 
-       return 0;
-
-out_err:
-       /*
-        * rtnl_unlock() will run netdev_run_todo(), putting the
-        * thus-far-registered bonding devices into a state which
-        * unregigister_netdevice() will accept
-        */
-       rtnl_unlock();
+       goto out;
+err:
        rtnl_lock();
-
-       /* free and unregister all bonds that were successfully added */
        bond_free_all();
-
+       bond_destroy_sysfs();
        rtnl_unlock();
-
+out:
        return res;
+
 }
 
 static void __exit bonding_exit(void)
@@ -4965,6 +4577,7 @@ static void __exit bonding_exit(void)
 
        rtnl_lock();
        bond_free_all();
+       bond_destroy_sysfs();
        rtnl_unlock();
 }
 
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
new file mode 100644 (file)
index 0000000..32d13da
--- /dev/null
@@ -0,0 +1,1358 @@
+
+/*
+ * Copyright(c) 2004-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 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.
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/device.h>
+#include <linux/sysdev.h>
+#include <linux/fs.h>
+#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/netdevice.h>
+#include <linux/inetdevice.h>
+#include <linux/in.h>
+#include <linux/sysfs.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/inet.h>
+#include <linux/rtnetlink.h>
+
+/* #define BONDING_DEBUG 1 */
+#include "bonding.h"
+#define to_class_dev(obj) container_of(obj,struct class_device,kobj)
+#define to_net_dev(class) container_of(class, struct net_device, class_dev)
+#define to_bond(cd)    ((struct bonding *)(to_net_dev(cd)->priv))
+
+/*---------------------------- Declarations -------------------------------*/
+
+
+extern struct list_head bond_dev_list;
+extern struct bond_params bonding_defaults;
+extern struct bond_parm_tbl bond_mode_tbl[];
+extern struct bond_parm_tbl bond_lacp_tbl[];
+extern struct bond_parm_tbl xmit_hashtype_tbl[];
+
+static int expected_refcount = -1;
+static struct class *netdev_class;
+/*--------------------------- Data Structures -----------------------------*/
+
+/* Bonding sysfs lock.  Why can't we just use the subsytem lock?
+ * Because kobject_register tries to acquire the subsystem lock.  If
+ * we already hold the lock (which we would if the user was creating
+ * a new bond through the sysfs interface), we deadlock.
+ * This lock is only needed when deleting a bond - we need to make sure
+ * that we don't collide with an ongoing ioctl.
+ */
+
+struct rw_semaphore bonding_rwsem;
+
+
+
+
+/*------------------------------ Functions --------------------------------*/
+
+/*
+ * "show" function for the bond_masters attribute.
+ * The class parameter is ignored.
+ */
+static ssize_t bonding_show_bonds(struct class *cls, char *buffer)
+{
+       int res = 0;
+       struct bonding *bond;
+
+       down_read(&(bonding_rwsem));
+
+       list_for_each_entry(bond, &bond_dev_list, bond_list) {
+               if (res > (PAGE_SIZE - IFNAMSIZ)) {
+                       /* not enough space for another interface name */
+                       if ((PAGE_SIZE - res) > 10)
+                               res = PAGE_SIZE - 10;
+                       res += sprintf(buffer + res, "++more++");
+                       break;
+               }
+               res += sprintf(buffer + res, "%s ",
+                              bond->dev->name);
+       }
+       res += sprintf(buffer + res, "\n");
+       res++;
+       up_read(&(bonding_rwsem));
+       return res;
+}
+
+/*
+ * "store" function for the bond_masters attribute.  This is what
+ * creates and deletes entire bonds.
+ *
+ * The class parameter is ignored.
+ *
+ */
+
+static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t count)
+{
+       char command[IFNAMSIZ + 1] = {0, };
+       char *ifname;
+       int res = count;
+       struct bonding *bond;
+       struct bonding *nxt;
+
+       down_write(&(bonding_rwsem));
+       sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
+       ifname = command + 1;
+       if ((strlen(command) <= 1) ||
+           !dev_valid_name(ifname))
+               goto err_no_cmd;
+
+       if (command[0] == '+') {
+
+               /* Check to see if the bond already exists. */
+               list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
+                       if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
+                               printk(KERN_ERR DRV_NAME
+                                       ": cannot add bond %s; it already exists\n",
+                                       ifname);
+                               res = -EPERM;
+                               goto out;
+                       }
+
+               printk(KERN_INFO DRV_NAME
+                       ": %s is being created...\n", ifname);
+               if (bond_create(ifname, &bonding_defaults, &bond)) {
+                       printk(KERN_INFO DRV_NAME
+                       ": %s interface already exists. Bond creation failed.\n",
+                       ifname);
+                       res = -EPERM;
+               }
+               goto out;
+       }
+
+       if (command[0] == '-') {
+               list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
+                       if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
+                               rtnl_lock();
+                               /* check the ref count on the bond's kobject.
+                                * If it's > expected, then there's a file open,
+                                * and we have to fail.
+                                */
+                               if (atomic_read(&bond->dev->class_dev.kobj.kref.refcount)
+                                                       > expected_refcount){
+                                       rtnl_unlock();
+                                       printk(KERN_INFO DRV_NAME
+                                               ": Unable remove bond %s due to open references.\n",
+                                               ifname);
+                                       res = -EPERM;
+                                       goto out;
+                               }
+                               printk(KERN_INFO DRV_NAME
+                                       ": %s is being deleted...\n",
+                                       bond->dev->name);
+                               unregister_netdevice(bond->dev);
+                               bond_deinit(bond->dev);
+                               bond_destroy_sysfs_entry(bond);
+                               rtnl_unlock();
+                               goto out;
+                       }
+
+               printk(KERN_ERR DRV_NAME
+                       ": unable to delete non-existent bond %s\n", ifname);
+               res = -ENODEV;
+               goto out;
+       }
+
+err_no_cmd:
+       printk(KERN_ERR DRV_NAME
+               ": no command found in bonding_masters. Use +ifname or -ifname.\n");
+       res = -EPERM;
+
+       /* Always return either count or an error.  If you return 0, you'll
+        * get called forever, which is bad.
+        */
+out:
+       up_write(&(bonding_rwsem));
+       return res;
+}
+/* class attribute for bond_masters file.  This ends up in /sys/class/net */
+static CLASS_ATTR(bonding_masters,  S_IWUSR | S_IRUGO,
+                 bonding_show_bonds, bonding_store_bonds);
+
+int bond_create_slave_symlinks(struct net_device *master, struct net_device *slave)
+{
+       char linkname[IFNAMSIZ+7];
+       int ret = 0;
+
+       /* first, create a link from the slave back to the master */
+       ret = sysfs_create_link(&(slave->class_dev.kobj), &(master->class_dev.kobj),
+                               "master");
+       if (ret)
+               return ret;
+       /* next, create a link from the master to the slave */
+       sprintf(linkname,"slave_%s",slave->name);
+       ret = sysfs_create_link(&(master->class_dev.kobj), &(slave->class_dev.kobj),
+                               linkname);
+       return ret;
+
+}
+
+void bond_destroy_slave_symlinks(struct net_device *master, struct net_device *slave)
+{
+       char linkname[IFNAMSIZ+7];
+
+       sysfs_remove_link(&(slave->class_dev.kobj), "master");
+       sprintf(linkname,"slave_%s",slave->name);
+       sysfs_remove_link(&(master->class_dev.kobj), linkname);
+}
+
+
+/*
+ * Show the slaves in the current bond.
+ */
+static ssize_t bonding_show_slaves(struct class_device *cd, char *buf)
+{
+       struct slave *slave;
+       int i, res = 0;
+       struct bonding *bond = to_bond(cd);
+
+       read_lock_bh(&bond->lock);
+       bond_for_each_slave(bond, slave, i) {
+               if (res > (PAGE_SIZE - IFNAMSIZ)) {
+                       /* not enough space for another interface name */
+                       if ((PAGE_SIZE - res) > 10)
+                               res = PAGE_SIZE - 10;
+                       res += sprintf(buf + res, "++more++");
+                       break;
+               }
+               res += sprintf(buf + res, "%s ", slave->dev->name);
+       }
+       read_unlock_bh(&bond->lock);
+       res += sprintf(buf + res, "\n");
+       res++;
+       return res;
+}
+
+/*
+ * Set the slaves in the current bond.  The bond interface must be
+ * up for this to succeed.
+ * This function is largely the same flow as bonding_update_bonds().
+ */
+static ssize_t bonding_store_slaves(struct class_device *cd, const char *buffer, size_t count)
+{
+       char command[IFNAMSIZ + 1] = { 0, };
+       char *ifname;
+       int i, res, found, ret = count;
+       struct slave *slave;
+       struct net_device *dev = 0;
+       struct bonding *bond = to_bond(cd);
+
+       /* Quick sanity check -- is the bond interface up? */
+       if (!(bond->dev->flags & IFF_UP)) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Unable to update slaves because interface is down.\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       /* Note:  We can't hold bond->lock here, as bond_create grabs it. */
+
+       sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
+       ifname = command + 1;
+       if ((strlen(command) <= 1) ||
+           !dev_valid_name(ifname))
+               goto err_no_cmd;
+
+       if (command[0] == '+') {
+
+               /* Got a slave name in ifname.  Is it already in the list? */
+               found = 0;
+               read_lock_bh(&bond->lock);
+               bond_for_each_slave(bond, slave, i)
+                       if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
+                               printk(KERN_ERR DRV_NAME
+                                      ": %s: Interface %s is already enslaved!\n",
+                                      bond->dev->name, ifname);
+                               ret = -EPERM;
+                               read_unlock_bh(&bond->lock);
+                               goto out;
+                       }
+
+               read_unlock_bh(&bond->lock);
+               printk(KERN_INFO DRV_NAME ": %s: Adding slave %s.\n",
+                      bond->dev->name, ifname);
+               dev = dev_get_by_name(ifname);
+               if (!dev) {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: Interface %s does not exist!\n",
+                              bond->dev->name, ifname);
+                       ret = -EPERM;
+                       goto out;
+               }
+               else
+                       dev_put(dev);
+
+               if (dev->flags & IFF_UP) {
+                       printk(KERN_ERR DRV_NAME
+                              ": %s: Error: Unable to enslave %s "
+                              "because it is already up.\n",
+                              bond->dev->name, dev->name);
+                       ret = -EPERM;
+                       goto out;
+               }
+               /* If this is the first slave, then we need to set
+                  the master's hardware address to be the same as the
+                  slave's. */
+               if (!(*((u32 *) & (bond->dev->dev_addr[0])))) {
+                       memcpy(bond->dev->dev_addr, dev->dev_addr,
+                              dev->addr_len);
+               }
+
+               /* Set the slave's MTU to match the bond */
+               if (dev->mtu != bond->dev->mtu) {
+                       if (dev->change_mtu) {
+                               res = dev->change_mtu(dev,
+                                                     bond->dev->mtu);
+                               if (res) {
+                                       ret = res;
+                                       goto out;
+                               }
+                       } else {
+                               dev->mtu = bond->dev->mtu;
+                       }
+               }
+               rtnl_lock();
+               res = bond_enslave(bond->dev, dev);
+               rtnl_unlock();
+               if (res) {
+                       ret = res;
+               }
+               goto out;
+       }
+
+       if (command[0] == '-') {
+               dev = NULL;
+               bond_for_each_slave(bond, slave, i)
+                       if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
+                               dev = slave->dev;
+                               break;
+                       }
+               if (dev) {
+                       printk(KERN_INFO DRV_NAME ": %s: Removing slave %s\n",
+                               bond->dev->name, dev->name);
+                       rtnl_lock();
+                       res = bond_release(bond->dev, dev);
+                       rtnl_unlock();
+                       if (res) {
+                               ret = res;
+                               goto out;
+                       }
+                       /* set the slave MTU to the default */
+                       if (dev->change_mtu) {
+                               dev->change_mtu(dev, 1500);
+                       } else {
+                               dev->mtu = 1500;
+                       }
+               }
+               else {
+                       printk(KERN_ERR DRV_NAME ": unable to remove non-existent slave %s for bond %s.\n",
+                               ifname, bond->dev->name);
+                       ret = -ENODEV;
+               }
+               goto out;
+       }
+
+err_no_cmd:
+       printk(KERN_ERR DRV_NAME ": no command found in slaves file for bond %s. Use +ifname or -ifname.\n", bond->dev->name);
+       ret = -EPERM;
+
+out:
+       return ret;
+}
+
+static CLASS_DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves, bonding_store_slaves);
+
+/*
+ * Show and set the bonding mode.  The bond interface must be down to
+ * change the mode.
+ */
+static ssize_t bonding_show_mode(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%s %d\n",
+                       bond_mode_tbl[bond->params.mode].modename,
+                       bond->params.mode) + 1;
+}
+
+static ssize_t bonding_store_mode(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->dev->flags & IFF_UP) {
+               printk(KERN_ERR DRV_NAME
+                      ": unable to update mode of %s because interface is up.\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       new_value = bond_parse_parm((char *)buf, bond_mode_tbl);
+       if (new_value < 0)  {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Ignoring invalid mode value %.*s.\n",
+                      bond->dev->name,
+                      (int)strlen(buf) - 1, buf);
+               ret = -EINVAL;
+               goto out;
+       } else {
+               bond->params.mode = new_value;
+               bond_set_mode_ops(bond, bond->params.mode);
+               printk(KERN_INFO DRV_NAME ": %s: setting mode to %s (%d).\n",
+                       bond->dev->name, bond_mode_tbl[new_value].modename, new_value);
+       }
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR, bonding_show_mode, bonding_store_mode);
+
+/*
+ * Show and set the bonding transmit hash method.  The bond interface must be down to
+ * change the xmit hash policy.
+ */
+static ssize_t bonding_show_xmit_hash(struct class_device *cd, char *buf)
+{
+       int count;
+       struct bonding *bond = to_bond(cd);
+
+       if ((bond->params.mode != BOND_MODE_XOR) &&
+           (bond->params.mode != BOND_MODE_8023AD)) {
+               // Not Applicable
+               count = sprintf(buf, "NA\n") + 1;
+       } else {
+               count = sprintf(buf, "%s %d\n",
+                       xmit_hashtype_tbl[bond->params.xmit_policy].modename,
+                       bond->params.xmit_policy) + 1;
+       }
+
+       return count;
+}
+
+static ssize_t bonding_store_xmit_hash(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->dev->flags & IFF_UP) {
+               printk(KERN_ERR DRV_NAME
+                      "%s: Interface is up. Unable to update xmit policy.\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       if ((bond->params.mode != BOND_MODE_XOR) &&
+           (bond->params.mode != BOND_MODE_8023AD)) {
+               printk(KERN_ERR DRV_NAME
+                      "%s: Transmit hash policy is irrelevant in this mode.\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       new_value = bond_parse_parm((char *)buf, xmit_hashtype_tbl);
+       if (new_value < 0)  {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Ignoring invalid xmit hash policy value %.*s.\n",
+                      bond->dev->name,
+                      (int)strlen(buf) - 1, buf);
+               ret = -EINVAL;
+               goto out;
+       } else {
+               bond->params.xmit_policy = new_value;
+               bond_set_mode_ops(bond, bond->params.mode);
+               printk(KERN_INFO DRV_NAME ": %s: setting xmit hash policy to %s (%d).\n",
+                       bond->dev->name, xmit_hashtype_tbl[new_value].modename, new_value);
+       }
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(xmit_hash_policy, S_IRUGO | S_IWUSR, bonding_show_xmit_hash, bonding_store_xmit_hash);
+
+/*
+ * Show and set the arp timer interval.  There are two tricky bits
+ * here.  First, if ARP monitoring is activated, then we must disable
+ * MII monitoring.  Second, if the ARP timer isn't running, we must
+ * start it.
+ */
+static ssize_t bonding_show_arp_interval(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%d\n", bond->params.arp_interval) + 1;
+}
+
+static ssize_t bonding_store_arp_interval(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: no arp_interval value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (new_value < 0) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Invalid arp_interval value %d not in range 1-%d; rejected.\n",
+                      bond->dev->name, new_value, INT_MAX);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       printk(KERN_INFO DRV_NAME
+              ": %s: Setting ARP monitoring interval to %d.\n",
+              bond->dev->name, new_value);
+       bond->params.arp_interval = new_value;
+       if (bond->params.miimon) {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: ARP monitoring cannot be used with MII monitoring. "
+                      "%s Disabling MII monitoring.\n",
+                      bond->dev->name, bond->dev->name);
+               bond->params.miimon = 0;
+               /* Kill MII timer, else it brings bond's link down */
+               if (bond->arp_timer.function) {
+                       printk(KERN_INFO DRV_NAME
+                       ": %s: Kill MII timer, else it brings bond's link down...\n",
+                      bond->dev->name);
+                       del_timer_sync(&bond->mii_timer);
+               }
+       }
+       if (!bond->params.arp_targets[0]) {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: ARP monitoring has been set up, "
+                      "but no ARP targets have been specified.\n",
+                      bond->dev->name);
+       }
+       if (bond->dev->flags & IFF_UP) {
+               /* If the interface is up, we may need to fire off
+                * the ARP timer.  If the interface is down, the
+                * timer will get fired off when the open function
+                * is called.
+                */
+               if (bond->arp_timer.function) {
+                       /* The timer's already set up, so fire it off */
+                       mod_timer(&bond->arp_timer, jiffies + 1);
+               } else {
+                       /* Set up the timer. */
+                       init_timer(&bond->arp_timer);
+                       bond->arp_timer.expires = jiffies + 1;
+                       bond->arp_timer.data =
+                               (unsigned long) bond->dev;
+                       if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) {
+                               bond->arp_timer.function =
+                                       (void *)
+                                       &bond_activebackup_arp_mon;
+                       } else {
+                               bond->arp_timer.function =
+                                       (void *)
+                                       &bond_loadbalance_arp_mon;
+                       }
+                       add_timer(&bond->arp_timer);
+               }
+       }
+
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(arp_interval, S_IRUGO | S_IWUSR , bonding_show_arp_interval, bonding_store_arp_interval);
+
+/*
+ * Show and set the arp targets.
+ */
+static ssize_t bonding_show_arp_targets(struct class_device *cd, char *buf)
+{
+       int i, res = 0;
+       struct bonding *bond = to_bond(cd);
+
+       for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
+               if (bond->params.arp_targets[i])
+                       res += sprintf(buf + res, "%u.%u.%u.%u ",
+                              NIPQUAD(bond->params.arp_targets[i]));
+       }
+       if (res)
+               res--;  /* eat the leftover space */
+       res += sprintf(buf + res, "\n");
+       res++;
+       return res;
+}
+
+static ssize_t bonding_store_arp_targets(struct class_device *cd, const char *buf, size_t count)
+{
+       u32 newtarget;
+       int i = 0, done = 0, ret = count;
+       struct bonding *bond = to_bond(cd);
+       u32 *targets;
+
+       targets = bond->params.arp_targets;
+       newtarget = in_aton(buf + 1);
+       /* look for adds */
+       if (buf[0] == '+') {
+               if ((newtarget == 0) || (newtarget == INADDR_BROADCAST)) {
+                       printk(KERN_ERR DRV_NAME
+                              ": %s: invalid ARP target %u.%u.%u.%u specified for addition\n",
+                              bond->dev->name, NIPQUAD(newtarget));
+                       ret = -EINVAL;
+                       goto out;
+               }
+               /* look for an empty slot to put the target in, and check for dupes */
+               for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
+                       if (targets[i] == newtarget) { /* duplicate */
+                               printk(KERN_ERR DRV_NAME
+                                      ": %s: ARP target %u.%u.%u.%u is already present\n",
+                                      bond->dev->name, NIPQUAD(newtarget));
+                               if (done)
+                                       targets[i] = 0;
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       if (targets[i] == 0 && !done) {
+                               printk(KERN_INFO DRV_NAME
+                                      ": %s: adding ARP target %d.%d.%d.%d.\n",
+                                      bond->dev->name, NIPQUAD(newtarget));
+                               done = 1;
+                               targets[i] = newtarget;
+                       }
+               }
+               if (!done) {
+                       printk(KERN_ERR DRV_NAME
+                              ": %s: ARP target table is full!\n",
+                              bond->dev->name);
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+       }
+       else if (buf[0] == '-') {
+               if ((newtarget == 0) || (newtarget == INADDR_BROADCAST)) {
+                       printk(KERN_ERR DRV_NAME
+                              ": %s: invalid ARP target %d.%d.%d.%d specified for removal\n",
+                              bond->dev->name, NIPQUAD(newtarget));
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
+                       if (targets[i] == newtarget) {
+                               printk(KERN_INFO DRV_NAME
+                                      ": %s: removing ARP target %d.%d.%d.%d.\n",
+                                      bond->dev->name, NIPQUAD(newtarget));
+                               targets[i] = 0;
+                               done = 1;
+                       }
+               }
+               if (!done) {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: unable to remove nonexistent ARP target %d.%d.%d.%d.\n",
+                              bond->dev->name, NIPQUAD(newtarget));
+                       ret = -EINVAL;
+                       goto out;
+               }
+       }
+       else {
+               printk(KERN_ERR DRV_NAME ": no command found in arp_ip_targets file for bond %s. Use +<addr> or -<addr>.\n",
+                       bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(arp_ip_target, S_IRUGO | S_IWUSR , bonding_show_arp_targets, bonding_store_arp_targets);
+
+/*
+ * Show and set the up and down delays.  These must be multiples of the
+ * MII monitoring value, and are stored internally as the multiplier.
+ * Thus, we must translate to MS for the real world.
+ */
+static ssize_t bonding_show_downdelay(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%d\n", bond->params.downdelay * bond->params.miimon) + 1;
+}
+
+static ssize_t bonding_store_downdelay(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (!(bond->params.miimon)) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Unable to set down delay as MII monitoring is disabled\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: no down delay value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (new_value < 0) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Invalid down delay value %d not in range %d-%d; rejected.\n",
+                      bond->dev->name, new_value, 1, INT_MAX);
+               ret = -EINVAL;
+               goto out;
+       } else {
+               if ((new_value % bond->params.miimon) != 0) {
+                       printk(KERN_WARNING DRV_NAME
+                              ": %s: Warning: down delay (%d) is not a multiple "
+                              "of miimon (%d), delay rounded to %d ms\n",
+                              bond->dev->name, new_value, bond->params.miimon,
+                              (new_value / bond->params.miimon) *
+                              bond->params.miimon);
+               }
+               bond->params.downdelay = new_value / bond->params.miimon;
+               printk(KERN_INFO DRV_NAME ": %s: Setting down delay to %d.\n",
+                      bond->dev->name, bond->params.downdelay * bond->params.miimon);
+
+       }
+
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(downdelay, S_IRUGO | S_IWUSR , bonding_show_downdelay, bonding_store_downdelay);
+
+static ssize_t bonding_show_updelay(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%d\n", bond->params.updelay * bond->params.miimon) + 1;
+
+}
+
+static ssize_t bonding_store_updelay(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (!(bond->params.miimon)) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Unable to set up delay as MII monitoring is disabled\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: no up delay value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (new_value < 0) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Invalid down delay value %d not in range %d-%d; rejected.\n",
+                      bond->dev->name, new_value, 1, INT_MAX);
+               ret = -EINVAL;
+               goto out;
+       } else {
+               if ((new_value % bond->params.miimon) != 0) {
+                       printk(KERN_WARNING DRV_NAME
+                              ": %s: Warning: up delay (%d) is not a multiple "
+                              "of miimon (%d), updelay rounded to %d ms\n",
+                              bond->dev->name, new_value, bond->params.miimon,
+                              (new_value / bond->params.miimon) *
+                              bond->params.miimon);
+               }
+               bond->params.updelay = new_value / bond->params.miimon;
+               printk(KERN_INFO DRV_NAME ": %s: Setting up delay to %d.\n",
+                      bond->dev->name, bond->params.updelay * bond->params.miimon);
+
+       }
+
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(updelay, S_IRUGO | S_IWUSR , bonding_show_updelay, bonding_store_updelay);
+
+/*
+ * Show and set the LACP interval.  Interface must be down, and the mode
+ * must be set to 802.3ad mode.
+ */
+static ssize_t bonding_show_lacp(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%s %d\n",
+               bond_lacp_tbl[bond->params.lacp_fast].modename,
+               bond->params.lacp_fast) + 1;
+}
+
+static ssize_t bonding_store_lacp(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->dev->flags & IFF_UP) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Unable to update LACP rate because interface is up.\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       if (bond->params.mode != BOND_MODE_8023AD) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Unable to update LACP rate because bond is not in 802.3ad mode.\n",
+                      bond->dev->name);
+               ret = -EPERM;
+               goto out;
+       }
+
+       new_value = bond_parse_parm((char *)buf, bond_lacp_tbl);
+
+       if ((new_value == 1) || (new_value == 0)) {
+               bond->params.lacp_fast = new_value;
+               printk(KERN_INFO DRV_NAME
+                      ": %s: Setting LACP rate to %s (%d).\n",
+                      bond->dev->name, bond_lacp_tbl[new_value].modename, new_value);
+       } else {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Ignoring invalid LACP rate value %.*s.\n",
+                       bond->dev->name, (int)strlen(buf) - 1, buf);
+               ret = -EINVAL;
+       }
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR, bonding_show_lacp, bonding_store_lacp);
+
+/*
+ * Show and set the MII monitor interval.  There are two tricky bits
+ * here.  First, if MII monitoring is activated, then we must disable
+ * ARP monitoring.  Second, if the timer isn't running, we must
+ * start it.
+ */
+static ssize_t bonding_show_miimon(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%d\n", bond->params.miimon) + 1;
+}
+
+static ssize_t bonding_store_miimon(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: no miimon value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (new_value < 0) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Invalid miimon value %d not in range %d-%d; rejected.\n",
+                      bond->dev->name, new_value, 1, INT_MAX);
+               ret = -EINVAL;
+               goto out;
+       } else {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: Setting MII monitoring interval to %d.\n",
+                      bond->dev->name, new_value);
+               bond->params.miimon = new_value;
+               if(bond->params.updelay)
+                       printk(KERN_INFO DRV_NAME
+                             ": %s: Note: Updating updelay (to %d) "
+                             "since it is a multiple of the miimon value.\n",
+                             bond->dev->name,
+                             bond->params.updelay * bond->params.miimon);
+               if(bond->params.downdelay)
+                       printk(KERN_INFO DRV_NAME
+                             ": %s: Note: Updating downdelay (to %d) "
+                             "since it is a multiple of the miimon value.\n",
+                             bond->dev->name,
+                             bond->params.downdelay * bond->params.miimon);
+               if (bond->params.arp_interval) {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: MII monitoring cannot be used with "
+                              "ARP monitoring. Disabling ARP monitoring...\n",
+                              bond->dev->name);
+                       bond->params.arp_interval = 0;
+                       /* Kill ARP timer, else it brings bond's link down */
+                       if (bond->mii_timer.function) {
+                               printk(KERN_INFO DRV_NAME
+                               ": %s: Kill ARP timer, else it brings bond's link down...\n",
+                              bond->dev->name);
+                               del_timer_sync(&bond->arp_timer);
+                       }
+               }
+
+               if (bond->dev->flags & IFF_UP) {
+                       /* If the interface is up, we may need to fire off
+                        * the MII timer. If the interface is down, the
+                        * timer will get fired off when the open function
+                        * is called.
+                        */
+                       if (bond->mii_timer.function) {
+                               /* The timer's already set up, so fire it off */
+                               mod_timer(&bond->mii_timer, jiffies + 1);
+                       } else {
+                               /* Set up the timer. */
+                               init_timer(&bond->mii_timer);
+                               bond->mii_timer.expires = jiffies + 1;
+                               bond->mii_timer.data =
+                                       (unsigned long) bond->dev;
+                               bond->mii_timer.function =
+                                       (void *) &bond_mii_monitor;
+                               add_timer(&bond->mii_timer);
+                       }
+               }
+       }
+out:
+       return ret;
+}
+static CLASS_DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR, bonding_show_miimon, bonding_store_miimon);
+
+/*
+ * Show and set the primary slave.  The store function is much
+ * simpler than bonding_store_slaves function because it only needs to
+ * handle one interface name.
+ * The bond must be a mode that supports a primary for this be
+ * set.
+ */
+static ssize_t bonding_show_primary(struct class_device *cd, char *buf)
+{
+       int count = 0;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->primary_slave)
+               count = sprintf(buf, "%s\n", bond->primary_slave->dev->name) + 1;
+       else
+               count = sprintf(buf, "\n") + 1;
+
+       return count;
+}
+
+static ssize_t bonding_store_primary(struct class_device *cd, const char *buf, size_t count)
+{
+       int i;
+       struct slave *slave;
+       struct bonding *bond = to_bond(cd);
+
+       write_lock_bh(&bond->lock);
+       if (!USES_PRIMARY(bond->params.mode)) {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: Unable to set primary slave; %s is in mode %d\n",
+                      bond->dev->name, bond->dev->name, bond->params.mode);
+       } else {
+               bond_for_each_slave(bond, slave, i) {
+                       if (strnicmp
+                           (slave->dev->name, buf,
+                            strlen(slave->dev->name)) == 0) {
+                               printk(KERN_INFO DRV_NAME
+                                      ": %s: Setting %s as primary slave.\n",
+                                      bond->dev->name, slave->dev->name);
+                               bond->primary_slave = slave;
+                               bond_select_active_slave(bond);
+                               goto out;
+                       }
+               }
+
+               /* if we got here, then we didn't match the name of any slave */
+
+               if (strlen(buf) == 0 || buf[0] == '\n') {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: Setting primary slave to None.\n",
+                              bond->dev->name);
+                       bond->primary_slave = 0;
+                               bond_select_active_slave(bond);
+               } else {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: Unable to set %.*s as primary slave as it is not a slave.\n",
+                              bond->dev->name, (int)strlen(buf) - 1, buf);
+               }
+       }
+out:
+       write_unlock_bh(&bond->lock);
+       return count;
+}
+static CLASS_DEVICE_ATTR(primary, S_IRUGO | S_IWUSR, bonding_show_primary, bonding_store_primary);
+
+/*
+ * Show and set the use_carrier flag.
+ */
+static ssize_t bonding_show_carrier(struct class_device *cd, char *buf)
+{
+       struct bonding *bond = to_bond(cd);
+
+       return sprintf(buf, "%d\n", bond->params.use_carrier) + 1;
+}
+
+static ssize_t bonding_store_carrier(struct class_device *cd, const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(cd);
+
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: no use_carrier value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if ((new_value == 0) || (new_value == 1)) {
+               bond->params.use_carrier = new_value;
+               printk(KERN_INFO DRV_NAME ": %s: Setting use_carrier to %d.\n",
+                      bond->dev->name, new_value);
+       } else {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: Ignoring invalid use_carrier value %d.\n",
+                      bond->dev->name, new_value);
+       }
+out:
+       return count;
+}
+static CLASS_DEVICE_ATTR(use_carrier, S_IRUGO | S_IWUSR, bonding_show_carrier, bonding_store_carrier);
+
+
+/*
+ * Show and set currently active_slave.
+ */
+static ssize_t bonding_show_active_slave(struct class_device *cd, char *buf)
+{
+       struct slave *curr;
+       struct bonding *bond = to_bond(cd);
+       int count;
+
+
+       read_lock(&bond->curr_slave_lock);
+       curr = bond->curr_active_slave;
+       read_unlock(&bond->curr_slave_lock);
+
+       if (USES_PRIMARY(bond->params.mode) && curr)
+               count = sprintf(buf, "%s\n", curr->dev->name) + 1;
+       else
+               count = sprintf(buf, "\n") + 1;
+       return count;
+}
+
+static ssize_t bonding_store_active_slave(struct class_device *cd, const char *buf, size_t count)
+{
+       int i;
+       struct slave *slave;
+        struct slave *old_active = NULL;
+        struct slave *new_active = NULL;
+       struct bonding *bond = to_bond(cd);
+
+       write_lock_bh(&bond->lock);
+       if (!USES_PRIMARY(bond->params.mode)) {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: Unable to change active slave; %s is in mode %d\n",
+                      bond->dev->name, bond->dev->name, bond->params.mode);
+       } else {
+               bond_for_each_slave(bond, slave, i) {
+                       if (strnicmp
+                           (slave->dev->name, buf,
+                            strlen(slave->dev->name)) == 0) {
+                               old_active = bond->curr_active_slave;
+                               new_active = slave;
+                               if (new_active && (new_active == old_active)) {
+                                       /* do nothing */
+                                       printk(KERN_INFO DRV_NAME
+                                              ": %s: %s is already the current active slave.\n",
+                                              bond->dev->name, slave->dev->name);
+                                       goto out;
+                               }
+                               else {
+                                       if ((new_active) &&
+                                           (old_active) &&
+                                           (new_active->link == BOND_LINK_UP) &&
+                                           IS_UP(new_active->dev)) {
+                                               printk(KERN_INFO DRV_NAME
+                                                     ": %s: Setting %s as active slave.\n",
+                                                     bond->dev->name, slave->dev->name);
+                                               bond_change_active_slave(bond, new_active);
+                                       }
+                                       else {
+                                               printk(KERN_INFO DRV_NAME
+                                                     ": %s: Could not set %s as active slave; "
+                                                     "either %s is down or the link is down.\n",
+                                                     bond->dev->name, slave->dev->name,
+                                                     slave->dev->name);
+                                       }
+                                       goto out;
+                               }
+                       }
+               }
+
+               /* if we got here, then we didn't match the name of any slave */
+
+               if (strlen(buf) == 0 || buf[0] == '\n') {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: Setting active slave to None.\n",
+                              bond->dev->name);
+                       bond->primary_slave = 0;
+                               bond_select_active_slave(bond);
+               } else {
+                       printk(KERN_INFO DRV_NAME
+                              ": %s: Unable to set %.*s as active slave as it is not a slave.\n",
+                              bond->dev->name, (int)strlen(buf) - 1, buf);
+               }
+       }
+out:
+       write_unlock_bh(&bond->lock);
+       return count;
+
+}
+static CLASS_DEVICE_ATTR(active_slave, S_IRUGO | S_IWUSR, bonding_show_active_slave, bonding_store_active_slave);
+
+
+/*
+ * Show link status of the bond interface.
+ */
+static ssize_t bonding_show_mii_status(struct class_device *cd, char *buf)
+{
+       struct slave *curr;
+       struct bonding *bond = to_bond(cd);
+
+       read_lock(&bond->curr_slave_lock);
+       curr = bond->curr_active_slave;
+       read_unlock(&bond->curr_slave_lock);
+
+       return sprintf(buf, "%s\n", (curr) ? "up" : "down") + 1;
+}
+static CLASS_DEVICE_ATTR(mii_status, S_IRUGO, bonding_show_mii_status, NULL);
+
+
+/*
+ * Show current 802.3ad aggregator ID.
+ */
+static ssize_t bonding_show_ad_aggregator(struct class_device *cd, char *buf)
+{
+       int count = 0;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->params.mode == BOND_MODE_8023AD) {
+               struct ad_info ad_info;
+               count = sprintf(buf, "%d\n", (bond_3ad_get_active_agg_info(bond, &ad_info)) ?  0 : ad_info.aggregator_id) + 1;
+       }
+       else
+               count = sprintf(buf, "\n") + 1;
+
+       return count;
+}
+static CLASS_DEVICE_ATTR(ad_aggregator, S_IRUGO, bonding_show_ad_aggregator, NULL);
+
+
+/*
+ * Show number of active 802.3ad ports.
+ */
+static ssize_t bonding_show_ad_num_ports(struct class_device *cd, char *buf)
+{
+       int count = 0;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->params.mode == BOND_MODE_8023AD) {
+               struct ad_info ad_info;
+               count = sprintf(buf, "%d\n", (bond_3ad_get_active_agg_info(bond, &ad_info)) ?  0: ad_info.ports) + 1;
+       }
+       else
+               count = sprintf(buf, "\n") + 1;
+
+       return count;
+}
+static CLASS_DEVICE_ATTR(ad_num_ports, S_IRUGO, bonding_show_ad_num_ports, NULL);
+
+
+/*
+ * Show current 802.3ad actor key.
+ */
+static ssize_t bonding_show_ad_actor_key(struct class_device *cd, char *buf)
+{
+       int count = 0;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->params.mode == BOND_MODE_8023AD) {
+               struct ad_info ad_info;
+               count = sprintf(buf, "%d\n", (bond_3ad_get_active_agg_info(bond, &ad_info)) ?  0 : ad_info.actor_key) + 1;
+       }
+       else
+               count = sprintf(buf, "\n") + 1;
+
+       return count;
+}
+static CLASS_DEVICE_ATTR(ad_actor_key, S_IRUGO, bonding_show_ad_actor_key, NULL);
+
+
+/*
+ * Show current 802.3ad partner key.
+ */
+static ssize_t bonding_show_ad_partner_key(struct class_device *cd, char *buf)
+{
+       int count = 0;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->params.mode == BOND_MODE_8023AD) {
+               struct ad_info ad_info;
+               count = sprintf(buf, "%d\n", (bond_3ad_get_active_agg_info(bond, &ad_info)) ?  0 : ad_info.partner_key) + 1;
+       }
+       else
+               count = sprintf(buf, "\n") + 1;
+
+       return count;
+}
+static CLASS_DEVICE_ATTR(ad_partner_key, S_IRUGO, bonding_show_ad_partner_key, NULL);
+
+
+/*
+ * Show current 802.3ad partner mac.
+ */
+static ssize_t bonding_show_ad_partner_mac(struct class_device *cd, char *buf)
+{
+       int count = 0;
+       struct bonding *bond = to_bond(cd);
+
+       if (bond->params.mode == BOND_MODE_8023AD) {
+               struct ad_info ad_info;
+               if (!bond_3ad_get_active_agg_info(bond, &ad_info)) {
+                       count = sprintf(buf,"%02x:%02x:%02x:%02x:%02x:%02x\n",
+                                      ad_info.partner_system[0],
+                                      ad_info.partner_system[1],
+                                      ad_info.partner_system[2],
+                                      ad_info.partner_system[3],
+                                      ad_info.partner_system[4],
+                                      ad_info.partner_system[5]) + 1;
+               }
+       }
+       else
+               count = sprintf(buf, "\n") + 1;
+
+       return count;
+}
+static CLASS_DEVICE_ATTR(ad_partner_mac, S_IRUGO, bonding_show_ad_partner_mac, NULL);
+
+
+
+static struct attribute *per_bond_attrs[] = {
+       &class_device_attr_slaves.attr,
+       &class_device_attr_mode.attr,
+       &class_device_attr_arp_interval.attr,
+       &class_device_attr_arp_ip_target.attr,
+       &class_device_attr_downdelay.attr,
+       &class_device_attr_updelay.attr,
+       &class_device_attr_lacp_rate.attr,
+       &class_device_attr_xmit_hash_policy.attr,
+       &class_device_attr_miimon.attr,
+       &class_device_attr_primary.attr,
+       &class_device_attr_use_carrier.attr,
+       &class_device_attr_active_slave.attr,
+       &class_device_attr_mii_status.attr,
+       &class_device_attr_ad_aggregator.attr,
+       &class_device_attr_ad_num_ports.attr,
+       &class_device_attr_ad_actor_key.attr,
+       &class_device_attr_ad_partner_key.attr,
+       &class_device_attr_ad_partner_mac.attr,
+       NULL,
+};
+
+static struct attribute_group bonding_group = {
+       .name = "bonding",
+       .attrs = per_bond_attrs,
+};
+
+/*
+ * Initialize sysfs.  This sets up the bonding_masters file in
+ * /sys/class/net.
+ */
+int bond_create_sysfs(void)
+{
+       int ret = 0;
+       struct bonding *firstbond;
+
+       init_rwsem(&bonding_rwsem);
+
+       /* get the netdev class pointer */
+       firstbond = container_of(bond_dev_list.next, struct bonding, bond_list);
+       if (!firstbond)
+               return -ENODEV;
+
+       netdev_class = firstbond->dev->class_dev.class;
+       if (!netdev_class)
+               return -ENODEV;
+
+       ret = class_create_file(netdev_class, &class_attr_bonding_masters);
+
+       return ret;
+
+}
+
+/*
+ * Remove /sys/class/net/bonding_masters.
+ */
+void bond_destroy_sysfs(void)
+{
+       if (netdev_class)
+               class_remove_file(netdev_class, &class_attr_bonding_masters);
+}
+
+/*
+ * Initialize sysfs for each bond.  This sets up and registers
+ * the 'bondctl' directory for each individual bond under /sys/class/net.
+ */
+int bond_create_sysfs_entry(struct bonding *bond)
+{
+       struct net_device *dev = bond->dev;
+       int err;
+
+       err = sysfs_create_group(&(dev->class_dev.kobj), &bonding_group);
+       if (err) {
+               printk(KERN_EMERG "eek! didn't create group!\n");
+       }
+
+       if (expected_refcount < 1)
+               expected_refcount = atomic_read(&bond->dev->class_dev.kobj.kref.refcount);
+
+       return err;
+}
+/*
+ * Remove sysfs entries for each bond.
+ */
+void bond_destroy_sysfs_entry(struct bonding *bond)
+{
+       struct net_device *dev = bond->dev;
+
+       sysfs_remove_group(&(dev->class_dev.kobj), &bonding_group);
+}
+
index 1433e91db0f7fb12b3fcec07c83288192202e4c5..015c7f1d1bc0843e3be52454505a8d99ad068fc9 100644 (file)
  *     This software may be used and distributed according to the terms
  *     of the GNU Public License, incorporated herein by reference.
  *
- *
- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>,
- *             Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Shmulik Hen <shmulik.hen at intel dot com>
- *     - Added support for IEEE 802.3ad Dynamic link aggregation mode.
- *
- * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- *             Amir Noam <amir.noam at intel dot com>
- *     - Code beautification and style changes (mainly in comments).
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Added support for Transmit load balancing mode.
- *
- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
- *     - Code cleanup and style changes
- *
- * 2005/05/05 - Jason Gabler <jygabler at lbl dot gov>
- *      - added "xmit_policy" kernel parameter for alternate hashing policy
- *       support for mode 2
  */
 
 #ifndef _LINUX_BONDING_H
 #include <linux/timer.h>
 #include <linux/proc_fs.h>
 #include <linux/if_bonding.h>
+#include <linux/kobject.h>
 #include "bond_3ad.h"
 #include "bond_alb.h"
 
-#define DRV_VERSION    "2.6.5"
-#define DRV_RELDATE    "November 4, 2005"
+#define DRV_VERSION    "3.0.0"
+#define DRV_RELDATE    "November 8, 2005"
 #define DRV_NAME       "bonding"
 #define DRV_DESCRIPTION        "Ethernet Channel Bonding Driver"
 
@@ -152,6 +134,11 @@ struct bond_params {
        u32 arp_targets[BOND_MAX_ARP_TARGETS];
 };
 
+struct bond_parm_tbl {
+       char *modename;
+       int mode;
+};
+
 struct vlan_entry {
        struct list_head vlan_list;
        u32 vlan_ip;
@@ -159,7 +146,7 @@ struct vlan_entry {
 };
 
 struct slave {
-       struct net_device *dev; /* first - usefull for panic debug */
+       struct net_device *dev; /* first - useful for panic debug */
        struct slave *next;
        struct slave *prev;
        s16    delay;
@@ -185,7 +172,7 @@ struct slave {
  *    beforehand.
  */
 struct bonding {
-       struct   net_device *dev; /* first - usefull for panic debug */
+       struct   net_device *dev; /* first - useful for panic debug */
        struct   slave *first_slave;
        struct   slave *curr_active_slave;
        struct   slave *current_arp_slave;
@@ -255,6 +242,25 @@ extern inline void bond_set_slave_active_flags(struct slave *slave)
 
 struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr);
 int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
+int bond_create(char *name, struct bond_params *params, struct bonding **newbond);
+void bond_deinit(struct net_device *bond_dev);
+int bond_create_sysfs(void);
+void bond_destroy_sysfs(void);
+void bond_destroy_sysfs_entry(struct bonding *bond);
+int bond_create_sysfs_entry(struct bonding *bond);
+int bond_create_slave_symlinks(struct net_device *master, struct net_device *slave);
+void bond_destroy_slave_symlinks(struct net_device *master, struct net_device *slave);
+int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
+int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
+int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev);
+void bond_mii_monitor(struct net_device *bond_dev);
+void bond_loadbalance_arp_mon(struct net_device *bond_dev);
+void bond_activebackup_arp_mon(struct net_device *bond_dev);
+void bond_set_mode_ops(struct bonding *bond, int mode);
+int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl);
+const char *bond_mode_name(int mode);
+void bond_select_active_slave(struct bonding *bond);
+void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
 
 #endif /* _LINUX_BONDING_H */
 
index 53b41d99b00b2ec48fad8d963f1be24b8269d43e..2c5b849b7ba4fcecc414866940c0316189345c15 100644 (file)
@@ -1332,8 +1332,8 @@ intr_handler_t t1_select_intr_handler(adapter_t *adapter)
  *
  * This runs with softirqs disabled.
  */
-unsigned int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter,
-                      unsigned int qid, struct net_device *dev)
+static int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter,
+                    unsigned int qid, struct net_device *dev)
 {
        struct sge *sge = adapter->sge;
        struct cmdQ *q = &sge->cmdQ[qid];
@@ -1352,9 +1352,10 @@ unsigned int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter,
                        set_bit(dev->if_port, &sge->stopped_tx_queues);
                        sge->stats.cmdQ_full[3]++;
                        spin_unlock(&q->lock);
-                       CH_ERR("%s: Tx ring full while queue awake!\n",
-                              adapter->name);
-                       return 1;
+                       if (!netif_queue_stopped(dev))
+                               CH_ERR("%s: Tx ring full while queue awake!\n",
+                                      adapter->name);
+                       return NETDEV_TX_BUSY;
                }
                if (unlikely(credits - count < q->stop_thres)) {
                        sge->stats.cmdQ_full[3]++;
@@ -1389,7 +1390,7 @@ unsigned int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter,
                        writel(F_CMDQ0_ENABLE, adapter->regs + A_SG_DOORBELL);
                }
        }
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 #define MK_ETH_TYPE_MSS(type, mss) (((mss) & 0x3FFF) | ((type) << 14))
@@ -1449,7 +1450,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
                if (unlikely(skb->len < ETH_HLEN ||
                             skb->len > dev->mtu + eth_hdr_len(skb->data))) {
                        dev_kfree_skb_any(skb);
-                       return NET_XMIT_SUCCESS;
+                       return NETDEV_TX_OK;
                }
 
                /*
@@ -1467,7 +1468,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
                        skb = skb_realloc_headroom(skb, sizeof(*cpl));
                        dev_kfree_skb_any(orig_skb);
                        if (!skb)
-                               return -ENOMEM;
+                               return NETDEV_TX_OK;
                }
 
                if (!(adapter->flags & UDP_CSUM_CAPABLE) &&
@@ -1475,7 +1476,7 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
                    skb->nh.iph->protocol == IPPROTO_UDP)
                        if (unlikely(skb_checksum_help(skb, 0))) {
                                dev_kfree_skb_any(skb);
-                               return -ENOMEM;
+                               return NETDEV_TX_OK;
                        }
 
                /* Hmmm, assuming to catch the gratious arp... and we'll use
index 434b255868516045dbd67bc764d7ba8ea35d37e1..6d0d24a6364f75d8dc7908b58d83d6d1672b234e 100644 (file)
@@ -89,8 +89,6 @@ int t1_sge_configure(struct sge *, struct sge_params *);
 int t1_sge_set_coalesce_params(struct sge *, struct sge_params *);
 void t1_sge_destroy(struct sge *);
 intr_handler_t t1_select_intr_handler(adapter_t *adapter);
-unsigned int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter,
-                      unsigned int qid, struct net_device *netdev);
 int t1_start_xmit(struct sk_buff *skb, struct net_device *dev);
 void t1_set_vlan_accel(struct adapter *adapter, int on_off);
 void t1_sge_start(struct sge *);
index 2a290cc397ad6a57b849356be7251ab090017f2a..70b47e4c4e9c483a68dafba6d317d35af73d679b 100644 (file)
@@ -1458,6 +1458,8 @@ static struct pci_driver dgrs_pci_driver = {
        .probe = dgrs_pci_probe,
        .remove = __devexit_p(dgrs_pci_remove),
 };
+#else
+static struct pci_driver dgrs_pci_driver = {};
 #endif
 
 
index 3f653a93e1bc78dc9ab7e730bdc9490cac4f5650..e02e9ba2e18b0b66166f2f877a2e282f0a4926f8 100644 (file)
@@ -188,11 +188,13 @@ struct e1000_tx_ring {
        /* array of buffer information structs */
        struct e1000_buffer *buffer_info;
 
-       struct e1000_buffer previous_buffer_info;
        spinlock_t tx_lock;
        uint16_t tdh;
        uint16_t tdt;
        uint64_t pkt;
+
+       boolean_t last_tx_tso;
+
 };
 
 struct e1000_rx_ring {
index 8eae8ba27e84da532250b16756c60456e00dcee1..c88f1a3c1b1db7d58a87a779d6517480e514d31c 100644 (file)
@@ -562,10 +562,29 @@ e1000_get_drvinfo(struct net_device *netdev,
                        struct ethtool_drvinfo *drvinfo)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
+       char firmware_version[32];
+       uint16_t eeprom_data;
 
        strncpy(drvinfo->driver,  e1000_driver_name, 32);
        strncpy(drvinfo->version, e1000_driver_version, 32);
-       strncpy(drvinfo->fw_version, "N/A", 32);
+       
+       /* EEPROM image version # is reported as firware version # for
+        * 8257{1|2|3} controllers */
+       e1000_read_eeprom(&adapter->hw, 5, 1, &eeprom_data);
+       switch (adapter->hw.mac_type) {
+       case e1000_82571:
+       case e1000_82572:
+       case e1000_82573:
+               sprintf(firmware_version, "%d.%d-%d", 
+                       (eeprom_data & 0xF000) >> 12,
+                       (eeprom_data & 0x0FF0) >> 4,
+                       eeprom_data & 0x000F);
+               break;
+       default:
+               sprintf(firmware_version, "n/a");
+       }
+
+       strncpy(drvinfo->fw_version, firmware_version, 32);
        strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
        drvinfo->n_stats = E1000_STATS_LEN;
        drvinfo->testinfo_len = E1000_TEST_LEN;
@@ -960,13 +979,21 @@ e1000_free_desc_rings(struct e1000_adapter *adapter)
                }
        }
 
-       if(txdr->desc)
+       if(txdr->desc) {
                pci_free_consistent(pdev, txdr->size, txdr->desc, txdr->dma);
-       if(rxdr->desc)
+               txdr->desc = NULL;
+       }
+       if(rxdr->desc) {
                pci_free_consistent(pdev, rxdr->size, rxdr->desc, rxdr->dma);
+               rxdr->desc = NULL;
+       }
 
        kfree(txdr->buffer_info);
+       txdr->buffer_info = NULL;
+
        kfree(rxdr->buffer_info);
+       rxdr->buffer_info = NULL;
+
        return;
 }
 
@@ -1301,21 +1328,32 @@ static int
 e1000_setup_loopback_test(struct e1000_adapter *adapter)
 {
        uint32_t rctl;
+       struct e1000_hw *hw = &adapter->hw;
 
-       if(adapter->hw.media_type == e1000_media_type_fiber ||
-          adapter->hw.media_type == e1000_media_type_internal_serdes) {
-               if(adapter->hw.mac_type == e1000_82545 ||
-                  adapter->hw.mac_type == e1000_82546 ||
-                  adapter->hw.mac_type == e1000_82545_rev_3 ||
-                  adapter->hw.mac_type == e1000_82546_rev_3)
+       if (hw->media_type == e1000_media_type_fiber ||
+          hw->media_type == e1000_media_type_internal_serdes) {
+               switch (hw->mac_type) {
+               case e1000_82545:
+               case e1000_82546:
+               case e1000_82545_rev_3:
+               case e1000_82546_rev_3:
                        return e1000_set_phy_loopback(adapter);
-               else {
-                       rctl = E1000_READ_REG(&adapter->hw, RCTL);
+                       break;
+               case e1000_82571:
+               case e1000_82572:
+#define E1000_SERDES_LB_ON 0x410
+                       e1000_set_phy_loopback(adapter);
+                       E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_ON);
+                       msec_delay(10);
+                       return 0;
+                       break;
+               default:
+                       rctl = E1000_READ_REG(hw, RCTL);
                        rctl |= E1000_RCTL_LBM_TCVR;
-                       E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
+                       E1000_WRITE_REG(hw, RCTL, rctl);
                        return 0;
                }
-       } else if(adapter->hw.media_type == e1000_media_type_copper)
+       } else if (hw->media_type == e1000_media_type_copper)
                return e1000_set_phy_loopback(adapter);
 
        return 7;
@@ -1326,25 +1364,36 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
 {
        uint32_t rctl;
        uint16_t phy_reg;
+       struct e1000_hw *hw = &adapter->hw;
 
        rctl = E1000_READ_REG(&adapter->hw, RCTL);
        rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC);
        E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
 
-       if(adapter->hw.media_type == e1000_media_type_copper ||
-          ((adapter->hw.media_type == e1000_media_type_fiber ||
-            adapter->hw.media_type == e1000_media_type_internal_serdes) &&
-           (adapter->hw.mac_type == e1000_82545 ||
-            adapter->hw.mac_type == e1000_82546 ||
-            adapter->hw.mac_type == e1000_82545_rev_3 ||
-            adapter->hw.mac_type == e1000_82546_rev_3))) {
-               adapter->hw.autoneg = TRUE;
-               e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
-               if(phy_reg & MII_CR_LOOPBACK) {
+       switch (hw->mac_type) {
+       case e1000_82571:
+       case e1000_82572:
+               if (hw->media_type == e1000_media_type_fiber ||
+                  hw->media_type == e1000_media_type_internal_serdes){
+#define E1000_SERDES_LB_OFF 0x400
+                       E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_OFF);
+                       msec_delay(10);
+                       break;
+               }
+               /* fall thru for Cu adapters */
+       case e1000_82545:
+       case e1000_82546:
+       case e1000_82545_rev_3:
+       case e1000_82546_rev_3:
+       default:
+               hw->autoneg = TRUE;
+               e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
+               if (phy_reg & MII_CR_LOOPBACK) {
                        phy_reg &= ~MII_CR_LOOPBACK;
-                       e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_reg);
-                       e1000_phy_reset(&adapter->hw);
+                       e1000_write_phy_reg(hw, PHY_CTRL, phy_reg);
+                       e1000_phy_reset(hw);
                }
+               break;
        }
 }
 
@@ -1440,9 +1489,11 @@ static int
 e1000_loopback_test(struct e1000_adapter *adapter, uint64_t *data)
 {
        if((*data = e1000_setup_desc_rings(adapter))) goto err_loopback;
-       if((*data = e1000_setup_loopback_test(adapter))) goto err_loopback;
+       if((*data = e1000_setup_loopback_test(adapter)))
+               goto err_loopback_setup;
        *data = e1000_run_loopback_test(adapter);
        e1000_loopback_cleanup(adapter);
+err_loopback_setup:
        e1000_free_desc_rings(adapter);
 err_loopback:
        return *data;
@@ -1671,6 +1722,14 @@ e1000_phys_id(struct net_device *netdev, uint32_t data)
                msleep_interruptible(data * 1000);
                del_timer_sync(&adapter->blink_timer);
        }
+       else if(adapter->hw.mac_type < e1000_82573) {
+               E1000_WRITE_REG(&adapter->hw, LEDCTL, (E1000_LEDCTL_LED2_BLINK_RATE |
+                       E1000_LEDCTL_LED0_BLINK | E1000_LEDCTL_LED2_BLINK |
+                       (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) |
+                       (E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED0_MODE_SHIFT) |
+                       (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED1_MODE_SHIFT)));
+               msleep_interruptible(data * 1000);
+       }
        else {
                E1000_WRITE_REG(&adapter->hw, LEDCTL, (E1000_LEDCTL_LED2_BLINK_RATE |
                        E1000_LEDCTL_LED1_BLINK | E1000_LEDCTL_LED2_BLINK | 
index a267c5235fc0d153b08c07a7b4fe3fc41a1df666..136fc031e4ad555d168a8b0ac002b460ebea8ebb 100644 (file)
@@ -563,11 +563,13 @@ e1000_reset_hw(struct e1000_hw *hw)
             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);
+            if (e1000_is_onboard_nvm_eeprom(hw) == FALSE) {
+                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 */
         case e1000_82571:
         case e1000_82572:
@@ -844,19 +846,27 @@ 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)) {
-        DEBUGOUT("EEPROM Read Error\n");
-        return -E1000_ERR_EEPROM;
-    }
-
-    if(hw->fc == e1000_fc_default) {
-        if((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 0)
-            hw->fc = e1000_fc_none;
-        else if((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) ==
-                EEPROM_WORD0F_ASM_DIR)
-            hw->fc = e1000_fc_tx_pause;
-        else
+    if (hw->fc == e1000_fc_default) {
+        switch (hw->mac_type) {
+        case e1000_82573:
             hw->fc = e1000_fc_full;
+            break;
+        default:
+            ret_val = e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG,
+                                        1, &eeprom_data);
+            if (ret_val) {
+                DEBUGOUT("EEPROM Read Error\n");
+                return -E1000_ERR_EEPROM;
+            }
+            if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 0)
+                hw->fc = e1000_fc_none;
+            else if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) ==
+                    EEPROM_WORD0F_ASM_DIR)
+                hw->fc = e1000_fc_tx_pause;
+            else
+                hw->fc = e1000_fc_full;
+            break;
+        }
     }
 
     /* We want to save off the original Flow Control configuration just
@@ -2962,13 +2972,22 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
     if(hw->mac_type > e1000_82543) {
         /* Read the device control register and assert the E1000_CTRL_PHY_RST
          * bit. Then, take it out of reset.
+         * For pre-e1000_82571 hardware, we delay for 10ms between the assert 
+         * and deassert.  For e1000_82571 hardware and later, we instead delay
+         * for 10ms after the deassertion.
          */
         ctrl = E1000_READ_REG(hw, CTRL);
         E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST);
         E1000_WRITE_FLUSH(hw);
-        msec_delay(10);
+        
+        if (hw->mac_type < e1000_82571) 
+            msec_delay(10);
+        
         E1000_WRITE_REG(hw, CTRL, ctrl);
         E1000_WRITE_FLUSH(hw);
+        
+        if (hw->mac_type >= e1000_82571)
+            msec_delay(10);
     } else {
         /* Read the Extended Device Control Register, assert the PHY_RESET_DIR
          * bit to put the PHY into reset. Then, take it out of reset.
@@ -5278,9 +5297,13 @@ 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_82571:
     case e1000_82572:
     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_1;
+        break;
+    case e1000_82571:
         hw->bus_type = e1000_bus_type_pci_express;
         hw->bus_speed = e1000_bus_speed_2500;
         hw->bus_width = e1000_bus_width_pciex_4;
@@ -6650,6 +6673,12 @@ e1000_get_auto_rd_done(struct e1000_hw *hw)
         break;
     }
 
+    /* PHY configuration from NVM just starts after EECD_AUTO_RD sets to high.
+     * Need to wait for PHY configuration completion before accessing NVM
+     * and PHY. */
+    if (hw->mac_type == e1000_82573)
+        msec_delay(25);
+
     return E1000_SUCCESS;
 }
 
index 76ce12809a11641cc6788fcc75a99cdca1d5dd70..7caa35748ceac9c8236d1510f9335b2e57f9073b 100644 (file)
@@ -123,6 +123,7 @@ typedef enum {
     e1000_bus_width_32,
     e1000_bus_width_64,
     e1000_bus_width_pciex_1,
+    e1000_bus_width_pciex_2,
     e1000_bus_width_pciex_4,
     e1000_bus_width_reserved
 } e1000_bus_width;
@@ -149,6 +150,7 @@ typedef enum {
     e1000_igp_cable_length_90  = 90,
     e1000_igp_cable_length_100 = 100,
     e1000_igp_cable_length_110 = 110,
+    e1000_igp_cable_length_115 = 115,
     e1000_igp_cable_length_120 = 120,
     e1000_igp_cable_length_130 = 130,
     e1000_igp_cable_length_140 = 140,
@@ -1457,6 +1459,7 @@ struct e1000_hw {
 #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_EECD_SECVAL_SHIFT      22
 #define E1000_STM_OPCODE     0xDB00
 #define E1000_HICR_FW_RESET  0xC0
 
@@ -1951,7 +1954,6 @@ struct e1000_host_command_info {
 
 #define E1000_MDALIGN          4096
 
-#define E1000_GCR_BEM32                 0x00400000
 #define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000
 /* Function Active and Power State to MNG */
 #define E1000_FACTPS_FUNC0_POWER_STATE_MASK         0x00000003
index 8b207f0e139e04fb9894ec771195f0866ea8210b..438a931fd55df4c6dd57e00d9480f35c4e9fb461 100644 (file)
@@ -711,6 +711,7 @@ e1000_probe(struct pci_dev *pdev,
                break;
        case e1000_82546:
        case e1000_82546_rev_3:
+       case e1000_82571:
                if((E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1)
                   && (adapter->hw.media_type == e1000_media_type_copper)) {
                        e1000_read_eeprom(&adapter->hw,
@@ -1158,7 +1159,6 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter,
                return -ENOMEM;
        }
        memset(txdr->buffer_info, 0, size);
-       memset(&txdr->previous_buffer_info, 0, sizeof(struct e1000_buffer));
 
        /* round up to nearest 4K */
 
@@ -1813,11 +1813,6 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter,
 
        /* Free all the Tx ring sk_buffs */
 
-       if (likely(tx_ring->previous_buffer_info.skb != NULL)) {
-               e1000_unmap_and_free_tx_resource(adapter,
-                               &tx_ring->previous_buffer_info);
-       }
-
        for(i = 0; i < tx_ring->count; i++) {
                buffer_info = &tx_ring->buffer_info[i];
                e1000_unmap_and_free_tx_resource(adapter, buffer_info);
@@ -1832,6 +1827,7 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter,
 
        tx_ring->next_to_use = 0;
        tx_ring->next_to_clean = 0;
+       tx_ring->last_tx_tso = 0;
 
        writel(0, adapter->hw.hw_addr + tx_ring->tdh);
        writel(0, adapter->hw.hw_addr + tx_ring->tdt);
@@ -2437,6 +2433,16 @@ e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
                buffer_info = &tx_ring->buffer_info[i];
                size = min(len, max_per_txd);
 #ifdef NETIF_F_TSO
+               /* Workaround for Controller erratum --
+                * descriptor for non-tso packet in a linear SKB that follows a
+                * tso gets written back prematurely before the data is fully
+                * DMAd to the controller */
+               if (!skb->data_len && tx_ring->last_tx_tso &&
+                               !skb_shinfo(skb)->tso_size) {
+                       tx_ring->last_tx_tso = 0;
+                       size -= 4;
+               }
+
                /* Workaround for premature desc write-backs
                 * in TSO mode.  Append 4-byte sentinel desc */
                if(unlikely(mss && !nr_frags && size == len && size > 8))
@@ -2621,19 +2627,7 @@ e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb)
                          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)) {
+       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 = 
@@ -2705,6 +2699,14 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        if(skb->ip_summed == CHECKSUM_HW)
                count++;
 #endif
+
+#ifdef NETIF_F_TSO
+       /* Controller Erratum workaround */
+       if (!skb->data_len && tx_ring->last_tx_tso &&
+               !skb_shinfo(skb)->tso_size)
+               count++;
+#endif
+
        count += TXD_USE_COUNT(len, max_txd_pwr);
 
        if(adapter->pcix_82544)
@@ -2786,9 +2788,10 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
                return NETDEV_TX_OK;
        }
 
-       if (likely(tso))
+       if (likely(tso)) {
+               tx_ring->last_tx_tso = 1;
                tx_flags |= E1000_TX_FLAGS_TSO;
-       else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
+       else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
                tx_flags |= E1000_TX_FLAGS_CSUM;
 
        /* Old method was to assume IPv4 packet by default if TSO was enabled.
@@ -3239,37 +3242,12 @@ 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)) {
-               /* Premature writeback of Tx descriptors clear (free buffers
-                * and unmap pci_mapping) previous_buffer_info */
-               if (likely(tx_ring->previous_buffer_info.skb != NULL)) {
-                       e1000_unmap_and_free_tx_resource(adapter,
-                                       &tx_ring->previous_buffer_info);
-               }
-
                for(cleaned = FALSE; !cleaned; ) {
                        tx_desc = E1000_TX_DESC(*tx_ring, i);
                        buffer_info = &tx_ring->buffer_info[i];
                        cleaned = (i == eop);
 
-#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 {
-                               if (cleaned) {
-                                       memcpy(&tx_ring->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
+                       e1000_unmap_and_free_tx_resource(adapter, buffer_info);
 
                        tx_desc->buffer_addr = 0;
                        tx_desc->lower.data = 0;
@@ -3330,12 +3308,6 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
                        netif_stop_queue(netdev);
                }
        }
-#ifdef NETIF_F_TSO
-       if (unlikely(!(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
-           time_after(jiffies, tx_ring->previous_buffer_info.time_stamp + HZ)))
-               e1000_unmap_and_free_tx_resource(
-                   adapter, &tx_ring->previous_buffer_info);
-#endif
        return cleaned;
 }
 
index 525624fc03b47016c2d1f1586d49d92e83c4dbba..c39344adecce590376c848311856122c63c77c2c 100644 (file)
@@ -10,7 +10,7 @@
  * trademarks of NVIDIA Corporation in the United States and other
  * countries.
  *
- * Copyright (C) 2003,4 Manfred Spraul
+ * Copyright (C) 2003,4,5 Manfred Spraul
  * Copyright (C) 2004 Andrew de Quincey (wol support)
  * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane
  *             IRQ rate fixes, bigendian fixes, cleanups, verification)
  *     0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check
  *     0.46: 20 Oct 2005: Add irq optimization modes.
  *     0.47: 26 Oct 2005: Add phyaddr 0 in phy scan.
+ *     0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single
  *
  * Known bugs:
  * We suspect that on some hardware no TX done interrupts are generated.
  * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
  * superfluous timer interrupts from the nic.
  */
-#define FORCEDETH_VERSION              "0.47"
+#define FORCEDETH_VERSION              "0.48"
 #define DRV_NAME                       "forcedeth"
 
 #include <linux/module.h>
@@ -871,8 +872,8 @@ static int nv_alloc_rx(struct net_device *dev)
                } else {
                        skb = np->rx_skbuff[nr];
                }
-               np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data, skb->len,
-                                               PCI_DMA_FROMDEVICE);
+               np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data,
+                                       skb->end-skb->data, PCI_DMA_FROMDEVICE);
                if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
                        np->rx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->rx_dma[nr]);
                        wmb();
@@ -999,7 +1000,7 @@ static void nv_drain_rx(struct net_device *dev)
                wmb();
                if (np->rx_skbuff[i]) {
                        pci_unmap_single(np->pci_dev, np->rx_dma[i],
-                                               np->rx_skbuff[i]->len,
+                                               np->rx_skbuff[i]->end-np->rx_skbuff[i]->data,
                                                PCI_DMA_FROMDEVICE);
                        dev_kfree_skb(np->rx_skbuff[i]);
                        np->rx_skbuff[i] = NULL;
@@ -1334,7 +1335,7 @@ static void nv_rx_process(struct net_device *dev)
                 * the performance.
                 */
                pci_unmap_single(np->pci_dev, np->rx_dma[i],
-                               np->rx_skbuff[i]->len,
+                               np->rx_skbuff[i]->end-np->rx_skbuff[i]->data,
                                PCI_DMA_FROMDEVICE);
 
                {
@@ -2455,7 +2456,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK;
                dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG;
 #ifdef NETIF_F_TSO
-               dev->features |= NETIF_F_TSO;
+               /* disabled dev->features |= NETIF_F_TSO; */
 #endif
        }
 
index 0f030b73cbb328b246e170d85e9401182659d860..146f9513aea57f89e04cea2b5f201730590dfc1d 100644 (file)
@@ -2,7 +2,8 @@
  * drivers/net/gianfar.c
  *
  * Gianfar Ethernet Driver
- * Driver for FEC on MPC8540 and TSEC on MPC8540/MPC8560
+ * This driver is designed for the non-CPM ethernet controllers
+ * on the 85xx and 83xx family of integrated processors
  * Based on 8260_io/fcc_enet.c
  *
  * Author: Andy Fleming
@@ -22,8 +23,6 @@
  *  B-V +1.62
  *
  *  Theory of operation
- *  This driver is designed for the non-CPM ethernet controllers
- *  on the 85xx and 83xx family of integrated processors
  *
  *  The driver is initialized through platform_device.  Structures which
  *  define the configuration needed by the board are defined in a
 #endif
 
 const char gfar_driver_name[] = "Gianfar Ethernet";
-const char gfar_driver_version[] = "1.2";
+const char gfar_driver_version[] = "1.3";
 
 static int gfar_enet_open(struct net_device *dev);
 static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev);
@@ -139,6 +138,10 @@ static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int l
 static void gfar_vlan_rx_register(struct net_device *netdev,
                                struct vlan_group *grp);
 static void gfar_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
+void gfar_halt(struct net_device *dev);
+void gfar_start(struct net_device *dev);
+static void gfar_clear_exact_match(struct net_device *dev);
+static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr);
 
 extern struct ethtool_ops gfar_ethtool_ops;
 
@@ -146,12 +149,10 @@ MODULE_AUTHOR("Freescale Semiconductor, Inc");
 MODULE_DESCRIPTION("Gianfar Ethernet Driver");
 MODULE_LICENSE("GPL");
 
-int gfar_uses_fcb(struct gfar_private *priv)
+/* Returns 1 if incoming frames use an FCB */
+static inline int gfar_uses_fcb(struct gfar_private *priv)
 {
-       if (priv->vlan_enable || priv->rx_csum_enable)
-               return 1;
-       else
-               return 0;
+       return (priv->vlan_enable || priv->rx_csum_enable);
 }
 
 /* Set up the ethernet device structure, private data,
@@ -320,15 +321,10 @@ static int gfar_probe(struct platform_device *pdev)
        else
                priv->padding = 0;
 
-       dev->hard_header_len += priv->padding;
-
        if (dev->features & NETIF_F_IP_CSUM)
                dev->hard_header_len += GMAC_FCB_LEN;
 
        priv->rx_buffer_size = DEFAULT_RX_BUFFER_SIZE;
-#ifdef CONFIG_GFAR_BUFSTASH
-       priv->rx_stash_size = STASH_LENGTH;
-#endif
        priv->tx_ring_size = DEFAULT_TX_RING_SIZE;
        priv->rx_ring_size = DEFAULT_RX_RING_SIZE;
 
@@ -350,6 +346,9 @@ static int gfar_probe(struct platform_device *pdev)
                goto register_fail;
        }
 
+       /* Create all the sysfs files */
+       gfar_init_sysfs(dev);
+
        /* Print out the device info */
        printk(KERN_INFO DEVICE_NAME, dev->name);
        for (idx = 0; idx < 6; idx++)
@@ -357,8 +356,7 @@ static int gfar_probe(struct platform_device *pdev)
        printk("\n");
 
        /* Even more device info helps when determining which kernel */
-       /* provided which set of benchmarks.  Since this is global for all */
-       /* devices, we only print it once */
+       /* provided which set of benchmarks. */
 #ifdef CONFIG_GFAR_NAPI
        printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name);
 #else
@@ -463,19 +461,9 @@ static void init_registers(struct net_device *dev)
        /* Initialize the max receive buffer length */
        gfar_write(&priv->regs->mrblr, priv->rx_buffer_size);
 
-#ifdef CONFIG_GFAR_BUFSTASH
-       /* If we are stashing buffers, we need to set the
-        * extraction length to the size of the buffer */
-       gfar_write(&priv->regs->attreli, priv->rx_stash_size << 16);
-#endif
-
        /* Initialize the Minimum Frame Length Register */
        gfar_write(&priv->regs->minflr, MINFLR_INIT_SETTINGS);
 
-       /* Setup Attributes so that snooping is on for rx */
-       gfar_write(&priv->regs->attr, ATTR_INIT_SETTINGS);
-       gfar_write(&priv->regs->attreli, ATTRELI_INIT_SETTINGS);
-
        /* Assign the TBI an address which won't conflict with the PHYs */
        gfar_write(&priv->regs->tbipa, TBIPA_VALUE);
 }
@@ -577,8 +565,7 @@ static void free_skb_resources(struct gfar_private *priv)
                for (i = 0; i < priv->rx_ring_size; i++) {
                        if (priv->rx_skbuff[i]) {
                                dma_unmap_single(NULL, rxbdp->bufPtr,
-                                               priv->rx_buffer_size
-                                               + RXBUF_ALIGNMENT,
+                                               priv->rx_buffer_size,
                                                DMA_FROM_DEVICE);
 
                                dev_kfree_skb_any(priv->rx_skbuff[i]);
@@ -636,6 +623,7 @@ int startup_gfar(struct net_device *dev)
        struct gfar *regs = priv->regs;
        int err = 0;
        u32 rctrl = 0;
+       u32 attrs = 0;
 
        gfar_write(&regs->imask, IMASK_INIT_CLEAR);
 
@@ -795,18 +783,50 @@ int startup_gfar(struct net_device *dev)
        if (priv->rx_csum_enable)
                rctrl |= RCTRL_CHECKSUMMING;
 
-       if (priv->extended_hash)
+       if (priv->extended_hash) {
                rctrl |= RCTRL_EXTHASH;
 
+               gfar_clear_exact_match(dev);
+               rctrl |= RCTRL_EMEN;
+       }
+
        if (priv->vlan_enable)
                rctrl |= RCTRL_VLAN;
 
+       if (priv->padding) {
+               rctrl &= ~RCTRL_PAL_MASK;
+               rctrl |= RCTRL_PADDING(priv->padding);
+       }
+
        /* Init rctrl based on our settings */
        gfar_write(&priv->regs->rctrl, rctrl);
 
        if (dev->features & NETIF_F_IP_CSUM)
                gfar_write(&priv->regs->tctrl, TCTRL_INIT_CSUM);
 
+       /* Set the extraction length and index */
+       attrs = ATTRELI_EL(priv->rx_stash_size) |
+               ATTRELI_EI(priv->rx_stash_index);
+
+       gfar_write(&priv->regs->attreli, attrs);
+
+       /* Start with defaults, and add stashing or locking
+        * depending on the approprate variables */
+       attrs = ATTR_INIT_SETTINGS;
+
+       if (priv->bd_stash_en)
+               attrs |= ATTR_BDSTASH;
+
+       if (priv->rx_stash_size != 0)
+               attrs |= ATTR_BUFSTASH;
+
+       gfar_write(&priv->regs->attr, attrs);
+
+       gfar_write(&priv->regs->fifo_tx_thr, priv->fifo_threshold);
+       gfar_write(&priv->regs->fifo_tx_starve, priv->fifo_starve);
+       gfar_write(&priv->regs->fifo_tx_starve_shutoff, priv->fifo_starve_off);
+
+       /* Start the controller */
        gfar_start(dev);
 
        return 0;
@@ -851,34 +871,32 @@ static int gfar_enet_open(struct net_device *dev)
        return err;
 }
 
-static struct txfcb *gfar_add_fcb(struct sk_buff *skb, struct txbd8 *bdp)
+static inline struct txfcb *gfar_add_fcb(struct sk_buff *skb, struct txbd8 *bdp)
 {
        struct txfcb *fcb = (struct txfcb *)skb_push (skb, GMAC_FCB_LEN);
 
        memset(fcb, 0, GMAC_FCB_LEN);
 
-       /* Flag the bd so the controller looks for the FCB */
-       bdp->status |= TXBD_TOE;
-
        return fcb;
 }
 
 static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb)
 {
-       int len;
+       u8 flags = 0;
 
        /* If we're here, it's a IP packet with a TCP or UDP
         * payload.  We set it to checksum, using a pseudo-header
         * we provide
         */
-       fcb->ip = 1;
-       fcb->tup = 1;
-       fcb->ctu = 1;
-       fcb->nph = 1;
+       flags = TXFCB_DEFAULT;
 
-       /* Notify the controller what the protocol is */
-       if (skb->nh.iph->protocol == IPPROTO_UDP)
-               fcb->udp = 1;
+       /* Tell the controller what the protocol is */
+       /* And provide the already calculated phcs */
+       if (skb->nh.iph->protocol == IPPROTO_UDP) {
+               flags |= TXFCB_UDP;
+               fcb->phcs = skb->h.uh->check;
+       } else
+               fcb->phcs = skb->h.th->check;
 
        /* l3os is the distance between the start of the
         * frame (skb->data) and the start of the IP hdr.
@@ -887,17 +905,12 @@ static inline void gfar_tx_checksum(struct sk_buff *skb, struct txfcb *fcb)
        fcb->l3os = (u16)(skb->nh.raw - skb->data - GMAC_FCB_LEN);
        fcb->l4os = (u16)(skb->h.raw - skb->nh.raw);
 
-       len = skb->nh.iph->tot_len - fcb->l4os;
-
-       /* Provide the pseudoheader csum */
-       fcb->phcs = ~csum_tcpudp_magic(skb->nh.iph->saddr,
-                       skb->nh.iph->daddr, len,
-                       skb->nh.iph->protocol, 0);
+       fcb->flags = flags;
 }
 
-void gfar_tx_vlan(struct sk_buff *skb, struct txfcb *fcb)
+void inline gfar_tx_vlan(struct sk_buff *skb, struct txfcb *fcb)
 {
-       fcb->vln = 1;
+       fcb->flags |= TXFCB_VLN;
        fcb->vlctl = vlan_tx_tag_get(skb);
 }
 
@@ -908,6 +921,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct gfar_private *priv = netdev_priv(dev);
        struct txfcb *fcb = NULL;
        struct txbd8 *txbdp;
+       u16 status;
 
        /* Update transmit stats */
        priv->stats.tx_bytes += skb->len;
@@ -919,19 +933,22 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
        txbdp = priv->cur_tx;
 
        /* Clear all but the WRAP status flags */
-       txbdp->status &= TXBD_WRAP;
+       status = txbdp->status & TXBD_WRAP;
 
        /* Set up checksumming */
-       if ((dev->features & NETIF_F_IP_CSUM)
-                       && (CHECKSUM_HW == skb->ip_summed)) {
+       if (likely((dev->features & NETIF_F_IP_CSUM)
+                       && (CHECKSUM_HW == skb->ip_summed))) {
                fcb = gfar_add_fcb(skb, txbdp);
+               status |= TXBD_TOE;
                gfar_tx_checksum(skb, fcb);
        }
 
        if (priv->vlan_enable &&
                        unlikely(priv->vlgrp && vlan_tx_tag_present(skb))) {
-               if (NULL == fcb)
+               if (unlikely(NULL == fcb)) {
                        fcb = gfar_add_fcb(skb, txbdp);
+                       status |= TXBD_TOE;
+               }
 
                gfar_tx_vlan(skb, fcb);
        }
@@ -949,14 +966,16 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
            (priv->skb_curtx + 1) & TX_RING_MOD_MASK(priv->tx_ring_size);
 
        /* Flag the BD as interrupt-causing */
-       txbdp->status |= TXBD_INTERRUPT;
+       status |= TXBD_INTERRUPT;
 
        /* Flag the BD as ready to go, last in frame, and  */
        /* in need of CRC */
-       txbdp->status |= (TXBD_READY | TXBD_LAST | TXBD_CRC);
+       status |= (TXBD_READY | TXBD_LAST | TXBD_CRC);
 
        dev->trans_start = jiffies;
 
+       txbdp->status = status;
+
        /* If this was the last BD in the ring, the next one */
        /* is at the beginning of the ring */
        if (txbdp->status & TXBD_WRAP)
@@ -1010,21 +1029,7 @@ static struct net_device_stats * gfar_get_stats(struct net_device *dev)
 /* Changes the mac address if the controller is not running. */
 int gfar_set_mac_address(struct net_device *dev)
 {
-       struct gfar_private *priv = netdev_priv(dev);
-       int i;
-       char tmpbuf[MAC_ADDR_LEN];
-       u32 tempval;
-
-       /* Now copy it into the mac registers backwards, cuz */
-       /* little endian is silly */
-       for (i = 0; i < MAC_ADDR_LEN; i++)
-               tmpbuf[MAC_ADDR_LEN - 1 - i] = dev->dev_addr[i];
-
-       gfar_write(&priv->regs->macstnaddr1, *((u32 *) (tmpbuf)));
-
-       tempval = *((u32 *) (tmpbuf + 4));
-
-       gfar_write(&priv->regs->macstnaddr2, tempval);
+       gfar_set_mac_for_addr(dev, 0, dev->dev_addr);
 
        return 0;
 }
@@ -1110,7 +1115,7 @@ static int gfar_change_mtu(struct net_device *dev, int new_mtu)
            INCREMENTAL_BUFFER_SIZE;
 
        /* Only stop and start the controller if it isn't already
-        * stopped */
+        * stopped, and we changed something */
        if ((oldsize != tempsize) && (dev->flags & IFF_UP))
                stop_gfar(dev);
 
@@ -1220,6 +1225,7 @@ static irqreturn_t gfar_transmit(int irq, void *dev_id, struct pt_regs *regs)
 
 struct sk_buff * gfar_new_skb(struct net_device *dev, struct rxbd8 *bdp)
 {
+       unsigned int alignamount;
        struct gfar_private *priv = netdev_priv(dev);
        struct sk_buff *skb = NULL;
        unsigned int timeout = SKB_ALLOC_TIMEOUT;
@@ -1231,18 +1237,18 @@ struct sk_buff * gfar_new_skb(struct net_device *dev, struct rxbd8 *bdp)
        if (NULL == skb)
                return NULL;
 
+       alignamount = RXBUF_ALIGNMENT -
+               (((unsigned) skb->data) & (RXBUF_ALIGNMENT - 1));
+
        /* We need the data buffer to be aligned properly.  We will reserve
         * as many bytes as needed to align the data properly
         */
-       skb_reserve(skb,
-                   RXBUF_ALIGNMENT -
-                   (((unsigned) skb->data) & (RXBUF_ALIGNMENT - 1)));
+       skb_reserve(skb, alignamount);
 
        skb->dev = dev;
 
        bdp->bufPtr = dma_map_single(NULL, skb->data,
-                       priv->rx_buffer_size + RXBUF_ALIGNMENT,
-                       DMA_FROM_DEVICE);
+                       priv->rx_buffer_size, DMA_FROM_DEVICE);
 
        bdp->length = 0;
 
@@ -1350,7 +1356,7 @@ static inline void gfar_rx_checksum(struct sk_buff *skb, struct rxfcb *fcb)
        /* If valid headers were found, and valid sums
         * were verified, then we tell the kernel that no
         * checksumming is necessary.  Otherwise, it is */
-       if (fcb->cip && !fcb->eip && fcb->ctu && !fcb->etu)
+       if ((fcb->flags & RXFCB_CSUM_MASK) == (RXFCB_CIP | RXFCB_CTU))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        else
                skb->ip_summed = CHECKSUM_NONE;
@@ -1401,7 +1407,7 @@ static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb,
                skb->protocol = eth_type_trans(skb, dev);
 
                /* Send the packet up the stack */
-               if (unlikely(priv->vlgrp && fcb->vln))
+               if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN)))
                        ret = gfar_rx_vlan(skb, priv->vlgrp, fcb->vlctl);
                else
                        ret = RECEIVE(skb);
@@ -1620,6 +1626,7 @@ static void adjust_link(struct net_device *dev)
        spin_lock_irqsave(&priv->lock, flags);
        if (phydev->link) {
                u32 tempval = gfar_read(&regs->maccfg2);
+               u32 ecntrl = gfar_read(&regs->ecntrl);
 
                /* Now we make sure that we can be in full duplex mode.
                 * If not, we operate in half-duplex mode. */
@@ -1644,6 +1651,13 @@ static void adjust_link(struct net_device *dev)
                        case 10:
                                tempval =
                                    ((tempval & ~(MACCFG2_IF)) | MACCFG2_MII);
+
+                               /* Reduced mode distinguishes
+                                * between 10 and 100 */
+                               if (phydev->speed == SPEED_100)
+                                       ecntrl |= ECNTRL_R100;
+                               else
+                                       ecntrl &= ~(ECNTRL_R100);
                                break;
                        default:
                                if (netif_msg_link(priv))
@@ -1657,6 +1671,7 @@ static void adjust_link(struct net_device *dev)
                }
 
                gfar_write(&regs->maccfg2, tempval);
+               gfar_write(&regs->ecntrl, ecntrl);
 
                if (!priv->oldlink) {
                        new_state = 1;
@@ -1721,6 +1736,9 @@ static void gfar_set_multi(struct net_device *dev)
                gfar_write(&regs->gaddr6, 0xffffffff);
                gfar_write(&regs->gaddr7, 0xffffffff);
        } else {
+               int em_num;
+               int idx;
+
                /* zero out the hash */
                gfar_write(&regs->igaddr0, 0x0);
                gfar_write(&regs->igaddr1, 0x0);
@@ -1739,18 +1757,47 @@ static void gfar_set_multi(struct net_device *dev)
                gfar_write(&regs->gaddr6, 0x0);
                gfar_write(&regs->gaddr7, 0x0);
 
+               /* If we have extended hash tables, we need to
+                * clear the exact match registers to prepare for
+                * setting them */
+               if (priv->extended_hash) {
+                       em_num = GFAR_EM_NUM + 1;
+                       gfar_clear_exact_match(dev);
+                       idx = 1;
+               } else {
+                       idx = 0;
+                       em_num = 0;
+               }
+
                if(dev->mc_count == 0)
                        return;
 
                /* Parse the list, and set the appropriate bits */
                for(mc_ptr = dev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) {
-                       gfar_set_hash_for_addr(dev, mc_ptr->dmi_addr);
+                       if (idx < em_num) {
+                               gfar_set_mac_for_addr(dev, idx,
+                                               mc_ptr->dmi_addr);
+                               idx++;
+                       } else
+                               gfar_set_hash_for_addr(dev, mc_ptr->dmi_addr);
                }
        }
 
        return;
 }
 
+
+/* Clears each of the exact match registers to zero, so they
+ * don't interfere with normal reception */
+static void gfar_clear_exact_match(struct net_device *dev)
+{
+       int idx;
+       u8 zero_arr[MAC_ADDR_LEN] = {0,0,0,0,0,0};
+
+       for(idx = 1;idx < GFAR_EM_NUM + 1;idx++)
+               gfar_set_mac_for_addr(dev, idx, (u8 *)zero_arr);
+}
+
 /* Set the appropriate hash bit for the given addr */
 /* The algorithm works like so:
  * 1) Take the Destination Address (ie the multicast address), and
@@ -1781,6 +1828,32 @@ static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr)
        return;
 }
 
+
+/* There are multiple MAC Address register pairs on some controllers
+ * This function sets the numth pair to a given address
+ */
+static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr)
+{
+       struct gfar_private *priv = netdev_priv(dev);
+       int idx;
+       char tmpbuf[MAC_ADDR_LEN];
+       u32 tempval;
+       u32 *macptr = &priv->regs->macstnaddr1;
+
+       macptr += num*2;
+
+       /* Now copy it into the mac registers backwards, cuz */
+       /* little endian is silly */
+       for (idx = 0; idx < MAC_ADDR_LEN; idx++)
+               tmpbuf[MAC_ADDR_LEN - 1 - idx] = addr[idx];
+
+       gfar_write(macptr, *((u32 *) (tmpbuf)));
+
+       tempval = *((u32 *) (tmpbuf + 4));
+
+       gfar_write(macptr+1, tempval);
+}
+
 /* GFAR error interrupt handler */
 static irqreturn_t gfar_error(int irq, void *dev_id, struct pt_regs *regs)
 {
index 5065ba82cb7608324d7b8d6f1a2a37a2b5b3fff2..94a91da84fbb7ac5abe74cd6e63332c48ca9afa5 100644 (file)
@@ -90,12 +90,26 @@ extern const char gfar_driver_version[];
 #define GFAR_RX_MAX_RING_SIZE   256
 #define GFAR_TX_MAX_RING_SIZE   256
 
+#define GFAR_MAX_FIFO_THRESHOLD 511
+#define GFAR_MAX_FIFO_STARVE   511
+#define GFAR_MAX_FIFO_STARVE_OFF 511
+
 #define DEFAULT_RX_BUFFER_SIZE  1536
 #define TX_RING_MOD_MASK(size) (size-1)
 #define RX_RING_MOD_MASK(size) (size-1)
 #define JUMBO_BUFFER_SIZE 9728
 #define JUMBO_FRAME_SIZE 9600
 
+#define DEFAULT_FIFO_TX_THR 0x100
+#define DEFAULT_FIFO_TX_STARVE 0x40
+#define DEFAULT_FIFO_TX_STARVE_OFF 0x80
+#define DEFAULT_BD_STASH 1
+#define DEFAULT_STASH_LENGTH   64
+#define DEFAULT_STASH_INDEX    0
+
+/* The number of Exact Match registers */
+#define GFAR_EM_NUM    15
+
 /* Latency of interface clock in nanoseconds */
 /* Interface clock latency , in this case, means the
  * time described by a value of 1 in the interrupt
@@ -112,11 +126,11 @@ extern const char gfar_driver_version[];
 
 #define DEFAULT_TX_COALESCE 1
 #define DEFAULT_TXCOUNT        16
-#define DEFAULT_TXTIME 400
+#define DEFAULT_TXTIME 4
 
 #define DEFAULT_RX_COALESCE 1
 #define DEFAULT_RXCOUNT        16
-#define DEFAULT_RXTIME 400
+#define DEFAULT_RXTIME 4
 
 #define TBIPA_VALUE            0x1f
 #define MIIMCFG_INIT_VALUE     0x00000007
@@ -147,6 +161,7 @@ extern const char gfar_driver_version[];
 
 #define ECNTRL_INIT_SETTINGS   0x00001000
 #define ECNTRL_TBI_MODE         0x00000020
+#define ECNTRL_R100            0x00000008
 
 #define MRBLR_INIT_SETTINGS    DEFAULT_RX_BUFFER_SIZE
 
@@ -181,10 +196,12 @@ extern const char gfar_driver_version[];
 #define RCTRL_PRSDEP_MASK      0x000000c0
 #define RCTRL_PRSDEP_INIT      0x000000c0
 #define RCTRL_PROM             0x00000008
+#define RCTRL_EMEN             0x00000002
 #define RCTRL_CHECKSUMMING     (RCTRL_IPCSEN \
                | RCTRL_TUCSEN | RCTRL_PRSDEP_INIT)
 #define RCTRL_EXTHASH          (RCTRL_GHTX)
 #define RCTRL_VLAN             (RCTRL_PRSDEP_INIT)
+#define RCTRL_PADDING(x)       ((x << 16) & RCTRL_PAL_MASK)
 
 
 #define RSTAT_CLEAR_RHALT       0x00800000
@@ -251,28 +268,26 @@ extern const char gfar_driver_version[];
                IMASK_XFUN | IMASK_RXC | IMASK_BABT | IMASK_DPE \
                | IMASK_PERR)
 
+/* Fifo management */
+#define FIFO_TX_THR_MASK       0x01ff
+#define FIFO_TX_STARVE_MASK    0x01ff
+#define FIFO_TX_STARVE_OFF_MASK        0x01ff
 
 /* Attribute fields */
 
 /* This enables rx snooping for buffers and descriptors */
-#ifdef CONFIG_GFAR_BDSTASH
 #define ATTR_BDSTASH           0x00000800
-#else
-#define ATTR_BDSTASH           0x00000000
-#endif
 
-#ifdef CONFIG_GFAR_BUFSTASH
 #define ATTR_BUFSTASH          0x00004000
-#define STASH_LENGTH           64
-#else
-#define ATTR_BUFSTASH          0x00000000
-#endif
 
 #define ATTR_SNOOPING          0x000000c0
-#define ATTR_INIT_SETTINGS      (ATTR_SNOOPING \
-               | ATTR_BDSTASH | ATTR_BUFSTASH)
+#define ATTR_INIT_SETTINGS      ATTR_SNOOPING
 
 #define ATTRELI_INIT_SETTINGS   0x0
+#define ATTRELI_EL_MASK                0x3fff0000
+#define ATTRELI_EL(x) (x << 16)
+#define ATTRELI_EI_MASK                0x00003fff
+#define ATTRELI_EI(x) (x)
 
 
 /* TxBD status field bits */
@@ -328,6 +343,7 @@ extern const char gfar_driver_version[];
 #define RXFCB_CTU              0x0400
 #define RXFCB_EIP              0x0200
 #define RXFCB_ETU              0x0100
+#define RXFCB_CSUM_MASK                0x0f00
 #define RXFCB_PERR_MASK                0x000c
 #define RXFCB_PERR_BADL3       0x0008
 
@@ -339,14 +355,7 @@ struct txbd8
 };
 
 struct txfcb {
-       u8      vln:1,
-               ip:1,
-               ip6:1,
-               tup:1,
-               udp:1,
-               cip:1,
-               ctu:1,
-               nph:1;
+       u8      flags;
        u8      reserved;
        u8      l4os;   /* Level 4 Header Offset */
        u8      l3os;   /* Level 3 Header Offset */
@@ -362,14 +371,7 @@ struct rxbd8
 };
 
 struct rxfcb {
-       u16     vln:1,
-               ip:1,
-               ip6:1,
-               tup:1,
-               cip:1,
-               ctu:1,
-               eip:1,
-               etu:1;
+       u16     flags;
        u8      rq;     /* Receive Queue index */
        u8      pro;    /* Layer 4 Protocol */
        u16     reserved;
@@ -688,12 +690,17 @@ struct gfar_private {
        spinlock_t lock;
        unsigned int rx_buffer_size;
        unsigned int rx_stash_size;
+       unsigned int rx_stash_index;
        unsigned int tx_ring_size;
        unsigned int rx_ring_size;
+       unsigned int fifo_threshold;
+       unsigned int fifo_starve;
+       unsigned int fifo_starve_off;
 
        unsigned char vlan_enable:1,
                rx_csum_enable:1,
-               extended_hash:1;
+               extended_hash:1,
+               bd_stash_en:1;
        unsigned short padding;
        struct vlan_group *vlgrp;
        /* Info structure initialized by board setup code */
@@ -731,6 +738,6 @@ extern void stop_gfar(struct net_device *dev);
 extern void gfar_halt(struct net_device *dev);
 extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev,
                int enable, u32 regnum, u32 read);
-void gfar_setup_stashing(struct net_device *dev);
+void gfar_init_sysfs(struct net_device *dev);
 
 #endif /* __GIANFAR_H */
index cfa3cd7c91a0a9c777851379e1c63d9eeae217a9..765e810620fe95f68834e7fede0019190609a494 100644 (file)
@@ -125,7 +125,7 @@ static char stat_gstrings[][ETH_GSTRING_LEN] = {
 static void gfar_gstrings(struct net_device *dev, u32 stringset, u8 * buf)
 {
        struct gfar_private *priv = netdev_priv(dev);
-       
+
        if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_RMON)
                memcpy(buf, stat_gstrings, GFAR_STATS_LEN * ETH_GSTRING_LEN);
        else
index e85eb216fb5be40464e1dfdf0402f77059bfeafb..d527cf2f9c1d7f47398eaac003b361e79428b38b 100644 (file)
@@ -24,6 +24,7 @@
 #define MII_READ_COMMAND       0x00000001
 
 #define GFAR_SUPPORTED (SUPPORTED_10baseT_Half \
+               | SUPPORTED_10baseT_Full \
                | SUPPORTED_100baseT_Half \
                | SUPPORTED_100baseT_Full \
                | SUPPORTED_Autoneg \
diff --git a/drivers/net/gianfar_sysfs.c b/drivers/net/gianfar_sysfs.c
new file mode 100644 (file)
index 0000000..10d34cb
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * drivers/net/gianfar_sysfs.c
+ *
+ * Gianfar Ethernet Driver
+ * This driver is designed for the non-CPM ethernet controllers
+ * on the 85xx and 83xx family of integrated processors
+ * Based on 8260_io/fcc_enet.c
+ *
+ * Author: Andy Fleming
+ * Maintainer: Kumar Gala (kumar.gala@freescale.com)
+ *
+ * Copyright (c) 2002-2005 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ * Sysfs file creation and management
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/unistd.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/etherdevice.h>
+#include <linux/spinlock.h>
+#include <linux/mm.h>
+#include <linux/device.h>
+
+#include <asm/uaccess.h>
+#include <linux/module.h>
+#include <linux/version.h>
+
+#include "gianfar.h"
+
+#define GFAR_ATTR(_name) \
+static ssize_t gfar_show_##_name(struct class_device *cdev, char *buf); \
+static ssize_t gfar_set_##_name(struct class_device *cdev, \
+               const char *buf, size_t count); \
+static CLASS_DEVICE_ATTR(_name, 0644, gfar_show_##_name, gfar_set_##_name)
+
+#define GFAR_CREATE_FILE(_dev, _name) \
+       class_device_create_file(&_dev->class_dev, &class_device_attr_##_name)
+
+GFAR_ATTR(bd_stash);
+GFAR_ATTR(rx_stash_size);
+GFAR_ATTR(rx_stash_index);
+GFAR_ATTR(fifo_threshold);
+GFAR_ATTR(fifo_starve);
+GFAR_ATTR(fifo_starve_off);
+
+#define to_net_dev(cd) container_of(cd, struct net_device, class_dev)
+
+static ssize_t gfar_show_bd_stash(struct class_device *cdev, char *buf)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+
+       return sprintf(buf, "%s\n", priv->bd_stash_en? "on" : "off");
+}
+
+static ssize_t gfar_set_bd_stash(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+       int new_setting = 0;
+       u32 temp;
+       unsigned long flags;
+
+       /* Find out the new setting */
+       if (!strncmp("on", buf, count-1) || !strncmp("1", buf, count-1))
+               new_setting = 1;
+       else if (!strncmp("off", buf, count-1) || !strncmp("0", buf, count-1))
+               new_setting = 0;
+       else
+               return count;
+
+       spin_lock_irqsave(&priv->lock, flags);
+
+       /* Set the new stashing value */
+       priv->bd_stash_en = new_setting;
+
+       temp = gfar_read(&priv->regs->attr);
+       
+       if (new_setting)
+               temp |= ATTR_BDSTASH;
+       else
+               temp &= ~(ATTR_BDSTASH);
+
+       gfar_write(&priv->regs->attr, temp);
+
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return count;
+}
+
+static ssize_t gfar_show_rx_stash_size(struct class_device *cdev, char *buf)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+
+       return sprintf(buf, "%d\n", priv->rx_stash_size);
+}
+
+static ssize_t gfar_set_rx_stash_size(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+       unsigned int length = simple_strtoul(buf, NULL, 0);
+       u32 temp;
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->lock, flags);
+       if (length > priv->rx_buffer_size)
+               return count;
+
+       if (length == priv->rx_stash_size)
+               return count;
+
+       priv->rx_stash_size = length;
+
+       temp = gfar_read(&priv->regs->attreli);
+       temp &= ~ATTRELI_EL_MASK;
+       temp |= ATTRELI_EL(length);
+       gfar_write(&priv->regs->attreli, temp);
+
+       /* Turn stashing on/off as appropriate */
+       temp = gfar_read(&priv->regs->attr);
+
+       if (length)
+               temp |= ATTR_BUFSTASH;
+       else
+               temp &= ~(ATTR_BUFSTASH);
+
+       gfar_write(&priv->regs->attr, temp);
+
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return count;
+}
+
+
+/* Stashing will only be enabled when rx_stash_size != 0 */
+static ssize_t gfar_show_rx_stash_index(struct class_device *cdev, char *buf)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+
+       return sprintf(buf, "%d\n", priv->rx_stash_index);
+}
+
+static ssize_t gfar_set_rx_stash_index(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+       unsigned short index = simple_strtoul(buf, NULL, 0);
+       u32 temp;
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->lock, flags);
+       if (index > priv->rx_stash_size)
+               return count;
+
+       if (index == priv->rx_stash_index)
+               return count;
+
+       priv->rx_stash_index = index;
+
+       temp = gfar_read(&priv->regs->attreli);
+       temp &= ~ATTRELI_EI_MASK;
+       temp |= ATTRELI_EI(index);
+       gfar_write(&priv->regs->attreli, flags);
+
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return count;
+}
+
+static ssize_t gfar_show_fifo_threshold(struct class_device *cdev, char *buf)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+
+       return sprintf(buf, "%d\n", priv->fifo_threshold);
+}
+
+static ssize_t gfar_set_fifo_threshold(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+       unsigned int length = simple_strtoul(buf, NULL, 0);
+       u32 temp;
+       unsigned long flags;
+
+       if (length > GFAR_MAX_FIFO_THRESHOLD)
+               return count;
+
+       spin_lock_irqsave(&priv->lock, flags);
+
+       priv->fifo_threshold = length;
+
+       temp = gfar_read(&priv->regs->fifo_tx_thr);
+       temp &= ~FIFO_TX_THR_MASK;
+       temp |= length;
+       gfar_write(&priv->regs->fifo_tx_thr, temp);
+
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return count;
+}
+
+static ssize_t gfar_show_fifo_starve(struct class_device *cdev, char *buf)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+
+       return sprintf(buf, "%d\n", priv->fifo_starve);
+}
+
+
+static ssize_t gfar_set_fifo_starve(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+       unsigned int num = simple_strtoul(buf, NULL, 0);
+       u32 temp;
+       unsigned long flags;
+
+       if (num > GFAR_MAX_FIFO_STARVE)
+               return count;
+
+       spin_lock_irqsave(&priv->lock, flags);
+
+       priv->fifo_starve = num;
+
+       temp = gfar_read(&priv->regs->fifo_tx_starve);
+       temp &= ~FIFO_TX_STARVE_MASK;
+       temp |= num;
+       gfar_write(&priv->regs->fifo_tx_starve, temp);
+
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return count;
+}
+
+static ssize_t gfar_show_fifo_starve_off(struct class_device *cdev, char *buf)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+
+       return sprintf(buf, "%d\n", priv->fifo_starve_off);
+}
+
+static ssize_t gfar_set_fifo_starve_off(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(cdev);
+       struct gfar_private *priv = netdev_priv(dev);
+       unsigned int num = simple_strtoul(buf, NULL, 0);
+       u32 temp;
+       unsigned long flags;
+
+       if (num > GFAR_MAX_FIFO_STARVE_OFF)
+               return count;
+
+       spin_lock_irqsave(&priv->lock, flags);
+
+       priv->fifo_starve_off = num;
+
+       temp = gfar_read(&priv->regs->fifo_tx_starve_shutoff);
+       temp &= ~FIFO_TX_STARVE_OFF_MASK;
+       temp |= num;
+       gfar_write(&priv->regs->fifo_tx_starve_shutoff, temp);
+
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return count;
+}
+
+void gfar_init_sysfs(struct net_device *dev)
+{
+       struct gfar_private *priv = netdev_priv(dev);
+
+       /* Initialize the default values */
+       priv->rx_stash_size = DEFAULT_STASH_LENGTH;
+       priv->rx_stash_index = DEFAULT_STASH_INDEX;
+       priv->fifo_threshold = DEFAULT_FIFO_TX_THR;
+       priv->fifo_starve = DEFAULT_FIFO_TX_STARVE;
+       priv->fifo_starve_off = DEFAULT_FIFO_TX_STARVE_OFF;
+       priv->bd_stash_en = DEFAULT_BD_STASH;
+
+       /* Create our sysfs files */
+       GFAR_CREATE_FILE(dev, bd_stash);
+       GFAR_CREATE_FILE(dev, rx_stash_size);
+       GFAR_CREATE_FILE(dev, rx_stash_index);
+       GFAR_CREATE_FILE(dev, fifo_threshold);
+       GFAR_CREATE_FILE(dev, fifo_starve);
+       GFAR_CREATE_FILE(dev, fifo_starve_off);
+
+}
index eb7d6947871555812408a40aa7e0c6fba697275e..1da8a66f91e115cf913f6c0492c3c2187cd6be75 100644 (file)
@@ -65,7 +65,7 @@
  */
 
 #define DRV_NAME        "emac"
-#define DRV_VERSION     "3.53"
+#define DRV_VERSION     "3.54"
 #define DRV_DESC        "PPC 4xx OCP EMAC driver"
 
 MODULE_DESCRIPTION(DRV_DESC);
@@ -158,6 +158,14 @@ static inline void emac_report_timeout_error(struct ocp_enet_private *dev,
 #define PHY_POLL_LINK_ON       HZ
 #define PHY_POLL_LINK_OFF      (HZ / 5)
 
+/* Graceful stop timeouts in us. 
+ * We should allow up to 1 frame time (full-duplex, ignoring collisions) 
+ */
+#define STOP_TIMEOUT_10                1230    
+#define STOP_TIMEOUT_100       124
+#define STOP_TIMEOUT_1000      13
+#define STOP_TIMEOUT_1000_JUMBO        73
+
 /* Please, keep in sync with struct ibm_emac_stats/ibm_emac_error_stats */
 static const char emac_stats_keys[EMAC_ETHTOOL_STATS_COUNT][ETH_GSTRING_LEN] = {
        "rx_packets", "rx_bytes", "tx_packets", "tx_bytes", "rx_packets_csum",
@@ -222,10 +230,12 @@ static void emac_tx_disable(struct ocp_enet_private *dev)
 
        r = in_be32(&p->mr0);
        if (r & EMAC_MR0_TXE) {
-               int n = 300;
+               int n = dev->stop_timeout;
                out_be32(&p->mr0, r & ~EMAC_MR0_TXE);
-               while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n)
+               while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n) {
+                       udelay(1);
                        --n;
+               }       
                if (unlikely(!n))
                        emac_report_timeout_error(dev, "TX disable timeout");
        }
@@ -248,9 +258,11 @@ static void emac_rx_enable(struct ocp_enet_private *dev)
        if (!(r & EMAC_MR0_RXE)) {
                if (unlikely(!(r & EMAC_MR0_RXI))) {
                        /* Wait if previous async disable is still in progress */
-                       int n = 100;
-                       while (!(r = in_be32(&p->mr0) & EMAC_MR0_RXI) && n)
+                       int n = dev->stop_timeout;
+                       while (!(r = in_be32(&p->mr0) & EMAC_MR0_RXI) && n) {
+                               udelay(1);
                                --n;
+                       }       
                        if (unlikely(!n))
                                emac_report_timeout_error(dev,
                                                          "RX disable timeout");
@@ -273,10 +285,12 @@ static void emac_rx_disable(struct ocp_enet_private *dev)
 
        r = in_be32(&p->mr0);
        if (r & EMAC_MR0_RXE) {
-               int n = 300;
+               int n = dev->stop_timeout;
                out_be32(&p->mr0, r & ~EMAC_MR0_RXE);
-               while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n)
+               while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n) {
+                       udelay(1);
                        --n;
+               }       
                if (unlikely(!n))
                        emac_report_timeout_error(dev, "RX disable timeout");
        }
@@ -395,6 +409,7 @@ static int emac_configure(struct ocp_enet_private *dev)
        r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST;
        if (dev->phy.duplex == DUPLEX_FULL)
                r |= EMAC_MR1_FDE;
+       dev->stop_timeout = STOP_TIMEOUT_10;
        switch (dev->phy.speed) {
        case SPEED_1000:
                if (emac_phy_gpcs(dev->phy.mode)) {
@@ -409,12 +424,16 @@ static int emac_configure(struct ocp_enet_private *dev)
                        r |= EMAC_MR1_MF_1000;
                r |= EMAC_MR1_RFS_16K;
                gige = 1;
-               
-               if (dev->ndev->mtu > ETH_DATA_LEN)
+
+               if (dev->ndev->mtu > ETH_DATA_LEN) {
                        r |= EMAC_MR1_JPSM;
+                       dev->stop_timeout = STOP_TIMEOUT_1000_JUMBO;
+               } else
+                       dev->stop_timeout = STOP_TIMEOUT_1000;
                break;
        case SPEED_100:
                r |= EMAC_MR1_MF_100;
+               dev->stop_timeout = STOP_TIMEOUT_100;
                /* Fall through */
        default:
                r |= EMAC_MR1_RFS_4K;
@@ -2048,6 +2067,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
        dev->phy.duplex = DUPLEX_FULL;
        dev->phy.autoneg = AUTONEG_DISABLE;
        dev->phy.pause = dev->phy.asym_pause = 0;
+       dev->stop_timeout = STOP_TIMEOUT_100;
        init_timer(&dev->link_timer);
        dev->link_timer.function = emac_link_timer;
        dev->link_timer.data = (unsigned long)dev;
index e9b44d030ac339ee0a3c4682ae0ed45ba077250d..911abbaf471b509187b0b187905a18216ba05b0c 100644 (file)
@@ -189,6 +189,8 @@ struct ocp_enet_private {
        struct timer_list               link_timer;
        int                             reset_failed;
 
+       int                             stop_timeout;   /* in us */
+
        struct ibm_emac_error_stats     estats;
        struct net_device_stats         nstats;
 
index c22c0517883c2b8566f3b4c1788cbab6b866feda..fa176ffb4ad525b2fe6869df4919734ebd2062c6 100644 (file)
@@ -1539,7 +1539,6 @@ static void irda_usb_disconnect(struct usb_interface *intf)
  * USB device callbacks
  */
 static struct usb_driver irda_driver = {
-       .owner          = THIS_MODULE,
        .name           = "irda-usb",
        .probe          = irda_usb_probe,
        .disconnect     = irda_usb_disconnect,
index 3961a754e920e37e8a1b310670edcdb48549a46c..31867e4b891b1e582e2490638cc417894337e736 100644 (file)
@@ -1152,7 +1152,6 @@ static int stir_resume(struct usb_interface *intf)
  * USB device callbacks
  */
 static struct usb_driver irda_driver = {
-       .owner          = THIS_MODULE,
        .name           = "stir4200",
        .probe          = stir_probe,
        .disconnect     = stir_disconnect,
diff --git a/drivers/net/ixp2000/Kconfig b/drivers/net/ixp2000/Kconfig
new file mode 100644 (file)
index 0000000..2fec241
--- /dev/null
@@ -0,0 +1,6 @@
+config ENP2611_MSF_NET
+       tristate "Radisys ENP2611 MSF network interface support"
+       depends on ARCH_ENP2611
+       help
+         This is a driver for the MSF network interface unit in
+         the IXP2400 on the Radisys ENP2611 platform.
diff --git a/drivers/net/ixp2000/Makefile b/drivers/net/ixp2000/Makefile
new file mode 100644 (file)
index 0000000..fd38351
--- /dev/null
@@ -0,0 +1,3 @@
+obj-$(CONFIG_ENP2611_MSF_NET) += enp2611_mod.o
+
+enp2611_mod-objs := caleb.o enp2611.o ixp2400-msf.o ixpdev.o pm3386.o
diff --git a/drivers/net/ixp2000/caleb.c b/drivers/net/ixp2000/caleb.c
new file mode 100644 (file)
index 0000000..3595e10
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Helper functions for the SPI-3 bridge FPGA on the Radisys ENP2611
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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/config.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <asm/io.h>
+#include "caleb.h"
+
+#define CALEB_IDLO             0x00
+#define CALEB_IDHI             0x01
+#define CALEB_RID              0x02
+#define CALEB_RESET            0x03
+#define CALEB_INTREN0          0x04
+#define CALEB_INTREN1          0x05
+#define CALEB_INTRSTAT0                0x06
+#define CALEB_INTRSTAT1                0x07
+#define CALEB_PORTEN           0x08
+#define CALEB_BURST            0x09
+#define CALEB_PORTPAUS         0x0A
+#define CALEB_PORTPAUSD                0x0B
+#define CALEB_PHY0RX           0x10
+#define CALEB_PHY1RX           0x11
+#define CALEB_PHY0TX           0x12
+#define CALEB_PHY1TX           0x13
+#define CALEB_IXPRX_HI_CNTR    0x15
+#define CALEB_PHY0RX_HI_CNTR   0x16
+#define CALEB_PHY1RX_HI_CNTR   0x17
+#define CALEB_IXPRX_CNTR       0x18
+#define CALEB_PHY0RX_CNTR      0x19
+#define CALEB_PHY1RX_CNTR      0x1A
+#define CALEB_IXPTX_CNTR       0x1B
+#define CALEB_PHY0TX_CNTR      0x1C
+#define CALEB_PHY1TX_CNTR      0x1D
+#define CALEB_DEBUG0           0x1E
+#define CALEB_DEBUG1           0x1F
+
+
+static u8 caleb_reg_read(int reg)
+{
+       u8 value;
+
+       value = *((volatile u8 *)(ENP2611_CALEB_VIRT_BASE + reg));
+
+//     printk(KERN_INFO "caleb_reg_read(%d) = %.2x\n", reg, value);
+
+       return value;
+}
+
+static void caleb_reg_write(int reg, u8 value)
+{
+       u8 dummy;
+
+//     printk(KERN_INFO "caleb_reg_write(%d, %.2x)\n", reg, value);
+
+       *((volatile u8 *)(ENP2611_CALEB_VIRT_BASE + reg)) = value;
+
+       dummy = *((volatile u8 *)ENP2611_CALEB_VIRT_BASE);
+       __asm__ __volatile__("mov %0, %0" : "+r" (dummy));
+}
+
+
+void caleb_reset(void)
+{
+       /*
+        * Perform a chip reset.
+        */
+       caleb_reg_write(CALEB_RESET, 0x02);
+       udelay(1);
+
+       /*
+        * Enable all interrupt sources.  This is needed to get
+        * meaningful results out of the status bits (register 6
+        * and 7.)
+        */
+       caleb_reg_write(CALEB_INTREN0, 0xff);
+       caleb_reg_write(CALEB_INTREN1, 0x07);
+
+       /*
+        * Set RX and TX FIFO thresholds to 1.5kb.
+        */
+       caleb_reg_write(CALEB_PHY0RX, 0x11);
+       caleb_reg_write(CALEB_PHY1RX, 0x11);
+       caleb_reg_write(CALEB_PHY0TX, 0x11);
+       caleb_reg_write(CALEB_PHY1TX, 0x11);
+
+       /*
+        * Program SPI-3 burst size.
+        */
+       caleb_reg_write(CALEB_BURST, 0);        // 64-byte RBUF mpackets
+//     caleb_reg_write(CALEB_BURST, 1);        // 128-byte RBUF mpackets
+//     caleb_reg_write(CALEB_BURST, 2);        // 256-byte RBUF mpackets
+}
+
+void caleb_enable_rx(int port)
+{
+       u8 temp;
+
+       temp = caleb_reg_read(CALEB_PORTEN);
+       temp |= 1 << port;
+       caleb_reg_write(CALEB_PORTEN, temp);
+}
+
+void caleb_disable_rx(int port)
+{
+       u8 temp;
+
+       temp = caleb_reg_read(CALEB_PORTEN);
+       temp &= ~(1 << port);
+       caleb_reg_write(CALEB_PORTEN, temp);
+}
+
+void caleb_enable_tx(int port)
+{
+       u8 temp;
+
+       temp = caleb_reg_read(CALEB_PORTEN);
+       temp |= 1 << (port + 4);
+       caleb_reg_write(CALEB_PORTEN, temp);
+}
+
+void caleb_disable_tx(int port)
+{
+       u8 temp;
+
+       temp = caleb_reg_read(CALEB_PORTEN);
+       temp &= ~(1 << (port + 4));
+       caleb_reg_write(CALEB_PORTEN, temp);
+}
diff --git a/drivers/net/ixp2000/caleb.h b/drivers/net/ixp2000/caleb.h
new file mode 100644 (file)
index 0000000..e93a1ef
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Helper functions for the SPI-3 bridge FPGA on the Radisys ENP2611
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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 __CALEB_H
+#define __CALEB_H
+
+void caleb_reset(void);
+void caleb_enable_rx(int port);
+void caleb_disable_rx(int port);
+void caleb_enable_tx(int port);
+void caleb_disable_tx(int port);
+
+
+#endif
diff --git a/drivers/net/ixp2000/enp2611.c b/drivers/net/ixp2000/enp2611.c
new file mode 100644 (file)
index 0000000..d82651a
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * IXP2400 MSF network device driver for the Radisys ENP2611
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/init.h>
+#include <linux/moduleparam.h>
+#include <asm/arch/uengine.h>
+#include <asm/mach-types.h>
+#include <asm/io.h>
+#include "ixpdev.h"
+#include "caleb.h"
+#include "ixp2400-msf.h"
+#include "pm3386.h"
+
+/***********************************************************************
+ * The Radisys ENP2611 is a PCI form factor board with three SFP GBIC
+ * slots, connected via two PMC/Sierra 3386s and an SPI-3 bridge FPGA
+ * to the IXP2400.
+ *
+ *                +-------------+
+ * SFP GBIC #0 ---+             |       +---------+
+ *                |  PM3386 #0  +-------+         |
+ * SFP GBIC #1 ---+             |       | "Caleb" |         +---------+
+ *                +-------------+       |         |         |         |
+ *                                      | SPI-3   +---------+ IXP2400 |
+ *                +-------------+       | bridge  |         |         |
+ * SFP GBIC #2 ---+             |       | FPGA    |         +---------+
+ *                |  PM3386 #1  +-------+         |
+ *                |             |       +---------+
+ *                +-------------+
+ *              ^                   ^                  ^
+ *              | 1.25Gbaud         | 104MHz           | 104MHz
+ *              | SERDES ea.        | SPI-3 ea.        | SPI-3
+ *
+ ***********************************************************************/
+static struct ixp2400_msf_parameters enp2611_msf_parameters =
+{
+       .rx_mode =              IXP2400_RX_MODE_UTOPIA_POS |
+                               IXP2400_RX_MODE_1x32 |
+                               IXP2400_RX_MODE_MPHY |
+                               IXP2400_RX_MODE_MPHY_32 |
+                               IXP2400_RX_MODE_MPHY_POLLED_STATUS |
+                               IXP2400_RX_MODE_MPHY_LEVEL3 |
+                               IXP2400_RX_MODE_RBUF_SIZE_64,
+
+       .rxclk01_multiplier =   IXP2400_PLL_MULTIPLIER_16,
+
+       .rx_poll_ports =        3,
+
+       .rx_channel_mode = {
+               IXP2400_PORT_RX_MODE_MASTER |
+               IXP2400_PORT_RX_MODE_POS_PHY |
+               IXP2400_PORT_RX_MODE_POS_PHY_L3 |
+               IXP2400_PORT_RX_MODE_ODD_PARITY |
+               IXP2400_PORT_RX_MODE_2_CYCLE_DECODE,
+
+               IXP2400_PORT_RX_MODE_MASTER |
+               IXP2400_PORT_RX_MODE_POS_PHY |
+               IXP2400_PORT_RX_MODE_POS_PHY_L3 |
+               IXP2400_PORT_RX_MODE_ODD_PARITY |
+               IXP2400_PORT_RX_MODE_2_CYCLE_DECODE,
+
+               IXP2400_PORT_RX_MODE_MASTER |
+               IXP2400_PORT_RX_MODE_POS_PHY |
+               IXP2400_PORT_RX_MODE_POS_PHY_L3 |
+               IXP2400_PORT_RX_MODE_ODD_PARITY |
+               IXP2400_PORT_RX_MODE_2_CYCLE_DECODE,
+
+               IXP2400_PORT_RX_MODE_MASTER |
+               IXP2400_PORT_RX_MODE_POS_PHY |
+               IXP2400_PORT_RX_MODE_POS_PHY_L3 |
+               IXP2400_PORT_RX_MODE_ODD_PARITY |
+               IXP2400_PORT_RX_MODE_2_CYCLE_DECODE
+       },
+
+       .tx_mode =              IXP2400_TX_MODE_UTOPIA_POS |
+                               IXP2400_TX_MODE_1x32 |
+                               IXP2400_TX_MODE_MPHY |
+                               IXP2400_TX_MODE_MPHY_32 |
+                               IXP2400_TX_MODE_MPHY_POLLED_STATUS |
+                               IXP2400_TX_MODE_MPHY_LEVEL3 |
+                               IXP2400_TX_MODE_TBUF_SIZE_64,
+
+       .txclk01_multiplier =   IXP2400_PLL_MULTIPLIER_16,
+
+       .tx_poll_ports =        3,
+
+       .tx_channel_mode = {
+               IXP2400_PORT_TX_MODE_MASTER |
+               IXP2400_PORT_TX_MODE_POS_PHY |
+               IXP2400_PORT_TX_MODE_ODD_PARITY |
+               IXP2400_PORT_TX_MODE_2_CYCLE_DECODE,
+
+               IXP2400_PORT_TX_MODE_MASTER |
+               IXP2400_PORT_TX_MODE_POS_PHY |
+               IXP2400_PORT_TX_MODE_ODD_PARITY |
+               IXP2400_PORT_TX_MODE_2_CYCLE_DECODE,
+
+               IXP2400_PORT_TX_MODE_MASTER |
+               IXP2400_PORT_TX_MODE_POS_PHY |
+               IXP2400_PORT_TX_MODE_ODD_PARITY |
+               IXP2400_PORT_TX_MODE_2_CYCLE_DECODE,
+
+               IXP2400_PORT_TX_MODE_MASTER |
+               IXP2400_PORT_TX_MODE_POS_PHY |
+               IXP2400_PORT_TX_MODE_ODD_PARITY |
+               IXP2400_PORT_TX_MODE_2_CYCLE_DECODE
+       }
+};
+
+struct enp2611_ixpdev_priv
+{
+       struct ixpdev_priv              ixpdev_priv;
+       struct net_device_stats         stats;
+};
+
+static struct net_device *nds[3];
+static struct timer_list link_check_timer;
+
+static struct net_device_stats *enp2611_get_stats(struct net_device *dev)
+{
+       struct enp2611_ixpdev_priv *ip = netdev_priv(dev);
+
+       pm3386_get_stats(ip->ixpdev_priv.channel, &(ip->stats));
+
+       return &(ip->stats);
+}
+
+/* @@@ Poll the SFP moddef0 line too.  */
+/* @@@ Try to use the pm3386 DOOL interrupt as well.  */
+static void enp2611_check_link_status(unsigned long __dummy)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+               struct net_device *dev;
+               int status;
+
+               dev = nds[i];
+
+               status = pm3386_is_link_up(i);
+               if (status && !netif_carrier_ok(dev)) {
+                       /* @@@ Should report autonegotiation status.  */
+                       printk(KERN_INFO "%s: NIC Link is Up\n", dev->name);
+
+                       pm3386_enable_tx(i);
+                       caleb_enable_tx(i);
+                       netif_carrier_on(dev);
+               } else if (!status && netif_carrier_ok(dev)) {
+                       printk(KERN_INFO "%s: NIC Link is Down\n", dev->name);
+
+                       netif_carrier_off(dev);
+                       caleb_disable_tx(i);
+                       pm3386_disable_tx(i);
+               }
+       }
+
+       link_check_timer.expires = jiffies + HZ / 10;
+       add_timer(&link_check_timer);
+}
+
+static void enp2611_set_port_admin_status(int port, int up)
+{
+       if (up) {
+               caleb_enable_rx(port);
+
+               pm3386_set_carrier(port, 1);
+               pm3386_enable_rx(port);
+       } else {
+               caleb_disable_tx(port);
+               pm3386_disable_tx(port);
+               /* @@@ Flush out pending packets.  */
+               pm3386_set_carrier(port, 0);
+
+               pm3386_disable_rx(port);
+               caleb_disable_rx(port);
+       }
+}
+
+static int __init enp2611_init_module(void)
+{ 
+       int i;
+
+       if (!machine_is_enp2611())
+               return -ENODEV;
+
+       caleb_reset();
+       pm3386_reset();
+
+       for (i = 0; i < 3; i++) {
+               nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv));
+               if (nds[i] == NULL) {
+                       while (--i >= 0)
+                               free_netdev(nds[i]);
+                       return -ENOMEM;
+               }
+
+               SET_MODULE_OWNER(nds[i]);
+               nds[i]->get_stats = enp2611_get_stats;
+               pm3386_init_port(i);
+               pm3386_get_mac(i, nds[i]->dev_addr);
+       }
+
+       ixp2400_msf_init(&enp2611_msf_parameters);
+
+       if (ixpdev_init(3, nds, enp2611_set_port_admin_status)) {
+               for (i = 0; i < 3; i++)
+                       free_netdev(nds[i]);
+               return -EINVAL;
+       }
+
+       init_timer(&link_check_timer);
+       link_check_timer.function = enp2611_check_link_status;
+       link_check_timer.expires = jiffies;
+       add_timer(&link_check_timer);
+
+       return 0;
+}
+
+static void __exit enp2611_cleanup_module(void)
+{
+       int i;
+
+       del_timer_sync(&link_check_timer);
+
+       ixpdev_deinit();
+       for (i = 0; i < 3; i++)
+               free_netdev(nds[i]);
+}
+
+module_init(enp2611_init_module);
+module_exit(enp2611_cleanup_module);
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/ixp2000/ixp2400-msf.c b/drivers/net/ixp2000/ixp2400-msf.c
new file mode 100644 (file)
index 0000000..48a3a89
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Generic library functions for the MSF (Media and Switch Fabric) unit
+ * found on the Intel IXP2400 network processor.
+ *
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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.
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <asm/hardware.h>
+#include <asm/arch/ixp2000-regs.h>
+#include <asm/delay.h>
+#include <asm/io.h>
+#include "ixp2400-msf.h"
+
+/*
+ * This is the Intel recommended PLL init procedure as described on
+ * page 340 of the IXP2400/IXP2800 Programmer's Reference Manual.
+ */
+static void ixp2400_pll_init(struct ixp2400_msf_parameters *mp)
+{
+       int rx_dual_clock;
+       int tx_dual_clock;
+       u32 value;
+
+       /*
+        * If the RX mode is not 1x32, we have to enable both RX PLLs
+        * (#0 and #1.)  The same thing for the TX direction.
+        */
+       rx_dual_clock = !!(mp->rx_mode & IXP2400_RX_MODE_WIDTH_MASK);
+       tx_dual_clock = !!(mp->tx_mode & IXP2400_TX_MODE_WIDTH_MASK);
+
+       /*
+        * Read initial value.
+        */
+       value = ixp2000_reg_read(IXP2000_MSF_CLK_CNTRL);
+
+       /*
+        * Put PLLs in powerdown and bypass mode.
+        */
+       value |= 0x0000f0f0;
+       ixp2000_reg_write(IXP2000_MSF_CLK_CNTRL, value);
+
+       /*
+        * Set single or dual clock mode bits.
+        */
+       value &= ~0x03000000;
+       value |= (rx_dual_clock << 24) | (tx_dual_clock << 25);
+
+       /*
+        * Set multipliers.
+        */
+       value &= ~0x00ff0000;
+       value |= mp->rxclk01_multiplier << 16;
+       value |= mp->rxclk23_multiplier << 18;
+       value |= mp->txclk01_multiplier << 20;
+       value |= mp->txclk23_multiplier << 22;
+
+       /*
+        * And write value.
+        */
+       ixp2000_reg_write(IXP2000_MSF_CLK_CNTRL, value);
+
+       /*
+        * Disable PLL bypass mode.
+        */
+       value &= ~(0x00005000 | rx_dual_clock << 13 | tx_dual_clock << 15);
+       ixp2000_reg_write(IXP2000_MSF_CLK_CNTRL, value);
+
+       /*
+        * Turn on PLLs.
+        */
+       value &= ~(0x00000050 | rx_dual_clock << 5 | tx_dual_clock << 7);
+       ixp2000_reg_write(IXP2000_MSF_CLK_CNTRL, value);
+
+       /*
+        * Wait for PLLs to lock.  There are lock status bits, but IXP2400
+        * erratum #65 says that these lock bits should not be relied upon
+        * as they might not accurately reflect the true state of the PLLs.
+        */
+       udelay(100);
+}
+
+/*
+ * Needed according to p480 of Programmer's Reference Manual.
+ */
+static void ixp2400_msf_free_rbuf_entries(struct ixp2400_msf_parameters *mp)
+{
+       int size_bits;
+       int i;
+
+       /*
+        * Work around IXP2400 erratum #69 (silent RBUF-to-DRAM transfer
+        * corruption) in the Intel-recommended way: do not add the RBUF
+        * elements susceptible to corruption to the freelist.
+        */
+       size_bits = mp->rx_mode & IXP2400_RX_MODE_RBUF_SIZE_MASK;
+       if (size_bits == IXP2400_RX_MODE_RBUF_SIZE_64) {
+               for (i = 1; i < 128; i++) {
+                       if (i == 9 || i == 18 || i == 27)
+                               continue;
+                       ixp2000_reg_write(IXP2000_MSF_RBUF_ELEMENT_DONE, i);
+               }
+       } else if (size_bits == IXP2400_RX_MODE_RBUF_SIZE_128) {
+               for (i = 1; i < 64; i++) {
+                       if (i == 4 || i == 9 || i == 13)
+                               continue;
+                       ixp2000_reg_write(IXP2000_MSF_RBUF_ELEMENT_DONE, i);
+               }
+       } else if (size_bits == IXP2400_RX_MODE_RBUF_SIZE_256) {
+               for (i = 1; i < 32; i++) {
+                       if (i == 2 || i == 4 || i == 6)
+                               continue;
+                       ixp2000_reg_write(IXP2000_MSF_RBUF_ELEMENT_DONE, i);
+               }
+       }
+}
+
+static u32 ixp2400_msf_valid_channels(u32 reg)
+{
+       u32 channels;
+
+       channels = 0;
+       switch (reg & IXP2400_RX_MODE_WIDTH_MASK) {
+       case IXP2400_RX_MODE_1x32:
+               channels = 0x1;
+               if (reg & IXP2400_RX_MODE_MPHY &&
+                   !(reg & IXP2400_RX_MODE_MPHY_32))
+                       channels = 0xf;
+               break;
+
+       case IXP2400_RX_MODE_2x16:
+               channels = 0x5;
+               break;
+
+       case IXP2400_RX_MODE_4x8:
+               channels = 0xf;
+               break;
+
+       case IXP2400_RX_MODE_1x16_2x8:
+               channels = 0xd;
+               break;
+       }
+
+       return channels;
+}
+
+static void ixp2400_msf_enable_rx(struct ixp2400_msf_parameters *mp)
+{
+       u32 value;
+
+       value = ixp2000_reg_read(IXP2000_MSF_RX_CONTROL) & 0x0fffffff;
+       value |= ixp2400_msf_valid_channels(mp->rx_mode) << 28;
+       ixp2000_reg_write(IXP2000_MSF_RX_CONTROL, value);
+}
+
+static void ixp2400_msf_enable_tx(struct ixp2400_msf_parameters *mp)
+{
+       u32 value;
+
+       value = ixp2000_reg_read(IXP2000_MSF_TX_CONTROL) & 0x0fffffff;
+       value |= ixp2400_msf_valid_channels(mp->tx_mode) << 28;
+       ixp2000_reg_write(IXP2000_MSF_TX_CONTROL, value);
+}
+
+
+void ixp2400_msf_init(struct ixp2400_msf_parameters *mp)
+{
+       u32 value;
+       int i;
+
+       /*
+        * Init the RX/TX PLLs based on the passed parameter block.
+        */
+       ixp2400_pll_init(mp);
+
+       /*
+        * Reset MSF.  Bit 7 in IXP_RESET_0 resets the MSF.
+        */
+       value = ixp2000_reg_read(IXP2000_RESET0);
+       ixp2000_reg_write(IXP2000_RESET0, value | 0x80);
+       ixp2000_reg_write(IXP2000_RESET0, value & ~0x80);
+
+       /*
+        * Initialise the RX section.
+        */
+       ixp2000_reg_write(IXP2000_MSF_RX_MPHY_POLL_LIMIT, mp->rx_poll_ports - 1);
+       ixp2000_reg_write(IXP2000_MSF_RX_CONTROL, mp->rx_mode);
+       for (i = 0; i < 4; i++) {
+               ixp2000_reg_write(IXP2000_MSF_RX_UP_CONTROL_0 + i,
+                                               mp->rx_channel_mode[i]);
+       }
+       ixp2400_msf_free_rbuf_entries(mp);
+       ixp2400_msf_enable_rx(mp);
+
+       /*
+        * Initialise the TX section.
+        */
+       ixp2000_reg_write(IXP2000_MSF_TX_MPHY_POLL_LIMIT, mp->tx_poll_ports - 1);
+       ixp2000_reg_write(IXP2000_MSF_TX_CONTROL, mp->tx_mode);
+       for (i = 0; i < 4; i++) {
+               ixp2000_reg_write(IXP2000_MSF_TX_UP_CONTROL_0 + i,
+                                               mp->tx_channel_mode[i]);
+       }
+       ixp2400_msf_enable_tx(mp);
+}
diff --git a/drivers/net/ixp2000/ixp2400-msf.h b/drivers/net/ixp2000/ixp2400-msf.h
new file mode 100644 (file)
index 0000000..3ac1af2
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Generic library functions for the MSF (Media and Switch Fabric) unit
+ * found on the Intel IXP2400 network processor.
+ *
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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.
+ */
+
+#ifndef __IXP2400_MSF_H
+#define __IXP2400_MSF_H
+
+struct ixp2400_msf_parameters
+{
+       u32                             rx_mode;
+       unsigned                        rxclk01_multiplier:2;
+       unsigned                        rxclk23_multiplier:2;
+       unsigned                        rx_poll_ports:6;
+       u32                             rx_channel_mode[4];
+
+       u32                             tx_mode;
+       unsigned                        txclk01_multiplier:2;
+       unsigned                        txclk23_multiplier:2;
+       unsigned                        tx_poll_ports:6;
+       u32                             tx_channel_mode[4];
+};
+
+void ixp2400_msf_init(struct ixp2400_msf_parameters *mp);
+
+#define IXP2400_PLL_MULTIPLIER_48              0x00
+#define IXP2400_PLL_MULTIPLIER_24              0x01
+#define IXP2400_PLL_MULTIPLIER_16              0x02
+#define IXP2400_PLL_MULTIPLIER_12              0x03
+
+#define IXP2400_RX_MODE_CSIX                   0x00400000
+#define IXP2400_RX_MODE_UTOPIA_POS             0x00000000
+#define IXP2400_RX_MODE_WIDTH_MASK             0x00300000
+#define IXP2400_RX_MODE_1x16_2x8               0x00300000
+#define IXP2400_RX_MODE_4x8                    0x00200000
+#define IXP2400_RX_MODE_2x16                   0x00100000
+#define IXP2400_RX_MODE_1x32                   0x00000000
+#define IXP2400_RX_MODE_MPHY                   0x00080000
+#define IXP2400_RX_MODE_SPHY                   0x00000000
+#define IXP2400_RX_MODE_MPHY_32                        0x00040000
+#define IXP2400_RX_MODE_MPHY_4                 0x00000000
+#define IXP2400_RX_MODE_MPHY_POLLED_STATUS     0x00020000
+#define IXP2400_RX_MODE_MPHY_DIRECT_STATUS     0x00000000
+#define IXP2400_RX_MODE_CBUS_FULL_DUPLEX       0x00010000
+#define IXP2400_RX_MODE_CBUS_SIMPLEX           0x00000000
+#define IXP2400_RX_MODE_MPHY_LEVEL2            0x00004000
+#define IXP2400_RX_MODE_MPHY_LEVEL3            0x00000000
+#define IXP2400_RX_MODE_CBUS_8BIT              0x00002000
+#define IXP2400_RX_MODE_CBUS_4BIT              0x00000000
+#define IXP2400_RX_MODE_CSIX_SINGLE_FREELIST   0x00000200
+#define IXP2400_RX_MODE_CSIX_SPLIT_FREELISTS   0x00000000
+#define IXP2400_RX_MODE_RBUF_SIZE_MASK         0x0000000c
+#define IXP2400_RX_MODE_RBUF_SIZE_256          0x00000008
+#define IXP2400_RX_MODE_RBUF_SIZE_128          0x00000004
+#define IXP2400_RX_MODE_RBUF_SIZE_64           0x00000000
+
+#define IXP2400_PORT_RX_MODE_SLAVE             0x00000040
+#define IXP2400_PORT_RX_MODE_MASTER            0x00000000
+#define IXP2400_PORT_RX_MODE_POS_PHY_L3                0x00000020
+#define IXP2400_PORT_RX_MODE_POS_PHY_L2                0x00000000
+#define IXP2400_PORT_RX_MODE_POS_PHY           0x00000010
+#define IXP2400_PORT_RX_MODE_UTOPIA            0x00000000
+#define IXP2400_PORT_RX_MODE_EVEN_PARITY       0x0000000c
+#define IXP2400_PORT_RX_MODE_ODD_PARITY                0x00000008
+#define IXP2400_PORT_RX_MODE_NO_PARITY         0x00000000
+#define IXP2400_PORT_RX_MODE_UTOPIA_BIG_CELLS  0x00000002
+#define IXP2400_PORT_RX_MODE_UTOPIA_NORMAL_CELLS       0x00000000
+#define IXP2400_PORT_RX_MODE_2_CYCLE_DECODE    0x00000001
+#define IXP2400_PORT_RX_MODE_1_CYCLE_DECODE    0x00000000
+
+#define IXP2400_TX_MODE_CSIX                   0x00400000
+#define IXP2400_TX_MODE_UTOPIA_POS             0x00000000
+#define IXP2400_TX_MODE_WIDTH_MASK             0x00300000
+#define IXP2400_TX_MODE_1x16_2x8               0x00300000
+#define IXP2400_TX_MODE_4x8                    0x00200000
+#define IXP2400_TX_MODE_2x16                   0x00100000
+#define IXP2400_TX_MODE_1x32                   0x00000000
+#define IXP2400_TX_MODE_MPHY                   0x00080000
+#define IXP2400_TX_MODE_SPHY                   0x00000000
+#define IXP2400_TX_MODE_MPHY_32                        0x00040000
+#define IXP2400_TX_MODE_MPHY_4                 0x00000000
+#define IXP2400_TX_MODE_MPHY_POLLED_STATUS     0x00020000
+#define IXP2400_TX_MODE_MPHY_DIRECT_STATUS     0x00000000
+#define IXP2400_TX_MODE_CBUS_FULL_DUPLEX       0x00010000
+#define IXP2400_TX_MODE_CBUS_SIMPLEX           0x00000000
+#define IXP2400_TX_MODE_MPHY_LEVEL2            0x00004000
+#define IXP2400_TX_MODE_MPHY_LEVEL3            0x00000000
+#define IXP2400_TX_MODE_CBUS_8BIT              0x00002000
+#define IXP2400_TX_MODE_CBUS_4BIT              0x00000000
+#define IXP2400_TX_MODE_TBUF_SIZE_MASK         0x0000000c
+#define IXP2400_TX_MODE_TBUF_SIZE_256          0x00000008
+#define IXP2400_TX_MODE_TBUF_SIZE_128          0x00000004
+#define IXP2400_TX_MODE_TBUF_SIZE_64           0x00000000
+
+#define IXP2400_PORT_TX_MODE_SLAVE             0x00000040
+#define IXP2400_PORT_TX_MODE_MASTER            0x00000000
+#define IXP2400_PORT_TX_MODE_POS_PHY           0x00000010
+#define IXP2400_PORT_TX_MODE_UTOPIA            0x00000000
+#define IXP2400_PORT_TX_MODE_EVEN_PARITY       0x0000000c
+#define IXP2400_PORT_TX_MODE_ODD_PARITY                0x00000008
+#define IXP2400_PORT_TX_MODE_NO_PARITY         0x00000000
+#define IXP2400_PORT_TX_MODE_UTOPIA_BIG_CELLS  0x00000002
+#define IXP2400_PORT_TX_MODE_2_CYCLE_DECODE    0x00000001
+#define IXP2400_PORT_TX_MODE_1_CYCLE_DECODE    0x00000000
+
+
+#endif
diff --git a/drivers/net/ixp2000/ixp2400_rx.uc b/drivers/net/ixp2000/ixp2400_rx.uc
new file mode 100644 (file)
index 0000000..42a73e3
--- /dev/null
@@ -0,0 +1,408 @@
+/*
+ * RX ucode for the Intel IXP2400 in POS-PHY mode.
+ * Copyright (C) 2004, 2005 Lennert Buytenhek
+ * Dedicated to Marija Kulikova.
+ *
+ * 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.
+ *
+ * Assumptions made in this code:
+ * - The IXP2400 MSF is configured for POS-PHY mode, in a mode where
+ *   only one full element list is used.  This includes, for example,
+ *   1x32 SPHY and 1x32 MPHY32, but not 4x8 SPHY or 1x32 MPHY4.  (This
+ *   is not an exhaustive list.)
+ * - The RBUF uses 64-byte mpackets.
+ * - RX descriptors reside in SRAM, and have the following format:
+ *     struct rx_desc
+ *     {
+ *     // to uengine
+ *             u32     buf_phys_addr;
+ *             u32     buf_length;
+ *
+ *     // from uengine
+ *             u32     channel;
+ *             u32     pkt_length;
+ *     };
+ * - Packet data resides in DRAM.
+ * - Packet buffer addresses are 8-byte aligned.
+ * - Scratch ring 0 is rx_pending.
+ * - Scratch ring 1 is rx_done, and has status condition 'full'.
+ * - The host triggers rx_done flush and rx_pending refill on seeing INTA.
+ * - This code is run on all eight threads of the microengine it runs on.
+ *
+ * Local memory is used for per-channel RX state.
+ */
+
+#define RX_THREAD_FREELIST_0           0x0030
+#define RBUF_ELEMENT_DONE              0x0044
+
+#define CHANNEL_FLAGS                  *l$index0[0]
+#define CHANNEL_FLAG_RECEIVING         1
+#define PACKET_LENGTH                  *l$index0[1]
+#define PACKET_CHECKSUM                        *l$index0[2]
+#define BUFFER_HANDLE                  *l$index0[3]
+#define BUFFER_START                   *l$index0[4]
+#define BUFFER_LENGTH                  *l$index0[5]
+
+#define CHANNEL_STATE_SIZE             24      // in bytes
+#define CHANNEL_STATE_SHIFT            5       // ceil(log2(state size))
+
+
+       .sig volatile sig1
+       .sig volatile sig2
+       .sig volatile sig3
+
+       .sig mpacket_arrived
+       .reg add_to_rx_freelist
+       .reg read $rsw0, $rsw1
+       .xfer_order $rsw0 $rsw1
+
+       .reg zero
+
+       /*
+        * Initialise add_to_rx_freelist.
+        */
+       .begin
+               .reg temp
+               .reg temp2
+
+               immed[add_to_rx_freelist, RX_THREAD_FREELIST_0]
+               immed_w1[add_to_rx_freelist, (&$rsw0 | (&mpacket_arrived << 12))]
+
+               local_csr_rd[ACTIVE_CTX_STS]
+               immed[temp, 0]
+               alu[temp2, temp, and, 0x1f]
+               alu_shf[add_to_rx_freelist, add_to_rx_freelist, or, temp2, <<20]
+               alu[temp2, temp, and, 0x80]
+               alu_shf[add_to_rx_freelist, add_to_rx_freelist, or, temp2, <<18]
+       .end
+
+       immed[zero, 0]
+
+       /*
+        * Skip context 0 initialisation?
+        */
+       .begin
+               br!=ctx[0, mpacket_receive_loop#]
+       .end
+
+       /*
+        * Initialise local memory.
+        */
+       .begin
+               .reg addr
+               .reg temp
+
+               immed[temp, 0]
+       init_local_mem_loop#:
+               alu_shf[addr, --, b, temp, <<CHANNEL_STATE_SHIFT]
+               local_csr_wr[ACTIVE_LM_ADDR_0, addr]
+               nop
+               nop
+               nop
+
+               immed[CHANNEL_FLAGS, 0]
+
+               alu[temp, temp, +, 1]
+               alu[--, temp, and, 0x20]
+               beq[init_local_mem_loop#]
+       .end
+
+       /*
+        * Initialise signal pipeline.
+        */
+       .begin
+               local_csr_wr[SAME_ME_SIGNAL, (&sig1 << 3)]
+               .set_sig sig1
+
+               local_csr_wr[SAME_ME_SIGNAL, (&sig2 << 3)]
+               .set_sig sig2
+
+               local_csr_wr[SAME_ME_SIGNAL, (&sig3 << 3)]
+               .set_sig sig3
+       .end
+
+mpacket_receive_loop#:
+       /*
+        * Synchronise and wait for mpacket.
+        */
+       .begin
+               ctx_arb[sig1]
+               local_csr_wr[SAME_ME_SIGNAL, (0x80 | (&sig1 << 3))]
+
+               msf[fast_wr, --, add_to_rx_freelist, 0]
+               .set_sig mpacket_arrived
+               ctx_arb[mpacket_arrived]
+               .set $rsw0 $rsw1
+       .end
+
+       /*
+        * We halt if we see {inbparerr,parerr,null,soperror}.
+        */
+       .begin
+               alu_shf[--, 0x1b, and, $rsw0, >>8]
+               bne[abort_rswerr#]
+       .end
+
+       /*
+        * Point local memory pointer to this channel's state area.
+        */
+       .begin
+               .reg chanaddr
+
+               alu[chanaddr, $rsw0, and, 0x1f]
+               alu_shf[chanaddr, --, b, chanaddr, <<CHANNEL_STATE_SHIFT]
+               local_csr_wr[ACTIVE_LM_ADDR_0, chanaddr]
+               nop
+               nop
+               nop
+       .end
+
+       /*
+        * Check whether we received a SOP mpacket while we were already
+        * working on a packet, or a non-SOP mpacket while there was no
+        * packet pending.  (SOP == RECEIVING -> abort)  If everything's
+        * okay, update the RECEIVING flag to reflect our new state.
+        */
+       .begin
+               .reg temp
+               .reg eop
+
+               #if CHANNEL_FLAG_RECEIVING != 1
+               #error CHANNEL_FLAG_RECEIVING is not 1
+               #endif
+
+               alu_shf[temp, 1, and, $rsw0, >>15]
+               alu[temp, temp, xor, CHANNEL_FLAGS]
+               alu[--, temp, and, CHANNEL_FLAG_RECEIVING]
+               beq[abort_proterr#]
+
+               alu_shf[eop, 1, and, $rsw0, >>14]
+               alu[CHANNEL_FLAGS, temp, xor, eop]
+       .end
+
+       /*
+        * Copy the mpacket into the right spot, and in case of EOP,
+        * write back the descriptor and pass the packet on.
+        */
+       .begin
+               .reg buffer_offset
+               .reg _packet_length
+               .reg _packet_checksum
+               .reg _buffer_handle
+               .reg _buffer_start
+               .reg _buffer_length
+
+               /*
+                * Determine buffer_offset, _packet_length and
+                * _packet_checksum.
+                */
+               .begin
+                       .reg temp
+
+                       alu[--, 1, and, $rsw0, >>15]
+                       beq[not_sop#]
+
+                       immed[PACKET_LENGTH, 0]
+                       immed[PACKET_CHECKSUM, 0]
+
+               not_sop#:
+                       alu[buffer_offset, --, b, PACKET_LENGTH]
+                       alu_shf[temp, 0xff, and, $rsw0, >>16]
+                       alu[_packet_length, buffer_offset, +, temp]
+                       alu[PACKET_LENGTH, --, b, _packet_length]
+
+                       immed[temp, 0xffff]
+                       alu[temp, $rsw1, and, temp]
+                       alu[_packet_checksum, PACKET_CHECKSUM, +, temp]
+                       alu[PACKET_CHECKSUM, --, b, _packet_checksum]
+               .end
+
+               /*
+                * Allocate buffer in case of SOP.
+                */
+               .begin
+                       .reg temp
+
+                       alu[temp, 1, and, $rsw0, >>15]
+                       beq[skip_buffer_alloc#]
+
+                       .begin
+                               .sig zzz
+                               .reg read $stemp $stemp2
+                               .xfer_order $stemp $stemp2
+
+                       rx_nobufs#:
+                               scratch[get, $stemp, zero, 0, 1], ctx_swap[zzz]
+                               alu[_buffer_handle, --, b, $stemp]
+                               beq[rx_nobufs#]
+
+                               sram[read, $stemp, _buffer_handle, 0, 2],
+                                                               ctx_swap[zzz]
+                               alu[_buffer_start, --, b, $stemp]
+                               alu[_buffer_length, --, b, $stemp2]
+                       .end
+
+               skip_buffer_alloc#:
+               .end
+
+               /*
+                * Resynchronise.
+                */
+               .begin
+                       ctx_arb[sig2]
+                       local_csr_wr[SAME_ME_SIGNAL, (0x80 | (&sig2 << 3))]
+               .end
+
+               /*
+                * Synchronise buffer state.
+                */
+               .begin
+                       .reg temp
+
+                       alu[temp, 1, and, $rsw0, >>15]
+                       beq[copy_from_local_mem#]
+
+                       alu[BUFFER_HANDLE, --, b, _buffer_handle]
+                       alu[BUFFER_START, --, b, _buffer_start]
+                       alu[BUFFER_LENGTH, --, b, _buffer_length]
+                       br[sync_state_done#]
+
+               copy_from_local_mem#:
+                       alu[_buffer_handle, --, b, BUFFER_HANDLE]
+                       alu[_buffer_start, --, b, BUFFER_START]
+                       alu[_buffer_length, --, b, BUFFER_LENGTH]
+
+               sync_state_done#:
+               .end
+
+#if 0
+               /*
+                * Debug buffer state management.
+                */
+               .begin
+                       .reg temp
+
+                       alu[temp, 1, and, $rsw0, >>14]
+                       beq[no_poison#]
+                       immed[BUFFER_HANDLE, 0xdead]
+                       immed[BUFFER_START, 0xdead]
+                       immed[BUFFER_LENGTH, 0xdead]
+               no_poison#:
+
+                       immed[temp, 0xdead]
+                       alu[--, _buffer_handle, -, temp]
+                       beq[state_corrupted#]
+                       alu[--, _buffer_start, -, temp]
+                       beq[state_corrupted#]
+                       alu[--, _buffer_length, -, temp]
+                       beq[state_corrupted#]
+               .end
+#endif
+
+               /*
+                * Check buffer length.
+                */
+               .begin
+                       alu[--, _buffer_length, -, _packet_length]
+                       blo[buffer_overflow#]
+               .end
+
+               /*
+                * Copy the mpacket and give back the RBUF element.
+                */
+               .begin
+                       .reg element
+                       .reg xfer_size
+                       .reg temp
+                       .sig copy_sig
+
+                       alu_shf[element, 0x7f, and, $rsw0, >>24]
+                       alu_shf[xfer_size, 0xff, and, $rsw0, >>16]
+
+                       alu[xfer_size, xfer_size, -, 1]
+                       alu_shf[xfer_size, 0x10, or, xfer_size, >>3]
+                       alu_shf[temp, 0x10, or, xfer_size, <<21]
+                       alu_shf[temp, temp, or, element, <<11]
+                       alu_shf[--, temp, or, 1, <<18]
+
+                       dram[rbuf_rd, --, _buffer_start, buffer_offset, max_8],
+                                               indirect_ref, sig_done[copy_sig]
+                       ctx_arb[copy_sig]
+
+                       alu[temp, RBUF_ELEMENT_DONE, or, element, <<16]
+                       msf[fast_wr, --, temp, 0]
+               .end
+
+               /*
+                * If EOP, write back the packet descriptor.
+                */
+               .begin
+                       .reg write $stemp $stemp2
+                       .xfer_order $stemp $stemp2
+                       .sig zzz
+
+                       alu_shf[--, 1, and, $rsw0, >>14]
+                       beq[no_writeback#]
+
+                       alu[$stemp, $rsw0, and, 0x1f]
+                       alu[$stemp2, --, b, _packet_length]
+                       sram[write, $stemp, _buffer_handle, 8, 2], ctx_swap[zzz]
+
+               no_writeback#:
+               .end
+
+               /*
+                * Resynchronise.
+                */
+               .begin
+                       ctx_arb[sig3]
+                       local_csr_wr[SAME_ME_SIGNAL, (0x80 | (&sig3 << 3))]
+               .end
+
+               /*
+                * If EOP, put the buffer back onto the scratch ring.
+                */
+               .begin
+                       .reg write $stemp
+                       .sig zzz
+
+                       br_inp_state[SCR_Ring1_Status, rx_done_ring_overflow#]
+
+                       alu_shf[--, 1, and, $rsw0, >>14]
+                       beq[mpacket_receive_loop#]
+
+                       alu[--, 1, and, $rsw0, >>10]
+                       bne[rxerr#]
+
+                       alu[$stemp, --, b, _buffer_handle]
+                       scratch[put, $stemp, zero, 4, 1], ctx_swap[zzz]
+                       cap[fast_wr, 0, XSCALE_INT_A]
+                       br[mpacket_receive_loop#]
+
+               rxerr#:
+                       alu[$stemp, --, b, _buffer_handle]
+                       scratch[put, $stemp, zero, 0, 1], ctx_swap[zzz]
+                       br[mpacket_receive_loop#]
+               .end
+       .end
+
+
+abort_rswerr#:
+       halt
+
+abort_proterr#:
+       halt
+
+state_corrupted#:
+       halt
+
+buffer_overflow#:
+       halt
+
+rx_done_ring_overflow#:
+       halt
+
+
diff --git a/drivers/net/ixp2000/ixp2400_rx.ucode b/drivers/net/ixp2000/ixp2400_rx.ucode
new file mode 100644 (file)
index 0000000..e8aee2f
--- /dev/null
@@ -0,0 +1,130 @@
+static struct ixp2000_uengine_code ixp2400_rx =
+{
+       .cpu_model_bitmask      = 0x000003fe,
+       .cpu_min_revision       = 0,
+       .cpu_max_revision       = 255,
+
+       .uengine_parameters     = IXP2000_UENGINE_8_CONTEXTS |
+                                 IXP2000_UENGINE_PRN_UPDATE_EVERY |
+                                 IXP2000_UENGINE_NN_FROM_PREVIOUS |
+                                 IXP2000_UENGINE_ASSERT_EMPTY_AT_0 |
+                                 IXP2000_UENGINE_LM_ADDR1_PER_CONTEXT |
+                                 IXP2000_UENGINE_LM_ADDR0_PER_CONTEXT,
+
+       .initial_reg_values     = (struct ixp2000_reg_value []) {
+               { -1, -1 }
+       },
+
+       .num_insns              = 109,
+       .insns                  = (u8 []) {
+               0xf0, 0x00, 0x0c, 0xc0, 0x05,
+               0xf4, 0x44, 0x0c, 0x00, 0x05,
+               0xfc, 0x04, 0x4c, 0x00, 0x00,
+               0xf0, 0x00, 0x00, 0x3b, 0x00,
+               0xb4, 0x40, 0xf0, 0x3b, 0x1f,
+               0x8a, 0xc0, 0x50, 0x3e, 0x05,
+               0xb4, 0x40, 0xf0, 0x3b, 0x80,
+               0x9a, 0xe0, 0x00, 0x3e, 0x05,
+               0xf0, 0x00, 0x00, 0x07, 0x00,
+               0xd8, 0x05, 0xc0, 0x00, 0x11,
+               0xf0, 0x00, 0x00, 0x0f, 0x00,
+               0x91, 0xb0, 0x20, 0x0e, 0x00,
+               0xfc, 0x06, 0x60, 0x0b, 0x00,
+               0xf0, 0x00, 0x0c, 0x03, 0x00,
+               0xf0, 0x00, 0x0c, 0x03, 0x00,
+               0xf0, 0x00, 0x0c, 0x03, 0x00,
+               0xf0, 0x00, 0x0c, 0x02, 0x00,
+               0xb0, 0xc0, 0x30, 0x0f, 0x01,
+               0xa4, 0x70, 0x00, 0x0f, 0x20,
+               0xd8, 0x02, 0xc0, 0x01, 0x00,
+               0xfc, 0x10, 0xac, 0x23, 0x08,
+               0xfc, 0x10, 0xac, 0x43, 0x10,
+               0xfc, 0x10, 0xac, 0x63, 0x18,
+               0xe0, 0x00, 0x00, 0x00, 0x02,
+               0xfc, 0x10, 0xae, 0x23, 0x88,
+               0x3d, 0x00, 0x04, 0x03, 0x20,
+               0xe0, 0x00, 0x00, 0x00, 0x10,
+               0x84, 0x82, 0x02, 0x01, 0x3b,
+               0xd8, 0x1a, 0x00, 0x01, 0x01,
+               0xb4, 0x00, 0x8c, 0x7d, 0x80,
+               0x91, 0xb0, 0x80, 0x22, 0x00,
+               0xfc, 0x06, 0x60, 0x23, 0x00,
+               0xf0, 0x00, 0x0c, 0x03, 0x00,
+               0xf0, 0x00, 0x0c, 0x03, 0x00,
+               0xf0, 0x00, 0x0c, 0x03, 0x00,
+               0x94, 0xf0, 0x92, 0x01, 0x21,
+               0xac, 0x40, 0x60, 0x26, 0x00,
+               0xa4, 0x30, 0x0c, 0x04, 0x06,
+               0xd8, 0x1a, 0x40, 0x01, 0x00,
+               0x94, 0xe0, 0xa2, 0x01, 0x21,
+               0xac, 0x20, 0x00, 0x28, 0x06,
+               0x84, 0xf2, 0x02, 0x01, 0x21,
+               0xd8, 0x0b, 0x40, 0x01, 0x00,
+               0xf0, 0x00, 0x0c, 0x02, 0x01,
+               0xf0, 0x00, 0x0c, 0x02, 0x02,
+               0xa0, 0x00, 0x08, 0x04, 0x00,
+               0x95, 0x00, 0xc6, 0x01, 0xff,
+               0xa0, 0x80, 0x10, 0x30, 0x00,
+               0xa0, 0x60, 0x1c, 0x00, 0x01,
+               0xf0, 0x0f, 0xf0, 0x33, 0xff,
+               0xb4, 0x00, 0xc0, 0x31, 0x81,
+               0xb0, 0x80, 0xb0, 0x32, 0x02,
+               0xa0, 0x20, 0x20, 0x2c, 0x00,
+               0x94, 0xf0, 0xd2, 0x01, 0x21,
+               0xd8, 0x0f, 0x40, 0x01, 0x00,
+               0x19, 0x40, 0x10, 0x04, 0x20,
+               0xa0, 0x00, 0x26, 0x04, 0x00,
+               0xd8, 0x0d, 0xc0, 0x01, 0x00,
+               0x00, 0x42, 0x10, 0x80, 0x02,
+               0xb0, 0x00, 0x46, 0x04, 0x00,
+               0xb0, 0x00, 0x56, 0x08, 0x00,
+               0xe0, 0x00, 0x00, 0x00, 0x04,
+               0xfc, 0x10, 0xae, 0x43, 0x90,
+               0x84, 0xf0, 0x32, 0x01, 0x21,
+               0xd8, 0x11, 0x40, 0x01, 0x00,
+               0xa0, 0x60, 0x3c, 0x00, 0x02,
+               0xa0, 0x20, 0x40, 0x10, 0x00,
+               0xa0, 0x20, 0x50, 0x14, 0x00,
+               0xd8, 0x12, 0x00, 0x00, 0x18,
+               0xa0, 0x00, 0x28, 0x0c, 0x00,
+               0xb0, 0x00, 0x48, 0x10, 0x00,
+               0xb0, 0x00, 0x58, 0x14, 0x00,
+               0xaa, 0xf0, 0x00, 0x14, 0x01,
+               0xd8, 0x1a, 0xc0, 0x01, 0x05,
+               0x85, 0x80, 0x42, 0x01, 0xff,
+               0x95, 0x00, 0x66, 0x01, 0xff,
+               0xba, 0xc0, 0x60, 0x1b, 0x01,
+               0x9a, 0x30, 0x60, 0x19, 0x30,
+               0x9a, 0xb0, 0x70, 0x1a, 0x30,
+               0x9b, 0x50, 0x78, 0x1e, 0x04,
+               0x8a, 0xe2, 0x08, 0x1e, 0x21,
+               0x6a, 0x4e, 0x00, 0x13, 0x00,
+               0xe0, 0x00, 0x00, 0x00, 0x30,
+               0x9b, 0x00, 0x7a, 0x92, 0x04,
+               0x3d, 0x00, 0x04, 0x1f, 0x20,
+               0x84, 0xe2, 0x02, 0x01, 0x21,
+               0xd8, 0x16, 0x80, 0x01, 0x00,
+               0xa4, 0x18, 0x0c, 0x7d, 0x80,
+               0xa0, 0x58, 0x1c, 0x00, 0x01,
+               0x01, 0x42, 0x00, 0xa0, 0x02,
+               0xe0, 0x00, 0x00, 0x00, 0x08,
+               0xfc, 0x10, 0xae, 0x63, 0x98,
+               0xd8, 0x1b, 0x00, 0xc2, 0x14,
+               0x84, 0xe2, 0x02, 0x01, 0x21,
+               0xd8, 0x05, 0xc0, 0x01, 0x00,
+               0x84, 0xa2, 0x02, 0x01, 0x21,
+               0xd8, 0x19, 0x40, 0x01, 0x01,
+               0xa0, 0x58, 0x0c, 0x00, 0x02,
+               0x1a, 0x40, 0x00, 0x04, 0x24,
+               0x33, 0x00, 0x01, 0x2f, 0x20,
+               0xd8, 0x05, 0xc0, 0x00, 0x18,
+               0xa0, 0x58, 0x0c, 0x00, 0x02,
+               0x1a, 0x40, 0x00, 0x04, 0x20,
+               0xd8, 0x05, 0xc0, 0x00, 0x18,
+               0xe0, 0x00, 0x02, 0x00, 0x00,
+               0xe0, 0x00, 0x02, 0x00, 0x00,
+               0xe0, 0x00, 0x02, 0x00, 0x00,
+               0xe0, 0x00, 0x02, 0x00, 0x00,
+               0xe0, 0x00, 0x02, 0x00, 0x00,
+       }
+};
diff --git a/drivers/net/ixp2000/ixp2400_tx.uc b/drivers/net/ixp2000/ixp2400_tx.uc
new file mode 100644 (file)
index 0000000..d090d18
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * TX ucode for the Intel IXP2400 in POS-PHY mode.
+ * Copyright (C) 2004, 2005 Lennert Buytenhek
+ * Dedicated to Marija Kulikova.
+ *
+ * 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.
+ *
+ * Assumptions made in this code:
+ * - The IXP2400 MSF is configured for POS-PHY mode, in a mode where
+ *   only one TBUF partition is used.  This includes, for example,
+ *   1x32 SPHY and 1x32 MPHY32, but not 4x8 SPHY or 1x32 MPHY4. (This
+ *   is not an exhaustive list.)
+ * - The TBUF uses 64-byte mpackets.
+ * - TX descriptors reside in SRAM, and have the following format:
+ *     struct tx_desc
+ *     {
+ *     // to uengine
+ *             u32     buf_phys_addr;
+ *             u32     pkt_length;
+ *             u32     channel;
+ *     };
+ * - Packet data resides in DRAM.
+ * - Packet buffer addresses are 8-byte aligned.
+ * - Scratch ring 2 is tx_pending.
+ * - Scratch ring 3 is tx_done, and has status condition 'full'.
+ * - This code is run on all eight threads of the microengine it runs on.
+ */
+
+#define TX_SEQUENCE_0          0x0060
+#define TBUF_CTRL              0x1800
+
+#define PARTITION_SIZE         128
+#define PARTITION_THRESH       96
+
+
+       .sig volatile sig1
+       .sig volatile sig2
+       .sig volatile sig3
+
+       .reg @old_tx_seq_0
+       .reg @mpkts_in_flight
+       .reg @next_tbuf_mpacket
+
+       .reg @buffer_handle
+       .reg @buffer_start
+       .reg @packet_length
+       .reg @channel
+       .reg @packet_offset
+
+       .reg zero
+
+       immed[zero, 0]
+
+       /*
+        * Skip context 0 initialisation?
+        */
+       .begin
+               br!=ctx[0, mpacket_tx_loop#]
+       .end
+
+       /*
+        * Wait until all pending TBUF elements have been transmitted.
+        */
+       .begin
+               .reg read $tx
+               .sig zzz
+
+       loop_empty#:
+               msf[read, $tx, zero, TX_SEQUENCE_0, 1], ctx_swap[zzz]
+               alu_shf[--, --, b, $tx, >>31]
+               beq[loop_empty#]
+
+               alu[@old_tx_seq_0, --, b, $tx]
+       .end
+
+       immed[@mpkts_in_flight, 0]
+       alu[@next_tbuf_mpacket, @old_tx_seq_0, and, (PARTITION_SIZE - 1)]
+
+       immed[@buffer_handle, 0]
+
+       /*
+        * Initialise signal pipeline.
+        */
+       .begin
+               local_csr_wr[SAME_ME_SIGNAL, (&sig1 << 3)]
+               .set_sig sig1
+
+               local_csr_wr[SAME_ME_SIGNAL, (&sig2 << 3)]
+               .set_sig sig2
+
+               local_csr_wr[SAME_ME_SIGNAL, (&sig3 << 3)]
+               .set_sig sig3
+       .end
+
+mpacket_tx_loop#:
+       .begin
+               .reg tbuf_element_index
+               .reg buffer_handle
+               .reg sop_eop
+               .reg packet_data
+               .reg channel
+               .reg mpacket_size
+
+               /*
+                * If there is no packet currently being transmitted,
+                * dequeue the next TX descriptor, and fetch the buffer
+                * address, packet length and destination channel number.
+                */
+               .begin
+                       .reg read $stemp $stemp2 $stemp3
+                       .xfer_order $stemp $stemp2 $stemp3
+                       .sig zzz
+
+                       ctx_arb[sig1]
+
+                       alu[--, --, b, @buffer_handle]
+                       bne[already_got_packet#]
+
+               tx_nobufs#:
+                       scratch[get, $stemp, zero, 8, 1], ctx_swap[zzz]
+                       alu[@buffer_handle, --, b, $stemp]
+                       beq[tx_nobufs#]
+
+                       sram[read, $stemp, $stemp, 0, 3], ctx_swap[zzz]
+                       alu[@buffer_start, --, b, $stemp]
+                       alu[@packet_length, --, b, $stemp2]
+                       beq[zero_byte_packet#]
+                       alu[@channel, --, b, $stemp3]
+                       immed[@packet_offset, 0]
+
+               already_got_packet#:
+                       local_csr_wr[SAME_ME_SIGNAL, (0x80 | (&sig1 << 3))]
+               .end
+
+               /*
+                * Determine tbuf element index, SOP/EOP flags, mpacket
+                * offset and mpacket size and cache buffer_handle and
+                * channel number.
+                */
+               .begin
+                       alu[tbuf_element_index, --, b, @next_tbuf_mpacket]
+                       alu[@next_tbuf_mpacket, @next_tbuf_mpacket, +, 1]
+                       alu[@next_tbuf_mpacket, @next_tbuf_mpacket, and,
+                                                       (PARTITION_SIZE - 1)]
+
+                       alu[buffer_handle, --, b, @buffer_handle]
+                       immed[@buffer_handle, 0]
+
+                       immed[sop_eop, 1]
+
+                       alu[packet_data, --, b, @packet_offset]
+                       bne[no_sop#]
+                       alu[sop_eop, sop_eop, or, 2]
+               no_sop#:
+                       alu[packet_data, packet_data, +, @buffer_start]
+
+                       alu[channel, --, b, @channel]
+
+                       alu[mpacket_size, @packet_length, -, @packet_offset]
+                       alu[--, 64, -, mpacket_size]
+                       bhs[eop#]
+                       alu[@buffer_handle, --, b, buffer_handle]
+                       immed[mpacket_size, 64]
+                       alu[sop_eop, sop_eop, and, 2]
+               eop#:
+
+                       alu[@packet_offset, @packet_offset, +, mpacket_size]
+               .end
+
+               /*
+                * Wait until there's enough space in the TBUF.
+                */
+               .begin
+                       .reg read $tx
+                       .reg temp
+                       .sig zzz
+
+                       ctx_arb[sig2]
+
+                       br[test_space#]
+
+               loop_space#:
+                       msf[read, $tx, zero, TX_SEQUENCE_0, 1], ctx_swap[zzz]
+
+                       alu[temp, $tx, -, @old_tx_seq_0]
+                       alu[temp, temp, and, 0xff]
+                       alu[@mpkts_in_flight, @mpkts_in_flight, -, temp]
+
+                       alu[@old_tx_seq_0, --, b, $tx]
+
+               test_space#:
+                       alu[--, PARTITION_THRESH, -, @mpkts_in_flight]
+                       blo[loop_space#]
+
+                       alu[@mpkts_in_flight, @mpkts_in_flight, +, 1]
+
+                       local_csr_wr[SAME_ME_SIGNAL, (0x80 | (&sig2 << 3))]
+               .end
+
+               /*
+                * Copy the packet data to the TBUF.
+                */
+               .begin
+                       .reg temp
+                       .sig copy_sig
+
+                       alu[temp, mpacket_size, -, 1]
+                       alu_shf[temp, 0x10, or, temp, >>3]
+                       alu_shf[temp, 0x10, or, temp, <<21]
+                       alu_shf[temp, temp, or, tbuf_element_index, <<11]
+                       alu_shf[--, temp, or, 1, <<18]
+
+                       dram[tbuf_wr, --, packet_data, 0, max_8],
+                                       indirect_ref, sig_done[copy_sig]
+                       ctx_arb[copy_sig]
+               .end
+
+               /*
+                * Mark TBUF element as ready-to-be-transmitted.
+                */
+               .begin
+                       .reg write $tsw $tsw2
+                       .xfer_order $tsw $tsw2
+                       .reg temp
+                       .sig zzz
+
+                       alu_shf[temp, channel, or, mpacket_size, <<24]
+                       alu_shf[$tsw, temp, or, sop_eop, <<8]
+                       immed[$tsw2, 0]
+
+                       immed[temp, TBUF_CTRL]
+                       alu_shf[temp, temp, or, tbuf_element_index, <<3]
+                       msf[write, $tsw, temp, 0, 2], ctx_swap[zzz]
+               .end
+
+               /*
+                * Resynchronise.
+                */
+               .begin
+                       ctx_arb[sig3]
+                       local_csr_wr[SAME_ME_SIGNAL, (0x80 | (&sig3 << 3))]
+               .end
+
+               /*
+                * If this was an EOP mpacket, recycle the TX buffer
+                * and signal the host.
+                */
+               .begin
+                       .reg write $stemp
+                       .sig zzz
+
+                       alu[--, sop_eop, and, 1]
+                       beq[mpacket_tx_loop#]
+
+               tx_done_ring_full#:
+                       br_inp_state[SCR_Ring3_Status, tx_done_ring_full#]
+
+                       alu[$stemp, --, b, buffer_handle]
+                       scratch[put, $stemp, zero, 12, 1], ctx_swap[zzz]
+                       cap[fast_wr, 0, XSCALE_INT_A]
+                       br[mpacket_tx_loop#]
+               .end
+       .end
+
+
+zero_byte_packet#:
+       halt
+
+
diff --git a/drivers/net/ixp2000/ixp2400_tx.ucode b/drivers/net/ixp2000/ixp2400_tx.ucode
new file mode 100644 (file)
index 0000000..a433e24
--- /dev/null
@@ -0,0 +1,98 @@
+static struct ixp2000_uengine_code ixp2400_tx =
+{
+       .cpu_model_bitmask      = 0x000003fe,
+       .cpu_min_revision       = 0,
+       .cpu_max_revision       = 255,
+
+       .uengine_parameters     = IXP2000_UENGINE_8_CONTEXTS |
+                                 IXP2000_UENGINE_PRN_UPDATE_EVERY |
+                                 IXP2000_UENGINE_NN_FROM_PREVIOUS |
+                                 IXP2000_UENGINE_ASSERT_EMPTY_AT_0 |
+                                 IXP2000_UENGINE_LM_ADDR1_PER_CONTEXT |
+                                 IXP2000_UENGINE_LM_ADDR0_PER_CONTEXT,
+
+       .initial_reg_values     = (struct ixp2000_reg_value []) {
+               { -1, -1 }
+       },
+
+       .num_insns              = 77,
+       .insns                  = (u8 []) {
+               0xf0, 0x00, 0x00, 0x07, 0x00,
+               0xd8, 0x03, 0x00, 0x00, 0x11,
+               0x3c, 0x40, 0x00, 0x04, 0xe0,
+               0x81, 0xf2, 0x02, 0x01, 0x00,
+               0xd8, 0x00, 0x80, 0x01, 0x00,
+               0xb0, 0x08, 0x06, 0x00, 0x00,
+               0xf0, 0x00, 0x0c, 0x00, 0x80,
+               0xb4, 0x49, 0x02, 0x03, 0x7f,
+               0xf0, 0x00, 0x02, 0x83, 0x00,
+               0xfc, 0x10, 0xac, 0x23, 0x08,
+               0xfc, 0x10, 0xac, 0x43, 0x10,
+               0xfc, 0x10, 0xac, 0x63, 0x18,
+               0xe0, 0x00, 0x00, 0x00, 0x02,
+               0xa0, 0x30, 0x02, 0x80, 0x00,
+               0xd8, 0x06, 0x00, 0x01, 0x01,
+               0x19, 0x40, 0x00, 0x04, 0x28,
+               0xb0, 0x0a, 0x06, 0x00, 0x00,
+               0xd8, 0x03, 0xc0, 0x01, 0x00,
+               0x00, 0x44, 0x00, 0x80, 0x80,
+               0xa0, 0x09, 0x06, 0x00, 0x00,
+               0xb0, 0x0b, 0x06, 0x04, 0x00,
+               0xd8, 0x13, 0x00, 0x01, 0x00,
+               0xb0, 0x0c, 0x06, 0x08, 0x00,
+               0xf0, 0x00, 0x0c, 0x00, 0xa0,
+               0xfc, 0x10, 0xae, 0x23, 0x88,
+               0xa0, 0x00, 0x12, 0x40, 0x00,
+               0xb0, 0xc9, 0x02, 0x43, 0x01,
+               0xb4, 0x49, 0x02, 0x43, 0x7f,
+               0xb0, 0x00, 0x22, 0x80, 0x00,
+               0xf0, 0x00, 0x02, 0x83, 0x00,
+               0xf0, 0x00, 0x0c, 0x04, 0x02,
+               0xb0, 0x40, 0x6c, 0x00, 0xa0,
+               0xd8, 0x08, 0x80, 0x01, 0x01,
+               0xaa, 0x00, 0x2c, 0x08, 0x02,
+               0xa0, 0xc0, 0x30, 0x18, 0x90,
+               0xa0, 0x00, 0x43, 0x00, 0x00,
+               0xba, 0xc0, 0x32, 0xc0, 0xa0,
+               0xaa, 0xb0, 0x00, 0x0f, 0x40,
+               0xd8, 0x0a, 0x80, 0x01, 0x04,
+               0xb0, 0x0a, 0x00, 0x08, 0x00,
+               0xf0, 0x00, 0x00, 0x0f, 0x40,
+               0xa4, 0x00, 0x2c, 0x08, 0x02,
+               0xa0, 0x8a, 0x00, 0x0c, 0xa0,
+               0xe0, 0x00, 0x00, 0x00, 0x04,
+               0xd8, 0x0c, 0x80, 0x00, 0x18,
+               0x3c, 0x40, 0x00, 0x04, 0xe0,
+               0xba, 0x80, 0x42, 0x01, 0x80,
+               0xb4, 0x40, 0x40, 0x13, 0xff,
+               0xaa, 0x88, 0x00, 0x10, 0x80,
+               0xb0, 0x08, 0x06, 0x00, 0x00,
+               0xaa, 0xf0, 0x0d, 0x80, 0x80,
+               0xd8, 0x0b, 0x40, 0x01, 0x05,
+               0xa0, 0x88, 0x0c, 0x04, 0x80,
+               0xfc, 0x10, 0xae, 0x43, 0x90,
+               0xba, 0xc0, 0x50, 0x0f, 0x01,
+               0x9a, 0x30, 0x50, 0x15, 0x30,
+               0x9a, 0xb0, 0x50, 0x16, 0x30,
+               0x9b, 0x50, 0x58, 0x16, 0x01,
+               0x8a, 0xe2, 0x08, 0x16, 0x21,
+               0x6b, 0x4e, 0x00, 0x83, 0x03,
+               0xe0, 0x00, 0x00, 0x00, 0x30,
+               0x9a, 0x80, 0x70, 0x0e, 0x04,
+               0x8b, 0x88, 0x08, 0x1e, 0x02,
+               0xf0, 0x00, 0x0c, 0x01, 0x81,
+               0xf0, 0x01, 0x80, 0x1f, 0x00,
+               0x9b, 0xd0, 0x78, 0x1e, 0x01,
+               0x3d, 0x42, 0x00, 0x1c, 0x20,
+               0xe0, 0x00, 0x00, 0x00, 0x08,
+               0xfc, 0x10, 0xae, 0x63, 0x98,
+               0xa4, 0x30, 0x0c, 0x04, 0x02,
+               0xd8, 0x03, 0x00, 0x01, 0x00,
+               0xd8, 0x11, 0xc1, 0x42, 0x14,
+               0xa0, 0x18, 0x00, 0x08, 0x00,
+               0x1a, 0x40, 0x00, 0x04, 0x2c,
+               0x33, 0x00, 0x01, 0x2f, 0x20,
+               0xd8, 0x03, 0x00, 0x00, 0x18,
+               0xe0, 0x00, 0x02, 0x00, 0x00,
+       }
+};
diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c
new file mode 100644 (file)
index 0000000..09f03f4
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ * IXP2000 MSF network device driver
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/init.h>
+#include <linux/moduleparam.h>
+#include <asm/arch/uengine.h>
+#include <asm/mach-types.h>
+#include <asm/io.h>
+#include "ixp2400_rx.ucode"
+#include "ixp2400_tx.ucode"
+#include "ixpdev_priv.h"
+#include "ixpdev.h"
+
+#define DRV_MODULE_VERSION     "0.2"
+
+static int nds_count;
+static struct net_device **nds;
+static int nds_open;
+static void (*set_port_admin_status)(int port, int up);
+
+static struct ixpdev_rx_desc * const rx_desc =
+       (struct ixpdev_rx_desc *)(IXP2000_SRAM0_VIRT_BASE + RX_BUF_DESC_BASE);
+static struct ixpdev_tx_desc * const tx_desc =
+       (struct ixpdev_tx_desc *)(IXP2000_SRAM0_VIRT_BASE + TX_BUF_DESC_BASE);
+static int tx_pointer;
+
+
+static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       struct ixpdev_priv *ip = netdev_priv(dev);
+       struct ixpdev_tx_desc *desc;
+       int entry;
+
+       if (unlikely(skb->len > PAGE_SIZE)) {
+               /* @@@ Count drops.  */
+               dev_kfree_skb(skb);
+               return 0;
+       }
+
+       entry = tx_pointer;
+       tx_pointer = (tx_pointer + 1) % TX_BUF_COUNT;
+
+       desc = tx_desc + entry;
+       desc->pkt_length = skb->len;
+       desc->channel = ip->channel;
+
+       skb_copy_and_csum_dev(skb, phys_to_virt(desc->buf_addr));
+       dev_kfree_skb(skb);
+
+       ixp2000_reg_write(RING_TX_PENDING,
+               TX_BUF_DESC_BASE + (entry * sizeof(struct ixpdev_tx_desc)));
+
+       dev->trans_start = jiffies;
+
+       local_irq_disable();
+       ip->tx_queue_entries++;
+       if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN)
+               netif_stop_queue(dev);
+       local_irq_enable();
+
+       return 0;
+}
+
+
+static int ixpdev_rx(struct net_device *dev, int *budget)
+{
+       while (*budget > 0) {
+               struct ixpdev_rx_desc *desc;
+               struct sk_buff *skb;
+               void *buf;
+               u32 _desc;
+
+               _desc = ixp2000_reg_read(RING_RX_DONE);
+               if (_desc == 0)
+                       return 0;
+
+               desc = rx_desc +
+                       ((_desc - RX_BUF_DESC_BASE) / sizeof(struct ixpdev_rx_desc));
+               buf = phys_to_virt(desc->buf_addr);
+
+               if (desc->pkt_length < 4 || desc->pkt_length > PAGE_SIZE) {
+                       printk(KERN_ERR "ixp2000: rx err, length %d\n",
+                                       desc->pkt_length);
+                       goto err;
+               }
+
+               if (desc->channel < 0 || desc->channel >= nds_count) {
+                       printk(KERN_ERR "ixp2000: rx err, channel %d\n",
+                                       desc->channel);
+                       goto err;
+               }
+
+               /* @@@ Make FCS stripping configurable.  */
+               desc->pkt_length -= 4;
+
+               if (unlikely(!netif_running(nds[desc->channel])))
+                       goto err;
+
+               skb = dev_alloc_skb(desc->pkt_length + 2);
+               if (likely(skb != NULL)) {
+                       skb->dev = nds[desc->channel];
+                       skb_reserve(skb, 2);
+                       eth_copy_and_sum(skb, buf, desc->pkt_length, 0);
+                       skb_put(skb, desc->pkt_length);
+                       skb->protocol = eth_type_trans(skb, skb->dev);
+
+                       skb->dev->last_rx = jiffies;
+
+                       netif_receive_skb(skb);
+               }
+
+err:
+               ixp2000_reg_write(RING_RX_PENDING, _desc);
+               dev->quota--;
+               (*budget)--;
+       }
+
+       return 1;
+}
+
+/* dev always points to nds[0].  */
+static int ixpdev_poll(struct net_device *dev, int *budget)
+{
+       /* @@@ Have to stop polling when nds[0] is administratively
+        * downed while we are polling.  */
+       do {
+               ixp2000_reg_write(IXP2000_IRQ_THD_RAW_STATUS_A_0, 0x00ff);
+
+               if (ixpdev_rx(dev, budget))
+                       return 1;
+       } while (ixp2000_reg_read(IXP2000_IRQ_THD_RAW_STATUS_A_0) & 0x00ff);
+
+       netif_rx_complete(dev);
+       ixp2000_reg_write(IXP2000_IRQ_THD_ENABLE_SET_A_0, 0x00ff);
+
+       return 0;
+}
+
+static void ixpdev_tx_complete(void)
+{
+       int channel;
+       u32 wake;
+
+       wake = 0;
+       while (1) {
+               struct ixpdev_priv *ip;
+               u32 desc;
+               int entry;
+
+               desc = ixp2000_reg_read(RING_TX_DONE);
+               if (desc == 0)
+                       break;
+
+               /* @@@ Check whether entries come back in order.  */
+               entry = (desc - TX_BUF_DESC_BASE) / sizeof(struct ixpdev_tx_desc);
+               channel = tx_desc[entry].channel;
+
+               if (channel < 0 || channel >= nds_count) {
+                       printk(KERN_ERR "ixp2000: txcomp channel index "
+                                       "out of bounds (%d, %.8i, %d)\n",
+                                       channel, (unsigned int)desc, entry);
+                       continue;
+               }
+
+               ip = netdev_priv(nds[channel]);
+               if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN)
+                       wake |= 1 << channel;
+               ip->tx_queue_entries--;
+       }
+
+       for (channel = 0; wake != 0; channel++) {
+               if (wake & (1 << channel)) {
+                       netif_wake_queue(nds[channel]);
+                       wake &= ~(1 << channel);
+               }
+       }
+}
+
+static irqreturn_t ixpdev_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+       u32 status;
+
+       status = ixp2000_reg_read(IXP2000_IRQ_THD_STATUS_A_0);
+       if (status == 0)
+               return IRQ_NONE;
+
+       /*
+        * Any of the eight receive units signaled RX?
+        */
+       if (status & 0x00ff) {
+               ixp2000_reg_wrb(IXP2000_IRQ_THD_ENABLE_CLEAR_A_0, 0x00ff);
+               if (likely(__netif_rx_schedule_prep(nds[0]))) {
+                       __netif_rx_schedule(nds[0]);
+               } else {
+                       printk(KERN_CRIT "ixp2000: irq while polling!!\n");
+               }
+       }
+
+       /*
+        * Any of the eight transmit units signaled TXdone?
+        */
+       if (status & 0xff00) {
+               ixp2000_reg_wrb(IXP2000_IRQ_THD_RAW_STATUS_A_0, 0xff00);
+               ixpdev_tx_complete();
+       }
+
+       return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void ixpdev_poll_controller(struct net_device *dev)
+{
+       disable_irq(IRQ_IXP2000_THDA0);
+       ixpdev_interrupt(IRQ_IXP2000_THDA0, dev, NULL);
+       enable_irq(IRQ_IXP2000_THDA0);
+}
+#endif
+
+static int ixpdev_open(struct net_device *dev)
+{
+       struct ixpdev_priv *ip = netdev_priv(dev);
+       int err;
+
+       if (!nds_open++) {
+               err = request_irq(IRQ_IXP2000_THDA0, ixpdev_interrupt,
+                                       SA_SHIRQ, "ixp2000_eth", nds);
+               if (err) {
+                       nds_open--;
+                       return err;
+               }
+
+               ixp2000_reg_write(IXP2000_IRQ_THD_ENABLE_SET_A_0, 0xffff);
+       }
+
+       set_port_admin_status(ip->channel, 1);
+       netif_start_queue(dev);
+
+       return 0;
+}
+
+static int ixpdev_close(struct net_device *dev)
+{
+       struct ixpdev_priv *ip = netdev_priv(dev);
+
+       netif_stop_queue(dev);
+       set_port_admin_status(ip->channel, 0);
+
+       if (!--nds_open) {
+               ixp2000_reg_write(IXP2000_IRQ_THD_ENABLE_CLEAR_A_0, 0xffff);
+               free_irq(IRQ_IXP2000_THDA0, nds);
+       }
+
+       return 0;
+}
+
+struct net_device *ixpdev_alloc(int channel, int sizeof_priv)
+{
+       struct net_device *dev;
+       struct ixpdev_priv *ip;
+
+       dev = alloc_etherdev(sizeof_priv);
+       if (dev == NULL)
+               return NULL;
+
+       dev->hard_start_xmit = ixpdev_xmit;
+       dev->poll = ixpdev_poll;
+       dev->open = ixpdev_open;
+       dev->stop = ixpdev_close;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       dev->poll_controller = ixpdev_poll_controller;
+#endif
+
+       dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
+       dev->weight = 64;
+
+       ip = netdev_priv(dev);
+       ip->channel = channel;
+       ip->tx_queue_entries = 0;
+
+       return dev;
+}
+
+int ixpdev_init(int __nds_count, struct net_device **__nds,
+               void (*__set_port_admin_status)(int port, int up))
+{
+       int i;
+       int err;
+
+       if (RX_BUF_COUNT > 192 || TX_BUF_COUNT > 192) {
+               static void __too_many_rx_or_tx_buffers(void);
+               __too_many_rx_or_tx_buffers();
+       }
+
+       printk(KERN_INFO "IXP2000 MSF ethernet driver %s\n", DRV_MODULE_VERSION);
+
+       nds_count = __nds_count;
+       nds = __nds;
+       set_port_admin_status = __set_port_admin_status;
+
+       for (i = 0; i < RX_BUF_COUNT; i++) {
+               void *buf;
+
+               buf = (void *)get_zeroed_page(GFP_KERNEL);
+               if (buf == NULL) {
+                       err = -ENOMEM;
+                       while (--i >= 0)
+                               free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
+                       goto err_out;
+               }
+               rx_desc[i].buf_addr = virt_to_phys(buf);
+               rx_desc[i].buf_length = PAGE_SIZE;
+       }
+
+       /* @@@ Maybe we shouldn't be preallocating TX buffers.  */
+       for (i = 0; i < TX_BUF_COUNT; i++) {
+               void *buf;
+
+               buf = (void *)get_zeroed_page(GFP_KERNEL);
+               if (buf == NULL) {
+                       err = -ENOMEM;
+                       while (--i >= 0)
+                               free_page((unsigned long)phys_to_virt(tx_desc[i].buf_addr));
+                       goto err_free_rx;
+               }
+               tx_desc[i].buf_addr = virt_to_phys(buf);
+       }
+
+       /* 256 entries, ring status set means 'empty', base address 0x0000.  */
+       ixp2000_reg_write(RING_RX_PENDING_BASE, 0x44000000);
+       ixp2000_reg_write(RING_RX_PENDING_HEAD, 0x00000000);
+       ixp2000_reg_write(RING_RX_PENDING_TAIL, 0x00000000);
+
+       /* 256 entries, ring status set means 'full', base address 0x0400.  */
+       ixp2000_reg_write(RING_RX_DONE_BASE, 0x40000400);
+       ixp2000_reg_write(RING_RX_DONE_HEAD, 0x00000000);
+       ixp2000_reg_write(RING_RX_DONE_TAIL, 0x00000000);
+
+       for (i = 0; i < RX_BUF_COUNT; i++) {
+               ixp2000_reg_write(RING_RX_PENDING,
+                       RX_BUF_DESC_BASE + (i * sizeof(struct ixpdev_rx_desc)));
+       }
+
+       ixp2000_uengine_load(0, &ixp2400_rx);
+       ixp2000_uengine_start_contexts(0, 0xff);
+
+       /* 256 entries, ring status set means 'empty', base address 0x0800.  */
+       ixp2000_reg_write(RING_TX_PENDING_BASE, 0x44000800);
+       ixp2000_reg_write(RING_TX_PENDING_HEAD, 0x00000000);
+       ixp2000_reg_write(RING_TX_PENDING_TAIL, 0x00000000);
+
+       /* 256 entries, ring status set means 'full', base address 0x0c00.  */
+       ixp2000_reg_write(RING_TX_DONE_BASE, 0x40000c00);
+       ixp2000_reg_write(RING_TX_DONE_HEAD, 0x00000000);
+       ixp2000_reg_write(RING_TX_DONE_TAIL, 0x00000000);
+
+       ixp2000_uengine_load(1, &ixp2400_tx);
+       ixp2000_uengine_start_contexts(1, 0xff);
+
+       for (i = 0; i < nds_count; i++) {
+               err = register_netdev(nds[i]);
+               if (err) {
+                       while (--i >= 0)
+                               unregister_netdev(nds[i]);
+                       goto err_free_tx;
+               }
+       }
+
+       for (i = 0; i < nds_count; i++) {
+               printk(KERN_INFO "%s: IXP2000 MSF ethernet (port %d), "
+                       "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x.\n", nds[i]->name, i,
+                       nds[i]->dev_addr[0], nds[i]->dev_addr[1],
+                       nds[i]->dev_addr[2], nds[i]->dev_addr[3],
+                       nds[i]->dev_addr[4], nds[i]->dev_addr[5]);
+       }
+
+       return 0;
+
+err_free_tx:
+       for (i = 0; i < TX_BUF_COUNT; i++)
+               free_page((unsigned long)phys_to_virt(tx_desc[i].buf_addr));
+
+err_free_rx:
+       for (i = 0; i < RX_BUF_COUNT; i++)
+               free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
+
+err_out:
+       return err;
+} 
+
+void ixpdev_deinit(void)
+{
+       int i;
+
+       /* @@@ Flush out pending packets.  */
+
+       for (i = 0; i < nds_count; i++)
+               unregister_netdev(nds[i]);
+
+       ixp2000_uengine_stop_contexts(1, 0xff);
+       ixp2000_uengine_stop_contexts(0, 0xff);
+       ixp2000_uengine_reset(0x3);
+
+       for (i = 0; i < TX_BUF_COUNT; i++)
+               free_page((unsigned long)phys_to_virt(tx_desc[i].buf_addr));
+
+       for (i = 0; i < RX_BUF_COUNT; i++)
+               free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
+}
diff --git a/drivers/net/ixp2000/ixpdev.h b/drivers/net/ixp2000/ixpdev.h
new file mode 100644 (file)
index 0000000..bd686cb
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * IXP2000 MSF network device driver
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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 __IXPDEV_H
+#define __IXPDEV_H
+
+struct ixpdev_priv
+{
+       int     channel;
+       int     tx_queue_entries;
+};
+
+struct net_device *ixpdev_alloc(int channel, int sizeof_priv);
+int ixpdev_init(int num_ports, struct net_device **nds,
+               void (*set_port_admin_status)(int port, int up));
+void ixpdev_deinit(void);
+
+
+#endif
diff --git a/drivers/net/ixp2000/ixpdev_priv.h b/drivers/net/ixp2000/ixpdev_priv.h
new file mode 100644 (file)
index 0000000..86aa08e
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * IXP2000 MSF network device driver
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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 __IXPDEV_PRIV_H
+#define __IXPDEV_PRIV_H
+
+#define RX_BUF_DESC_BASE       0x00001000
+#define RX_BUF_COUNT           ((3 * PAGE_SIZE) / (4 * sizeof(struct ixpdev_rx_desc)))
+#define TX_BUF_DESC_BASE       0x00002000
+#define TX_BUF_COUNT           ((3 * PAGE_SIZE) / (4 * sizeof(struct ixpdev_tx_desc)))
+#define TX_BUF_COUNT_PER_CHAN  (TX_BUF_COUNT / 4)
+
+#define RING_RX_PENDING                ((u32 *)IXP2000_SCRATCH_RING_VIRT_BASE)
+#define RING_RX_DONE           ((u32 *)(IXP2000_SCRATCH_RING_VIRT_BASE + 4))
+#define RING_TX_PENDING                ((u32 *)(IXP2000_SCRATCH_RING_VIRT_BASE + 8))
+#define RING_TX_DONE           ((u32 *)(IXP2000_SCRATCH_RING_VIRT_BASE + 12))
+
+#define SCRATCH_REG(x)         ((u32 *)(IXP2000_GLOBAL_REG_VIRT_BASE | 0x0800 | (x)))
+#define RING_RX_PENDING_BASE   SCRATCH_REG(0x00)
+#define RING_RX_PENDING_HEAD   SCRATCH_REG(0x04)
+#define RING_RX_PENDING_TAIL   SCRATCH_REG(0x08)
+#define RING_RX_DONE_BASE      SCRATCH_REG(0x10)
+#define RING_RX_DONE_HEAD      SCRATCH_REG(0x14)
+#define RING_RX_DONE_TAIL      SCRATCH_REG(0x18)
+#define RING_TX_PENDING_BASE   SCRATCH_REG(0x20)
+#define RING_TX_PENDING_HEAD   SCRATCH_REG(0x24)
+#define RING_TX_PENDING_TAIL   SCRATCH_REG(0x28)
+#define RING_TX_DONE_BASE      SCRATCH_REG(0x30)
+#define RING_TX_DONE_HEAD      SCRATCH_REG(0x34)
+#define RING_TX_DONE_TAIL      SCRATCH_REG(0x38)
+
+struct ixpdev_rx_desc
+{
+       u32     buf_addr;
+       u32     buf_length;
+       u32     channel;
+       u32     pkt_length;
+};
+
+struct ixpdev_tx_desc
+{
+       u32     buf_addr;
+       u32     pkt_length;
+       u32     channel;
+       u32     unused;
+};
+
+
+#endif
diff --git a/drivers/net/ixp2000/pm3386.c b/drivers/net/ixp2000/pm3386.c
new file mode 100644 (file)
index 0000000..5c7ab75
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ * Helper functions for the PM3386s on the Radisys ENP2611
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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/config.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <asm/io.h>
+#include "pm3386.h"
+
+/*
+ * Read from register 'reg' of PM3386 device 'pm'.
+ */
+static u16 pm3386_reg_read(int pm, int reg)
+{
+       void *_reg;
+       u16 value;
+
+       _reg = (void *)ENP2611_PM3386_0_VIRT_BASE;
+       if (pm == 1)
+               _reg = (void *)ENP2611_PM3386_1_VIRT_BASE;
+
+       value = *((volatile u16 *)(_reg + (reg << 1)));
+
+//     printk(KERN_INFO "pm3386_reg_read(%d, %.3x) = %.8x\n", pm, reg, value);
+
+       return value;
+}
+
+/*
+ * Write to register 'reg' of PM3386 device 'pm', and perform
+ * a readback from the identification register.
+ */
+static void pm3386_reg_write(int pm, int reg, u16 value)
+{
+       void *_reg;
+       u16 dummy;
+
+//     printk(KERN_INFO "pm3386_reg_write(%d, %.3x, %.8x)\n", pm, reg, value);
+
+       _reg = (void *)ENP2611_PM3386_0_VIRT_BASE;
+       if (pm == 1)
+               _reg = (void *)ENP2611_PM3386_1_VIRT_BASE;
+
+       *((volatile u16 *)(_reg + (reg << 1))) = value;
+
+       dummy = *((volatile u16 *)_reg);
+       __asm__ __volatile__("mov %0, %0" : "+r" (dummy));
+}
+
+/*
+ * Read from port 'port' register 'reg', where the registers
+ * for the different ports are 'spacing' registers apart.
+ */
+static u16 pm3386_port_reg_read(int port, int _reg, int spacing)
+{
+       int reg;
+
+       reg = _reg;
+       if (port & 1)
+               reg += spacing;
+
+       return pm3386_reg_read(port >> 1, reg);
+}
+
+/*
+ * Write to port 'port' register 'reg', where the registers
+ * for the different ports are 'spacing' registers apart.
+ */
+static void pm3386_port_reg_write(int port, int _reg, int spacing, u16 value)
+{
+       int reg;
+
+       reg = _reg;
+       if (port & 1)
+               reg += spacing;
+
+       pm3386_reg_write(port >> 1, reg, value);
+}
+
+
+void pm3386_reset(void)
+{
+       u8 mac[3][6];
+
+       /* Save programmed MAC addresses.  */
+       pm3386_get_mac(0, mac[0]);
+       pm3386_get_mac(1, mac[1]);
+       pm3386_get_mac(2, mac[2]);
+
+       /* Assert analog and digital reset.  */
+       pm3386_reg_write(0, 0x002, 0x0060);
+       pm3386_reg_write(1, 0x002, 0x0060);
+       mdelay(1);
+
+       /* Deassert analog reset.  */
+       pm3386_reg_write(0, 0x002, 0x0062);
+       pm3386_reg_write(1, 0x002, 0x0062);
+       mdelay(10);
+
+       /* Deassert digital reset.  */
+       pm3386_reg_write(0, 0x002, 0x0063);
+       pm3386_reg_write(1, 0x002, 0x0063);
+       mdelay(10);
+
+       /* Restore programmed MAC addresses.  */
+       pm3386_set_mac(0, mac[0]);
+       pm3386_set_mac(1, mac[1]);
+       pm3386_set_mac(2, mac[2]);
+
+       /* Disable carrier on all ports.  */
+       pm3386_set_carrier(0, 0);
+       pm3386_set_carrier(1, 0);
+       pm3386_set_carrier(2, 0);
+}
+
+static u16 swaph(u16 x)
+{
+       return ((x << 8) | (x >> 8)) & 0xffff;
+}
+
+void pm3386_init_port(int port)
+{
+       int pm = port >> 1;
+
+       /*
+        * Work around ENP2611 bootloader programming MAC address
+        * in reverse.
+        */
+       if (pm3386_port_reg_read(port, 0x30a, 0x100) == 0x0000 &&
+           (pm3386_port_reg_read(port, 0x309, 0x100) & 0xff00) == 0x5000) {
+               u16 temp[3];
+
+               temp[0] = pm3386_port_reg_read(port, 0x308, 0x100);
+               temp[1] = pm3386_port_reg_read(port, 0x309, 0x100);
+               temp[2] = pm3386_port_reg_read(port, 0x30a, 0x100);
+               pm3386_port_reg_write(port, 0x308, 0x100, swaph(temp[2]));
+               pm3386_port_reg_write(port, 0x309, 0x100, swaph(temp[1]));
+               pm3386_port_reg_write(port, 0x30a, 0x100, swaph(temp[0]));
+       }
+
+       /*
+        * Initialise narrowbanding mode.  See application note 2010486
+        * for more information.  (@@@ We also need to issue a reset
+        * when ROOL or DOOL are detected.)
+        */
+       pm3386_port_reg_write(port, 0x708, 0x10, 0xd055);
+       udelay(500);
+       pm3386_port_reg_write(port, 0x708, 0x10, 0x5055);
+
+       /*
+        * SPI-3 ingress block.  Set 64 bytes SPI-3 burst size
+        * towards SPI-3 bridge.
+        */
+       pm3386_port_reg_write(port, 0x122, 0x20, 0x0002);
+
+       /*
+        * Enable ingress protocol checking, and soft reset the
+        * SPI-3 ingress block.
+        */
+       pm3386_reg_write(pm, 0x103, 0x0003);
+       while (!(pm3386_reg_read(pm, 0x103) & 0x80))
+               ;
+
+       /*
+        * SPI-3 egress block.  Gather 12288 bytes of the current
+        * packet in the TX fifo before initiating transmit on the
+        * SERDES interface.  (Prevents TX underflows.)
+        */
+       pm3386_port_reg_write(port, 0x221, 0x20, 0x0007);
+
+       /*
+        * Enforce odd parity from the SPI-3 bridge, and soft reset
+        * the SPI-3 egress block.
+        */
+       pm3386_reg_write(pm, 0x203, 0x000d & ~(4 << (port & 1)));
+       while ((pm3386_reg_read(pm, 0x203) & 0x000c) != 0x000c)
+               ;
+
+       /*
+        * EGMAC block.  Set this channels to reject long preambles,
+        * not send or transmit PAUSE frames, enable preamble checking,
+        * disable frame length checking, enable FCS appending, enable
+        * TX frame padding.
+        */
+       pm3386_port_reg_write(port, 0x302, 0x100, 0x0113);
+
+       /*
+        * Soft reset the EGMAC block.
+        */
+       pm3386_port_reg_write(port, 0x301, 0x100, 0x8000);
+       pm3386_port_reg_write(port, 0x301, 0x100, 0x0000);
+
+       /*
+        * Auto-sense autonegotiation status.
+        */
+       pm3386_port_reg_write(port, 0x306, 0x100, 0x0100);
+
+       /*
+        * Allow reception of jumbo frames.
+        */
+       pm3386_port_reg_write(port, 0x310, 0x100, 9018);
+
+       /*
+        * Allow transmission of jumbo frames.
+        */
+       pm3386_port_reg_write(port, 0x336, 0x100, 9018);
+
+       /* @@@ Should set 0x337/0x437 (RX forwarding threshold.)  */
+
+       /*
+        * Set autonegotiation parameters to 'no PAUSE, full duplex.'
+        */
+       pm3386_port_reg_write(port, 0x31c, 0x100, 0x0020);
+
+       /*
+        * Enable and restart autonegotiation.
+        */
+       pm3386_port_reg_write(port, 0x318, 0x100, 0x0003);
+       pm3386_port_reg_write(port, 0x318, 0x100, 0x0002);
+}
+
+void pm3386_get_mac(int port, u8 *mac)
+{
+       u16 temp;
+
+       temp = pm3386_port_reg_read(port, 0x308, 0x100);
+       mac[0] = temp & 0xff;
+       mac[1] = (temp >> 8) & 0xff;
+
+       temp = pm3386_port_reg_read(port, 0x309, 0x100);
+       mac[2] = temp & 0xff;
+       mac[3] = (temp >> 8) & 0xff;
+
+       temp = pm3386_port_reg_read(port, 0x30a, 0x100);
+       mac[4] = temp & 0xff;
+       mac[5] = (temp >> 8) & 0xff;
+}
+
+void pm3386_set_mac(int port, u8 *mac)
+{
+       pm3386_port_reg_write(port, 0x308, 0x100, (mac[1] << 8) | mac[0]);
+       pm3386_port_reg_write(port, 0x309, 0x100, (mac[3] << 8) | mac[2]);
+       pm3386_port_reg_write(port, 0x30a, 0x100, (mac[5] << 8) | mac[4]);
+}
+
+static u32 pm3386_get_stat(int port, u16 base)
+{
+       u32 value;
+
+       value = pm3386_port_reg_read(port, base, 0x100);
+       value |= pm3386_port_reg_read(port, base + 1, 0x100) << 16;
+
+       return value;
+}
+
+void pm3386_get_stats(int port, struct net_device_stats *stats)
+{
+       /*
+        * Snapshot statistics counters.
+        */
+       pm3386_port_reg_write(port, 0x500, 0x100, 0x0001);
+       while (pm3386_port_reg_read(port, 0x500, 0x100) & 0x0001)
+               ;
+
+       memset(stats, 0, sizeof(*stats));
+
+       stats->rx_packets = pm3386_get_stat(port, 0x510);
+       stats->tx_packets = pm3386_get_stat(port, 0x590);
+       stats->rx_bytes = pm3386_get_stat(port, 0x514);
+       stats->tx_bytes = pm3386_get_stat(port, 0x594);
+       /* @@@ Add other stats.  */
+}
+
+void pm3386_set_carrier(int port, int state)
+{
+       pm3386_port_reg_write(port, 0x703, 0x10, state ? 0x1001 : 0x0000);
+}
+
+int pm3386_is_link_up(int port)
+{
+       u16 temp;
+
+       temp = pm3386_port_reg_read(port, 0x31a, 0x100);
+       temp = pm3386_port_reg_read(port, 0x31a, 0x100);
+
+       return !!(temp & 0x0002);
+}
+
+void pm3386_enable_rx(int port)
+{
+       u16 temp;
+
+       temp = pm3386_port_reg_read(port, 0x303, 0x100);
+       temp |= 0x1000;
+       pm3386_port_reg_write(port, 0x303, 0x100, temp);
+}
+
+void pm3386_disable_rx(int port)
+{
+       u16 temp;
+
+       temp = pm3386_port_reg_read(port, 0x303, 0x100);
+       temp &= 0xefff;
+       pm3386_port_reg_write(port, 0x303, 0x100, temp);
+}
+
+void pm3386_enable_tx(int port)
+{
+       u16 temp;
+
+       temp = pm3386_port_reg_read(port, 0x303, 0x100);
+       temp |= 0x4000;
+       pm3386_port_reg_write(port, 0x303, 0x100, temp);
+}
+
+void pm3386_disable_tx(int port)
+{
+       u16 temp;
+
+       temp = pm3386_port_reg_read(port, 0x303, 0x100);
+       temp &= 0xbfff;
+       pm3386_port_reg_write(port, 0x303, 0x100, temp);
+}
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/ixp2000/pm3386.h b/drivers/net/ixp2000/pm3386.h
new file mode 100644 (file)
index 0000000..fe92bb0
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Helper functions for the PM3386s on the Radisys ENP2611
+ * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Dedicated to Marija Kulikova.
+ *
+ * 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 __PM3386_H
+#define __PM3386_H
+
+void pm3386_reset(void);
+void pm3386_init_port(int port);
+void pm3386_get_mac(int port, u8 *mac);
+void pm3386_set_mac(int port, u8 *mac);
+void pm3386_get_stats(int port, struct net_device_stats *stats);
+void pm3386_set_carrier(int port, int state);
+int pm3386_is_link_up(int port);
+void pm3386_enable_rx(int port);
+void pm3386_disable_rx(int port);
+void pm3386_enable_tx(int port);
+void pm3386_disable_tx(int port);
+
+
+#endif
index b039bd89ceb953ee88c5150ae1329b1913c12cd2..272d331d29cd5a6a6363861ca0b1f91cba5ca33a 100644 (file)
@@ -296,7 +296,7 @@ static int __init jazz_sonic_init_module(void)
        }
 
        jazz_sonic_device = platform_device_alloc(jazz_sonic_string, 0);
-       if (!jazz_sonnic_device)
+       if (!jazz_sonic_device)
                goto out_unregister;
 
        if (platform_device_add(jazz_sonic_device)) {
@@ -307,7 +307,7 @@ static int __init jazz_sonic_init_module(void)
        return 0;
 
 out_unregister:
-       driver_unregister(&jazz_sonic_driver);
+       platform_driver_unregister(&jazz_sonic_driver);
 
        return -ENOMEM;
 }
index 878535953cb13d8b0f24077839f5ce7a65034e9b..026c732024c99e8dd7708f6291732682af34976c 100644 (file)
@@ -1,28 +1,8 @@
-//
-// <COPYRIGHT CLASS="1B" YEAR="2005">
-// Unpublished work (c) MIPS Technologies, Inc.  All rights reserved.
-// Unpublished rights reserved under the copyright laws of the U.S.A. and
-//  other countries.
-//
-// PROPRIETARY / SECRET CONFIDENTIAL INFORMATION OF MIPS TECHNOLOGIES, INC.
-// FOR INTERNAL USE ONLY.
-//
-// Under no circumstances (contract or otherwise) may this information be
-// disclosed to, or copied, modified or used by anyone other than employees
-// or contractors of MIPS Technologies having a need to know.
-// </COPYRIGHT>
-//
-//++
-// File: MIPS_Net.h
-//
-// Description:
-//   The definition of the emulated MIPSNET device's interface.
-//
-// Notes: This include file needs to work from a Linux device drivers.
-//
-//--
-//
-
+/*
+ * 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 __MIPSNET_H
 #define __MIPSNET_H
 
index f857ae94d261ab505dd809499c372878c0d79e93..b0c3b6ab62634ea01d8be0e3ac5ee0d246ccb1f4 100644 (file)
 #include <linux/ethtool.h>
 #include <linux/timer.h>
 #include <linux/if_vlan.h>
+#include <linux/rtnetlink.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
index 384a736a0d2f820f5c6a7fcce3306d8e6ff04264..356f509092221de4b610f5be6aaf52227df975a6 100644 (file)
@@ -131,10 +131,9 @@ typedef struct local_info_t {
     u_short tx_queue_len;
     cardtype_t cardtype;
     u_short sent;
-    u_char mc_filter[8];
 } local_info_t;
 
-#define MC_FILTERBREAK 8
+#define MC_FILTERBREAK 64
 
 /*====================================================================*/
 /* 
@@ -1005,15 +1004,8 @@ static void fjn_reset(struct net_device *dev)
     for (i = 0; i < 6; i++) 
         outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
 
-    /* Switch to bank 1 */
-    if (lp->cardtype == MBH10302)
-       outb(BANK_1, ioaddr + CONFIG_1);
-    else
-       outb(BANK_1U, ioaddr + CONFIG_1);
-
-    /* set the multicast table to accept none. */
-    for (i = 0; i < 8; i++) 
-        outb(0x00, ioaddr + MAR_ADR + i);
+    /* (re)initialize the multicast table */
+    set_rx_mode(dev);
 
     /* Switch to bank 2 (runtime mode) */
     if (lp->cardtype == MBH10302)
@@ -1264,11 +1256,11 @@ static struct net_device_stats *fjn_get_stats(struct net_device *dev)
 static void set_rx_mode(struct net_device *dev)
 {
     kio_addr_t ioaddr = dev->base_addr;
-    struct local_info_t *lp = netdev_priv(dev);
     u_char mc_filter[8];                /* Multicast hash filter */
     u_long flags;
     int i;
     
+    int saved_bank;
     int saved_config_0 = inb(ioaddr + CONFIG_0);
      
     local_irq_save(flags); 
@@ -1306,15 +1298,13 @@ static void set_rx_mode(struct net_device *dev)
        outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
     }
 
-    if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
-       int saved_bank = inb(ioaddr + CONFIG_1);
-       /* Switch to bank 1 and set the multicast table. */
-       outb(0xe4, ioaddr + CONFIG_1);
-       for (i = 0; i < 8; i++)
-           outb(mc_filter[i], ioaddr + MAR_ADR + i);
-       memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
-       outb(saved_bank, ioaddr + CONFIG_1);
-    }
+    /* Switch to bank 1 and set the multicast table. */
+    saved_bank = inb(ioaddr + CONFIG_1);
+    outb(0xe4, ioaddr + CONFIG_1);
+
+    for (i = 0; i < 8; i++)
+       outb(mc_filter[i], ioaddr + MAR_ADR + i);
+    outb(saved_bank, ioaddr + CONFIG_1);
 
     outb(saved_config_0, ioaddr + CONFIG_0);
 
index be319229f5436be46642fb782ebfc7b056f22675..8f6cf8c896a484bdd837a5ec9c894863297b2d2d 100644 (file)
@@ -1251,12 +1251,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
 
     if (memcmp(promaddr, dev->dev_addr, 6)
        || !is_valid_ether_addr(dev->dev_addr)) {
-#ifndef __powerpc__
        if (is_valid_ether_addr(promaddr)) {
-#else
-       if (!is_valid_ether_addr(dev->dev_addr)
-           && is_valid_ether_addr(promaddr)) {
-#endif
            if (pcnet32_debug & NETIF_MSG_PROBE) {
                printk(" warning: CSR address invalid,\n");
                printk(KERN_INFO "    using instead PROM address of");
index 16bebe7a7ce1fdf43c45334b826bb919d7cb9444..7da0e3dd5fe3ee44c5830761a77f7a1979e4a203 100644 (file)
 #include <asm/irq.h>
 #include <asm/uaccess.h>
 
+MODULE_DESCRIPTION("PHY library");
+MODULE_AUTHOR("Andy Fleming");
+MODULE_LICENSE("GPL");
+
 static struct phy_driver genphy_driver;
 extern int mdio_bus_init(void);
 extern void mdio_bus_exit(void);
index 50430f79f8cf8190541e47495d625cae0cd7a765..1c6d328165bb066bd132b44c1fe4d4cbbbc0a096 100644 (file)
@@ -524,9 +524,6 @@ static int get_filter(void __user *arg, struct sock_filter **p)
        if (copy_from_user(&uprog, arg, sizeof(uprog)))
                return -EFAULT;
 
-       if (uprog.len > BPF_MAXINSNS)
-               return -EINVAL;
-
        if (!uprog.len) {
                *p = NULL;
                return 0;
index a842ecc60a34000d746c7d96aff16ca1f661f3e2..9369f811075d123f245dc54bfac2a86f56607225 100644 (file)
@@ -85,7 +85,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 static int pppoe_xmit(struct ppp_channel *chan, struct sk_buff *skb);
 static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb);
 
-static struct proto_ops pppoe_ops;
+static const struct proto_ops pppoe_ops;
 static DEFINE_RWLOCK(pppoe_hash_lock);
 
 static struct ppp_channel_ops pppoe_chan_ops;
@@ -383,8 +383,6 @@ static int pppoe_rcv(struct sk_buff *skb,
 {
        struct pppoe_hdr *ph;
        struct pppox_sock *po;
-       struct sock *sk;
-       int ret;
 
        if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
                goto drop;
@@ -395,24 +393,8 @@ static int pppoe_rcv(struct sk_buff *skb,
        ph = (struct pppoe_hdr *) skb->nh.raw;
 
        po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source);
-       if (!po) 
-               goto drop;
-
-       sk = sk_pppox(po);
-       bh_lock_sock(sk);
-
-       /* Socket state is unknown, must put skb into backlog. */
-       if (sock_owned_by_user(sk) != 0) {
-               sk_add_backlog(sk, skb);
-               ret = NET_RX_SUCCESS;
-       } else {
-               ret = pppoe_rcv_core(sk, skb);
-       }
-
-       bh_unlock_sock(sk);
-       sock_put(sk);
-
-       return ret;
+       if (po != NULL) 
+               return sk_receive_skb(sk_pppox(po), skb);
 drop:
        kfree_skb(skb);
 out:
@@ -1081,9 +1063,7 @@ static int __init pppoe_proc_init(void)
 static inline int pppoe_proc_init(void) { return 0; }
 #endif /* CONFIG_PROC_FS */
 
-/* ->ioctl are set at pppox_create */
-
-static struct proto_ops pppoe_ops = {
+static const struct proto_ops pppoe_ops = {
     .family            = AF_PPPOX,
     .owner             = THIS_MODULE,
     .release           = pppoe_release,
@@ -1099,7 +1079,8 @@ static struct proto_ops pppoe_ops = {
     .getsockopt                = sock_no_getsockopt,
     .sendmsg           = pppoe_sendmsg,
     .recvmsg           = pppoe_recvmsg,
-    .mmap              = sock_no_mmap
+    .mmap              = sock_no_mmap,
+    .ioctl             = pppox_ioctl,
 };
 
 static struct pppox_proto pppoe_proto = {
index 0c1e114527fb3549feb59685ac57d41b77502529..9315046b3f5509eebea0b0207f9b36a4a4326c89 100644 (file)
@@ -68,8 +68,7 @@ EXPORT_SYMBOL(register_pppox_proto);
 EXPORT_SYMBOL(unregister_pppox_proto);
 EXPORT_SYMBOL(pppox_unbind_sock);
 
-static int pppox_ioctl(struct socket* sock, unsigned int cmd, 
-                      unsigned long arg)
+int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
        struct pppox_sock *po = pppox_sk(sk);
@@ -105,6 +104,7 @@ static int pppox_ioctl(struct socket* sock, unsigned int cmd,
        return rc;
 }
 
+EXPORT_SYMBOL(pppox_ioctl);
 
 static int pppox_create(struct socket *sock, int protocol)
 {
@@ -119,11 +119,7 @@ static int pppox_create(struct socket *sock, int protocol)
                goto out;
 
        rc = pppox_protos[protocol]->create(sock);
-       if (!rc) {
-               /* We get to set the ioctl handler. */
-               /* For everything else, pppox is just a shell. */
-               sock->ops->ioctl = pppox_ioctl;
-       }
+
        module_put(pppox_protos[protocol]->owner);
 out:
        return rc;
index e57df8dfe6b4ec29b0c81b2f71d9c5809b1fa228..89c46787676c9d9d3249597b38ce788a56fb5bc4 100644 (file)
@@ -66,7 +66,7 @@
 #include "s2io.h"
 #include "s2io-regs.h"
 
-#define DRV_VERSION "Version 2.0.9.3"
+#define DRV_VERSION "Version 2.0.9.4"
 
 /* S2io Driver name & version. */
 static char s2io_driver_name[] = "Neterion";
@@ -412,7 +412,7 @@ static int init_shared_mem(struct s2io_nic *nic)
                    config->tx_cfg[i].fifo_len - 1;
                mac_control->fifos[i].fifo_no = i;
                mac_control->fifos[i].nic = nic;
-               mac_control->fifos[i].max_txds = MAX_SKB_FRAGS + 1;
+               mac_control->fifos[i].max_txds = MAX_SKB_FRAGS + 2;
 
                for (j = 0; j < page_num; j++) {
                        int k = 0;
@@ -459,6 +459,10 @@ static int init_shared_mem(struct s2io_nic *nic)
                }
        }
 
+       nic->ufo_in_band_v = kmalloc((sizeof(u64) * size), GFP_KERNEL);
+       if (!nic->ufo_in_band_v)
+               return -ENOMEM;
+
        /* Allocation and initialization of RXDs in Rings */
        size = 0;
        for (i = 0; i < config->rx_ring_num; i++) {
@@ -731,6 +735,8 @@ static void free_shared_mem(struct s2io_nic *nic)
                                    mac_control->stats_mem,
                                    mac_control->stats_mem_phy);
        }
+       if (nic->ufo_in_band_v)
+               kfree(nic->ufo_in_band_v);
 }
 
 /**
@@ -2003,6 +2009,49 @@ static int start_nic(struct s2io_nic *nic)
 
        return SUCCESS;
 }
+/**
+ * s2io_txdl_getskb - Get the skb from txdl, unmap and return skb
+ */
+static struct sk_buff *s2io_txdl_getskb(fifo_info_t *fifo_data, TxD_t *txdlp, int get_off)
+{
+       nic_t *nic = fifo_data->nic;
+       struct sk_buff *skb;
+       TxD_t *txds;
+       u16 j, frg_cnt;
+
+       txds = txdlp;
+       if (txds->Host_Control == (u64)(long)nic->ufo_in_band_v) {
+               pci_unmap_single(nic->pdev, (dma_addr_t)
+                       txds->Buffer_Pointer, sizeof(u64),
+                       PCI_DMA_TODEVICE);
+               txds++;
+       }
+
+       skb = (struct sk_buff *) ((unsigned long)
+                       txds->Host_Control);
+       if (!skb) {
+               memset(txdlp, 0, (sizeof(TxD_t) * fifo_data->max_txds));
+               return NULL;
+       }
+       pci_unmap_single(nic->pdev, (dma_addr_t)
+                        txds->Buffer_Pointer,
+                        skb->len - skb->data_len,
+                        PCI_DMA_TODEVICE);
+       frg_cnt = skb_shinfo(skb)->nr_frags;
+       if (frg_cnt) {
+               txds++;
+               for (j = 0; j < frg_cnt; j++, txds++) {
+                       skb_frag_t *frag = &skb_shinfo(skb)->frags[j];
+                       if (!txds->Buffer_Pointer)
+                               break;
+                       pci_unmap_page(nic->pdev, (dma_addr_t) 
+                                       txds->Buffer_Pointer,
+                                      frag->size, PCI_DMA_TODEVICE);
+               }
+       }
+       txdlp->Host_Control = 0;
+       return(skb);
+}
 
 /**
  *  free_tx_buffers - Free all queued Tx buffers
@@ -2020,7 +2069,7 @@ static void free_tx_buffers(struct s2io_nic *nic)
        int i, j;
        mac_info_t *mac_control;
        struct config_param *config;
-       int cnt = 0, frg_cnt;
+       int cnt = 0;
 
        mac_control = &nic->mac_control;
        config = &nic->config;
@@ -2029,38 +2078,11 @@ static void free_tx_buffers(struct s2io_nic *nic)
                for (j = 0; j < config->tx_cfg[i].fifo_len - 1; j++) {
                        txdp = (TxD_t *) mac_control->fifos[i].list_info[j].
                            list_virt_addr;
-                       skb =
-                           (struct sk_buff *) ((unsigned long) txdp->
-                                               Host_Control);
-                       if (skb == NULL) {
-                               memset(txdp, 0, sizeof(TxD_t) *
-                                      config->max_txds);
-                               continue;
+                       skb = s2io_txdl_getskb(&mac_control->fifos[i], txdp, j);
+                       if (skb) {
+                               dev_kfree_skb(skb);
+                               cnt++;
                        }
-                       frg_cnt = skb_shinfo(skb)->nr_frags;
-                       pci_unmap_single(nic->pdev, (dma_addr_t)
-                                        txdp->Buffer_Pointer,
-                                        skb->len - skb->data_len,
-                                        PCI_DMA_TODEVICE);
-                       if (frg_cnt) {
-                               TxD_t *temp;
-                               temp = txdp;
-                               txdp++;
-                               for (j = 0; j < frg_cnt; j++, txdp++) {
-                                       skb_frag_t *frag =
-                                           &skb_shinfo(skb)->frags[j];
-                                       pci_unmap_page(nic->pdev,
-                                                      (dma_addr_t)
-                                                      txdp->
-                                                      Buffer_Pointer,
-                                                      frag->size,
-                                                      PCI_DMA_TODEVICE);
-                               }
-                               txdp = temp;
-                       }
-                       dev_kfree_skb(skb);
-                       memset(txdp, 0, sizeof(TxD_t) * config->max_txds);
-                       cnt++;
                }
                DBG_PRINT(INTR_DBG,
                          "%s:forcibly freeing %d skbs on FIFO%d\n",
@@ -2661,7 +2683,6 @@ static void tx_intr_handler(fifo_info_t *fifo_data)
        tx_curr_get_info_t get_info, put_info;
        struct sk_buff *skb;
        TxD_t *txdlp;
-       u16 j, frg_cnt;
 
        get_info = fifo_data->tx_curr_get_info;
        put_info = fifo_data->tx_curr_put_info;
@@ -2684,8 +2705,7 @@ to loss of link\n");
                        }
                }
 
-               skb = (struct sk_buff *) ((unsigned long)
-                               txdlp->Host_Control);
+               skb = s2io_txdl_getskb(fifo_data, txdlp, get_info.offset);
                if (skb == NULL) {
                        DBG_PRINT(ERR_DBG, "%s: Null skb ",
                        __FUNCTION__);
@@ -2693,34 +2713,6 @@ to loss of link\n");
                        return;
                }
 
-               frg_cnt = skb_shinfo(skb)->nr_frags;
-               nic->tx_pkt_count++;
-
-               pci_unmap_single(nic->pdev, (dma_addr_t)
-                                txdlp->Buffer_Pointer,
-                                skb->len - skb->data_len,
-                                PCI_DMA_TODEVICE);
-               if (frg_cnt) {
-                       TxD_t *temp;
-                       temp = txdlp;
-                       txdlp++;
-                       for (j = 0; j < frg_cnt; j++, txdlp++) {
-                               skb_frag_t *frag =
-                                   &skb_shinfo(skb)->frags[j];
-                               if (!txdlp->Buffer_Pointer)
-                                       break;
-                               pci_unmap_page(nic->pdev,
-                                              (dma_addr_t)
-                                              txdlp->
-                                              Buffer_Pointer,
-                                              frag->size,
-                                              PCI_DMA_TODEVICE);
-                       }
-                       txdlp = temp;
-               }
-               memset(txdlp, 0,
-                      (sizeof(TxD_t) * fifo_data->max_txds));
-
                /* Updating the statistics block */
                nic->stats.tx_bytes += skb->len;
                dev_kfree_skb_irq(skb);
@@ -3078,7 +3070,7 @@ int s2io_set_swapper(nic_t * sp)
 
 static int wait_for_msix_trans(nic_t *nic, int i)
 {
-       XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+       XENA_dev_config_t __iomem *bar0 = nic->bar0;
        u64 val64;
        int ret = 0, cnt = 0;
 
@@ -3099,7 +3091,7 @@ static int wait_for_msix_trans(nic_t *nic, int i)
 
 void restore_xmsi_data(nic_t *nic)
 {
-       XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+       XENA_dev_config_t __iomem *bar0 = nic->bar0;
        u64 val64;
        int i;
 
@@ -3117,7 +3109,7 @@ void restore_xmsi_data(nic_t *nic)
 
 static void store_xmsi_data(nic_t *nic)
 {
-       XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+       XENA_dev_config_t __iomem *bar0 = nic->bar0;
        u64 val64, addr, data;
        int i;
 
@@ -3140,7 +3132,7 @@ static void store_xmsi_data(nic_t *nic)
 
 int s2io_enable_msi(nic_t *nic)
 {
-       XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+       XENA_dev_config_t __iomem *bar0 = nic->bar0;
        u16 msi_ctrl, msg_val;
        struct config_param *config = &nic->config;
        struct net_device *dev = nic->dev;
@@ -3190,7 +3182,7 @@ int s2io_enable_msi(nic_t *nic)
 
 int s2io_enable_msi_x(nic_t *nic)
 {
-       XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+       XENA_dev_config_t __iomem *bar0 = nic->bar0;
        u64 tx_mat, rx_mat;
        u16 msi_control; /* Temp variable */
        int ret, i, j, msix_indx = 1;
@@ -3331,7 +3323,7 @@ failed\n", dev->name);
                                          s2io_msix_fifo_handle, 0, sp->desc1,
                                          sp->s2io_entries[i].arg);
                                DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc1, 
-                                                       sp->msix_info[i].addr);
+                                   (unsigned long long)sp->msix_info[i].addr);
                        } else {
                                sprintf(sp->desc2, "%s:MSI-X-%d-RX",
                                        dev->name, i);
@@ -3339,7 +3331,7 @@ failed\n", dev->name);
                                          s2io_msix_ring_handle, 0, sp->desc2,
                                          sp->s2io_entries[i].arg);
                                DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc2, 
-                                                       sp->msix_info[i].addr);
+                                    (unsigned long long)sp->msix_info[i].addr);
                        }
                        if (err) {
                                DBG_PRINT(ERR_DBG, "%s: MSI-X-%d registration \
@@ -3527,6 +3519,8 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
                return 0;
        }
 
+       txdp->Control_1 = 0;
+       txdp->Control_2 = 0;
 #ifdef NETIF_F_TSO
        mss = skb_shinfo(skb)->tso_size;
        if (mss) {
@@ -3534,19 +3528,13 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
                txdp->Control_1 |= TXD_TCP_LSO_MSS(mss);
        }
 #endif
-
-       frg_cnt = skb_shinfo(skb)->nr_frags;
-       frg_len = skb->len - skb->data_len;
-
-       txdp->Buffer_Pointer = pci_map_single
-           (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE);
-       txdp->Host_Control = (unsigned long) skb;
        if (skb->ip_summed == CHECKSUM_HW) {
                txdp->Control_2 |=
                    (TXD_TX_CKO_IPV4_EN | TXD_TX_CKO_TCP_EN |
                     TXD_TX_CKO_UDP_EN);
        }
-
+       txdp->Control_1 |= TXD_GATHER_CODE_FIRST;
+       txdp->Control_1 |= TXD_LIST_OWN_XENA;
        txdp->Control_2 |= config->tx_intr_type;
 
        if (sp->vlgrp && vlan_tx_tag_present(skb)) {
@@ -3554,10 +3542,40 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
                txdp->Control_2 |= TXD_VLAN_TAG(vlan_tag);
        }
 
-       txdp->Control_1 |= (TXD_BUFFER0_SIZE(frg_len) |
-                           TXD_GATHER_CODE_FIRST);
-       txdp->Control_1 |= TXD_LIST_OWN_XENA;
+       frg_len = skb->len - skb->data_len;
+       if (skb_shinfo(skb)->ufo_size) {
+               int ufo_size;
+
+               ufo_size = skb_shinfo(skb)->ufo_size;
+               ufo_size &= ~7;
+               txdp->Control_1 |= TXD_UFO_EN;
+               txdp->Control_1 |= TXD_UFO_MSS(ufo_size);
+               txdp->Control_1 |= TXD_BUFFER0_SIZE(8);
+#ifdef __BIG_ENDIAN
+               sp->ufo_in_band_v[put_off] =
+                               (u64)skb_shinfo(skb)->ip6_frag_id;
+#else
+               sp->ufo_in_band_v[put_off] =
+                               (u64)skb_shinfo(skb)->ip6_frag_id << 32;
+#endif
+               txdp->Host_Control = (unsigned long)sp->ufo_in_band_v;
+               txdp->Buffer_Pointer = pci_map_single(sp->pdev,
+                                       sp->ufo_in_band_v,
+                                       sizeof(u64), PCI_DMA_TODEVICE);
+               txdp++;
+               txdp->Control_1 = 0;
+               txdp->Control_2 = 0;
+       }
 
+       txdp->Buffer_Pointer = pci_map_single
+           (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE);
+       txdp->Host_Control = (unsigned long) skb;
+       txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len);
+
+       if (skb_shinfo(skb)->ufo_size)
+               txdp->Control_1 |= TXD_UFO_EN;
+
+       frg_cnt = skb_shinfo(skb)->nr_frags;
        /* For fragmented SKB. */
        for (i = 0; i < frg_cnt; i++) {
                skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
@@ -3569,9 +3587,14 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
                    (sp->pdev, frag->page, frag->page_offset,
                     frag->size, PCI_DMA_TODEVICE);
                txdp->Control_1 |= TXD_BUFFER0_SIZE(frag->size);
+               if (skb_shinfo(skb)->ufo_size)
+                       txdp->Control_1 |= TXD_UFO_EN;
        }
        txdp->Control_1 |= TXD_GATHER_CODE_LAST;
 
+       if (skb_shinfo(skb)->ufo_size)
+               frg_cnt++; /* as Txd0 was used for inband header */
+
        tx_fifo = mac_control->tx_FIFO_start[queue];
        val64 = mac_control->fifos[queue].list_info[put_off].list_phy_addr;
        writeq(val64, &tx_fifo->TxDL_Pointer);
@@ -3583,6 +3606,8 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
        if (mss)
                val64 |= TX_FIFO_SPECIAL_FUNC;
 #endif
+       if (skb_shinfo(skb)->ufo_size)
+               val64 |= TX_FIFO_SPECIAL_FUNC;
        writeq(val64, &tx_fifo->List_Control);
 
        mmiowb();
@@ -4721,7 +4746,10 @@ static int s2io_eeprom_test(nic_t * sp, uint64_t * data)
                fail = 1;
 
        if (ret_data != 0x012345) {
-               DBG_PRINT(ERR_DBG, "%s: eeprom test error at offset 0x4F0. Data written %llx Data read %llx\n", dev->name, (u64)0x12345, ret_data); 
+               DBG_PRINT(ERR_DBG, "%s: eeprom test error at offset 0x4F0. "
+                       "Data written %llx Data read %llx\n",
+                       dev->name, (unsigned long long)0x12345,
+                       (unsigned long long)ret_data);
                fail = 1;
        }
 
@@ -4740,7 +4768,10 @@ static int s2io_eeprom_test(nic_t * sp, uint64_t * data)
                fail = 1;
 
        if (ret_data != 0x012345) {
-               DBG_PRINT(ERR_DBG, "%s: eeprom test error at offset 0x7F0. Data written %llx Data read %llx\n", dev->name, (u64)0x12345, ret_data); 
+               DBG_PRINT(ERR_DBG, "%s: eeprom test error at offset 0x7F0. "
+                       "Data written %llx Data read %llx\n",
+                       dev->name, (unsigned long long)0x12345,
+                       (unsigned long long)ret_data);
                fail = 1;
        }
 
@@ -5190,6 +5221,8 @@ static struct ethtool_ops netdev_ethtool_ops = {
        .get_tso = ethtool_op_get_tso,
        .set_tso = ethtool_op_set_tso,
 #endif
+       .get_ufo = ethtool_op_get_ufo,
+       .set_ufo = ethtool_op_set_ufo,
        .self_test_count = s2io_ethtool_self_test_count,
        .self_test = s2io_ethtool_test,
        .get_strings = s2io_ethtool_get_strings,
@@ -5941,7 +5974,8 @@ Defaulting to INTA\n");
                        break;
                }
        }
-       config->max_txds = MAX_SKB_FRAGS + 1;
+       /* + 2 because one Txd for skb->data and one Txd for UFO */
+       config->max_txds = MAX_SKB_FRAGS + 2;
 
        /* Rx side parameters. */
        if (rx_ring_sz[0] == 0)
@@ -6035,6 +6069,10 @@ Defaulting to INTA\n");
 #ifdef NETIF_F_TSO
        dev->features |= NETIF_F_TSO;
 #endif
+       if (sp->device_type & XFRAME_II_DEVICE) {
+               dev->features |= NETIF_F_UFO;
+               dev->features |= NETIF_F_HW_CSUM;
+       }
 
        dev->tx_timeout = &s2io_tx_watchdog;
        dev->watchdog_timeo = WATCH_DOG_TIMEOUT;
index 419aad7f10e7c357c469904ca56cea95295daf3b..852a6a899d07cd5d1d9a79b7b724ce447daf5991 100644 (file)
@@ -393,7 +393,9 @@ typedef struct _TxD {
 #define TXD_GATHER_CODE_LAST    BIT(23)
 #define TXD_TCP_LSO_EN          BIT(30)
 #define TXD_UDP_COF_EN          BIT(31)
+#define TXD_UFO_EN             BIT(31) | BIT(30)
 #define TXD_TCP_LSO_MSS(val)    vBIT(val,34,14)
+#define TXD_UFO_MSS(val)       vBIT(val,34,14)
 #define TXD_BUFFER0_SIZE(val)   vBIT(val,48,16)
 
        u64 Control_2;
@@ -789,6 +791,7 @@ struct s2io_nic {
 
        spinlock_t      rx_lock;
        atomic_t        isr_cnt;
+       u64 *ufo_in_band_v;
 };
 
 #define RESET_ERROR 1;
index 1d4d88680db197cb1caa0660360db9001c140090..3d95fa20cd883e969cb3b138f8edb0a07a06c815 100644 (file)
@@ -1,6 +1,6 @@
 /* sis900.c: A SiS 900/7016 PCI Fast Ethernet driver for Linux.
    Copyright 1999 Silicon Integrated System Corporation 
-   Revision:   1.08.08 Jan. 22 2005
+   Revision:   1.08.09 Sep. 19 2005
    
    Modified from the driver which is originally written by Donald Becker.
    
@@ -17,6 +17,7 @@
    SiS 7014 Single Chip 100BASE-TX/10BASE-T Physical Layer Solution,
    preliminary Rev. 1.0 Jan. 18, 1998
 
+   Rev 1.08.09 Sep. 19 2005 Daniele Venzano add Wake on LAN support
    Rev 1.08.08 Jan. 22 2005 Daniele Venzano use netif_msg for debugging messages
    Rev 1.08.07 Nov.  2 2003 Daniele Venzano <webvenza@libero.it> add suspend/resume support
    Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support
@@ -76,7 +77,7 @@
 #include "sis900.h"
 
 #define SIS900_MODULE_NAME "sis900"
-#define SIS900_DRV_VERSION "v1.08.08 Jan. 22 2005"
+#define SIS900_DRV_VERSION "v1.08.09 Sep. 19 2005"
 
 static char version[] __devinitdata =
 KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n";
@@ -538,6 +539,11 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
                printk("%2.2x:", (u8)net_dev->dev_addr[i]);
        printk("%2.2x.\n", net_dev->dev_addr[i]);
 
+       /* Detect Wake on Lan support */
+       ret = inl(CFGPMC & PMESP);
+       if (netif_msg_probe(sis_priv) && (ret & PME_D3C) == 0)
+               printk(KERN_INFO "%s: Wake on LAN only available from suspend to RAM.", net_dev->name);
+
        return 0;
 
  err_unmap_rx:
@@ -2015,6 +2021,67 @@ static int sis900_nway_reset(struct net_device *net_dev)
        return mii_nway_restart(&sis_priv->mii_info);
 }
 
+/**
+ *     sis900_set_wol - Set up Wake on Lan registers
+ *     @net_dev: the net device to probe
+ *     @wol: container for info passed to the driver
+ *
+ *     Process ethtool command "wol" to setup wake on lan features.
+ *     SiS900 supports sending WoL events if a correct packet is received,
+ *     but there is no simple way to filter them to only a subset (broadcast,
+ *     multicast, unicast or arp).
+ */
+static int sis900_set_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol)
+{
+       struct sis900_private *sis_priv = net_dev->priv;
+       long pmctrl_addr = net_dev->base_addr + pmctrl;
+       u32 cfgpmcsr = 0, pmctrl_bits = 0;
+
+       if (wol->wolopts == 0) {
+               pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
+               cfgpmcsr |= ~PME_EN;
+               pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr);
+               outl(pmctrl_bits, pmctrl_addr);
+               if (netif_msg_wol(sis_priv))
+                       printk(KERN_DEBUG "%s: Wake on LAN disabled\n", net_dev->name);
+               return 0;
+       }
+
+       if (wol->wolopts & (WAKE_MAGICSECURE | WAKE_UCAST | WAKE_MCAST
+                               | WAKE_BCAST | WAKE_ARP))
+               return -EINVAL;
+
+       if (wol->wolopts & WAKE_MAGIC)
+               pmctrl_bits |= MAGICPKT;
+       if (wol->wolopts & WAKE_PHY)
+               pmctrl_bits |= LINKON;
+       
+       outl(pmctrl_bits, pmctrl_addr);
+
+       pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
+       cfgpmcsr |= PME_EN;
+       pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr);
+       if (netif_msg_wol(sis_priv))
+               printk(KERN_DEBUG "%s: Wake on LAN enabled\n", net_dev->name);
+
+       return 0;
+}
+
+static void sis900_get_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol)
+{
+       long pmctrl_addr = net_dev->base_addr + pmctrl;
+       u32 pmctrl_bits;
+
+       pmctrl_bits = inl(pmctrl_addr);
+       if (pmctrl_bits & MAGICPKT)
+               wol->wolopts |= WAKE_MAGIC;
+       if (pmctrl_bits & LINKON)
+               wol->wolopts |= WAKE_PHY;
+
+       wol->supported = (WAKE_PHY | WAKE_MAGIC);
+}
+
 static struct ethtool_ops sis900_ethtool_ops = {
        .get_drvinfo    = sis900_get_drvinfo,
        .get_msglevel   = sis900_get_msglevel,
@@ -2023,6 +2090,8 @@ static struct ethtool_ops sis900_ethtool_ops = {
        .get_settings   = sis900_get_settings,
        .set_settings   = sis900_set_settings,
        .nway_reset     = sis900_nway_reset,
+       .get_wol        = sis900_get_wol,
+       .set_wol        = sis900_set_wol
 };
 
 /**
index de3c06735d15eab202779adcd714473b5e4844f7..4233ea55670f53e05f9bcc7fd4f2f1e6fba88e6f 100644 (file)
@@ -33,6 +33,7 @@ enum sis900_registers {
         rxcfg=0x34,             //Receive Configuration Register
         flctrl=0x38,            //Flow Control Register
         rxlen=0x3c,             //Receive Packet Length Register
+        cfgpmcsr=0x44,          //Configuration Power Management Control/Status Register
         rfcr=0x48,              //Receive Filter Control Register
         rfdr=0x4C,              //Receive Filter Data Register
         pmctrl=0xB0,            //Power Management Control Register
@@ -140,6 +141,50 @@ enum sis96x_eeprom_command {
        EEREQ = 0x00000400, EEDONE = 0x00000200, EEGNT = 0x00000100
 };
 
+/* PCI Registers */
+enum sis900_pci_registers {
+       CFGPMC   = 0x40,
+       CFGPMCSR = 0x44
+};
+
+/* Power management capabilities bits */
+enum sis900_cfgpmc_register_bits {
+       PMVER   = 0x00070000, 
+       DSI     = 0x00100000,
+       PMESP   = 0xf8000000
+};
+
+enum sis900_pmesp_bits {
+       PME_D0 = 0x1,
+       PME_D1 = 0x2,
+       PME_D2 = 0x4,
+       PME_D3H = 0x8,
+       PME_D3C = 0x10
+};
+
+/* Power management control/status bits */
+enum sis900_cfgpmcsr_register_bits {
+       PMESTS = 0x00004000,
+       PME_EN = 0x00000100, // Power management enable
+       PWR_STA = 0x00000003 // Current power state
+};
+
+/* Wake-on-LAN support. */
+enum sis900_power_management_control_register_bits {
+       LINKLOSS  = 0x00000001,
+       LINKON    = 0x00000002,
+       MAGICPKT  = 0x00000400,
+       ALGORITHM = 0x00000800,
+       FRM1EN    = 0x00100000,
+       FRM2EN    = 0x00200000,
+       FRM3EN    = 0x00400000,
+       FRM1ACS   = 0x01000000,
+       FRM2ACS   = 0x02000000,
+       FRM3ACS   = 0x04000000,
+       WAKEALL   = 0x40000000,
+       GATECLK   = 0x80000000
+};
+
 /* Management Data I/O (mdio) frame */
 #define MIIread         0x6000
 #define MIIwrite        0x5002
index 6783039ffb757123b079151cfbe69d6c0ca608f4..afd900d5d730e81d32353ecd5882415ab6047d48 100644 (file)
@@ -26,9 +26,7 @@ sk98lin-objs    :=    \
                skrlmt.o        \
                sktimer.o       \
                skvpd.o         \
-               skxmac2.o       \
-               skproc.o        \
-               skcsum.o
+               skxmac2.o
 
 # DBGDEF =  \
 # -DDEBUG
@@ -77,7 +75,7 @@ endif
 # SK_DBGCAT_DRV_INT_SRC         0x04000000      interrupts sources
 # SK_DBGCAT_DRV_EVENT           0x08000000      driver events
 
-EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM)
+EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM)
 
 clean:
        rm -f core *.o *.a *.s
index 542cec57f86a30b129adc3f62b710670c2424972..778d9e618ebd545b3349fffca86369b99c65a36d 100644 (file)
@@ -60,7 +60,6 @@ extern SK_U64         SkOsGetTime(SK_AC*);
 extern int             SkPciReadCfgDWord(SK_AC*, int, SK_U32*);
 extern int             SkPciReadCfgWord(SK_AC*, int, SK_U16*);
 extern int             SkPciReadCfgByte(SK_AC*, int, SK_U8*);
-extern int             SkPciWriteCfgDWord(SK_AC*, int, SK_U32);
 extern int             SkPciWriteCfgWord(SK_AC*, int, SK_U16);
 extern int             SkPciWriteCfgByte(SK_AC*, int, SK_U8);
 extern int             SkDrvEvent(SK_AC*, SK_IOC IoC, SK_U32, SK_EVPARA);
@@ -268,8 +267,6 @@ typedef struct s_DevNet DEV_NET;
 struct s_DevNet {
        int             PortNr;
        int             NetNr;
-       int             Mtu;
-       int             Up;
        SK_AC   *pAC;
 };  
 
@@ -298,6 +295,7 @@ struct s_RxPort {
        RXD             *pRxdRingTail;  /* Tail of Rx rings */
        RXD             *pRxdRingPrev;  /* descriptor given to BMU previously */
        int             RxdRingFree;    /* # of free entrys */
+       int             RxCsum;         /* use receive checksum hardware */
        spinlock_t      RxDesRingLock;  /* serialize descriptor accesses */
        int             RxFillLimit;    /* limit for buffers in ring */
        SK_IOC          HwAddr;         /* bmu registers address */
@@ -390,12 +388,10 @@ struct s_AC  {
        
        SK_IOC          IoBase;         /* register set of adapter */
        int             BoardLevel;     /* level of active hw init (0-2) */
-       char            DeviceStr[80];  /* adapter string from vpd */
+
        SK_U32          AllocFlag;      /* flag allocation of resources */
        struct pci_dev  *PciDev;        /* for access to pci config space */
-       SK_U32          PciDevId;       /* pci device id */
        struct SK_NET_DEVICE    *dev[2];        /* pointer to device struct */
-       char            Name[30];       /* driver name */
 
        int             RxBufSize;      /* length of receive buffers */
         struct net_device_stats stats; /* linux 'netstat -i' statistics */
@@ -425,16 +421,11 @@ struct s_AC  {
        TX_PORT         TxPort[SK_MAX_MACS][2];
        RX_PORT         RxPort[SK_MAX_MACS];
 
-       unsigned int    CsOfs1;         /* for checksum calculation */
-       unsigned int    CsOfs2;         /* for checksum calculation */
-       SK_U32          CsOfs;          /* for checksum calculation */
-
        SK_BOOL         CheckQueue;     /* check event queue soon */
        SK_TIMER        DrvCleanupTimer;/* to check for pending descriptors */
        DIM_INFO        DynIrqModInfo;  /* all data related to DIM */
 
        /* Only for tests */
-       int             PortUp;
        int             PortDown;
        int             ChipsetType;    /*  Chipset family type 
                                         *  0 == Genesis family support
index bdc1a5eaaae9610533bcbffaffeecd83a01f425d..daa9a8d154fca28f3c23ae824a24c10415094093 100644 (file)
@@ -130,14 +130,12 @@ typedef   struct s_vpd_key {
 #ifndef VPD_DO_IO
 #define VPD_OUT8(pAC,IoC,Addr,Val)     (void)SkPciWriteCfgByte(pAC,Addr,Val)
 #define VPD_OUT16(pAC,IoC,Addr,Val)    (void)SkPciWriteCfgWord(pAC,Addr,Val)
-#define VPD_OUT32(pAC,IoC,Addr,Val)    (void)SkPciWriteCfgDWord(pAC,Addr,Val)
 #define VPD_IN8(pAC,IoC,Addr,pVal)     (void)SkPciReadCfgByte(pAC,Addr,pVal)
 #define VPD_IN16(pAC,IoC,Addr,pVal)    (void)SkPciReadCfgWord(pAC,Addr,pVal)
 #define VPD_IN32(pAC,IoC,Addr,pVal)    (void)SkPciReadCfgDWord(pAC,Addr,pVal)
 #else  /* VPD_DO_IO */
 #define VPD_OUT8(pAC,IoC,Addr,Val)     SK_OUT8(IoC,PCI_C(Addr),Val)
 #define VPD_OUT16(pAC,IoC,Addr,Val)    SK_OUT16(IoC,PCI_C(Addr),Val)
-#define VPD_OUT32(pAC,IoC,Addr,Val)    SK_OUT32(IoC,PCI_C(Addr),Val)
 #define VPD_IN8(pAC,IoC,Addr,pVal)     SK_IN8(IoC,PCI_C(Addr),pVal)
 #define VPD_IN16(pAC,IoC,Addr,pVal)    SK_IN16(IoC,PCI_C(Addr),pVal)
 #define VPD_IN32(pAC,IoC,Addr,pVal)    SK_IN32(IoC,PCI_C(Addr),pVal)
@@ -155,12 +153,6 @@ typedef    struct s_vpd_key {
                else                                            \
                        SK_OUT16(pAC,PCI_C(Addr),Val);          \
                }
-#define VPD_OUT32(pAC,Ioc,Addr,Val) {                  \
-               if ((pAC)->DgT.DgUseCfgCycle)                   \
-                       SkPciWriteCfgDWord(pAC,Addr,Val);       \
-               else                                            \
-                       SK_OUT32(pAC,PCI_C(Addr),Val);          \
-               }
 #define VPD_IN8(pAC,Ioc,Addr,pVal) {                   \
                if ((pAC)->DgT.DgUseCfgCycle)                   \
                        SkPciReadCfgByte(pAC,Addr,pVal);        \
diff --git a/drivers/net/sk98lin/skcsum.c b/drivers/net/sk98lin/skcsum.c
deleted file mode 100644 (file)
index 38a6e7a..0000000
+++ /dev/null
@@ -1,871 +0,0 @@
-/******************************************************************************
- *
- * Name:       skcsum.c
- * Project:    GEnesis, PCI Gigabit Ethernet Adapter
- * Version:    $Revision: 1.12 $
- * Date:       $Date: 2003/08/20 13:55:53 $
- * Purpose:    Store/verify Internet checksum in send/receive packets.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *     (C)Copyright 1998-2003 SysKonnect GmbH.
- *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     The information in this file is provided "AS IS" without warranty.
- *
- ******************************************************************************/
-
-#ifdef SK_USE_CSUM     /* Check if CSUM is to be used. */
-
-#ifndef lint
-static const char SysKonnectFileId[] =
-       "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect.";
-#endif /* !lint */
-
-/******************************************************************************
- *
- * Description:
- *
- * This is the "GEnesis" common module "CSUM".
- *
- * This module contains the code necessary to calculate, store, and verify the
- * Internet Checksum of IP, TCP, and UDP frames.
- *
- * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon"
- * and is the code name of this SysKonnect project.
- *
- * Compilation Options:
- *
- *     SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an
- *     empty module.
- *
- *     SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id
- *     definitions. In this case, all SKCS_PROTO_xxx definitions must be made
- *     external.
- *
- *     SKCS_OVERWRITE_STATUS - Define to overwrite the default return status
- *     definitions. In this case, all SKCS_STATUS_xxx definitions must be made
- *     external.
- *
- * Include File Hierarchy:
- *
- *     "h/skdrv1st.h"
- *     "h/skcsum.h"
- *     "h/sktypes.h"
- *     "h/skqueue.h"
- *     "h/skdrv2nd.h"
- *
- ******************************************************************************/
-
-#include "h/skdrv1st.h"
-#include "h/skcsum.h"
-#include "h/skdrv2nd.h"
-
-/* defines ********************************************************************/
-
-/* The size of an Ethernet MAC header. */
-#define SKCS_ETHERNET_MAC_HEADER_SIZE                  (6+6+2)
-
-/* The size of the used topology's MAC header. */
-#define        SKCS_MAC_HEADER_SIZE    SKCS_ETHERNET_MAC_HEADER_SIZE
-
-/* The size of the IP header without any option fields. */
-#define SKCS_IP_HEADER_SIZE                                            20
-
-/*
- * Field offsets within the IP header.
- */
-
-/* "Internet Header Version" and "Length". */
-#define SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH  0
-
-/* "Total Length". */
-#define SKCS_OFS_IP_TOTAL_LENGTH                               2
-
-/* "Flags" "Fragment Offset". */
-#define SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET  6
-
-/* "Next Level Protocol" identifier. */
-#define SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL                        9
-
-/* Source IP address. */
-#define SKCS_OFS_IP_SOURCE_ADDRESS                             12
-
-/* Destination IP address. */
-#define SKCS_OFS_IP_DESTINATION_ADDRESS                        16
-
-
-/*
- * Field offsets within the UDP header.
- */
-
-/* UDP checksum. */
-#define SKCS_OFS_UDP_CHECKSUM                                  6
-
-/* IP "Next Level Protocol" identifiers (see RFC 790). */
-#define SKCS_PROTO_ID_TCP              6       /* Transport Control Protocol */
-#define SKCS_PROTO_ID_UDP              17      /* User Datagram Protocol */
-
-/* IP "Don't Fragment" bit. */
-#define SKCS_IP_DONT_FRAGMENT  SKCS_HTON16(0x4000)
-
-/* Add a byte offset to a pointer. */
-#define SKCS_IDX(pPtr, Ofs)    ((void *) ((char *) (pPtr) + (Ofs)))
-
-/*
- * Macros that convert host to network representation and vice versa, i.e.
- * little/big endian conversion on little endian machines only.
- */
-#ifdef SK_LITTLE_ENDIAN
-#define SKCS_HTON16(Val16)     (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8))
-#endif /* SK_LITTLE_ENDIAN */
-#ifdef SK_BIG_ENDIAN
-#define SKCS_HTON16(Val16)     (Val16)
-#endif /* SK_BIG_ENDIAN */
-#define SKCS_NTOH16(Val16)     SKCS_HTON16(Val16)
-
-/* typedefs *******************************************************************/
-
-/* function prototypes ********************************************************/
-
-/******************************************************************************
- *
- *     SkCsGetSendInfo - get checksum information for a send packet
- *
- * Description:
- *     Get all checksum information necessary to send a TCP or UDP packet. The
- *     function checks the IP header passed to it. If the high-level protocol
- *     is either TCP or UDP the pseudo header checksum is calculated and
- *     returned.
- *
- *     The function returns the total length of the IP header (including any
- *     IP option fields), which is the same as the start offset of the IP data
- *     which in turn is the start offset of the TCP or UDP header.
- *
- *     The function also returns the TCP or UDP pseudo header checksum, which
- *     should be used as the start value for the hardware checksum calculation.
- *     (Note that any actual pseudo header checksum can never calculate to
- *     zero.)
- *
- * Note:
- *     There is a bug in the GENESIS ASIC which may lead to wrong checksums.
- *
- * Arguments:
- *     pAc - A pointer to the adapter context struct.
- *
- *     pIpHeader - Pointer to IP header. Must be at least the IP header *not*
- *     including any option fields, i.e. at least 20 bytes.
- *
- *     Note: This pointer will be used to address 8-, 16-, and 32-bit
- *     variables with the respective alignment offsets relative to the pointer.
- *     Thus, the pointer should point to a 32-bit aligned address. If the
- *     target system cannot address 32-bit variables on non 32-bit aligned
- *     addresses, then the pointer *must* point to a 32-bit aligned address.
- *
- *     pPacketInfo - A pointer to the packet information structure for this
- *     packet. Before calling this SkCsGetSendInfo(), the following field must
- *     be initialized:
- *
- *             ProtocolFlags - Initialize with any combination of
- *             SKCS_PROTO_XXX bit flags. SkCsGetSendInfo() will only work on
- *             the protocols specified here. Any protocol(s) not specified
- *             here will be ignored.
- *
- *             Note: Only one checksum can be calculated in hardware. Thus, if
- *             SKCS_PROTO_IP is specified in the 'ProtocolFlags',
- *             SkCsGetSendInfo() must calculate the IP header checksum in
- *             software. It might be a better idea to have the calling
- *             protocol stack calculate the IP header checksum.
- *
- * Returns: N/A
- *     On return, the following fields in 'pPacketInfo' may or may not have
- *     been filled with information, depending on the protocol(s) found in the
- *     packet:
- *
- *     ProtocolFlags - Returns the SKCS_PROTO_XXX bit flags of the protocol(s)
- *     that were both requested by the caller and actually found in the packet.
- *     Protocol(s) not specified by the caller and/or not found in the packet
- *     will have their respective SKCS_PROTO_XXX bit flags reset.
- *
- *     Note: For IP fragments, TCP and UDP packet information is ignored.
- *
- *     IpHeaderLength - The total length in bytes of the complete IP header
- *     including any option fields is returned here. This is the start offset
- *     of the IP data, i.e. the TCP or UDP header if present.
- *
- *     IpHeaderChecksum - If IP has been specified in the 'ProtocolFlags', the
- *     16-bit Internet Checksum of the IP header is returned here. This value
- *     is to be stored into the packet's 'IP Header Checksum' field.
- *
- *     PseudoHeaderChecksum - If this is a TCP or UDP packet and if TCP or UDP
- *     has been specified in the 'ProtocolFlags', the 16-bit Internet Checksum
- *     of the TCP or UDP pseudo header is returned here.
- */
-void SkCsGetSendInfo(
-SK_AC                          *pAc,                   /* Adapter context struct. */
-void                           *pIpHeader,             /* IP header. */
-SKCS_PACKET_INFO       *pPacketInfo,   /* Packet information struct. */
-int                                    NetNumber)              /* Net number */
-{
-       /* Internet Header Version found in IP header. */
-       unsigned InternetHeaderVersion;
-
-       /* Length of the IP header as found in IP header. */
-       unsigned IpHeaderLength;
-
-       /* Bit field specifiying the desired/found protocols. */
-       unsigned ProtocolFlags;
-
-       /* Next level protocol identifier found in IP header. */
-       unsigned NextLevelProtocol;
-
-       /* Length of IP data portion. */
-       unsigned IpDataLength;
-
-       /* TCP/UDP pseudo header checksum. */
-       unsigned long PseudoHeaderChecksum;
-
-       /* Pointer to next level protocol statistics structure. */
-       SKCS_PROTO_STATS *NextLevelProtoStats;
-
-       /* Temporary variable. */
-       unsigned Tmp;
-
-       Tmp = *(SK_U8 *)
-               SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH);
-
-       /* Get the Internet Header Version (IHV). */
-       /* Note: The IHV is stored in the upper four bits. */
-
-       InternetHeaderVersion = Tmp >> 4;
-
-       /* Check the Internet Header Version. */
-       /* Note: We currently only support IP version 4. */
-
-       if (InternetHeaderVersion != 4) {       /* IPv4? */
-               SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX,
-                       ("Tx: Unknown Internet Header Version %u.\n",
-                       InternetHeaderVersion));
-               pPacketInfo->ProtocolFlags = 0;
-               pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++;
-               return;
-       }
-
-       /* Get the IP header length (IHL). */
-       /*
-        * Note: The IHL is stored in the lower four bits as the number of
-        * 4-byte words.
-        */
-
-       IpHeaderLength = (Tmp & 0xf) * 4;
-       pPacketInfo->IpHeaderLength = IpHeaderLength;
-
-       /* Check the IP header length. */
-
-       /* 04-Aug-1998 sw - Really check the IHL? Necessary? */
-
-       if (IpHeaderLength < 5*4) {
-               SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX,
-                       ("Tx: Invalid IP Header Length %u.\n", IpHeaderLength));
-               pPacketInfo->ProtocolFlags = 0;
-               pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++;
-               return;
-       }
-
-       /* This is an IPv4 frame with a header of valid length. */
-
-       pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxOkCts++;
-
-       /* Check if we should calculate the IP header checksum. */
-
-       ProtocolFlags = pPacketInfo->ProtocolFlags;
-
-       if (ProtocolFlags & SKCS_PROTO_IP) {
-               pPacketInfo->IpHeaderChecksum =
-                       SkCsCalculateChecksum(pIpHeader, IpHeaderLength);
-       }
-
-       /* Get the next level protocol identifier. */
-
-       NextLevelProtocol =
-               *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL);
-
-       /*
-        * Check if this is a TCP or UDP frame and if we should calculate the
-        * TCP/UDP pseudo header checksum.
-        *
-        * Also clear all protocol bit flags of protocols not present in the
-        * frame.
-        */
-
-       if ((ProtocolFlags & SKCS_PROTO_TCP) != 0 &&
-               NextLevelProtocol == SKCS_PROTO_ID_TCP) {
-               /* TCP/IP frame. */
-               ProtocolFlags &= SKCS_PROTO_TCP | SKCS_PROTO_IP;
-               NextLevelProtoStats =
-                       &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP];
-       }
-       else if ((ProtocolFlags & SKCS_PROTO_UDP) != 0 &&
-               NextLevelProtocol == SKCS_PROTO_ID_UDP) {
-               /* UDP/IP frame. */
-               ProtocolFlags &= SKCS_PROTO_UDP | SKCS_PROTO_IP;
-               NextLevelProtoStats =
-                       &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP];
-       }
-       else {
-               /*
-                * Either not a TCP or UDP frame and/or TCP/UDP processing not
-                * specified.
-                */
-               pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP;
-               return;
-       }
-
-       /* Check if this is an IP fragment. */
-
-       /*
-        * Note: An IP fragment has a non-zero "Fragment Offset" field and/or
-        * the "More Fragments" bit set. Thus, if both the "Fragment Offset"
-        * and the "More Fragments" are zero, it is *not* a fragment. We can
-        * easily check both at the same time since they are in the same 16-bit
-        * word.
-        */
-
-       if ((*(SK_U16 *)
-               SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) &
-               ~SKCS_IP_DONT_FRAGMENT) != 0) {
-               /* IP fragment; ignore all other protocols. */
-               pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP;
-               NextLevelProtoStats->TxUnableCts++;
-               return;
-       }
-
-       /*
-        * Calculate the TCP/UDP pseudo header checksum.
-        */
-
-       /* Get total length of IP header and data. */
-
-       IpDataLength =
-               *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH);
-
-       /* Get length of IP data portion. */
-
-       IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength;
-
-       /* Calculate the sum of all pseudo header fields (16-bit). */
-
-       PseudoHeaderChecksum =
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_SOURCE_ADDRESS + 0) +
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_SOURCE_ADDRESS + 2) +
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_DESTINATION_ADDRESS + 0) +
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_DESTINATION_ADDRESS + 2) +
-               (unsigned long) SKCS_HTON16(NextLevelProtocol) +
-               (unsigned long) SKCS_HTON16(IpDataLength);
-       
-       /* Add-in any carries. */
-
-       SKCS_OC_ADD(PseudoHeaderChecksum, PseudoHeaderChecksum, 0);
-
-       /* Add-in any new carry. */
-
-       SKCS_OC_ADD(pPacketInfo->PseudoHeaderChecksum, PseudoHeaderChecksum, 0);
-
-       pPacketInfo->ProtocolFlags = ProtocolFlags;
-       NextLevelProtoStats->TxOkCts++; /* Success. */
-}      /* SkCsGetSendInfo */
-
-
-/******************************************************************************
- *
- *     SkCsGetReceiveInfo - verify checksum information for a received packet
- *
- * Description:
- *     Verify a received frame's checksum. The function returns a status code
- *     reflecting the result of the verification.
- *
- * Note:
- *     Before calling this function you have to verify that the frame is
- *     not padded and Checksum1 and Checksum2 are bigger than 1.
- *
- * Arguments:
- *     pAc - Pointer to adapter context struct.
- *
- *     pIpHeader - Pointer to IP header. Must be at least the length in bytes
- *     of the received IP header including any option fields. For UDP packets,
- *     8 additional bytes are needed to access the UDP checksum.
- *
- *     Note: The actual length of the IP header is stored in the lower four
- *     bits of the first octet of the IP header as the number of 4-byte words,
- *     so it must be multiplied by four to get the length in bytes. Thus, the
- *     maximum IP header length is 15 * 4 = 60 bytes.
- *
- *     Checksum1 - The first 16-bit Internet Checksum calculated by the
- *     hardware starting at the offset returned by SkCsSetReceiveFlags().
- *
- *     Checksum2 - The second 16-bit Internet Checksum calculated by the
- *     hardware starting at the offset returned by SkCsSetReceiveFlags().
- *
- * Returns:
- *     SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame.
- *     SKCS_STATUS_IP_CSUM_ERROR - IP checksum error.
- *     SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame.
- *     SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame
- *     SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok).
- *     SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame).
- *     SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok).
- *     SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok).
- *     SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok.
- *     SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok.
- *     SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum.
- *
- *     Note: If SKCS_OVERWRITE_STATUS is defined, the SKCS_STATUS_XXX values
- *     returned here can be defined in some header file by the module using CSUM.
- *     In this way, the calling module can assign return values for its own needs,
- *     e.g. by assigning bit flags to the individual protocols.
- */
-SKCS_STATUS SkCsGetReceiveInfo(
-SK_AC          *pAc,           /* Adapter context struct. */
-void           *pIpHeader,     /* IP header. */
-unsigned       Checksum1,      /* Hardware checksum 1. */
-unsigned       Checksum2,      /* Hardware checksum 2. */
-int                    NetNumber)      /* Net number */
-{
-       /* Internet Header Version found in IP header. */
-       unsigned InternetHeaderVersion;
-
-       /* Length of the IP header as found in IP header. */
-       unsigned IpHeaderLength;
-
-       /* Length of IP data portion. */
-       unsigned IpDataLength;
-
-       /* IP header checksum. */
-       unsigned IpHeaderChecksum;
-
-       /* IP header options checksum, if any. */
-       unsigned IpOptionsChecksum;
-
-       /* IP data checksum, i.e. TCP/UDP checksum. */
-       unsigned IpDataChecksum;
-
-       /* Next level protocol identifier found in IP header. */
-       unsigned NextLevelProtocol;
-
-       /* The checksum of the "next level protocol", i.e. TCP or UDP. */
-       unsigned long NextLevelProtocolChecksum;
-
-       /* Pointer to next level protocol statistics structure. */
-       SKCS_PROTO_STATS *NextLevelProtoStats;
-
-       /* Temporary variable. */
-       unsigned Tmp;
-
-       Tmp = *(SK_U8 *)
-               SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH);
-
-       /* Get the Internet Header Version (IHV). */
-       /* Note: The IHV is stored in the upper four bits. */
-
-       InternetHeaderVersion = Tmp >> 4;
-
-       /* Check the Internet Header Version. */
-       /* Note: We currently only support IP version 4. */
-
-       if (InternetHeaderVersion != 4) {       /* IPv4? */
-               SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX,
-                       ("Rx: Unknown Internet Header Version %u.\n",
-                       InternetHeaderVersion));
-               pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxUnableCts++;
-               return (SKCS_STATUS_UNKNOWN_IP_VERSION);
-       }
-
-       /* Get the IP header length (IHL). */
-       /*
-        * Note: The IHL is stored in the lower four bits as the number of
-        * 4-byte words.
-        */
-
-       IpHeaderLength = (Tmp & 0xf) * 4;
-
-       /* Check the IP header length. */
-
-       /* 04-Aug-1998 sw - Really check the IHL? Necessary? */
-
-       if (IpHeaderLength < 5*4) {
-               SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX,
-                       ("Rx: Invalid IP Header Length %u.\n", IpHeaderLength));
-               pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++;
-               return (SKCS_STATUS_IP_CSUM_ERROR);
-       }
-
-       /* This is an IPv4 frame with a header of valid length. */
-
-       /* Get the IP header and data checksum. */
-
-       IpDataChecksum = Checksum2;
-
-       /*
-        * The IP header checksum is calculated as follows:
-        *
-        *      IpHeaderChecksum = Checksum1 - Checksum2
-        */
-
-       SKCS_OC_SUB(IpHeaderChecksum, Checksum1, Checksum2);
-
-       /* Check if any IP header options. */
-
-       if (IpHeaderLength > SKCS_IP_HEADER_SIZE) {
-
-               /* Get the IP options checksum. */
-
-               IpOptionsChecksum = SkCsCalculateChecksum(
-                       SKCS_IDX(pIpHeader, SKCS_IP_HEADER_SIZE),
-                       IpHeaderLength - SKCS_IP_HEADER_SIZE);
-
-               /* Adjust the IP header and IP data checksums. */
-
-               SKCS_OC_ADD(IpHeaderChecksum, IpHeaderChecksum, IpOptionsChecksum);
-
-               SKCS_OC_SUB(IpDataChecksum, IpDataChecksum, IpOptionsChecksum);
-       }
-
-       /*
-        * Check if the IP header checksum is ok.
-        *
-        * NOTE: We must check the IP header checksum even if the caller just wants
-        * us to check upper-layer checksums, because we cannot do any further
-        * processing of the packet without a valid IP checksum.
-        */
-       
-       /* Get the next level protocol identifier. */
-       
-       NextLevelProtocol = *(SK_U8 *)
-               SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL);
-
-       if (IpHeaderChecksum != 0xffff) {
-               pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++;
-               /* the NDIS tester wants to know the upper level protocol too */
-               if (NextLevelProtocol == SKCS_PROTO_ID_TCP) {
-                       return(SKCS_STATUS_IP_CSUM_ERROR_TCP);
-               }
-               else if (NextLevelProtocol == SKCS_PROTO_ID_UDP) {
-                       return(SKCS_STATUS_IP_CSUM_ERROR_UDP);
-               }
-               return (SKCS_STATUS_IP_CSUM_ERROR);
-       }
-
-       /*
-        * Check if this is a TCP or UDP frame and if we should calculate the
-        * TCP/UDP pseudo header checksum.
-        *
-        * Also clear all protocol bit flags of protocols not present in the
-        * frame.
-        */
-
-       if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_TCP) != 0 &&
-               NextLevelProtocol == SKCS_PROTO_ID_TCP) {
-               /* TCP/IP frame. */
-               NextLevelProtoStats =
-                       &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP];
-       }
-       else if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_UDP) != 0 &&
-               NextLevelProtocol == SKCS_PROTO_ID_UDP) {
-               /* UDP/IP frame. */
-               NextLevelProtoStats =
-                       &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP];
-       }
-       else {
-               /*
-                * Either not a TCP or UDP frame and/or TCP/UDP processing not
-                * specified.
-                */
-               return (SKCS_STATUS_IP_CSUM_OK);
-       }
-
-       /* Check if this is an IP fragment. */
-
-       /*
-        * Note: An IP fragment has a non-zero "Fragment Offset" field and/or
-        * the "More Fragments" bit set. Thus, if both the "Fragment Offset"
-        * and the "More Fragments" are zero, it is *not* a fragment. We can
-        * easily check both at the same time since they are in the same 16-bit
-        * word.
-        */
-
-       if ((*(SK_U16 *)
-               SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) &
-               ~SKCS_IP_DONT_FRAGMENT) != 0) {
-               /* IP fragment; ignore all other protocols. */
-               NextLevelProtoStats->RxUnableCts++;
-               return (SKCS_STATUS_IP_FRAGMENT);
-       }
-
-       /*
-        * 08-May-2000 ra
-        *
-        * From RFC 768 (UDP)
-        * If the computed checksum is zero, it is transmitted as all ones (the
-        * equivalent in one's complement arithmetic).  An all zero transmitted
-        * checksum value means that the transmitter generated no checksum (for
-        * debugging or for higher level protocols that don't care).
-        */
-
-       if (NextLevelProtocol == SKCS_PROTO_ID_UDP &&
-               *(SK_U16*)SKCS_IDX(pIpHeader, IpHeaderLength + 6) == 0x0000) {
-
-               NextLevelProtoStats->RxOkCts++;
-               
-               return (SKCS_STATUS_IP_CSUM_OK_NO_UDP);
-       }
-
-       /*
-        * Calculate the TCP/UDP checksum.
-        */
-
-       /* Get total length of IP header and data. */
-
-       IpDataLength =
-               *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH);
-
-       /* Get length of IP data portion. */
-
-       IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength;
-
-       NextLevelProtocolChecksum =
-
-               /* Calculate the pseudo header checksum. */
-
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_SOURCE_ADDRESS + 0) +
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_SOURCE_ADDRESS + 2) +
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_DESTINATION_ADDRESS + 0) +
-               (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
-                       SKCS_OFS_IP_DESTINATION_ADDRESS + 2) +
-               (unsigned long) SKCS_HTON16(NextLevelProtocol) +
-               (unsigned long) SKCS_HTON16(IpDataLength) +
-
-               /* Add the TCP/UDP header checksum. */
-
-               (unsigned long) IpDataChecksum;
-
-       /* Add-in any carries. */
-
-       SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0);
-
-       /* Add-in any new carry. */
-
-       SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0);
-
-       /* Check if the TCP/UDP checksum is ok. */
-
-       if ((unsigned) NextLevelProtocolChecksum == 0xffff) {
-
-               /* TCP/UDP checksum ok. */
-
-               NextLevelProtoStats->RxOkCts++;
-
-               return (NextLevelProtocol == SKCS_PROTO_ID_TCP ?
-                       SKCS_STATUS_TCP_CSUM_OK : SKCS_STATUS_UDP_CSUM_OK);
-       }
-       
-       /* TCP/UDP checksum error. */
-
-       NextLevelProtoStats->RxErrCts++;
-
-       return (NextLevelProtocol == SKCS_PROTO_ID_TCP ?
-               SKCS_STATUS_TCP_CSUM_ERROR : SKCS_STATUS_UDP_CSUM_ERROR);
-}      /* SkCsGetReceiveInfo */
-
-
-/******************************************************************************
- *
- *     SkCsSetReceiveFlags - set checksum receive flags
- *
- * Description:
- *     Use this function to set the various receive flags. According to the
- *     protocol flags set by the caller, the start offsets within received
- *     packets of the two hardware checksums are returned. These offsets must
- *     be stored in all receive descriptors.
- *
- * Arguments:
- *     pAc - Pointer to adapter context struct.
- *
- *     ReceiveFlags - Any combination of SK_PROTO_XXX flags of the protocols
- *     for which the caller wants checksum information on received frames.
- *
- *     pChecksum1Offset - The start offset of the first receive descriptor
- *     hardware checksum to be calculated for received frames is returned
- *     here.
- *
- *     pChecksum2Offset - The start offset of the second receive descriptor
- *     hardware checksum to be calculated for received frames is returned
- *     here.
- *
- * Returns: N/A
- *     Returns the two hardware checksum start offsets.
- */
-void SkCsSetReceiveFlags(
-SK_AC          *pAc,                           /* Adapter context struct. */
-unsigned       ReceiveFlags,           /* New receive flags. */
-unsigned       *pChecksum1Offset,      /* Offset for hardware checksum 1. */
-unsigned       *pChecksum2Offset,      /* Offset for hardware checksum 2. */
-int                    NetNumber)
-{
-       /* Save the receive flags. */
-
-       pAc->Csum.ReceiveFlags[NetNumber] = ReceiveFlags;
-
-       /* First checksum start offset is the IP header. */
-       *pChecksum1Offset = SKCS_MAC_HEADER_SIZE;
-
-       /*
-        * Second checksum start offset is the IP data. Note that this may vary
-        * if there are any IP header options in the actual packet.
-        */
-       *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE;
-}      /* SkCsSetReceiveFlags */
-
-#ifndef SK_CS_CALCULATE_CHECKSUM
-
-/******************************************************************************
- *
- *     SkCsCalculateChecksum - calculate checksum for specified data
- *
- * Description:
- *     Calculate and return the 16-bit Internet Checksum for the specified
- *     data.
- *
- * Arguments:
- *     pData - Pointer to data for which the checksum shall be calculated.
- *     Note: The pointer should be aligned on a 16-bit boundary.
- *
- *     Length - Length in bytes of data to checksum.
- *
- * Returns:
- *     The 16-bit Internet Checksum for the specified data.
- *
- *     Note: The checksum is calculated in the machine's natural byte order,
- *     i.e. little vs. big endian. Thus, the resulting checksum is different
- *     for the same input data on little and big endian machines.
- *
- *     However, when written back to the network packet, the byte order is
- *     always in correct network order.
- */
-unsigned SkCsCalculateChecksum(
-void           *pData,         /* Data to checksum. */
-unsigned       Length)         /* Length of data. */
-{
-       SK_U16 *pU16;           /* Pointer to the data as 16-bit words. */
-       unsigned long Checksum; /* Checksum; must be at least 32 bits. */
-
-       /* Sum up all 16-bit words. */
-
-       pU16 = (SK_U16 *) pData;
-       for (Checksum = 0; Length > 1; Length -= 2) {
-               Checksum += *pU16++;
-       }
-
-       /* If this is an odd number of bytes, add-in the last byte. */
-
-       if (Length > 0) {
-#ifdef SK_BIG_ENDIAN
-               /* Add the last byte as the high byte. */
-               Checksum += ((unsigned) *(SK_U8 *) pU16) << 8;
-#else  /* !SK_BIG_ENDIAN */
-               /* Add the last byte as the low byte. */
-               Checksum += *(SK_U8 *) pU16;
-#endif /* !SK_BIG_ENDIAN */
-       }
-
-       /* Add-in any carries. */
-
-       SKCS_OC_ADD(Checksum, Checksum, 0);
-
-       /* Add-in any new carry. */
-
-       SKCS_OC_ADD(Checksum, Checksum, 0);
-
-       /* Note: All bits beyond the 16-bit limit are now zero. */
-
-       return ((unsigned) Checksum);
-}      /* SkCsCalculateChecksum */
-
-#endif /* SK_CS_CALCULATE_CHECKSUM */
-
-/******************************************************************************
- *
- *     SkCsEvent - the CSUM event dispatcher
- *
- * Description:
- *     This is the event handler for the CSUM module.
- *
- * Arguments:
- *     pAc - Pointer to adapter context.
- *
- *     Ioc - I/O context.
- *
- *     Event -  Event id.
- *
- *     Param - Event dependent parameter.
- *
- * Returns:
- *     The 16-bit Internet Checksum for the specified data.
- *
- *     Note: The checksum is calculated in the machine's natural byte order,
- *     i.e. little vs. big endian. Thus, the resulting checksum is different
- *     for the same input data on little and big endian machines.
- *
- *     However, when written back to the network packet, the byte order is
- *     always in correct network order.
- */
-int SkCsEvent(
-SK_AC          *pAc,   /* Pointer to adapter context. */
-SK_IOC         Ioc,    /* I/O context. */
-SK_U32         Event,  /* Event id. */
-SK_EVPARA      Param)  /* Event dependent parameter. */
-{
-       int ProtoIndex;
-       int     NetNumber;
-
-       switch (Event) {
-       /*
-        * Clear protocol statistics.
-        *
-        * Param - Protocol index, or -1 for all protocols.
-        *               - Net number.
-        */
-       case SK_CSUM_EVENT_CLEAR_PROTO_STATS:
-
-               ProtoIndex = (int)Param.Para32[1];
-               NetNumber = (int)Param.Para32[0];
-               if (ProtoIndex < 0) {   /* Clear for all protocols. */
-                       if (NetNumber >= 0) {
-                               SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0,
-                                       sizeof(pAc->Csum.ProtoStats[NetNumber]));
-                       }
-               }
-               else {                                  /* Clear for individual protocol. */
-                       SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0,
-                               sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex]));
-               }
-               break;
-       default:
-               break;
-       }
-       return (0);     /* Success. */
-}      /* SkCsEvent */
-
-#endif /* SK_USE_CSUM */
index fb639959292b3656d375a04c68cc6bee4d3e8fe1..4265ed91a9c4800eee83f7ed2f53ae2a63f1459f 100644 (file)
@@ -539,6 +539,48 @@ static int setPauseParams(struct net_device *dev , struct ethtool_pauseparam *ep
         return ret ? -EIO : 0;
 }
 
+/* Only Yukon supports checksum offload. */
+static int setScatterGather(struct net_device *dev, u32 data)
+{
+       DEV_NET *pNet = netdev_priv(dev);
+       SK_AC *pAC = pNet->pAC;
+
+       if (pAC->GIni.GIChipId == CHIP_ID_GENESIS)
+               return -EOPNOTSUPP;
+       return ethtool_op_set_sg(dev, data);
+}
+
+static int setTxCsum(struct net_device *dev, u32 data)
+{
+       DEV_NET *pNet = netdev_priv(dev);
+       SK_AC *pAC = pNet->pAC;
+
+       if (pAC->GIni.GIChipId == CHIP_ID_GENESIS)
+               return -EOPNOTSUPP;
+
+       return ethtool_op_set_tx_csum(dev, data);
+}
+
+static u32 getRxCsum(struct net_device *dev)
+{
+       DEV_NET *pNet = netdev_priv(dev);
+       SK_AC *pAC = pNet->pAC;
+
+       return pAC->RxPort[pNet->PortNr].RxCsum;
+}
+
+static int setRxCsum(struct net_device *dev, u32 data)
+{
+       DEV_NET *pNet = netdev_priv(dev);
+       SK_AC *pAC = pNet->pAC;
+
+       if (pAC->GIni.GIChipId == CHIP_ID_GENESIS)
+               return -EOPNOTSUPP;
+
+       pAC->RxPort[pNet->PortNr].RxCsum = data != 0;
+       return 0;
+}
+
 struct ethtool_ops SkGeEthtoolOps = {
        .get_settings           = getSettings,
        .set_settings           = setSettings,
@@ -549,4 +591,12 @@ struct ethtool_ops SkGeEthtoolOps = {
        .phys_id                = locateDevice,
        .get_pauseparam         = getPauseParams,
        .set_pauseparam         = setPauseParams,
+       .get_link               = ethtool_op_get_link,
+       .get_perm_addr          = ethtool_op_get_perm_addr,
+       .get_sg                 = ethtool_op_get_sg,
+       .set_sg                 = setScatterGather,
+       .get_tx_csum            = ethtool_op_get_tx_csum,
+       .set_tx_csum            = setTxCsum,
+       .get_rx_csum            = getRxCsum,
+       .set_rx_csum            = setRxCsum,
 };
index b18c92cb629e8a34ee95888f0ecd8498eacddf6a..9a76ac180b11519e69d09263a6bf1eafd8c1376a 100644 (file)
  *             "h/skgeinit.h"
  *             "h/skaddr.h"
  *             "h/skgesirq.h"
- *             "h/skcsum.h"
  *             "h/skrlmt.h"
  *
  ******************************************************************************/
 
 #include       "h/skversion.h"
 
+#include       <linux/in.h>
 #include       <linux/module.h>
 #include       <linux/moduleparam.h>
 #include       <linux/init.h>
-#include       <linux/proc_fs.h>
 #include       <linux/dma-mapping.h>
+#include       <linux/ip.h>
 
 #include       "h/skdrv1st.h"
 #include       "h/skdrv2nd.h"
@@ -206,7 +206,6 @@ static void SkGeSetRxMode(struct SK_NET_DEVICE *dev);
 static struct  net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev);
 static int     SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd);
 static void    GetConfiguration(SK_AC*);
-static void    ProductStr(SK_AC*);
 static int     XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*);
 static void    FreeTxDescriptors(SK_AC*pAC, TX_PORT*);
 static void    FillRxRing(SK_AC*, RX_PORT*);
@@ -235,28 +234,6 @@ static int      SkDrvDeInitAdapter(SK_AC *pAC, int devNbr);
  * Extern Function Prototypes
  *
  ******************************************************************************/
-static const char      SKRootName[] = "net/sk98lin";
-static struct          proc_dir_entry *pSkRootDir;
-extern struct  file_operations sk_proc_fops;
-
-static inline void SkGeProcCreate(struct net_device *dev)
-{
-       struct proc_dir_entry *pe;
-
-       if (pSkRootDir && 
-           (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) {
-               pe->proc_fops = &sk_proc_fops;
-               pe->data = dev;
-               pe->owner = THIS_MODULE;
-       }
-}
-static inline void SkGeProcRemove(struct net_device *dev)
-{
-       if (pSkRootDir)
-               remove_proc_entry(dev->name, pSkRootDir);
-}
-
 extern void SkDimEnableModerationIfNeeded(SK_AC *pAC); 
 extern void SkDimDisplayModerationSettings(SK_AC *pAC);
 extern void SkDimStartModerationTimer(SK_AC *pAC);
@@ -277,6 +254,27 @@ extern  struct ethtool_ops SkGeEthtoolOps;
 static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}};
 static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480};
 
+/*****************************************************************************
+ *
+ *     SkPciWriteCfgDWord - write a 32 bit value to pci config space
+ *
+ * Description:
+ *     This routine writes a 32 bit value to the pci configuration
+ *     space.
+ *
+ * Returns:
+ *     0 - indicate everything worked ok.
+ *     != 0 - error indication
+ */
+static inline int SkPciWriteCfgDWord(
+SK_AC *pAC,    /* Adapter Control structure pointer */
+int PciAddr,           /* PCI register address */
+SK_U32 Val)            /* pointer to store the read value */
+{
+       pci_write_config_dword(pAC->PciDev, PciAddr, Val);
+       return(0);
+} /* SkPciWriteCfgDWord */
+
 /*****************************************************************************
  *
  *     SkGeInitPCI - Init the PCI resources
@@ -300,7 +298,7 @@ int SkGeInitPCI(SK_AC *pAC)
        dev->mem_start = pci_resource_start (pdev, 0);
        pci_set_master(pdev);
 
-       if (pci_request_regions(pdev, pAC->Name) != 0) {
+       if (pci_request_regions(pdev, "sk98lin") != 0) {
                retval = 2;
                goto out_disable;
        }
@@ -578,10 +576,10 @@ SK_BOOL   DualNet;
        spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
 
        if (pAC->GIni.GIMacsFound == 2) {
-                Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, pAC->Name, dev);
+                Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev);
        } else if (pAC->GIni.GIMacsFound == 1) {
                Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ,
-                       pAC->Name, dev);
+                       "sk98lin", dev);
        } else {
                printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n",
                       pAC->GIni.GIMacsFound);
@@ -601,11 +599,6 @@ SK_BOOL    DualNet;
                        return(-EAGAIN);
        }
 
-       SkCsSetReceiveFlags(pAC,
-               SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP,
-               &pAC->CsOfs1, &pAC->CsOfs2, 0);
-       pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1;
-
        BoardInitMem(pAC);
        /* tschilling: New common function with minimum size check. */
        DualNet = SK_FALSE;
@@ -823,7 +816,7 @@ uintptr_t VNextDescr;       /* the virtual bus address of the next descriptor */
                /* set the pointers right */
                pDescr->VNextRxd = VNextDescr & 0xffffffffULL;
                pDescr->pNextRxd = pNextDescr;
-               pDescr->TcpSumStarts = pAC->CsOfs;
+               if (!IsTx) pDescr->TcpSumStarts = ETH_HLEN << 16 | ETH_HLEN;
 
                /* advance one step */
                pPrevDescr = pDescr;
@@ -1270,7 +1263,6 @@ struct SK_NET_DEVICE      *dev)
        spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
 
        pAC->MaxPorts++;
-       pNet->Up = 1;
 
 
        SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
@@ -1400,7 +1392,6 @@ struct SK_NET_DEVICE      *dev)
                        sizeof(SK_PNMI_STRUCT_DATA));
 
        pAC->MaxPorts--;
-       pNet->Up = 0;
 
        return (0);
 } /* SkGeClose */
@@ -1505,8 +1496,6 @@ struct sk_buff    *pMessage)      /* pointer to send-message              */
        TXD             *pOldTxd;
        unsigned long    Flags;
        SK_U64           PhysAddr;
-       int              Protocol;
-       int              IpHeaderLength;
        int              BytesSend = pMessage->len;
 
        SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X"));
@@ -1579,8 +1568,10 @@ struct sk_buff   *pMessage)      /* pointer to send-message              */
        pTxd->pMBuf     = pMessage;
 
        if (pMessage->ip_summed == CHECKSUM_HW) {
-               Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff);
-               if ((Protocol == C_PROTO_ID_UDP) && 
+               u16 hdrlen = pMessage->h.raw - pMessage->data;
+               u16 offset = hdrlen + pMessage->csum;
+
+               if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) &&
                        (pAC->GIni.GIChipRev == 0) &&
                        (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
                        pTxd->TBControl = BMU_TCP_CHECK;
@@ -1588,14 +1579,9 @@ struct sk_buff   *pMessage)      /* pointer to send-message              */
                        pTxd->TBControl = BMU_UDP_CHECK;
                }
 
-               IpHeaderLength  = (SK_U8)pMessage->data[C_OFFSET_IPHEADER];
-               IpHeaderLength  = (IpHeaderLength & 0xf) * 4;
-               pTxd->TcpSumOfs = 0; /* PH-Checksum already calculated */
-               pTxd->TcpSumSt  = C_LEN_ETHERMAC_HEADER + IpHeaderLength + 
-                                                       (Protocol == C_PROTO_ID_UDP ?
-                                                       C_OFFSET_UDPHEADER_UDPCS : 
-                                                       C_OFFSET_TCPHEADER_TCPCS);
-               pTxd->TcpSumWr  = C_LEN_ETHERMAC_HEADER + IpHeaderLength;
+               pTxd->TcpSumOfs = 0;
+               pTxd->TcpSumSt  = hdrlen;
+               pTxd->TcpSumWr  = offset;
 
                pTxd->TBControl |= BMU_OWN | BMU_STF | 
                                   BMU_SW  | BMU_EOF |
@@ -1658,11 +1644,10 @@ struct sk_buff  *pMessage)      /* pointer to send-message              */
        TXD             *pTxdLst;
        int              CurrFrag;
        int              BytesSend;
-       int              IpHeaderLength; 
-       int              Protocol;
        skb_frag_t      *sk_frag;
        SK_U64           PhysAddr;
        unsigned long    Flags;
+       SK_U32           Control;
 
        spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags);
 #ifndef USE_TX_COMPLETE
@@ -1685,7 +1670,6 @@ struct sk_buff    *pMessage)      /* pointer to send-message              */
        pTxdFst   = pTxd;
        pTxdLst   = pTxd;
        BytesSend = 0;
-       Protocol  = 0;
 
        /* 
        ** Map the first fragment (header) into the DMA-space
@@ -1703,32 +1687,31 @@ struct sk_buff  *pMessage)      /* pointer to send-message              */
        ** Does the HW need to evaluate checksum for TCP or UDP packets? 
        */
        if (pMessage->ip_summed == CHECKSUM_HW) {
-               pTxd->TBControl = BMU_STF | BMU_STFWD | skb_headlen(pMessage);
+               u16 hdrlen = pMessage->h.raw - pMessage->data;
+               u16 offset = hdrlen + pMessage->csum;
+
+               Control = BMU_STFWD;
+
                /* 
                ** We have to use the opcode for tcp here,  because the
                ** opcode for udp is not working in the hardware yet 
                ** (Revision 2.0)
                */
-               Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff);
-               if ((Protocol == C_PROTO_ID_UDP) && 
+               if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) &&
                        (pAC->GIni.GIChipRev == 0) &&
                        (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
-                       pTxd->TBControl |= BMU_TCP_CHECK;
+                       Control |= BMU_TCP_CHECK;
                } else {
-                       pTxd->TBControl |= BMU_UDP_CHECK;
+                       Control |= BMU_UDP_CHECK;
                }
 
-               IpHeaderLength  = ((SK_U8)pMessage->data[C_OFFSET_IPHEADER] & 0xf)*4;
-               pTxd->TcpSumOfs = 0; /* PH-Checksum already claculated */
-               pTxd->TcpSumSt  = C_LEN_ETHERMAC_HEADER + IpHeaderLength +
-                                               (Protocol == C_PROTO_ID_UDP ?
-                                               C_OFFSET_UDPHEADER_UDPCS :
-                                               C_OFFSET_TCPHEADER_TCPCS);
-               pTxd->TcpSumWr  = C_LEN_ETHERMAC_HEADER + IpHeaderLength;
-       } else {
-               pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_STF |
-                                       skb_headlen(pMessage);
-       }
+               pTxd->TcpSumOfs = 0;
+               pTxd->TcpSumSt  = hdrlen;
+               pTxd->TcpSumWr  = offset;
+       } else
+               Control = BMU_CHECK | BMU_SW;
+
+       pTxd->TBControl = BMU_STF | Control | skb_headlen(pMessage);
 
        pTxd = pTxd->pNextTxd;
        pTxPort->TxdRingFree--;
@@ -1752,40 +1735,18 @@ struct sk_buff  *pMessage)      /* pointer to send-message              */
                pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32);
                pTxd->pMBuf     = pMessage;
                
-               /* 
-               ** Does the HW need to evaluate checksum for TCP or UDP packets? 
-               */
-               if (pMessage->ip_summed == CHECKSUM_HW) {
-                       pTxd->TBControl = BMU_OWN | BMU_SW | BMU_STFWD;
-                       /* 
-                       ** We have to use the opcode for tcp here because the 
-                       ** opcode for udp is not working in the hardware yet 
-                       ** (revision 2.0)
-                       */
-                       if ((Protocol == C_PROTO_ID_UDP) && 
-                               (pAC->GIni.GIChipRev == 0) &&
-                               (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
-                               pTxd->TBControl |= BMU_TCP_CHECK;
-                       } else {
-                               pTxd->TBControl |= BMU_UDP_CHECK;
-                       }
-               } else {
-                       pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_OWN;
-               }
+               pTxd->TBControl = Control | BMU_OWN | sk_frag->size;;
 
                /* 
                ** Do we have the last fragment? 
                */
                if( (CurrFrag+1) == skb_shinfo(pMessage)->nr_frags )  {
 #ifdef USE_TX_COMPLETE
-                       pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF | sk_frag->size;
+                       pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF;
 #else
-                       pTxd->TBControl |= BMU_EOF | sk_frag->size;
+                       pTxd->TBControl |= BMU_EOF;
 #endif
                        pTxdFst->TBControl |= BMU_OWN | BMU_SW;
-
-               } else {
-                       pTxd->TBControl |= sk_frag->size;
                }
                pTxdLst = pTxd;
                pTxd    = pTxd->pNextTxd;
@@ -2032,7 +1993,6 @@ SK_U32                    Control;                /* control field of descriptor */
 struct sk_buff *pMsg;                  /* pointer to message holding frame */
 struct sk_buff *pNewMsg;               /* pointer to a new message for copying frame */
 int                            FrameLength;    /* total length of received frame */
-int                            IpFrameLength;
 SK_MBUF                        *pRlmtMbuf;             /* ptr to a buffer for giving a frame to rlmt */
 SK_EVPARA              EvPara;                 /* an event parameter union */  
 unsigned long  Flags;                  /* for spin lock */
@@ -2045,10 +2005,6 @@ SK_BOOL                  IsMc;
 SK_BOOL  IsBadFrame;                   /* Bad frame */
 
 SK_U32                 FrameStat;
-unsigned short Csum1;
-unsigned short Csum2;
-unsigned short Type;
-int                            Result;
 SK_U64                 PhysAddr;
 
 rx_start:      
@@ -2177,8 +2133,8 @@ rx_start:
                                                    (dma_addr_t) PhysAddr,
                                                    FrameLength,
                                                    PCI_DMA_FROMDEVICE);
-                       eth_copy_and_sum(pNewMsg, pMsg->data,
-                               FrameLength, 0);
+                       memcpy(pNewMsg->data, pMsg, FrameLength);
+
                        pci_dma_sync_single_for_device(pAC->PciDev,
                                                       (dma_addr_t) PhysAddr,
                                                       FrameLength,
@@ -2206,69 +2162,15 @@ rx_start:
 
                        /* set length in message */
                        skb_put(pMsg, FrameLength);
-                       /* hardware checksum */
-                       Type = ntohs(*((short*)&pMsg->data[12]));
+               } /* frame > SK_COPY_TRESHOLD */
 
 #ifdef USE_SK_RX_CHECKSUM
-                       if (Type == 0x800) {
-                               Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff);
-                               Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff);
-                               IpFrameLength = (int) ntohs((unsigned short)
-                                                               ((unsigned short *) pMsg->data)[8]);
-
-                               /*
-                                * Test: If frame is padded, a check is not possible!
-                                * Frame not padded? Length difference must be 14 (0xe)!
-                                */
-                               if ((FrameLength - IpFrameLength) != 0xe) {
-                               /* Frame padded => TCP offload not possible! */
-                                       pMsg->ip_summed = CHECKSUM_NONE;
-                               } else {
-                               /* Frame not padded => TCP offload! */
-                                       if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) &&
-                                               (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) ||
-                                               (pAC->ChipsetType)) {
-                                               Result = SkCsGetReceiveInfo(pAC,
-                                                       &pMsg->data[14],
-                                                       Csum1, Csum2, pRxPort->PortIndex);
-                                               if (Result ==
-                                                       SKCS_STATUS_IP_FRAGMENT ||
-                                                       Result ==
-                                                       SKCS_STATUS_IP_CSUM_OK ||
-                                                       Result ==
-                                                       SKCS_STATUS_TCP_CSUM_OK ||
-                                                       Result ==
-                                                       SKCS_STATUS_UDP_CSUM_OK) {
-                                                               pMsg->ip_summed =
-                                                               CHECKSUM_UNNECESSARY;
-                                               }
-                                               else if (Result ==
-                                                       SKCS_STATUS_TCP_CSUM_ERROR ||
-                                                       Result ==
-                                                       SKCS_STATUS_UDP_CSUM_ERROR ||
-                                                       Result ==
-                                                       SKCS_STATUS_IP_CSUM_ERROR_UDP ||
-                                                       Result ==
-                                                       SKCS_STATUS_IP_CSUM_ERROR_TCP ||
-                                                       Result ==
-                                                       SKCS_STATUS_IP_CSUM_ERROR ) {
-                                                       /* HW Checksum error */
-                                                       SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
-                                                       SK_DBGCAT_DRV_RX_PROGRESS,
-                                                       ("skge: CRC error. Frame dropped!\n"));
-                                                       goto rx_failed;
-                                               } else {
-                                                               pMsg->ip_summed =
-                                                               CHECKSUM_NONE;
-                                               }
-                                       }/* checksumControl calculation valid */
-                               } /* Frame length check */
-                       } /* IP frame */
+               pMsg->csum = pRxd->TcpSums & 0xffff;
+               pMsg->ip_summed = CHECKSUM_HW;
 #else
-                       pMsg->ip_summed = CHECKSUM_NONE;        
+               pMsg->ip_summed = CHECKSUM_NONE;
 #endif
-               } /* frame > SK_COPY_TRESHOLD */
-               
+
                SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V"));
                ForRlmt = SK_RLMT_RX_PROTOCOL;
 #if 0
@@ -2643,7 +2545,7 @@ unsigned long             Flags;
 static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int NewMtu)
 {
 DEV_NET                *pNet;
-DEV_NET                *pOtherNet;
+struct net_device *pOtherDev;
 SK_AC          *pAC;
 unsigned long  Flags;
 int            i;
@@ -2673,11 +2575,11 @@ SK_EVPARA       EvPara;
        }
 #endif
 
-       pNet->Mtu = NewMtu;
-       pOtherNet = netdev_priv(pAC->dev[1 - pNet->NetNr]);
-       if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) {
-               return(0);
-       }
+       pOtherDev = pAC->dev[1 - pNet->NetNr];
+
+       if ( netif_running(pOtherDev) && (pOtherDev->mtu > 1500)
+            && (NewMtu <= 1500))
+               return 0;
 
        pAC->RxBufSize = NewMtu + 32;
        dev->mtu = NewMtu;
@@ -2839,7 +2741,8 @@ SK_EVPARA         EvPara;
                EvPara.Para32[1] = -1;
                SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
                        
-               if (pOtherNet->Up) {
+               if (netif_running(pOtherDev)) {
+                       DEV_NET *pOtherNet = netdev_priv(pOtherDev);
                        EvPara.Para32[0] = pOtherNet->PortNr;
                        SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
                }
@@ -2913,7 +2816,7 @@ unsigned long     Flags;                  /* for spin lock */
        pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts;
        pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts;
        
-        if (pNet->Mtu <= 1500) {
+        if (dev->mtu <= 1500) {
                 pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF;
         } else {
                 pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts -
@@ -3864,25 +3767,21 @@ int     Capabilities[3][3] =
  *
  * Returns: N/A
  */
-static void ProductStr(
-SK_AC  *pAC            /* pointer to adapter context */
+static inline int ProductStr(
+       SK_AC   *pAC,           /* pointer to adapter context */
+       char    *DeviceStr,     /* result string */
+       int      StrLen         /* length of the string */
 )
 {
-int    StrLen = 80;            /* length of the string, defined in SK_AC */
 char   Keyword[] = VPD_NAME;   /* vpd productname identifier */
 int    ReturnCode;             /* return code from vpd_read */
 unsigned long Flags;
 
        spin_lock_irqsave(&pAC->SlowPathLock, Flags);
-       ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, pAC->DeviceStr,
-               &StrLen);
+       ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, DeviceStr, &StrLen);
        spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
-       if (ReturnCode != 0) {
-               /* there was an error reading the vpd data */
-               SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR,
-                       ("Error reading VPD data: %d\n", ReturnCode));
-               pAC->DeviceStr[0] = '\0';
-       }
+
+       return ReturnCode;
 } /* ProductStr */
 
 /*****************************************************************************
@@ -4083,28 +3982,6 @@ SK_U8 *pVal)             /* pointer to store the read value */
 } /* SkPciReadCfgByte */
 
 
-/*****************************************************************************
- *
- *     SkPciWriteCfgDWord - write a 32 bit value to pci config space
- *
- * Description:
- *     This routine writes a 32 bit value to the pci configuration
- *     space.
- *
- * Returns:
- *     0 - indicate everything worked ok.
- *     != 0 - error indication
- */
-int SkPciWriteCfgDWord(
-SK_AC *pAC,    /* Adapter Control structure pointer */
-int PciAddr,           /* PCI register address */
-SK_U32 Val)            /* pointer to store the read value */
-{
-       pci_write_config_dword(pAC->PciDev, PciAddr, Val);
-       return(0);
-} /* SkPciWriteCfgDWord */
-
-
 /*****************************************************************************
  *
  *     SkPciWriteCfgWord - write a 16 bit value to pci config space
@@ -4243,6 +4120,7 @@ SK_BOOL           DualNet;
                        Flags);
                break;
        case SK_DRV_NET_UP:      /* SK_U32 PortIdx */
+       {       struct net_device *dev = pAC->dev[Param.Para32[0]];
                /* action list 5 */
                FromPort = Param.Para32[0];
                SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
@@ -4326,22 +4204,12 @@ SK_BOOL         DualNet;
                        printk("    irq moderation:  disabled\n");
 
 
-#ifdef SK_ZEROCOPY
-               if (pAC->ChipsetType)
-#ifdef USE_SK_TX_CHECKSUM
-                       printk("    scatter-gather:  enabled\n");
-#else
-                       printk("    tx-checksum:     disabled\n");
-#endif
-               else
-                       printk("    scatter-gather:  disabled\n");
-#else
-                       printk("    scatter-gather:  disabled\n");
-#endif
-
-#ifndef USE_SK_RX_CHECKSUM
-                       printk("    rx-checksum:     disabled\n");
-#endif
+               printk("    scatter-gather:  %s\n",
+                      (dev->features & NETIF_F_SG) ? "enabled" : "disabled");
+               printk("    tx-checksum:     %s\n",
+                      (dev->features & NETIF_F_IP_CSUM) ? "enabled" : "disabled");
+               printk("    rx-checksum:     %s\n",
+                      pAC->RxPort[Param.Para32[0]].RxCsum ? "enabled" : "disabled");
 
                } else {
                         DoPrintInterfaceChange = SK_TRUE;
@@ -4356,9 +4224,9 @@ SK_BOOL           DualNet;
                }
 
                /* Inform the world that link protocol is up. */
-               netif_carrier_on(pAC->dev[Param.Para32[0]]);
-
+               netif_carrier_on(dev);
                break;
+       }
        case SK_DRV_NET_DOWN:    /* SK_U32 Reason */
                /* action list 7 */
                SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
@@ -4572,7 +4440,7 @@ SK_AC   *pAc)   /* pointer to adapter context */
 
        pAC->DiagModeActive = DIAG_ACTIVE;
        if (pAC->BoardLevel > SK_INIT_DATA) {
-               if (pNet->Up) {
+               if (netif_running(pAC->dev[0])) {
                        pAC->WasIfUp[0] = SK_TRUE;
                        pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose      */
                        DoPrintInterfaceChange = SK_FALSE;
@@ -4582,7 +4450,7 @@ SK_AC   *pAc)   /* pointer to adapter context */
                }
                if (pNet != netdev_priv(pAC->dev[1])) {
                        pNet = netdev_priv(pAC->dev[1]);
-                       if (pNet->Up) {
+                       if (netif_running(pAC->dev[1])) {
                                pAC->WasIfUp[1] = SK_TRUE;
                                pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
                                DoPrintInterfaceChange = SK_FALSE;
@@ -4908,6 +4776,7 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
        struct net_device       *dev = NULL;
        static int boards_found = 0;
        int error = -ENODEV;
+       char DeviceStr[80];
 
        if (pci_enable_device(pdev))
                goto out;
@@ -4935,18 +4804,15 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
        memset(pNet->pAC, 0, sizeof(SK_AC));
        pAC = pNet->pAC;
        pAC->PciDev = pdev;
-       pAC->PciDevId = pdev->device;
+
        pAC->dev[0] = dev;
        pAC->dev[1] = dev;
-       sprintf(pAC->Name, "SysKonnect SK-98xx");
        pAC->CheckQueue = SK_FALSE;
 
-       pNet->Mtu = 1500;
-       pNet->Up = 0;
        dev->irq = pdev->irq;
        error = SkGeInitPCI(pAC);
        if (error) {
-               printk("SKGE: PCI setup failed: %i\n", error);
+               printk(KERN_ERR "sk98lin: PCI setup failed: %i\n", error);
                goto out_free_netdev;
        }
 
@@ -4965,30 +4831,38 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
        SET_NETDEV_DEV(dev, &pdev->dev);
        SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
 
-#ifdef SK_ZEROCOPY
-#ifdef USE_SK_TX_CHECKSUM
+       /* Use only if yukon hardware */
        if (pAC->ChipsetType) {
-               /* Use only if yukon hardware */
-               /* SK and ZEROCOPY - fly baby... */
-               dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
-       }
+#ifdef USE_SK_TX_CHECKSUM
+               dev->features |= NETIF_F_IP_CSUM;
+#endif
+#ifdef SK_ZEROCOPY
+               dev->features |= NETIF_F_SG;
 #endif
+#ifdef USE_SK_RX_CHECKSUM
+               pAC->RxPort[0].RxCsum = 1;
 #endif
+       }
 
        pAC->Index = boards_found++;
 
        if (SkGeBoardInit(dev, pAC))
                goto out_free_netdev;
 
+       /* Read Adapter name from VPD */
+       if (ProductStr(pAC, DeviceStr, sizeof(DeviceStr)) != 0) {
+               printk(KERN_ERR "sk98lin: Could not read VPD data.\n");
+               goto out_free_resources;
+       }
+
        /* Register net device */
        if (register_netdev(dev)) {
-               printk(KERN_ERR "SKGE: Could not register device.\n");
+               printk(KERN_ERR "sk98lin: Could not register device.\n");
                goto out_free_resources;
        }
 
        /* Print adapter specific string from vpd */
-       ProductStr(pAC);
-       printk("%s: %s\n", dev->name, pAC->DeviceStr);
+       printk("%s: %s\n", dev->name, DeviceStr);
 
        /* Print configuration settings */
        printk("      PrefPort:%c  RlmtMode:%s\n",
@@ -5001,10 +4875,8 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
 
        SkGeYellowLED(pAC, pAC->IoBase, 1);
 
-
        memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6);
-
-       SkGeProcCreate(dev);
+       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        pNet->PortNr = 0;
        pNet->NetNr  = 0;
@@ -5024,8 +4896,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
                pNet->PortNr  = 1;
                pNet->NetNr   = 1;
                pNet->pAC     = pAC;
-               pNet->Mtu     = 1500;
-               pNet->Up      = 0;
 
                dev->open               = &SkGeOpen;
                dev->stop               = &SkGeClose;
@@ -5038,25 +4908,28 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
                SET_NETDEV_DEV(dev, &pdev->dev);
                SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
 
-#ifdef SK_ZEROCOPY
-#ifdef USE_SK_TX_CHECKSUM
                if (pAC->ChipsetType) {
-                       /* SG and ZEROCOPY - fly baby... */
-                       dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
-               }
+#ifdef USE_SK_TX_CHECKSUM
+                       dev->features |= NETIF_F_IP_CSUM;
+#endif
+#ifdef SK_ZEROCOPY
+                       dev->features |= NETIF_F_SG;
 #endif
+#ifdef USE_SK_RX_CHECKSUM
+                       pAC->RxPort[1].RxCsum = 1;
 #endif
+               }
 
                if (register_netdev(dev)) {
-                       printk(KERN_ERR "SKGE: Could not register device.\n");
+                       printk(KERN_ERR "sk98lin: Could not register device for seconf port.\n");
                        free_netdev(dev);
                        pAC->dev[1] = pAC->dev[0];
                } else {
-                       SkGeProcCreate(dev);
                        memcpy(&dev->dev_addr,
                                        &pAC->Addr.Net[1].CurrentMacAddress, 6);
+                       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
        
-                       printk("%s: %s\n", dev->name, pAC->DeviceStr);
+                       printk("%s: %s\n", dev->name, DeviceStr);
                        printk("      PrefPort:B  RlmtMode:Dual Check Link State\n");
                }
        }
@@ -5092,10 +4965,7 @@ static void __devexit skge_remove_one(struct pci_dev *pdev)
        SK_AC *pAC = pNet->pAC;
        struct net_device *otherdev = pAC->dev[1];
 
-       SkGeProcRemove(dev);
        unregister_netdev(dev);
-       if (otherdev != dev)
-               SkGeProcRemove(otherdev);
 
        SkGeYellowLED(pAC, pAC->IoBase, 0);
 
@@ -5180,9 +5050,9 @@ static int skge_resume(struct pci_dev *pdev)
        pci_enable_device(pdev);
        pci_set_master(pdev);
        if (pAC->GIni.GIMacsFound == 2)
-               ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, pAC->Name, dev);
+               ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev);
        else
-               ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, pAC->Name, dev);
+               ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, "sk98lin", dev);
        if (ret) {
                printk(KERN_WARNING "sk98lin: unable to acquire IRQ %d\n", dev->irq);
                pAC->AllocFlag &= ~SK_ALLOC_IRQ;
@@ -5240,23 +5110,12 @@ static struct pci_driver skge_driver = {
 
 static int __init skge_init(void)
 {
-       int error;
-
-       pSkRootDir = proc_mkdir(SKRootName, NULL);
-       if (pSkRootDir) 
-               pSkRootDir->owner = THIS_MODULE;
-       
-       error = pci_register_driver(&skge_driver);
-       if (error)
-               remove_proc_entry(SKRootName, NULL);
-       return error;
+       return pci_module_init(&skge_driver);
 }
 
 static void __exit skge_exit(void)
 {
        pci_unregister_driver(&skge_driver);
-       remove_proc_entry(SKRootName, NULL);
-
 }
 
 module_init(skge_init);
diff --git a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c
deleted file mode 100644 (file)
index 5cece25..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-/******************************************************************************
- *
- * Name:       skproc.c
- * Project:    GEnesis, PCI Gigabit Ethernet Adapter
- * Version:    $Revision: 1.11 $
- * Date:       $Date: 2003/12/11 16:03:57 $
- * Purpose:    Funktions to display statictic data
- *
- ******************************************************************************/
-/******************************************************************************
- *
- *     (C)Copyright 1998-2002 SysKonnect GmbH.
- *     (C)Copyright 2002-2003 Marvell.
- *
- *     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.
- *
- *     Created 22-Nov-2000
- *     Author: Mirko Lindner (mlindner@syskonnect.de)
- *
- *     The information in this file is provided "AS IS" without warranty.
- *
- ******************************************************************************/
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-
-#include "h/skdrv1st.h"
-#include "h/skdrv2nd.h"
-#include "h/skversion.h"
-
-static int sk_seq_show(struct seq_file *seq, void *v);
-static int sk_proc_open(struct inode *inode, struct file *file);
-
-struct file_operations sk_proc_fops = {
-       .owner          = THIS_MODULE,
-       .open           = sk_proc_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
-
-/*****************************************************************************
- *
- *      sk_seq_show - show proc information of a particular adapter
- *
- * Description:
- *  This function fills the proc entry with statistic data about 
- *  the ethernet device. It invokes the generic sk_gen_browse() to
- *  print out all items one per one.
- *  
- * Returns: 0
- *      
- */
-static int sk_seq_show(struct seq_file *seq, void *v)
-{
-       struct net_device *dev = seq->private;
-       DEV_NET                 *pNet = netdev_priv(dev);
-       SK_AC                   *pAC = pNet->pAC;
-       SK_PNMI_STRUCT_DATA     *pPnmiStruct = &pAC->PnmiStruct;
-       unsigned long           Flags;  
-       unsigned int            Size;
-       char                    sens_msg[50];
-       int                     t;
-       int                     i;
-
-       /* NetIndex in GetStruct is now required, zero is only dummy */
-       for (t=pAC->GIni.GIMacsFound; t > 0; t--) {
-               if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1)
-                       t--;
-
-               spin_lock_irqsave(&pAC->SlowPathLock, Flags);
-               Size = SK_PNMI_STRUCT_SIZE;
-#ifdef SK_DIAG_SUPPORT
-               if (pAC->BoardLevel == SK_INIT_DATA) {
-                       SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA));
-                       if (pAC->DiagModeActive == DIAG_NOTACTIVE) {
-                               pAC->Pnmi.DiagAttached = SK_DIAG_IDLE;
-                       }
-               } else {
-                       SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1);
-               }
-#else
-               SkPnmiGetStruct(pAC, pAC->IoBase, 
-                               pPnmiStruct, &Size, t-1);
-#endif
-               spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
-       
-               if (pAC->dev[t-1] == dev) {
-                       SK_PNMI_STAT    *pPnmiStat = &pPnmiStruct->Stat[0];
-
-                       seq_printf(seq, "\nDetailed statistic for device %s\n",
-                                     pAC->dev[t-1]->name);
-                       seq_printf(seq, "=======================================\n");
-       
-                       /* Board statistics */
-                       seq_printf(seq, "\nBoard statistics\n\n");
-                       seq_printf(seq, "Active Port                    %c\n",
-                                     'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
-                                                                   Net[t-1].PrefPort]->PortNumber);
-                       seq_printf(seq, "Preferred Port                 %c\n",
-                                     'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
-                                                                   Net[t-1].PrefPort]->PortNumber);
-
-                       seq_printf(seq, "Bus speed (MHz)                %d\n",
-                                     pPnmiStruct->BusSpeed);
-
-                       seq_printf(seq, "Bus width (Bit)                %d\n",
-                                     pPnmiStruct->BusWidth);
-                       seq_printf(seq, "Driver version                 %s\n",
-                                     VER_STRING);
-                       seq_printf(seq, "Hardware revision              v%d.%d\n",
-                                     (pAC->GIni.GIPciHwRev >> 4) & 0x0F,
-                                     pAC->GIni.GIPciHwRev & 0x0F);
-
-                       /* Print sensor informations */
-                       for (i=0; i < pAC->I2c.MaxSens; i ++) {
-                               /* Check type */
-                               switch (pAC->I2c.SenTable[i].SenType) {
-                               case 1:
-                                       strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-                                       strcat(sens_msg, " (C)");
-                                       seq_printf(seq, "%-25s      %d.%02d\n",
-                                                     sens_msg,
-                                                     pAC->I2c.SenTable[i].SenValue / 10,
-                                                     pAC->I2c.SenTable[i].SenValue % 10);
-
-                                       strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-                                       strcat(sens_msg, " (F)");
-                                       seq_printf(seq, "%-25s      %d.%02d\n",
-                                                     sens_msg,
-                                                     ((((pAC->I2c.SenTable[i].SenValue)
-                                                        *10)*9)/5 + 3200)/100,
-                                                     ((((pAC->I2c.SenTable[i].SenValue)
-                                                        *10)*9)/5 + 3200) % 10);
-                                       break;
-                               case 2:
-                                       strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-                                       strcat(sens_msg, " (V)");
-                                       seq_printf(seq, "%-25s      %d.%03d\n",
-                                                     sens_msg,
-                                                     pAC->I2c.SenTable[i].SenValue / 1000,
-                                                     pAC->I2c.SenTable[i].SenValue % 1000);
-                                       break;
-                               case 3:
-                                       strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-                                       strcat(sens_msg, " (rpm)");
-                                       seq_printf(seq, "%-25s      %d\n",
-                                                     sens_msg,
-                                                     pAC->I2c.SenTable[i].SenValue);
-                                       break;
-                               default:
-                                       break;
-                               }
-                       }
-                               
-                       /*Receive statistics */
-                       seq_printf(seq, "\nReceive statistics\n\n");
-
-                       seq_printf(seq, "Received bytes                 %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxOctetsOkCts);
-                       seq_printf(seq, "Received packets               %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxOkCts);
-#if 0
-                       if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && 
-                           pAC->HWRevision < 12) {
-                               pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - 
-                                       pPnmiStat->StatRxShortsCts;
-                               pPnmiStat->StatRxShortsCts = 0;
-                       }
-#endif
-                       if (dev->mtu > 1500)
-                               pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
-                                       pPnmiStat->StatRxTooLongCts;
-
-                       seq_printf(seq, "Receive errors                 %Lu\n",
-                                     (unsigned long long) pPnmiStruct->InErrorsCts);
-                       seq_printf(seq, "Receive dropped                %Lu\n",
-                                     (unsigned long long) pPnmiStruct->RxNoBufCts);
-                       seq_printf(seq, "Received multicast             %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxMulticastOkCts);
-                       seq_printf(seq, "Receive error types\n");
-                       seq_printf(seq, "   length                      %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxRuntCts);
-                       seq_printf(seq, "   buffer overflow             %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxFifoOverflowCts);
-                       seq_printf(seq, "   bad crc                     %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxFcsCts);
-                       seq_printf(seq, "   framing                     %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxFramingCts);
-                       seq_printf(seq, "   missed frames               %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxMissedCts);
-
-                       if (dev->mtu > 1500)
-                               pPnmiStat->StatRxTooLongCts = 0;
-
-                       seq_printf(seq, "   too long                    %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxTooLongCts);                                        
-                       seq_printf(seq, "   carrier extension           %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxCextCts);                           
-                       seq_printf(seq, "   too short                   %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxShortsCts);                         
-                       seq_printf(seq, "   symbol                      %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxSymbolCts);                         
-                       seq_printf(seq, "   LLC MAC size                %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxIRLengthCts);                               
-                       seq_printf(seq, "   carrier event               %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxCarrierCts);                                
-                       seq_printf(seq, "   jabber                      %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatRxJabberCts);                         
-
-
-                       /*Transmit statistics */
-                       seq_printf(seq, "\nTransmit statistics\n\n");
-                               
-                       seq_printf(seq, "Transmited bytes               %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxOctetsOkCts);
-                       seq_printf(seq, "Transmited packets             %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxOkCts);
-                       seq_printf(seq, "Transmit errors                %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
-                       seq_printf(seq, "Transmit dropped               %Lu\n",
-                                     (unsigned long long) pPnmiStruct->TxNoBufCts);
-                       seq_printf(seq, "Transmit collisions            %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
-                       seq_printf(seq, "Transmit error types\n");
-                       seq_printf(seq, "   excessive collision         %ld\n",
-                                     pAC->stats.tx_aborted_errors);
-                       seq_printf(seq, "   carrier                     %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxCarrierCts);
-                       seq_printf(seq, "   fifo underrun               %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts);
-                       seq_printf(seq, "   heartbeat                   %Lu\n",
-                                     (unsigned long long) pPnmiStat->StatTxCarrierCts);
-                       seq_printf(seq, "   window                      %ld\n",
-                                     pAC->stats.tx_window_errors);
-                               
-               }
-       }
-       return 0;
-}
-
-/*****************************************************************************
- *
- *      sk_proc_open - register the show function when proc is open'ed
- *  
- * Description:
- *  This function is called whenever a sk98lin proc file is queried.
- *  
- * Returns: the return value of single_open()
- *      
- */
-static int sk_proc_open(struct inode *inode, struct file *file)
-{
-    return single_open(file, sk_seq_show, PDE(inode)->data);
-}
-
-/*******************************************************************************
- *
- * End of file
- *
- ******************************************************************************/
index 596c93b12daad126b18e9ae305bd2c1c8f695687..b538e3038058a7afe022a83fbadf9876dac0ffbb 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/in.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -43,7 +44,7 @@
 #include "skge.h"
 
 #define DRV_NAME               "skge"
-#define DRV_VERSION            "1.2"
+#define DRV_VERSION            "1.3"
 #define PFX                    DRV_NAME " "
 
 #define DEFAULT_TX_RING_SIZE   128
@@ -88,15 +89,14 @@ 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_phy_reset(struct skge_port *skge);
 static void skge_tx_clean(struct skge_port *skge);
 static int xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val);
 static int 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 void genesis_link_up(struct skge_port *skge);
 
 /* Avoid conditionals by using array */
@@ -276,10 +276,9 @@ static int skge_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
        skge->autoneg = ecmd->autoneg;
        skge->advertising = ecmd->advertising;
 
-       if (netif_running(dev)) {
-               skge_down(dev);
-               skge_up(dev);
-       }
+       if (netif_running(dev))
+               skge_phy_reset(skge);
+
        return (0);
 }
 
@@ -399,6 +398,7 @@ static int skge_set_ring_param(struct net_device *dev,
                               struct ethtool_ringparam *p)
 {
        struct skge_port *skge = netdev_priv(dev);
+       int err;
 
        if (p->rx_pending == 0 || p->rx_pending > MAX_RX_RING_SIZE ||
            p->tx_pending == 0 || p->tx_pending > MAX_TX_RING_SIZE)
@@ -409,7 +409,9 @@ static int skge_set_ring_param(struct net_device *dev,
 
        if (netif_running(dev)) {
                skge_down(dev);
-               skge_up(dev);
+               err = skge_up(dev);
+               if (err)
+                       dev_close(dev);
        }
 
        return 0;
@@ -430,21 +432,11 @@ static void skge_set_msglevel(struct net_device *netdev, u32 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);
+       skge_phy_reset(skge);
        return 0;
 }
 
@@ -516,10 +508,8 @@ static int skge_set_pauseparam(struct net_device *dev,
        else
                skge->flow_control = FLOW_MODE_NONE;
 
-       if (netif_running(dev)) {
-               skge_down(dev);
-               skge_up(dev);
-       }
+       if (netif_running(dev))
+               skge_phy_reset(skge);
        return 0;
 }
 
@@ -2019,6 +2009,25 @@ static void yukon_phy_intr(struct skge_port *skge)
        /* XXX restart autonegotiation? */
 }
 
+static void skge_phy_reset(struct skge_port *skge)
+{
+       struct skge_hw *hw = skge->hw;
+       int port = skge->port;
+
+       netif_stop_queue(skge->netdev);
+       netif_carrier_off(skge->netdev);
+
+       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);
+}
+
 /* Basic MII support */
 static int skge_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
@@ -2187,6 +2196,7 @@ static int skge_up(struct net_device *dev)
        kfree(skge->rx_ring.start);
  free_pci_mem:
        pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma);
+       skge->mem = NULL;
 
        return err;
 }
@@ -2197,6 +2207,9 @@ static int skge_down(struct net_device *dev)
        struct skge_hw *hw = skge->hw;
        int port = skge->port;
 
+       if (skge->mem == NULL)
+               return 0;
+
        if (netif_msg_ifdown(skge))
                printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
 
@@ -2253,6 +2266,7 @@ static int skge_down(struct net_device *dev)
        kfree(skge->rx_ring.start);
        kfree(skge->tx_ring.start);
        pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma);
+       skge->mem = NULL;
        return 0;
 }
 
@@ -2280,11 +2294,13 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
        }
 
        if (unlikely(skge->tx_avail < skb_shinfo(skb)->nr_frags +1)) {
-               netif_stop_queue(dev);
-               spin_unlock_irqrestore(&skge->tx_lock, flags);
+               if (!netif_queue_stopped(dev)) {
+                       netif_stop_queue(dev);
 
-               printk(KERN_WARNING PFX "%s: ring full when queue awake!\n",
-                      dev->name);
+                       printk(KERN_WARNING PFX "%s: ring full when queue awake!\n",
+                              dev->name);
+               }
+               spin_unlock_irqrestore(&skge->tx_lock, flags);
                return NETDEV_TX_BUSY;
        }
 
@@ -2300,14 +2316,12 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
        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
+               if (skb->h.ipiph->protocol == IPPROTO_UDP
                    && hw->chip_rev == 0 && hw->chip_id == CHIP_ID_YUKON)
                        control = BMU_TCP_CHECK;
                else
@@ -2413,18 +2427,23 @@ static void skge_tx_timeout(struct net_device *dev)
 
 static int skge_change_mtu(struct net_device *dev, int new_mtu)
 {
-       int err = 0;
-       int running = netif_running(dev);
+       int err;
 
        if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
                return -EINVAL;
 
+       if (!netif_running(dev)) {
+               dev->mtu = new_mtu;
+               return 0;
+       }
+
+       skge_down(dev);
 
-       if (running)
-               skge_down(dev);
        dev->mtu = new_mtu;
-       if (running)
-               skge_up(dev);
+
+       err = skge_up(dev);
+       if (err)
+               dev_close(dev);
 
        return err;
 }
@@ -3398,8 +3417,8 @@ static int skge_resume(struct pci_dev *pdev)
                struct net_device *dev = hw->dev[i];
                if (dev) {
                        netif_device_attach(dev);
-                       if (netif_running(dev))
-                               skge_up(dev);
+                       if (netif_running(dev) && skge_up(dev))
+                               dev_close(dev);
                }
        }
        return 0;
index ee123c15f5450947f874bcd3b5963ba61f1dc98f..2efdacc290e58962cb8917953e78cb7afd6ca17d 100644 (file)
@@ -475,18 +475,6 @@ enum {
        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))
 
@@ -675,22 +663,16 @@ enum {
        LED_OFF = 1<<0, /* switch LED off */
 };
 
-/* Receive GMAC FIFO (YUKON and Yukon-2) */
+/* Receive GMAC FIFO (YUKON) */
 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 */
 };
 
@@ -855,48 +837,6 @@ enum {
        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,
@@ -923,8 +863,6 @@ enum {
        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) */
@@ -1641,15 +1579,6 @@ enum {
        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 {
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
new file mode 100644 (file)
index 0000000..f5d697c
--- /dev/null
@@ -0,0 +1,3262 @@
+/*
+ * New driver for Marvell Yukon 2 chipset.
+ * Based on earlier sk98lin, and skge driver.
+ *
+ * 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) 2005 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.
+ */
+
+/*
+ * TOTEST
+ *     - speed setting
+ *     - suspend/resume
+ */
+
+#include <linux/config.h>
+#include <linux/crc32.h>
+#include <linux/kernel.h>
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/dma-mapping.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/pci.h>
+#include <linux/ip.h>
+#include <linux/tcp.h>
+#include <linux/in.h>
+#include <linux/delay.h>
+#include <linux/workqueue.h>
+#include <linux/if_vlan.h>
+#include <linux/prefetch.h>
+#include <linux/mii.h>
+
+#include <asm/irq.h>
+
+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+#define SKY2_VLAN_TAG_USED 1
+#endif
+
+#include "sky2.h"
+
+#define DRV_NAME               "sky2"
+#define DRV_VERSION            "0.11"
+#define PFX                    DRV_NAME " "
+
+/*
+ * The Yukon II chipset takes 64 bit command blocks (called list elements)
+ * that are organized into three (receive, transmit, status) different rings
+ * similar to Tigon3. A transmit can require several elements;
+ * a receive requires one (or two if using 64 bit dma).
+ */
+
+#define is_ec_a1(hw) \
+       unlikely((hw)->chip_id == CHIP_ID_YUKON_EC && \
+                (hw)->chip_rev == CHIP_REV_YU_EC_A1)
+
+#define RX_LE_SIZE             512
+#define RX_LE_BYTES            (RX_LE_SIZE*sizeof(struct sky2_rx_le))
+#define RX_MAX_PENDING         (RX_LE_SIZE/2 - 2)
+#define RX_DEF_PENDING         RX_MAX_PENDING
+
+#define TX_RING_SIZE           512
+#define TX_DEF_PENDING         (TX_RING_SIZE - 1)
+#define TX_MIN_PENDING         64
+#define MAX_SKB_TX_LE          (4 + 2*MAX_SKB_FRAGS)
+
+#define STATUS_RING_SIZE       2048    /* 2 ports * (TX + 2*RX) */
+#define STATUS_LE_BYTES                (STATUS_RING_SIZE*sizeof(struct sky2_status_le))
+#define ETH_JUMBO_MTU          9000
+#define TX_WATCHDOG            (5 * HZ)
+#define NAPI_WEIGHT            64
+#define PHY_RETRIES            1000
+
+static const u32 default_msg =
+    NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK
+    | NETIF_MSG_TIMER | NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR
+    | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN | NETIF_MSG_INTR;
+
+static int debug = -1;         /* defaults above */
+module_param(debug, int, 0);
+MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
+
+static int copybreak __read_mostly = 256;
+module_param(copybreak, int, 0);
+MODULE_PARM_DESC(copybreak, "Receive copy threshold");
+
+static const struct pci_device_id sky2_id_table[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) },
+       { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) },
+       { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) },
+       { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4343) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4344) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4345) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4346) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4347) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4350) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4351) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4360) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) },
+       { 0 }
+};
+
+MODULE_DEVICE_TABLE(pci, sky2_id_table);
+
+/* Avoid conditionals by using array */
+static const unsigned txqaddr[] = { Q_XA1, Q_XA2 };
+static const unsigned rxqaddr[] = { Q_R1, Q_R2 };
+
+/* This driver supports yukon2 chipset only */
+static const char *yukon2_name[] = {
+       "XL",           /* 0xb3 */
+       "EC Ultra",     /* 0xb4 */
+       "UNKNOWN",      /* 0xb5 */
+       "EC",           /* 0xb6 */
+       "FE",           /* 0xb7 */
+};
+
+/* Access to external PHY */
+static int gm_phy_write(struct sky2_hw *hw, unsigned port, u16 reg, u16 val)
+{
+       int i;
+
+       gma_write16(hw, port, GM_SMI_DATA, val);
+       gma_write16(hw, port, GM_SMI_CTRL,
+                   GM_SMI_CT_PHY_AD(PHY_ADDR_MARV) | GM_SMI_CT_REG_AD(reg));
+
+       for (i = 0; i < PHY_RETRIES; i++) {
+               if (!(gma_read16(hw, port, GM_SMI_CTRL) & GM_SMI_CT_BUSY))
+                       return 0;
+               udelay(1);
+       }
+
+       printk(KERN_WARNING PFX "%s: phy write timeout\n", hw->dev[port]->name);
+       return -ETIMEDOUT;
+}
+
+static int __gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg, u16 *val)
+{
+       int i;
+
+       gma_write16(hw, port, GM_SMI_CTRL, GM_SMI_CT_PHY_AD(PHY_ADDR_MARV)
+                   | GM_SMI_CT_REG_AD(reg) | GM_SMI_CT_OP_RD);
+
+       for (i = 0; i < PHY_RETRIES; i++) {
+               if (gma_read16(hw, port, GM_SMI_CTRL) & GM_SMI_CT_RD_VAL) {
+                       *val = gma_read16(hw, port, GM_SMI_DATA);
+                       return 0;
+               }
+
+               udelay(1);
+       }
+
+       return -ETIMEDOUT;
+}
+
+static u16 gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg)
+{
+       u16 v;
+
+       if (__gm_phy_read(hw, port, reg, &v) != 0)
+               printk(KERN_WARNING PFX "%s: phy read timeout\n", hw->dev[port]->name);
+       return v;
+}
+
+static int sky2_set_power_state(struct sky2_hw *hw, pci_power_t state)
+{
+       u16 power_control;
+       u32 reg1;
+       int vaux;
+       int ret = 0;
+
+       pr_debug("sky2_set_power_state %d\n", state);
+       sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+
+       pci_read_config_word(hw->pdev, hw->pm_cap + PCI_PM_PMC, &power_control);
+       vaux = (sky2_read8(hw, B0_CTST) & Y2_VAUX_AVAIL) &&
+               (power_control & PCI_PM_CAP_PME_D3cold);
+
+       pci_read_config_word(hw->pdev, hw->pm_cap + PCI_PM_CTRL, &power_control);
+
+       power_control |= PCI_PM_CTRL_PME_STATUS;
+       power_control &= ~(PCI_PM_CTRL_STATE_MASK);
+
+       switch (state) {
+       case PCI_D0:
+               /* switch power to VCC (WA for VAUX problem) */
+               sky2_write8(hw, B0_POWER_CTRL,
+                           PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_OFF | PC_VCC_ON);
+
+               /* disable Core Clock Division, */
+               sky2_write32(hw, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS);
+
+               if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
+                       /* enable bits are inverted */
+                       sky2_write8(hw, B2_Y2_CLK_GATE,
+                                   Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
+                                   Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
+                                   Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS);
+               else
+                       sky2_write8(hw, B2_Y2_CLK_GATE, 0);
+
+               /* Turn off phy power saving */
+               pci_read_config_dword(hw->pdev, PCI_DEV_REG1, &reg1);
+               reg1 &= ~(PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
+
+               /* looks like this XL is back asswards .. */
+               if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) {
+                       reg1 |= PCI_Y2_PHY1_COMA;
+                       if (hw->ports > 1)
+                               reg1 |= PCI_Y2_PHY2_COMA;
+               }
+               pci_write_config_dword(hw->pdev, PCI_DEV_REG1, reg1);
+               break;
+
+       case PCI_D3hot:
+       case PCI_D3cold:
+               /* Turn on phy power saving */
+               pci_read_config_dword(hw->pdev, PCI_DEV_REG1, &reg1);
+               if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
+                       reg1 &= ~(PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
+               else
+                       reg1 |= (PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
+               pci_write_config_dword(hw->pdev, PCI_DEV_REG1, reg1);
+
+               if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
+                       sky2_write8(hw, B2_Y2_CLK_GATE, 0);
+               else
+                       /* enable bits are inverted */
+                       sky2_write8(hw, B2_Y2_CLK_GATE,
+                                   Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
+                                   Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
+                                   Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS);
+
+               /* switch power to VAUX */
+               if (vaux && state != PCI_D3cold)
+                       sky2_write8(hw, B0_POWER_CTRL,
+                                   (PC_VAUX_ENA | PC_VCC_ENA |
+                                    PC_VAUX_ON | PC_VCC_OFF));
+               break;
+       default:
+               printk(KERN_ERR PFX "Unknown power state %d\n", state);
+               ret = -1;
+       }
+
+       pci_write_config_byte(hw->pdev, hw->pm_cap + PCI_PM_CTRL, power_control);
+       sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+       return ret;
+}
+
+static void sky2_phy_reset(struct sky2_hw *hw, unsigned port)
+{
+       u16 reg;
+
+       /* disable all GMAC IRQ's */
+       sky2_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
+       /* disable PHY IRQs */
+       gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
+
+       gma_write16(hw, port, GM_MC_ADDR_H1, 0);        /* clear MC hash */
+       gma_write16(hw, port, GM_MC_ADDR_H2, 0);
+       gma_write16(hw, port, GM_MC_ADDR_H3, 0);
+       gma_write16(hw, port, GM_MC_ADDR_H4, 0);
+
+       reg = gma_read16(hw, port, GM_RX_CTRL);
+       reg |= GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA;
+       gma_write16(hw, port, GM_RX_CTRL, reg);
+}
+
+static void sky2_phy_init(struct sky2_hw *hw, unsigned port)
+{
+       struct sky2_port *sky2 = netdev_priv(hw->dev[port]);
+       u16 ctrl, ct1000, adv, pg, ledctrl, ledover;
+
+       if (sky2->autoneg == AUTONEG_ENABLE && hw->chip_id != CHIP_ID_YUKON_XL) {
+               u16 ectrl = 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);
+
+               if (hw->chip_id == CHIP_ID_YUKON_EC)
+                       ectrl |= PHY_M_EC_DSC_2(2) | PHY_M_EC_DOWN_S_ENA;
+               else
+                       ectrl |= PHY_M_EC_M_DSC(2) | PHY_M_EC_S_DSC(3);
+
+               gm_phy_write(hw, port, PHY_MARV_EXT_CTRL, ectrl);
+       }
+
+       ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
+       if (hw->copper) {
+               if (hw->chip_id == CHIP_ID_YUKON_FE) {
+                       /* enable automatic crossover */
+                       ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1;
+               } else {
+                       /* disable energy detect */
+                       ctrl &= ~PHY_M_PC_EN_DET_MSK;
+
+                       /* enable automatic crossover */
+                       ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO);
+
+                       if (sky2->autoneg == AUTONEG_ENABLE &&
+                           hw->chip_id == CHIP_ID_YUKON_XL) {
+                               ctrl &= ~PHY_M_PC_DSC_MSK;
+                               ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA;
+                       }
+               }
+               gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+       } else {
+               /* workaround for deviation #4.88 (CRC errors) */
+               /* disable Automatic Crossover */
+
+               ctrl &= ~PHY_M_PC_MDIX_MSK;
+               gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+
+               if (hw->chip_id == CHIP_ID_YUKON_XL) {
+                       /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */
+                       gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2);
+                       ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
+                       ctrl &= ~PHY_M_MAC_MD_MSK;
+                       ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX);
+                       gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+
+                       /* select page 1 to access Fiber registers */
+                       gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 1);
+               }
+       }
+
+       ctrl = gm_phy_read(hw, port, PHY_MARV_CTRL);
+       if (sky2->autoneg == AUTONEG_DISABLE)
+               ctrl &= ~PHY_CT_ANE;
+       else
+               ctrl |= PHY_CT_ANE;
+
+       ctrl |= PHY_CT_RESET;
+       gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
+
+       ctrl = 0;
+       ct1000 = 0;
+       adv = PHY_AN_CSMA;
+
+       if (sky2->autoneg == AUTONEG_ENABLE) {
+               if (hw->copper) {
+                       if (sky2->advertising & ADVERTISED_1000baseT_Full)
+                               ct1000 |= PHY_M_1000C_AFD;
+                       if (sky2->advertising & ADVERTISED_1000baseT_Half)
+                               ct1000 |= PHY_M_1000C_AHD;
+                       if (sky2->advertising & ADVERTISED_100baseT_Full)
+                               adv |= PHY_M_AN_100_FD;
+                       if (sky2->advertising & ADVERTISED_100baseT_Half)
+                               adv |= PHY_M_AN_100_HD;
+                       if (sky2->advertising & ADVERTISED_10baseT_Full)
+                               adv |= PHY_M_AN_10_FD;
+                       if (sky2->advertising & ADVERTISED_10baseT_Half)
+                               adv |= PHY_M_AN_10_HD;
+               } else          /* special defines for FIBER (88E1011S only) */
+                       adv |= PHY_M_AN_1000X_AHD | PHY_M_AN_1000X_AFD;
+
+               /* Set Flow-control capabilities */
+               if (sky2->tx_pause && sky2->rx_pause)
+                       adv |= PHY_AN_PAUSE_CAP;        /* symmetric */
+               else if (sky2->rx_pause && !sky2->tx_pause)
+                       adv |= PHY_AN_PAUSE_ASYM | PHY_AN_PAUSE_CAP;
+               else if (!sky2->rx_pause && sky2->tx_pause)
+                       adv |= PHY_AN_PAUSE_ASYM;       /* local */
+
+               /* Restart Auto-negotiation */
+               ctrl |= PHY_CT_ANE | PHY_CT_RE_CFG;
+       } else {
+               /* forced speed/duplex settings */
+               ct1000 = PHY_M_1000C_MSE;
+
+               if (sky2->duplex == DUPLEX_FULL)
+                       ctrl |= PHY_CT_DUP_MD;
+
+               switch (sky2->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)
+               gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, ct1000);
+
+       gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv);
+       gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
+
+       /* Setup Phy LED's */
+       ledctrl = PHY_M_LED_PULS_DUR(PULS_170MS);
+       ledover = 0;
+
+       switch (hw->chip_id) {
+       case CHIP_ID_YUKON_FE:
+               /* on 88E3082 these bits are at 11..9 (shifted left) */
+               ledctrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) << 1;
+
+               ctrl = gm_phy_read(hw, port, PHY_MARV_FE_LED_PAR);
+
+               /* delete ACT LED control bits */
+               ctrl &= ~PHY_M_FELP_LED1_MSK;
+               /* change ACT LED control to blink mode */
+               ctrl |= PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL);
+               gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR, ctrl);
+               break;
+
+       case CHIP_ID_YUKON_XL:
+               pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
+
+               /* select page 3 to access LED control register */
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
+
+               /* set LED Function Control register */
+               gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, (PHY_M_LEDC_LOS_CTRL(1) |     /* LINK/ACT */
+                                                          PHY_M_LEDC_INIT_CTRL(7) |    /* 10 Mbps */
+                                                          PHY_M_LEDC_STA1_CTRL(7) |    /* 100 Mbps */
+                                                          PHY_M_LEDC_STA0_CTRL(7)));   /* 1000 Mbps */
+
+               /* set Polarity Control register */
+               gm_phy_write(hw, port, PHY_MARV_PHY_STAT,
+                            (PHY_M_POLC_LS1_P_MIX(4) |
+                             PHY_M_POLC_IS0_P_MIX(4) |
+                             PHY_M_POLC_LOS_CTRL(2) |
+                             PHY_M_POLC_INIT_CTRL(2) |
+                             PHY_M_POLC_STA1_CTRL(2) |
+                             PHY_M_POLC_STA0_CTRL(2)));
+
+               /* restore page register */
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
+               break;
+
+       default:
+               /* 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);
+       }
+
+       gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl);
+
+       if (sky2->autoneg == AUTONEG_DISABLE || sky2->speed == SPEED_100) {
+               /* turn on 100 Mbps LED (LED_LINK100) */
+               ledover |= PHY_M_LED_MO_100(MO_LED_ON);
+       }
+
+       if (ledover)
+               gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover);
+
+       /* Enable phy interrupt on auto-negotiation complete (or link up) */
+       if (sky2->autoneg == AUTONEG_ENABLE)
+               gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_IS_AN_COMPL);
+       else
+               gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
+}
+
+/* Force a renegotiation */
+static void sky2_phy_reinit(struct sky2_port *sky2)
+{
+       down(&sky2->phy_sema);
+       sky2_phy_init(sky2->hw, sky2->port);
+       up(&sky2->phy_sema);
+}
+
+static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
+{
+       struct sky2_port *sky2 = netdev_priv(hw->dev[port]);
+       u16 reg;
+       int i;
+       const u8 *addr = hw->dev[port]->dev_addr;
+
+       sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
+       sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR|GPC_ENA_PAUSE);
+
+       sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR);
+
+       if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0 && port == 1) {
+               /* WA DEV_472 -- looks like crossed wires on port 2 */
+               /* clear GMAC 1 Control reset */
+               sky2_write8(hw, SK_REG(0, GMAC_CTRL), GMC_RST_CLR);
+               do {
+                       sky2_write8(hw, SK_REG(1, GMAC_CTRL), GMC_RST_SET);
+                       sky2_write8(hw, SK_REG(1, GMAC_CTRL), GMC_RST_CLR);
+               } while (gm_phy_read(hw, 1, PHY_MARV_ID0) != PHY_MARV_ID0_VAL ||
+                        gm_phy_read(hw, 1, PHY_MARV_ID1) != PHY_MARV_ID1_Y2 ||
+                        gm_phy_read(hw, 1, PHY_MARV_INT_MASK) != 0);
+       }
+
+       if (sky2->autoneg == AUTONEG_DISABLE) {
+               reg = gma_read16(hw, port, GM_GP_CTRL);
+               reg |= GM_GPCR_AU_ALL_DIS;
+               gma_write16(hw, port, GM_GP_CTRL, reg);
+               gma_read16(hw, port, GM_GP_CTRL);
+
+               switch (sky2->speed) {
+               case SPEED_1000:
+                       reg |= GM_GPCR_SPEED_1000;
+                       /* fallthru */
+               case SPEED_100:
+                       reg |= GM_GPCR_SPEED_100;
+               }
+
+               if (sky2->duplex == DUPLEX_FULL)
+                       reg |= GM_GPCR_DUP_FULL;
+       } else
+               reg = GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100 | GM_GPCR_DUP_FULL;
+
+       if (!sky2->tx_pause && !sky2->rx_pause) {
+               sky2_write32(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
+               reg |=
+                   GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
+       } else if (sky2->tx_pause && !sky2->rx_pause) {
+               /* disable Rx flow-control */
+               reg |= GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
+       }
+
+       gma_write16(hw, port, GM_GP_CTRL, reg);
+
+       sky2_read16(hw, SK_REG(port, GMAC_IRQ_SRC));
+
+       down(&sky2->phy_sema);
+       sky2_phy_init(hw, port);
+       up(&sky2->phy_sema);
+
+       /* MIB clear */
+       reg = gma_read16(hw, port, GM_PHY_ADDR);
+       gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR);
+
+       for (i = 0; i < GM_MIB_CNT_SIZE; i++)
+               gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i);
+       gma_write16(hw, port, GM_PHY_ADDR, reg);
+
+       /* transmit control */
+       gma_write16(hw, port, GM_TX_CTRL, TX_COL_THR(TX_COL_DEF));
+
+       /* receive control reg: unicast + multicast + no FCS  */
+       gma_write16(hw, port, GM_RX_CTRL,
+                   GM_RXCR_UCF_ENA | GM_RXCR_CRC_DIS | GM_RXCR_MCF_ENA);
+
+       /* transmit flow control */
+       gma_write16(hw, port, GM_TX_FLOW_CTRL, 0xffff);
+
+       /* transmit parameter */
+       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) |
+                   TX_BACK_OFF_LIM(TX_BOF_LIM_DEF));
+
+       /* serial mode register */
+       reg = DATA_BLIND_VAL(DATA_BLIND_DEF) |
+               GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
+
+       if (hw->dev[port]->mtu > ETH_DATA_LEN)
+               reg |= GM_SMOD_JUMBO_ENA;
+
+       gma_write16(hw, port, GM_SERIAL_MODE, reg);
+
+       /* virtual address for data */
+       gma_set_addr(hw, port, GM_SRC_ADDR_2L, addr);
+
+       /* physical address: used for pause frames */
+       gma_set_addr(hw, port, GM_SRC_ADDR_1L, addr);
+
+       /* ignore counter overflows */
+       gma_write16(hw, port, GM_TX_IRQ_MSK, 0);
+       gma_write16(hw, port, GM_RX_IRQ_MSK, 0);
+       gma_write16(hw, port, GM_TR_IRQ_MSK, 0);
+
+       /* Configure Rx MAC FIFO */
+       sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_CLR);
+       sky2_write16(hw, SK_REG(port, RX_GMF_CTRL_T),
+                    GMF_RX_CTRL_DEF);
+
+       /* Flush Rx MAC FIFO on any flow control or error */
+       sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR);
+
+       /* Set threshold to 0xa (64 bytes)
+        *  ASF disabled so no need to do WA dev #4.30
+        */
+       sky2_write16(hw, SK_REG(port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF);
+
+       /* Configure Tx MAC FIFO */
+       sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR);
+       sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON);
+
+       if (hw->chip_id == CHIP_ID_YUKON_EC_U) {
+               sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8);
+               sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8);
+               if (hw->dev[port]->mtu > ETH_DATA_LEN) {
+                       /* set Tx GMAC FIFO Almost Empty Threshold */
+                       sky2_write32(hw, SK_REG(port, TX_GMF_AE_THR), 0x180);
+                       /* Disable Store & Forward mode for TX */
+                       sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_DIS);
+               }
+       }
+
+}
+
+static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, size_t len)
+{
+       u32 end;
+
+       start /= 8;
+       len /= 8;
+       end = start + len - 1;
+
+       sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
+       sky2_write32(hw, RB_ADDR(q, RB_START), start);
+       sky2_write32(hw, RB_ADDR(q, RB_END), end);
+       sky2_write32(hw, RB_ADDR(q, RB_WP), start);
+       sky2_write32(hw, RB_ADDR(q, RB_RP), start);
+
+       if (q == Q_R1 || q == Q_R2) {
+               u32 rxup, rxlo;
+
+               rxlo = len/2;
+               rxup = rxlo + len/4;
+
+               /* Set thresholds on receive queue's */
+               sky2_write32(hw, RB_ADDR(q, RB_RX_UTPP), rxup);
+               sky2_write32(hw, RB_ADDR(q, RB_RX_LTPP), rxlo);
+       } else {
+               /* Enable store & forward on Tx queue's because
+                * Tx FIFO is only 1K on Yukon
+                */
+               sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
+       }
+
+       sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
+       sky2_read8(hw, RB_ADDR(q, RB_CTRL));
+}
+
+/* Setup Bus Memory Interface */
+static void sky2_qset(struct sky2_hw *hw, u16 q)
+{
+       sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_RESET);
+       sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_OPER_INIT);
+       sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_FIFO_OP_ON);
+       sky2_write32(hw, Q_ADDR(q, Q_WM),  BMU_WM_DEFAULT);
+}
+
+/* Setup prefetch unit registers. This is the interface between
+ * hardware and driver list elements
+ */
+static void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr,
+                                     u64 addr, u32 last)
+{
+       sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
+       sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_CLR);
+       sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_ADDR_HI), addr >> 32);
+       sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_ADDR_LO), (u32) addr);
+       sky2_write16(hw, Y2_QADDR(qaddr, PREF_UNIT_LAST_IDX), last);
+       sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_OP_ON);
+
+       sky2_read32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL));
+}
+
+static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2)
+{
+       struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod;
+
+       sky2->tx_prod = (sky2->tx_prod + 1) % TX_RING_SIZE;
+       return le;
+}
+
+/*
+ * This is a workaround code taken from SysKonnect sk98lin driver
+ * to deal with chip bug on Yukon EC rev 0 in the wraparound case.
+ */
+static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q,
+                               u16 idx, u16 *last, u16 size)
+{
+       if (is_ec_a1(hw) && idx < *last) {
+               u16 hwget = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX));
+
+               if (hwget == 0) {
+                       /* Start prefetching again */
+                       sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 0xe0);
+                       goto setnew;
+               }
+
+               if (hwget == size - 1) {
+                       /* set watermark to one list element */
+                       sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 8);
+
+                       /* set put index to first list element */
+                       sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), 0);
+               } else          /* have hardware go to end of list */
+                       sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX),
+                                    size - 1);
+       } else {
+setnew:
+               sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx);
+       }
+       *last = idx;
+}
+
+
+static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2)
+{
+       struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put;
+       sky2->rx_put = (sky2->rx_put + 1) % RX_LE_SIZE;
+       return le;
+}
+
+/* Return high part of DMA address (could be 32 or 64 bit) */
+static inline u32 high32(dma_addr_t a)
+{
+       return (a >> 16) >> 16;
+}
+
+/* Build description to hardware about buffer */
+static inline void sky2_rx_add(struct sky2_port *sky2, dma_addr_t map)
+{
+       struct sky2_rx_le *le;
+       u32 hi = high32(map);
+       u16 len = sky2->rx_bufsize;
+
+       if (sky2->rx_addr64 != hi) {
+               le = sky2_next_rx(sky2);
+               le->addr = cpu_to_le32(hi);
+               le->ctrl = 0;
+               le->opcode = OP_ADDR64 | HW_OWNER;
+               sky2->rx_addr64 = high32(map + len);
+       }
+
+       le = sky2_next_rx(sky2);
+       le->addr = cpu_to_le32((u32) map);
+       le->length = cpu_to_le16(len);
+       le->ctrl = 0;
+       le->opcode = OP_PACKET | HW_OWNER;
+}
+
+
+/* Tell chip where to start receive checksum.
+ * Actually has two checksums, but set both same to avoid possible byte
+ * order problems.
+ */
+static void rx_set_checksum(struct sky2_port *sky2)
+{
+       struct sky2_rx_le *le;
+
+       le = sky2_next_rx(sky2);
+       le->addr = (ETH_HLEN << 16) | ETH_HLEN;
+       le->ctrl = 0;
+       le->opcode = OP_TCPSTART | HW_OWNER;
+
+       sky2_write32(sky2->hw,
+                    Q_ADDR(rxqaddr[sky2->port], Q_CSR),
+                    sky2->rx_csum ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
+
+}
+
+/*
+ * The RX Stop command will not work for Yukon-2 if the BMU does not
+ * reach the end of packet and since we can't make sure that we have
+ * incoming data, we must reset the BMU while it is not doing a DMA
+ * transfer. Since it is possible that the RX path is still active,
+ * the RX RAM buffer will be stopped first, so any possible incoming
+ * data will not trigger a DMA. After the RAM buffer is stopped, the
+ * BMU is polled until any DMA in progress is ended and only then it
+ * will be reset.
+ */
+static void sky2_rx_stop(struct sky2_port *sky2)
+{
+       struct sky2_hw *hw = sky2->hw;
+       unsigned rxq = rxqaddr[sky2->port];
+       int i;
+
+       /* disable the RAM Buffer receive queue */
+       sky2_write8(hw, RB_ADDR(rxq, RB_CTRL), RB_DIS_OP_MD);
+
+       for (i = 0; i < 0xffff; i++)
+               if (sky2_read8(hw, RB_ADDR(rxq, Q_RSL))
+                   == sky2_read8(hw, RB_ADDR(rxq, Q_RL)))
+                       goto stopped;
+
+       printk(KERN_WARNING PFX "%s: receiver stop failed\n",
+              sky2->netdev->name);
+stopped:
+       sky2_write32(hw, Q_ADDR(rxq, Q_CSR), BMU_RST_SET | BMU_FIFO_RST);
+
+       /* reset the Rx prefetch unit */
+       sky2_write32(hw, Y2_QADDR(rxq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
+}
+
+/* Clean out receive buffer area, assumes receiver hardware stopped */
+static void sky2_rx_clean(struct sky2_port *sky2)
+{
+       unsigned i;
+
+       memset(sky2->rx_le, 0, RX_LE_BYTES);
+       for (i = 0; i < sky2->rx_pending; i++) {
+               struct ring_info *re = sky2->rx_ring + i;
+
+               if (re->skb) {
+                       pci_unmap_single(sky2->hw->pdev,
+                                        re->mapaddr, sky2->rx_bufsize,
+                                        PCI_DMA_FROMDEVICE);
+                       kfree_skb(re->skb);
+                       re->skb = NULL;
+               }
+       }
+}
+
+/* Basic MII support */
+static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       struct mii_ioctl_data *data = if_mii(ifr);
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       int err = -EOPNOTSUPP;
+
+       if (!netif_running(dev))
+               return -ENODEV; /* Phy still in reset */
+
+       switch(cmd) {
+       case SIOCGMIIPHY:
+               data->phy_id = PHY_ADDR_MARV;
+
+               /* fallthru */
+       case SIOCGMIIREG: {
+               u16 val = 0;
+
+               down(&sky2->phy_sema);
+               err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val);
+               up(&sky2->phy_sema);
+
+               data->val_out = val;
+               break;
+       }
+
+       case SIOCSMIIREG:
+               if (!capable(CAP_NET_ADMIN))
+                       return -EPERM;
+
+               down(&sky2->phy_sema);
+               err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f,
+                                  data->val_in);
+               up(&sky2->phy_sema);
+               break;
+       }
+       return err;
+}
+
+#ifdef SKY2_VLAN_TAG_USED
+static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       u16 port = sky2->port;
+
+       spin_lock(&sky2->tx_lock);
+
+       sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_ON);
+       sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_ON);
+       sky2->vlgrp = grp;
+
+       spin_unlock(&sky2->tx_lock);
+}
+
+static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       u16 port = sky2->port;
+
+       spin_lock(&sky2->tx_lock);
+
+       sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF);
+       sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF);
+       if (sky2->vlgrp)
+               sky2->vlgrp->vlan_devices[vid] = NULL;
+
+       spin_unlock(&sky2->tx_lock);
+}
+#endif
+
+/*
+ * Allocate and setup receiver buffer pool.
+ * In case of 64 bit dma, there are 2X as many list elements
+ * available as ring entries
+ * and need to reserve one list element so we don't wrap around.
+ *
+ * It appears the hardware has a bug in the FIFO logic that
+ * cause it to hang if the FIFO gets overrun and the receive buffer
+ * is not aligned.  This means we can't use skb_reserve to align
+ * the IP header.
+ */
+static int sky2_rx_start(struct sky2_port *sky2)
+{
+       struct sky2_hw *hw = sky2->hw;
+       unsigned rxq = rxqaddr[sky2->port];
+       int i;
+
+       sky2->rx_put = sky2->rx_next = 0;
+       sky2_qset(hw, rxq);
+       sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1);
+
+       rx_set_checksum(sky2);
+       for (i = 0; i < sky2->rx_pending; i++) {
+               struct ring_info *re = sky2->rx_ring + i;
+
+               re->skb = dev_alloc_skb(sky2->rx_bufsize);
+               if (!re->skb)
+                       goto nomem;
+
+               re->mapaddr = pci_map_single(hw->pdev, re->skb->data,
+                                            sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
+               sky2_rx_add(sky2, re->mapaddr);
+       }
+
+       /* Tell chip about available buffers */
+       sky2_write16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX), sky2->rx_put);
+       sky2->rx_last_put = sky2_read16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX));
+       return 0;
+nomem:
+       sky2_rx_clean(sky2);
+       return -ENOMEM;
+}
+
+/* Bring up network interface. */
+static int sky2_up(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       u32 ramsize, rxspace;
+       int err = -ENOMEM;
+
+       if (netif_msg_ifup(sky2))
+               printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
+
+       /* must be power of 2 */
+       sky2->tx_le = pci_alloc_consistent(hw->pdev,
+                                          TX_RING_SIZE *
+                                          sizeof(struct sky2_tx_le),
+                                          &sky2->tx_le_map);
+       if (!sky2->tx_le)
+               goto err_out;
+
+       sky2->tx_ring = kcalloc(TX_RING_SIZE, sizeof(struct tx_ring_info),
+                               GFP_KERNEL);
+       if (!sky2->tx_ring)
+               goto err_out;
+       sky2->tx_prod = sky2->tx_cons = 0;
+
+       sky2->rx_le = pci_alloc_consistent(hw->pdev, RX_LE_BYTES,
+                                          &sky2->rx_le_map);
+       if (!sky2->rx_le)
+               goto err_out;
+       memset(sky2->rx_le, 0, RX_LE_BYTES);
+
+       sky2->rx_ring = kcalloc(sky2->rx_pending, sizeof(struct ring_info),
+                               GFP_KERNEL);
+       if (!sky2->rx_ring)
+               goto err_out;
+
+       sky2_mac_init(hw, port);
+
+       /* Configure RAM buffers */
+       if (hw->chip_id == CHIP_ID_YUKON_FE ||
+           (hw->chip_id == CHIP_ID_YUKON_EC && hw->chip_rev == 2))
+               ramsize = 4096;
+       else {
+               u8 e0 = sky2_read8(hw, B2_E_0);
+               ramsize = (e0 == 0) ? (128 * 1024) : (e0 * 4096);
+       }
+
+       /* 2/3 for Rx */
+       rxspace = (2 * ramsize) / 3;
+       sky2_ramset(hw, rxqaddr[port], 0, rxspace);
+       sky2_ramset(hw, txqaddr[port], rxspace, ramsize - rxspace);
+
+       /* Make sure SyncQ is disabled */
+       sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL),
+                   RB_RST_SET);
+
+       sky2_qset(hw, txqaddr[port]);
+       if (hw->chip_id == CHIP_ID_YUKON_EC_U)
+               sky2_write16(hw, Q_ADDR(txqaddr[port], Q_AL), 0x1a0);
+
+
+       sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map,
+                          TX_RING_SIZE - 1);
+
+       err = sky2_rx_start(sky2);
+       if (err)
+               goto err_out;
+
+       /* Enable interrupts from phy/mac for port */
+       hw->intr_mask |= (port == 0) ? Y2_IS_PORT_1 : Y2_IS_PORT_2;
+       sky2_write32(hw, B0_IMSK, hw->intr_mask);
+       return 0;
+
+err_out:
+       if (sky2->rx_le) {
+               pci_free_consistent(hw->pdev, RX_LE_BYTES,
+                                   sky2->rx_le, sky2->rx_le_map);
+               sky2->rx_le = NULL;
+       }
+       if (sky2->tx_le) {
+               pci_free_consistent(hw->pdev,
+                                   TX_RING_SIZE * sizeof(struct sky2_tx_le),
+                                   sky2->tx_le, sky2->tx_le_map);
+               sky2->tx_le = NULL;
+       }
+       kfree(sky2->tx_ring);
+       kfree(sky2->rx_ring);
+
+       sky2->tx_ring = NULL;
+       sky2->rx_ring = NULL;
+       return err;
+}
+
+/* Modular subtraction in ring */
+static inline int tx_dist(unsigned tail, unsigned head)
+{
+       return (head - tail) % TX_RING_SIZE;
+}
+
+/* Number of list elements available for next tx */
+static inline int tx_avail(const struct sky2_port *sky2)
+{
+       return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod);
+}
+
+/* Estimate of number of transmit list elements required */
+static inline unsigned tx_le_req(const struct sk_buff *skb)
+{
+       unsigned count;
+
+       count = sizeof(dma_addr_t) / sizeof(u32);
+       count += skb_shinfo(skb)->nr_frags * count;
+
+       if (skb_shinfo(skb)->tso_size)
+               ++count;
+
+       if (skb->ip_summed == CHECKSUM_HW)
+               ++count;
+
+       return count;
+}
+
+/*
+ * Put one packet in ring for transmit.
+ * A single packet can generate multiple list elements, and
+ * the number of ring elements will probably be less than the number
+ * of list elements used.
+ *
+ * No BH disabling for tx_lock here (like tg3)
+ */
+static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       struct sky2_tx_le *le = NULL;
+       struct tx_ring_info *re;
+       unsigned i, len;
+       dma_addr_t mapping;
+       u32 addr64;
+       u16 mss;
+       u8 ctrl;
+
+       if (!spin_trylock(&sky2->tx_lock))
+               return NETDEV_TX_LOCKED;
+
+       if (unlikely(tx_avail(sky2) < tx_le_req(skb))) {
+               /* There is a known but harmless race with lockless tx
+                * and netif_stop_queue.
+                */
+               if (!netif_queue_stopped(dev)) {
+                       netif_stop_queue(dev);
+                       printk(KERN_WARNING PFX "%s: ring full when queue awake!\n",
+                              dev->name);
+               }
+               spin_unlock(&sky2->tx_lock);
+
+               return NETDEV_TX_BUSY;
+       }
+
+       if (unlikely(netif_msg_tx_queued(sky2)))
+               printk(KERN_DEBUG "%s: tx queued, slot %u, len %d\n",
+                      dev->name, sky2->tx_prod, skb->len);
+
+       len = skb_headlen(skb);
+       mapping = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
+       addr64 = high32(mapping);
+
+       re = sky2->tx_ring + sky2->tx_prod;
+
+       /* Send high bits if changed or crosses boundary */
+       if (addr64 != sky2->tx_addr64 || high32(mapping + len) != sky2->tx_addr64) {
+               le = get_tx_le(sky2);
+               le->tx.addr = cpu_to_le32(addr64);
+               le->ctrl = 0;
+               le->opcode = OP_ADDR64 | HW_OWNER;
+               sky2->tx_addr64 = high32(mapping + len);
+       }
+
+       /* Check for TCP Segmentation Offload */
+       mss = skb_shinfo(skb)->tso_size;
+       if (mss != 0) {
+               /* just drop the packet if non-linear expansion fails */
+               if (skb_header_cloned(skb) &&
+                   pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
+                       dev_kfree_skb_any(skb);
+                       goto out_unlock;
+               }
+
+               mss += ((skb->h.th->doff - 5) * 4);     /* TCP options */
+               mss += (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr);
+               mss += ETH_HLEN;
+       }
+
+       if (mss != sky2->tx_last_mss) {
+               le = get_tx_le(sky2);
+               le->tx.tso.size = cpu_to_le16(mss);
+               le->tx.tso.rsvd = 0;
+               le->opcode = OP_LRGLEN | HW_OWNER;
+               le->ctrl = 0;
+               sky2->tx_last_mss = mss;
+       }
+
+       ctrl = 0;
+#ifdef SKY2_VLAN_TAG_USED
+       /* Add VLAN tag, can piggyback on LRGLEN or ADDR64 */
+       if (sky2->vlgrp && vlan_tx_tag_present(skb)) {
+               if (!le) {
+                       le = get_tx_le(sky2);
+                       le->tx.addr = 0;
+                       le->opcode = OP_VLAN|HW_OWNER;
+                       le->ctrl = 0;
+               } else
+                       le->opcode |= OP_VLAN;
+               le->length = cpu_to_be16(vlan_tx_tag_get(skb));
+               ctrl |= INS_VLAN;
+       }
+#endif
+
+       /* Handle TCP checksum offload */
+       if (skb->ip_summed == CHECKSUM_HW) {
+               u16 hdr = skb->h.raw - skb->data;
+               u16 offset = hdr + skb->csum;
+
+               ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
+               if (skb->nh.iph->protocol == IPPROTO_UDP)
+                       ctrl |= UDPTCP;
+
+               le = get_tx_le(sky2);
+               le->tx.csum.start = cpu_to_le16(hdr);
+               le->tx.csum.offset = cpu_to_le16(offset);
+               le->length = 0; /* initial checksum value */
+               le->ctrl = 1;   /* one packet */
+               le->opcode = OP_TCPLISW | HW_OWNER;
+       }
+
+       le = get_tx_le(sky2);
+       le->tx.addr = cpu_to_le32((u32) mapping);
+       le->length = cpu_to_le16(len);
+       le->ctrl = ctrl;
+       le->opcode = mss ? (OP_LARGESEND | HW_OWNER) : (OP_PACKET | HW_OWNER);
+
+       /* Record the transmit mapping info */
+       re->skb = skb;
+       pci_unmap_addr_set(re, mapaddr, mapping);
+
+       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+               skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+               struct tx_ring_info *fre;
+
+               mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset,
+                                      frag->size, PCI_DMA_TODEVICE);
+               addr64 = (mapping >> 16) >> 16;
+               if (addr64 != sky2->tx_addr64) {
+                       le = get_tx_le(sky2);
+                       le->tx.addr = cpu_to_le32(addr64);
+                       le->ctrl = 0;
+                       le->opcode = OP_ADDR64 | HW_OWNER;
+                       sky2->tx_addr64 = addr64;
+               }
+
+               le = get_tx_le(sky2);
+               le->tx.addr = cpu_to_le32((u32) mapping);
+               le->length = cpu_to_le16(frag->size);
+               le->ctrl = ctrl;
+               le->opcode = OP_BUFFER | HW_OWNER;
+
+               fre = sky2->tx_ring
+                   + ((re - sky2->tx_ring) + i + 1) % TX_RING_SIZE;
+               pci_unmap_addr_set(fre, mapaddr, mapping);
+       }
+
+       re->idx = sky2->tx_prod;
+       le->ctrl |= EOP;
+
+       sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod,
+                    &sky2->tx_last_put, TX_RING_SIZE);
+
+       if (tx_avail(sky2) <= MAX_SKB_TX_LE)
+               netif_stop_queue(dev);
+
+out_unlock:
+       mmiowb();
+       spin_unlock(&sky2->tx_lock);
+
+       dev->trans_start = jiffies;
+       return NETDEV_TX_OK;
+}
+
+/*
+ * Free ring elements from starting at tx_cons until "done"
+ *
+ * NB: the hardware will tell us about partial completion of multi-part
+ *     buffers; these are deferred until completion.
+ */
+static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
+{
+       struct net_device *dev = sky2->netdev;
+       struct pci_dev *pdev = sky2->hw->pdev;
+       u16 nxt, put;
+       unsigned i;
+
+       BUG_ON(done >= TX_RING_SIZE);
+
+       if (unlikely(netif_msg_tx_done(sky2)))
+               printk(KERN_DEBUG "%s: tx done, up to %u\n",
+                      dev->name, done);
+
+       for (put = sky2->tx_cons; put != done; put = nxt) {
+               struct tx_ring_info *re = sky2->tx_ring + put;
+               struct sk_buff *skb = re->skb;
+
+               nxt = re->idx;
+               BUG_ON(nxt >= TX_RING_SIZE);
+               prefetch(sky2->tx_ring + nxt);
+
+               /* Check for partial status */
+               if (tx_dist(put, done) < tx_dist(put, nxt))
+                       break;
+
+               skb = re->skb;
+               pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr),
+                                skb_headlen(skb), PCI_DMA_TODEVICE);
+
+               for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+                       struct tx_ring_info *fre;
+                       fre = sky2->tx_ring + (put + i + 1) % TX_RING_SIZE;
+                       pci_unmap_page(pdev, pci_unmap_addr(fre, mapaddr),
+                                      skb_shinfo(skb)->frags[i].size,
+                                      PCI_DMA_TODEVICE);
+               }
+
+               dev_kfree_skb_any(skb);
+       }
+
+       spin_lock(&sky2->tx_lock);
+       sky2->tx_cons = put;
+       if (netif_queue_stopped(dev) && tx_avail(sky2) > MAX_SKB_TX_LE)
+               netif_wake_queue(dev);
+       spin_unlock(&sky2->tx_lock);
+}
+
+/* Cleanup all untransmitted buffers, assume transmitter not running */
+static void sky2_tx_clean(struct sky2_port *sky2)
+{
+       sky2_tx_complete(sky2, sky2->tx_prod);
+}
+
+/* Network shutdown */
+static int sky2_down(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       u16 ctrl;
+
+       /* Never really got started! */
+       if (!sky2->tx_le)
+               return 0;
+
+       if (netif_msg_ifdown(sky2))
+               printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
+
+       /* Stop more packets from being queued */
+       netif_stop_queue(dev);
+
+       /* Disable port IRQ */
+       local_irq_disable();
+       hw->intr_mask &= ~((sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2);
+       sky2_write32(hw, B0_IMSK, hw->intr_mask);
+       local_irq_enable();
+
+       flush_scheduled_work();
+
+       sky2_phy_reset(hw, port);
+
+       /* Stop transmitter */
+       sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_STOP);
+       sky2_read32(hw, Q_ADDR(txqaddr[port], Q_CSR));
+
+       sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL),
+                    RB_RST_SET | RB_DIS_OP_MD);
+
+       ctrl = gma_read16(hw, port, GM_GP_CTRL);
+       ctrl &= ~(GM_GPCR_TX_ENA | GM_GPCR_RX_ENA);
+       gma_write16(hw, port, GM_GP_CTRL, ctrl);
+
+       sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
+
+       /* Workaround shared GMAC reset */
+       if (!(hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0
+             && port == 0 && hw->dev[1] && netif_running(hw->dev[1])))
+               sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET);
+
+       /* Disable Force Sync bit and Enable Alloc bit */
+       sky2_write8(hw, SK_REG(port, TXA_CTRL),
+                   TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
+
+       /* Stop Interval Timer and Limit Counter of Tx Arbiter */
+       sky2_write32(hw, SK_REG(port, TXA_ITI_INI), 0L);
+       sky2_write32(hw, SK_REG(port, TXA_LIM_INI), 0L);
+
+       /* Reset the PCI FIFO of the async Tx queue */
+       sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR),
+                    BMU_RST_SET | BMU_FIFO_RST);
+
+       /* Reset the Tx prefetch units */
+       sky2_write32(hw, Y2_QADDR(txqaddr[port], PREF_UNIT_CTRL),
+                    PREF_UNIT_RST_SET);
+
+       sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), RB_RST_SET);
+
+       sky2_rx_stop(sky2);
+
+       sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
+       sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
+
+       /* turn off LED's */
+       sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
+
+       synchronize_irq(hw->pdev->irq);
+
+       sky2_tx_clean(sky2);
+       sky2_rx_clean(sky2);
+
+       pci_free_consistent(hw->pdev, RX_LE_BYTES,
+                           sky2->rx_le, sky2->rx_le_map);
+       kfree(sky2->rx_ring);
+
+       pci_free_consistent(hw->pdev,
+                           TX_RING_SIZE * sizeof(struct sky2_tx_le),
+                           sky2->tx_le, sky2->tx_le_map);
+       kfree(sky2->tx_ring);
+
+       sky2->tx_le = NULL;
+       sky2->rx_le = NULL;
+
+       sky2->rx_ring = NULL;
+       sky2->tx_ring = NULL;
+
+       return 0;
+}
+
+static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux)
+{
+       if (!hw->copper)
+               return SPEED_1000;
+
+       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 sky2_link_up(struct sky2_port *sky2)
+{
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       u16 reg;
+
+       /* Enable Transmit FIFO Underrun */
+       sky2_write8(hw, SK_REG(port, GMAC_IRQ_MSK), GMAC_DEF_MSK);
+
+       reg = gma_read16(hw, port, GM_GP_CTRL);
+       if (sky2->duplex == DUPLEX_FULL || sky2->autoneg == AUTONEG_ENABLE)
+               reg |= GM_GPCR_DUP_FULL;
+
+       /* enable Rx/Tx */
+       reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
+       gma_write16(hw, port, GM_GP_CTRL, reg);
+       gma_read16(hw, port, GM_GP_CTRL);
+
+       gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
+
+       netif_carrier_on(sky2->netdev);
+       netif_wake_queue(sky2->netdev);
+
+       /* Turn on link LED */
+       sky2_write8(hw, SK_REG(port, LNK_LED_REG),
+                   LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF);
+
+       if (hw->chip_id == CHIP_ID_YUKON_XL) {
+               u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
+
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
+               gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, PHY_M_LEDC_LOS_CTRL(1) |      /* LINK/ACT */
+                            PHY_M_LEDC_INIT_CTRL(sky2->speed ==
+                                                 SPEED_10 ? 7 : 0) |
+                            PHY_M_LEDC_STA1_CTRL(sky2->speed ==
+                                                 SPEED_100 ? 7 : 0) |
+                            PHY_M_LEDC_STA0_CTRL(sky2->speed ==
+                                                 SPEED_1000 ? 7 : 0));
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
+       }
+
+       if (netif_msg_link(sky2))
+               printk(KERN_INFO PFX
+                      "%s: Link is up at %d Mbps, %s duplex, flow control %s\n",
+                      sky2->netdev->name, sky2->speed,
+                      sky2->duplex == DUPLEX_FULL ? "full" : "half",
+                      (sky2->tx_pause && sky2->rx_pause) ? "both" :
+                      sky2->tx_pause ? "tx" : sky2->rx_pause ? "rx" : "none");
+}
+
+static void sky2_link_down(struct sky2_port *sky2)
+{
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       u16 reg;
+
+       gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
+
+       reg = gma_read16(hw, port, GM_GP_CTRL);
+       reg &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
+       gma_write16(hw, port, GM_GP_CTRL, reg);
+       gma_read16(hw, port, GM_GP_CTRL);       /* PCI post */
+
+       if (sky2->rx_pause && !sky2->tx_pause) {
+               /* restore Asymmetric Pause bit */
+               gm_phy_write(hw, port, PHY_MARV_AUNE_ADV,
+                            gm_phy_read(hw, port, PHY_MARV_AUNE_ADV)
+                            | PHY_M_AN_ASP);
+       }
+
+       netif_carrier_off(sky2->netdev);
+       netif_stop_queue(sky2->netdev);
+
+       /* Turn on link LED */
+       sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF);
+
+       if (netif_msg_link(sky2))
+               printk(KERN_INFO PFX "%s: Link is down.\n", sky2->netdev->name);
+       sky2_phy_init(hw, port);
+}
+
+static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux)
+{
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       u16 lpa;
+
+       lpa = gm_phy_read(hw, port, PHY_MARV_AUNE_LP);
+
+       if (lpa & PHY_M_AN_RF) {
+               printk(KERN_ERR PFX "%s: remote fault", sky2->netdev->name);
+               return -1;
+       }
+
+       if (hw->chip_id != CHIP_ID_YUKON_FE &&
+           gm_phy_read(hw, port, PHY_MARV_1000T_STAT) & PHY_B_1000S_MSF) {
+               printk(KERN_ERR PFX "%s: master/slave fault",
+                      sky2->netdev->name);
+               return -1;
+       }
+
+       if (!(aux & PHY_M_PS_SPDUP_RES)) {
+               printk(KERN_ERR PFX "%s: speed/duplex mismatch",
+                      sky2->netdev->name);
+               return -1;
+       }
+
+       sky2->duplex = (aux & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
+
+       sky2->speed = sky2_phy_speed(hw, aux);
+
+       /* Pause bits are offset (9..8) */
+       if (hw->chip_id == CHIP_ID_YUKON_XL)
+               aux >>= 6;
+
+       sky2->rx_pause = (aux & PHY_M_PS_RX_P_EN) != 0;
+       sky2->tx_pause = (aux & PHY_M_PS_TX_P_EN) != 0;
+
+       if ((sky2->tx_pause || sky2->rx_pause)
+           && !(sky2->speed < SPEED_1000 && sky2->duplex == DUPLEX_HALF))
+               sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_ON);
+       else
+               sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
+
+       return 0;
+}
+
+/*
+ * Interrupt from PHY are handled outside of interrupt context
+ * because accessing phy registers requires spin wait which might
+ * cause excess interrupt latency.
+ */
+static void sky2_phy_task(void *arg)
+{
+       struct sky2_port *sky2 = arg;
+       struct sky2_hw *hw = sky2->hw;
+       u16 istatus, phystat;
+
+       down(&sky2->phy_sema);
+       istatus = gm_phy_read(hw, sky2->port, PHY_MARV_INT_STAT);
+       phystat = gm_phy_read(hw, sky2->port, PHY_MARV_PHY_STAT);
+
+       if (netif_msg_intr(sky2))
+               printk(KERN_INFO PFX "%s: phy interrupt status 0x%x 0x%x\n",
+                      sky2->netdev->name, istatus, phystat);
+
+       if (istatus & PHY_M_IS_AN_COMPL) {
+               if (sky2_autoneg_done(sky2, phystat) == 0)
+                       sky2_link_up(sky2);
+               goto out;
+       }
+
+       if (istatus & PHY_M_IS_LSP_CHANGE)
+               sky2->speed = sky2_phy_speed(hw, phystat);
+
+       if (istatus & PHY_M_IS_DUP_CHANGE)
+               sky2->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)
+                       sky2_link_up(sky2);
+               else
+                       sky2_link_down(sky2);
+       }
+out:
+       up(&sky2->phy_sema);
+
+       local_irq_disable();
+       hw->intr_mask |= (sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2;
+       sky2_write32(hw, B0_IMSK, hw->intr_mask);
+       local_irq_enable();
+}
+
+static void sky2_tx_timeout(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       unsigned txq = txqaddr[sky2->port];
+
+       if (netif_msg_timer(sky2))
+               printk(KERN_ERR PFX "%s: tx timeout\n", dev->name);
+
+       netif_stop_queue(dev);
+
+       sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP);
+       sky2_read32(hw, Q_ADDR(txq, Q_CSR));
+
+       sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
+
+       sky2_tx_clean(sky2);
+
+       sky2_qset(hw, txq);
+       sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1);
+
+       netif_wake_queue(dev);
+}
+
+
+#define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
+/* Want receive buffer size to be multiple of 64 bits, and incl room for vlan */
+static inline unsigned sky2_buf_size(int mtu)
+{
+       return roundup(mtu + ETH_HLEN + 4, 8);
+}
+
+static int sky2_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       int err;
+       u16 ctl, mode;
+
+       if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
+               return -EINVAL;
+
+       if (hw->chip_id == CHIP_ID_YUKON_EC_U && new_mtu > ETH_DATA_LEN)
+               return -EINVAL;
+
+       if (!netif_running(dev)) {
+               dev->mtu = new_mtu;
+               return 0;
+       }
+
+       sky2_write32(hw, B0_IMSK, 0);
+
+       dev->trans_start = jiffies;     /* prevent tx timeout */
+       netif_stop_queue(dev);
+       netif_poll_disable(hw->dev[0]);
+
+       ctl = gma_read16(hw, sky2->port, GM_GP_CTRL);
+       gma_write16(hw, sky2->port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA);
+       sky2_rx_stop(sky2);
+       sky2_rx_clean(sky2);
+
+       dev->mtu = new_mtu;
+       sky2->rx_bufsize = sky2_buf_size(new_mtu);
+       mode = DATA_BLIND_VAL(DATA_BLIND_DEF) |
+               GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
+
+       if (dev->mtu > ETH_DATA_LEN)
+               mode |= GM_SMOD_JUMBO_ENA;
+
+       gma_write16(hw, sky2->port, GM_SERIAL_MODE, mode);
+
+       sky2_write8(hw, RB_ADDR(rxqaddr[sky2->port], RB_CTRL), RB_ENA_OP_MD);
+
+       err = sky2_rx_start(sky2);
+       sky2_write32(hw, B0_IMSK, hw->intr_mask);
+
+       if (err)
+               dev_close(dev);
+       else {
+               gma_write16(hw, sky2->port, GM_GP_CTRL, ctl);
+
+               netif_poll_enable(hw->dev[0]);
+               netif_wake_queue(dev);
+       }
+
+       return err;
+}
+
+/*
+ * Receive one packet.
+ * For small packets or errors, just reuse existing skb.
+ * For larger packets, get new buffer.
+ */
+static struct sk_buff *sky2_receive(struct sky2_port *sky2,
+                                   u16 length, u32 status)
+{
+       struct ring_info *re = sky2->rx_ring + sky2->rx_next;
+       struct sk_buff *skb = NULL;
+
+       if (unlikely(netif_msg_rx_status(sky2)))
+               printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n",
+                      sky2->netdev->name, sky2->rx_next, status, length);
+
+       sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending;
+       prefetch(sky2->rx_ring + sky2->rx_next);
+
+       if (status & GMR_FS_ANY_ERR)
+               goto error;
+
+       if (!(status & GMR_FS_RX_OK))
+               goto resubmit;
+
+       if ((status >> 16) != length || length > sky2->rx_bufsize)
+               goto oversize;
+
+       if (length < copybreak) {
+               skb = alloc_skb(length + 2, GFP_ATOMIC);
+               if (!skb)
+                       goto resubmit;
+
+               skb_reserve(skb, 2);
+               pci_dma_sync_single_for_cpu(sky2->hw->pdev, re->mapaddr,
+                                           length, PCI_DMA_FROMDEVICE);
+               memcpy(skb->data, re->skb->data, length);
+               skb->ip_summed = re->skb->ip_summed;
+               skb->csum = re->skb->csum;
+               pci_dma_sync_single_for_device(sky2->hw->pdev, re->mapaddr,
+                                              length, PCI_DMA_FROMDEVICE);
+       } else {
+               struct sk_buff *nskb;
+
+               nskb = dev_alloc_skb(sky2->rx_bufsize);
+               if (!nskb)
+                       goto resubmit;
+
+               skb = re->skb;
+               re->skb = nskb;
+               pci_unmap_single(sky2->hw->pdev, re->mapaddr,
+                                sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
+               prefetch(skb->data);
+
+               re->mapaddr = pci_map_single(sky2->hw->pdev, nskb->data,
+                                            sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
+       }
+
+       skb_put(skb, length);
+resubmit:
+       re->skb->ip_summed = CHECKSUM_NONE;
+       sky2_rx_add(sky2, re->mapaddr);
+
+       /* Tell receiver about new buffers. */
+       sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put,
+                    &sky2->rx_last_put, RX_LE_SIZE);
+
+       return skb;
+
+oversize:
+       ++sky2->net_stats.rx_over_errors;
+       goto resubmit;
+
+error:
+       ++sky2->net_stats.rx_errors;
+
+       if (netif_msg_rx_err(sky2))
+               printk(KERN_INFO PFX "%s: rx error, status 0x%x length %d\n",
+                      sky2->netdev->name, status, length);
+
+       if (status & (GMR_FS_LONG_ERR | GMR_FS_UN_SIZE))
+               sky2->net_stats.rx_length_errors++;
+       if (status & GMR_FS_FRAGMENT)
+               sky2->net_stats.rx_frame_errors++;
+       if (status & GMR_FS_CRC_ERR)
+               sky2->net_stats.rx_crc_errors++;
+       if (status & GMR_FS_RX_FF_OV)
+               sky2->net_stats.rx_fifo_errors++;
+
+       goto resubmit;
+}
+
+/*
+ * Check for transmit complete
+ */
+#define TX_NO_STATUS   0xffff
+
+static inline void sky2_tx_check(struct sky2_hw *hw, int port, u16 last)
+{
+       if (last != TX_NO_STATUS) {
+               struct net_device *dev = hw->dev[port];
+               if (dev && netif_running(dev)) {
+                       struct sky2_port *sky2 = netdev_priv(dev);
+                       sky2_tx_complete(sky2, last);
+               }
+       }
+}
+
+/*
+ * Both ports share the same status interrupt, therefore there is only
+ * one poll routine.
+ */
+static int sky2_poll(struct net_device *dev0, int *budget)
+{
+       struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw;
+       unsigned int to_do = min(dev0->quota, *budget);
+       unsigned int work_done = 0;
+       u16 hwidx;
+       u16 tx_done[2] = { TX_NO_STATUS, TX_NO_STATUS };
+
+       hwidx = sky2_read16(hw, STAT_PUT_IDX);
+       BUG_ON(hwidx >= STATUS_RING_SIZE);
+       rmb();
+
+       while (hwidx != hw->st_idx) {
+               struct sky2_status_le *le  = hw->st_le + hw->st_idx;
+               struct net_device *dev;
+               struct sky2_port *sky2;
+               struct sk_buff *skb;
+               u32 status;
+               u16 length;
+               u8 op;
+
+               le = hw->st_le + hw->st_idx;
+               hw->st_idx = (hw->st_idx + 1) % STATUS_RING_SIZE;
+               prefetch(hw->st_le + hw->st_idx);
+
+               BUG_ON(le->link >= 2);
+               dev = hw->dev[le->link];
+               if (dev == NULL || !netif_running(dev))
+                       continue;
+
+               sky2 = netdev_priv(dev);
+               status = le32_to_cpu(le->status);
+               length = le16_to_cpu(le->length);
+               op = le->opcode & ~HW_OWNER;
+               le->opcode = 0;
+
+               switch (op) {
+               case OP_RXSTAT:
+                       skb = sky2_receive(sky2, length, status);
+                       if (!skb)
+                               break;
+
+                       skb->dev = dev;
+                       skb->protocol = eth_type_trans(skb, dev);
+                       dev->last_rx = jiffies;
+
+#ifdef SKY2_VLAN_TAG_USED
+                       if (sky2->vlgrp && (status & GMR_FS_VLAN)) {
+                               vlan_hwaccel_receive_skb(skb,
+                                                        sky2->vlgrp,
+                                                        be16_to_cpu(sky2->rx_tag));
+                       } else
+#endif
+                               netif_receive_skb(skb);
+
+                       if (++work_done >= to_do)
+                               goto exit_loop;
+                       break;
+
+#ifdef SKY2_VLAN_TAG_USED
+               case OP_RXVLAN:
+                       sky2->rx_tag = length;
+                       break;
+
+               case OP_RXCHKSVLAN:
+                       sky2->rx_tag = length;
+                       /* fall through */
+#endif
+               case OP_RXCHKS:
+                       skb = sky2->rx_ring[sky2->rx_next].skb;
+                       skb->ip_summed = CHECKSUM_HW;
+                       skb->csum = le16_to_cpu(status);
+                       break;
+
+               case OP_TXINDEXLE:
+                       /* TX index reports status for both ports */
+                       tx_done[0] = status & 0xffff;
+                       tx_done[1] = ((status >> 24) & 0xff)
+                               | (u16)(length & 0xf) << 8;
+                       break;
+
+               default:
+                       if (net_ratelimit())
+                               printk(KERN_WARNING PFX
+                                      "unknown status opcode 0x%x\n", op);
+                       break;
+               }
+       }
+
+exit_loop:
+       sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
+       mmiowb();
+
+       sky2_tx_check(hw, 0, tx_done[0]);
+       sky2_tx_check(hw, 1, tx_done[1]);
+
+       if (sky2_read16(hw, STAT_PUT_IDX) == hw->st_idx) {
+               /* need to restart TX timer */
+               if (is_ec_a1(hw)) {
+                       sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
+                       sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
+               }
+
+               netif_rx_complete(dev0);
+               hw->intr_mask |= Y2_IS_STAT_BMU;
+               sky2_write32(hw, B0_IMSK, hw->intr_mask);
+               mmiowb();
+               return 0;
+       } else {
+               *budget -= work_done;
+               dev0->quota -= work_done;
+               return 1;
+       }
+}
+
+static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
+{
+       struct net_device *dev = hw->dev[port];
+
+       printk(KERN_INFO PFX "%s: hw error interrupt status 0x%x\n",
+              dev->name, status);
+
+       if (status & Y2_IS_PAR_RD1) {
+               printk(KERN_ERR PFX "%s: ram data read parity error\n",
+                      dev->name);
+               /* Clear IRQ */
+               sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_RD_PERR);
+       }
+
+       if (status & Y2_IS_PAR_WR1) {
+               printk(KERN_ERR PFX "%s: ram data write parity error\n",
+                      dev->name);
+
+               sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_WR_PERR);
+       }
+
+       if (status & Y2_IS_PAR_MAC1) {
+               printk(KERN_ERR PFX "%s: MAC parity error\n", dev->name);
+               sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_PE);
+       }
+
+       if (status & Y2_IS_PAR_RX1) {
+               printk(KERN_ERR PFX "%s: RX parity error\n", dev->name);
+               sky2_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), BMU_CLR_IRQ_PAR);
+       }
+
+       if (status & Y2_IS_TCP_TXA1) {
+               printk(KERN_ERR PFX "%s: TCP segmentation error\n", dev->name);
+               sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_CLR_IRQ_TCP);
+       }
+}
+
+static void sky2_hw_intr(struct sky2_hw *hw)
+{
+       u32 status = sky2_read32(hw, B0_HWE_ISRC);
+
+       if (status & Y2_IS_TIST_OV)
+               sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
+
+       if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) {
+               u16 pci_err;
+
+               pci_read_config_word(hw->pdev, PCI_STATUS, &pci_err);
+               printk(KERN_ERR PFX "%s: pci hw error (0x%x)\n",
+                      pci_name(hw->pdev), pci_err);
+
+               sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+               pci_write_config_word(hw->pdev, PCI_STATUS,
+                                     pci_err | PCI_STATUS_ERROR_BITS);
+               sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+       }
+
+       if (status & Y2_IS_PCI_EXP) {
+               /* PCI-Express uncorrectable Error occurred */
+               u32 pex_err;
+
+               pci_read_config_dword(hw->pdev, PEX_UNC_ERR_STAT, &pex_err);
+
+               printk(KERN_ERR PFX "%s: pci express error (0x%x)\n",
+                      pci_name(hw->pdev), pex_err);
+
+               /* clear the interrupt */
+               sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+               pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT,
+                                      0xffffffffUL);
+               sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+
+               if (pex_err & PEX_FATAL_ERRORS) {
+                       u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK);
+                       hwmsk &= ~Y2_IS_PCI_EXP;
+                       sky2_write32(hw, B0_HWE_IMSK, hwmsk);
+               }
+       }
+
+       if (status & Y2_HWE_L1_MASK)
+               sky2_hw_error(hw, 0, status);
+       status >>= 8;
+       if (status & Y2_HWE_L1_MASK)
+               sky2_hw_error(hw, 1, status);
+}
+
+static void sky2_mac_intr(struct sky2_hw *hw, unsigned port)
+{
+       struct net_device *dev = hw->dev[port];
+       struct sky2_port *sky2 = netdev_priv(dev);
+       u8 status = sky2_read8(hw, SK_REG(port, GMAC_IRQ_SRC));
+
+       if (netif_msg_intr(sky2))
+               printk(KERN_INFO PFX "%s: mac interrupt status 0x%x\n",
+                      dev->name, status);
+
+       if (status & GM_IS_RX_FF_OR) {
+               ++sky2->net_stats.rx_fifo_errors;
+               sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
+       }
+
+       if (status & GM_IS_TX_FF_UR) {
+               ++sky2->net_stats.tx_fifo_errors;
+               sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
+       }
+}
+
+static void sky2_phy_intr(struct sky2_hw *hw, unsigned port)
+{
+       struct net_device *dev = hw->dev[port];
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       hw->intr_mask &= ~(port == 0 ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2);
+       sky2_write32(hw, B0_IMSK, hw->intr_mask);
+       schedule_work(&sky2->phy_task);
+}
+
+static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs)
+{
+       struct sky2_hw *hw = dev_id;
+       struct net_device *dev0 = hw->dev[0];
+       u32 status;
+
+       status = sky2_read32(hw, B0_Y2_SP_ISRC2);
+       if (status == 0 || status == ~0)
+               return IRQ_NONE;
+
+       if (status & Y2_IS_HW_ERR)
+               sky2_hw_intr(hw);
+
+       /* Do NAPI for Rx and Tx status */
+       if (status & Y2_IS_STAT_BMU) {
+               hw->intr_mask &= ~Y2_IS_STAT_BMU;
+               sky2_write32(hw, B0_IMSK, hw->intr_mask);
+
+               if (likely(__netif_rx_schedule_prep(dev0))) {
+                       prefetch(&hw->st_le[hw->st_idx]);
+                       __netif_rx_schedule(dev0);
+               }
+       }
+
+       if (status & Y2_IS_IRQ_PHY1)
+               sky2_phy_intr(hw, 0);
+
+       if (status & Y2_IS_IRQ_PHY2)
+               sky2_phy_intr(hw, 1);
+
+       if (status & Y2_IS_IRQ_MAC1)
+               sky2_mac_intr(hw, 0);
+
+       if (status & Y2_IS_IRQ_MAC2)
+               sky2_mac_intr(hw, 1);
+
+       sky2_write32(hw, B0_Y2_SP_ICR, 2);
+
+       sky2_read32(hw, B0_IMSK);
+
+       return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void sky2_netpoll(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       sky2_intr(sky2->hw->pdev->irq, sky2->hw, NULL);
+}
+#endif
+
+/* Chip internal frequency for clock calculations */
+static inline u32 sky2_mhz(const struct sky2_hw *hw)
+{
+       switch (hw->chip_id) {
+       case CHIP_ID_YUKON_EC:
+       case CHIP_ID_YUKON_EC_U:
+               return 125;     /* 125 Mhz */
+       case CHIP_ID_YUKON_FE:
+               return 100;     /* 100 Mhz */
+       default:                /* YUKON_XL */
+               return 156;     /* 156 Mhz */
+       }
+}
+
+static inline u32 sky2_us2clk(const struct sky2_hw *hw, u32 us)
+{
+       return sky2_mhz(hw) * us;
+}
+
+static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk)
+{
+       return clk / sky2_mhz(hw);
+}
+
+
+static int sky2_reset(struct sky2_hw *hw)
+{
+       u32 ctst;
+       u16 status;
+       u8 t8, pmd_type;
+       int i;
+
+       ctst = sky2_read32(hw, B0_CTST);
+
+       sky2_write8(hw, B0_CTST, CS_RST_CLR);
+       hw->chip_id = sky2_read8(hw, B2_CHIP_ID);
+       if (hw->chip_id < CHIP_ID_YUKON_XL || hw->chip_id > CHIP_ID_YUKON_FE) {
+               printk(KERN_ERR PFX "%s: unsupported chip type 0x%x\n",
+                      pci_name(hw->pdev), hw->chip_id);
+               return -EOPNOTSUPP;
+       }
+
+       /* ring for status responses */
+       hw->st_le = pci_alloc_consistent(hw->pdev, STATUS_LE_BYTES,
+                                        &hw->st_dma);
+       if (!hw->st_le)
+               return -ENOMEM;
+
+       /* disable ASF */
+       if (hw->chip_id <= CHIP_ID_YUKON_EC) {
+               sky2_write8(hw, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET);
+               sky2_write16(hw, B0_CTST, Y2_ASF_DISABLE);
+       }
+
+       /* do a SW reset */
+       sky2_write8(hw, B0_CTST, CS_RST_SET);
+       sky2_write8(hw, B0_CTST, CS_RST_CLR);
+
+       /* clear PCI errors, if any */
+       pci_read_config_word(hw->pdev, PCI_STATUS, &status);
+       sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
+       pci_write_config_word(hw->pdev, PCI_STATUS,
+                             status | PCI_STATUS_ERROR_BITS);
+
+       sky2_write8(hw, B0_CTST, CS_MRST_CLR);
+
+       /* clear any PEX errors */
+       if (is_pciex(hw)) {
+               u16 lstat;
+               pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT,
+                                      0xffffffffUL);
+               pci_read_config_word(hw->pdev, PEX_LNK_STAT, &lstat);
+       }
+
+       pmd_type = sky2_read8(hw, B2_PMD_TYP);
+       hw->copper = !(pmd_type == 'L' || pmd_type == 'S');
+
+       hw->ports = 1;
+       t8 = sky2_read8(hw, B2_Y2_HW_RES);
+       if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) {
+               if (!(sky2_read8(hw, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC))
+                       ++hw->ports;
+       }
+       hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4;
+
+       sky2_set_power_state(hw, PCI_D0);
+
+       for (i = 0; i < hw->ports; i++) {
+               sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
+               sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_CLR);
+       }
+
+       sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
+
+       /* Clear I2C IRQ noise */
+       sky2_write32(hw, B2_I2C_IRQ, 1);
+
+       /* turn off hardware timer (unused) */
+       sky2_write8(hw, B2_TI_CTRL, TIM_STOP);
+       sky2_write8(hw, B2_TI_CTRL, TIM_CLR_IRQ);
+
+       sky2_write8(hw, B0_Y2LED, LED_STAT_ON);
+
+       /* Turn off descriptor polling */
+       sky2_write32(hw, B28_DPT_CTRL, DPT_STOP);
+
+       /* Turn off receive timestamp */
+       sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_STOP);
+       sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
+
+       /* enable the Tx Arbiters */
+       for (i = 0; i < hw->ports; i++)
+               sky2_write8(hw, SK_REG(i, TXA_CTRL), TXA_ENA_ARB);
+
+       /* Initialize ram interface */
+       for (i = 0; i < hw->ports; i++) {
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_CTRL), RI_RST_CLR);
+
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_R1), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XA1), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XS1), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_R1), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XA1), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS1), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_R2), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XA2), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XS2), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_R2), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XA2), SK_RI_TO_53);
+               sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53);
+       }
+
+       sky2_write32(hw, B0_HWE_IMSK, Y2_HWE_ALL_MASK);
+
+       for (i = 0; i < hw->ports; i++)
+               sky2_phy_reset(hw, i);
+
+       memset(hw->st_le, 0, STATUS_LE_BYTES);
+       hw->st_idx = 0;
+
+       sky2_write32(hw, STAT_CTRL, SC_STAT_RST_SET);
+       sky2_write32(hw, STAT_CTRL, SC_STAT_RST_CLR);
+
+       sky2_write32(hw, STAT_LIST_ADDR_LO, hw->st_dma);
+       sky2_write32(hw, STAT_LIST_ADDR_HI, (u64) hw->st_dma >> 32);
+
+       /* Set the list last index */
+       sky2_write16(hw, STAT_LAST_IDX, STATUS_RING_SIZE - 1);
+
+       /* These status setup values are copied from SysKonnect's driver */
+       if (is_ec_a1(hw)) {
+               /* WA for dev. #4.3 */
+               sky2_write16(hw, STAT_TX_IDX_TH, 0xfff);        /* Tx Threshold */
+
+               /* set Status-FIFO watermark */
+               sky2_write8(hw, STAT_FIFO_WM, 0x21);    /* WA for dev. #4.18 */
+
+               /* set Status-FIFO ISR watermark */
+               sky2_write8(hw, STAT_FIFO_ISR_WM, 0x07);        /* WA for dev. #4.18 */
+               sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 10000));
+       } else {
+               sky2_write16(hw, STAT_TX_IDX_TH, 10);
+               sky2_write8(hw, STAT_FIFO_WM, 16);
+
+               /* set Status-FIFO ISR watermark */
+               if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0)
+                       sky2_write8(hw, STAT_FIFO_ISR_WM, 4);
+               else
+                       sky2_write8(hw, STAT_FIFO_ISR_WM, 16);
+
+               sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000));
+               sky2_write32(hw, STAT_LEV_TIMER_INI, sky2_us2clk(hw, 100));
+               sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 20));
+       }
+
+       /* enable status unit */
+       sky2_write32(hw, STAT_CTRL, SC_STAT_OP_ON);
+
+       sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
+       sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START);
+       sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_START);
+
+       return 0;
+}
+
+static inline u32 sky2_supported_modes(const struct sky2_hw *hw)
+{
+       u32 modes;
+       if (hw->copper) {
+               modes = SUPPORTED_10baseT_Half
+                   | SUPPORTED_10baseT_Full
+                   | SUPPORTED_100baseT_Half
+                   | SUPPORTED_100baseT_Full
+                   | SUPPORTED_Autoneg | SUPPORTED_TP;
+
+               if (hw->chip_id != CHIP_ID_YUKON_FE)
+                       modes |= SUPPORTED_1000baseT_Half
+                           | SUPPORTED_1000baseT_Full;
+       } else
+               modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE
+                   | SUPPORTED_Autoneg;
+       return modes;
+}
+
+static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+
+       ecmd->transceiver = XCVR_INTERNAL;
+       ecmd->supported = sky2_supported_modes(hw);
+       ecmd->phy_address = PHY_ADDR_MARV;
+       if (hw->copper) {
+               ecmd->supported = SUPPORTED_10baseT_Half
+                   | SUPPORTED_10baseT_Full
+                   | SUPPORTED_100baseT_Half
+                   | SUPPORTED_100baseT_Full
+                   | SUPPORTED_1000baseT_Half
+                   | SUPPORTED_1000baseT_Full
+                   | SUPPORTED_Autoneg | SUPPORTED_TP;
+               ecmd->port = PORT_TP;
+       } else
+               ecmd->port = PORT_FIBRE;
+
+       ecmd->advertising = sky2->advertising;
+       ecmd->autoneg = sky2->autoneg;
+       ecmd->speed = sky2->speed;
+       ecmd->duplex = sky2->duplex;
+       return 0;
+}
+
+static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       const struct sky2_hw *hw = sky2->hw;
+       u32 supported = sky2_supported_modes(hw);
+
+       if (ecmd->autoneg == AUTONEG_ENABLE) {
+               ecmd->advertising = supported;
+               sky2->duplex = -1;
+               sky2->speed = -1;
+       } else {
+               u32 setting;
+
+               switch (ecmd->speed) {
+               case SPEED_1000:
+                       if (ecmd->duplex == DUPLEX_FULL)
+                               setting = SUPPORTED_1000baseT_Full;
+                       else if (ecmd->duplex == DUPLEX_HALF)
+                               setting = SUPPORTED_1000baseT_Half;
+                       else
+                               return -EINVAL;
+                       break;
+               case SPEED_100:
+                       if (ecmd->duplex == DUPLEX_FULL)
+                               setting = SUPPORTED_100baseT_Full;
+                       else if (ecmd->duplex == DUPLEX_HALF)
+                               setting = SUPPORTED_100baseT_Half;
+                       else
+                               return -EINVAL;
+                       break;
+
+               case SPEED_10:
+                       if (ecmd->duplex == DUPLEX_FULL)
+                               setting = SUPPORTED_10baseT_Full;
+                       else if (ecmd->duplex == DUPLEX_HALF)
+                               setting = SUPPORTED_10baseT_Half;
+                       else
+                               return -EINVAL;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+
+               if ((setting & supported) == 0)
+                       return -EINVAL;
+
+               sky2->speed = ecmd->speed;
+               sky2->duplex = ecmd->duplex;
+       }
+
+       sky2->autoneg = ecmd->autoneg;
+       sky2->advertising = ecmd->advertising;
+
+       if (netif_running(dev))
+               sky2_phy_reinit(sky2);
+
+       return 0;
+}
+
+static void sky2_get_drvinfo(struct net_device *dev,
+                            struct ethtool_drvinfo *info)
+{
+       struct sky2_port *sky2 = 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(sky2->hw->pdev));
+}
+
+static const struct sky2_stat {
+       char name[ETH_GSTRING_LEN];
+       u16 offset;
+} sky2_stats[] = {
+       { "tx_bytes",      GM_TXO_OK_HI },
+       { "rx_bytes",      GM_RXO_OK_HI },
+       { "tx_broadcast",  GM_TXF_BC_OK },
+       { "rx_broadcast",  GM_RXF_BC_OK },
+       { "tx_multicast",  GM_TXF_MC_OK },
+       { "rx_multicast",  GM_RXF_MC_OK },
+       { "tx_unicast",    GM_TXF_UC_OK },
+       { "rx_unicast",    GM_RXF_UC_OK },
+       { "tx_mac_pause",  GM_TXF_MPAUSE },
+       { "rx_mac_pause",  GM_RXF_MPAUSE },
+       { "collisions",    GM_TXF_SNG_COL },
+       { "late_collision",GM_TXF_LAT_COL },
+       { "aborted",       GM_TXF_ABO_COL },
+       { "multi_collisions", GM_TXF_MUL_COL },
+       { "fifo_underrun", GM_TXE_FIFO_UR },
+       { "fifo_overflow", GM_RXE_FIFO_OV },
+       { "rx_toolong",    GM_RXF_LNG_ERR },
+       { "rx_jabber",     GM_RXF_JAB_PKT },
+       { "rx_runt",       GM_RXE_FRAG },
+       { "rx_too_long",   GM_RXF_LNG_ERR },
+       { "rx_fcs_error",   GM_RXF_FCS_ERR },
+};
+
+static u32 sky2_get_rx_csum(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       return sky2->rx_csum;
+}
+
+static int sky2_set_rx_csum(struct net_device *dev, u32 data)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       sky2->rx_csum = data;
+
+       sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR),
+                    data ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
+
+       return 0;
+}
+
+static u32 sky2_get_msglevel(struct net_device *netdev)
+{
+       struct sky2_port *sky2 = netdev_priv(netdev);
+       return sky2->msg_enable;
+}
+
+static int sky2_nway_reset(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       if (sky2->autoneg != AUTONEG_ENABLE)
+               return -EINVAL;
+
+       sky2_phy_reinit(sky2);
+
+       return 0;
+}
+
+static void sky2_phy_stats(struct sky2_port *sky2, u64 * data, unsigned count)
+{
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       int i;
+
+       data[0] = (u64) gma_read32(hw, port, GM_TXO_OK_HI) << 32
+           | (u64) gma_read32(hw, port, GM_TXO_OK_LO);
+       data[1] = (u64) gma_read32(hw, port, GM_RXO_OK_HI) << 32
+           | (u64) gma_read32(hw, port, GM_RXO_OK_LO);
+
+       for (i = 2; i < count; i++)
+               data[i] = (u64) gma_read32(hw, port, sky2_stats[i].offset);
+}
+
+static void sky2_set_msglevel(struct net_device *netdev, u32 value)
+{
+       struct sky2_port *sky2 = netdev_priv(netdev);
+       sky2->msg_enable = value;
+}
+
+static int sky2_get_stats_count(struct net_device *dev)
+{
+       return ARRAY_SIZE(sky2_stats);
+}
+
+static void sky2_get_ethtool_stats(struct net_device *dev,
+                                  struct ethtool_stats *stats, u64 * data)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       sky2_phy_stats(sky2, data, ARRAY_SIZE(sky2_stats));
+}
+
+static void sky2_get_strings(struct net_device *dev, u32 stringset, u8 * data)
+{
+       int i;
+
+       switch (stringset) {
+       case ETH_SS_STATS:
+               for (i = 0; i < ARRAY_SIZE(sky2_stats); i++)
+                       memcpy(data + i * ETH_GSTRING_LEN,
+                              sky2_stats[i].name, ETH_GSTRING_LEN);
+               break;
+       }
+}
+
+/* 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 *sky2_get_stats(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       u64 data[13];
+
+       sky2_phy_stats(sky2, data, ARRAY_SIZE(data));
+
+       sky2->net_stats.tx_bytes = data[0];
+       sky2->net_stats.rx_bytes = data[1];
+       sky2->net_stats.tx_packets = data[2] + data[4] + data[6];
+       sky2->net_stats.rx_packets = data[3] + data[5] + data[7];
+       sky2->net_stats.multicast = data[5] + data[7];
+       sky2->net_stats.collisions = data[10];
+       sky2->net_stats.tx_aborted_errors = data[12];
+
+       return &sky2->net_stats;
+}
+
+static int sky2_set_mac_address(struct net_device *dev, void *p)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sockaddr *addr = p;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EADDRNOTAVAIL;
+
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       memcpy_toio(sky2->hw->regs + B2_MAC_1 + sky2->port * 8,
+                   dev->dev_addr, ETH_ALEN);
+       memcpy_toio(sky2->hw->regs + B2_MAC_2 + sky2->port * 8,
+                   dev->dev_addr, ETH_ALEN);
+
+       if (netif_running(dev))
+               sky2_phy_reinit(sky2);
+
+       return 0;
+}
+
+static void sky2_set_multicast(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       struct dev_mc_list *list = dev->mc_list;
+       u16 reg;
+       u8 filter[8];
+
+       memset(filter, 0, sizeof(filter));
+
+       reg = gma_read16(hw, port, GM_RX_CTRL);
+       reg |= GM_RXCR_UCF_ENA;
+
+       if (dev->flags & IFF_PROMISC)   /* promiscuous */
+               reg &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
+       else if ((dev->flags & IFF_ALLMULTI) || dev->mc_count > 16)     /* 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);
+               }
+       }
+
+       gma_write16(hw, port, GM_MC_ADDR_H1,
+                   (u16) filter[0] | ((u16) filter[1] << 8));
+       gma_write16(hw, port, GM_MC_ADDR_H2,
+                   (u16) filter[2] | ((u16) filter[3] << 8));
+       gma_write16(hw, port, GM_MC_ADDR_H3,
+                   (u16) filter[4] | ((u16) filter[5] << 8));
+       gma_write16(hw, port, GM_MC_ADDR_H4,
+                   (u16) filter[6] | ((u16) filter[7] << 8));
+
+       gma_write16(hw, port, GM_RX_CTRL, reg);
+}
+
+/* Can have one global because blinking is controlled by
+ * ethtool and that is always under RTNL mutex
+ */
+static void sky2_led(struct sky2_hw *hw, unsigned port, int on)
+{
+       u16 pg;
+
+       switch (hw->chip_id) {
+       case CHIP_ID_YUKON_XL:
+               pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
+               gm_phy_write(hw, port, PHY_MARV_PHY_CTRL,
+                            on ? (PHY_M_LEDC_LOS_CTRL(1) |
+                                  PHY_M_LEDC_INIT_CTRL(7) |
+                                  PHY_M_LEDC_STA1_CTRL(7) |
+                                  PHY_M_LEDC_STA0_CTRL(7))
+                            : 0);
+
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
+               break;
+
+       default:
+               gm_phy_write(hw, port, PHY_MARV_LED_CTRL, 0);
+               gm_phy_write(hw, port, PHY_MARV_LED_OVER,
+                            on ? 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)
+                            : 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));
+
+       }
+}
+
+/* blink LED's for finding board */
+static int sky2_phys_id(struct net_device *dev, u32 data)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       unsigned port = sky2->port;
+       u16 ledctrl, ledover = 0;
+       long ms;
+       int interrupted;
+       int onoff = 1;
+
+       if (!data || data > (u32) (MAX_SCHEDULE_TIMEOUT / HZ))
+               ms = jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT);
+       else
+               ms = data * 1000;
+
+       /* save initial values */
+       down(&sky2->phy_sema);
+       if (hw->chip_id == CHIP_ID_YUKON_XL) {
+               u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
+               ledctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
+       } else {
+               ledctrl = gm_phy_read(hw, port, PHY_MARV_LED_CTRL);
+               ledover = gm_phy_read(hw, port, PHY_MARV_LED_OVER);
+       }
+
+       interrupted = 0;
+       while (!interrupted && ms > 0) {
+               sky2_led(hw, port, onoff);
+               onoff = !onoff;
+
+               up(&sky2->phy_sema);
+               interrupted = msleep_interruptible(250);
+               down(&sky2->phy_sema);
+
+               ms -= 250;
+       }
+
+       /* resume regularly scheduled programming */
+       if (hw->chip_id == CHIP_ID_YUKON_XL) {
+               u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
+               gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ledctrl);
+               gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
+       } else {
+               gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl);
+               gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover);
+       }
+       up(&sky2->phy_sema);
+
+       return 0;
+}
+
+static void sky2_get_pauseparam(struct net_device *dev,
+                               struct ethtool_pauseparam *ecmd)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       ecmd->tx_pause = sky2->tx_pause;
+       ecmd->rx_pause = sky2->rx_pause;
+       ecmd->autoneg = sky2->autoneg;
+}
+
+static int sky2_set_pauseparam(struct net_device *dev,
+                              struct ethtool_pauseparam *ecmd)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       int err = 0;
+
+       sky2->autoneg = ecmd->autoneg;
+       sky2->tx_pause = ecmd->tx_pause != 0;
+       sky2->rx_pause = ecmd->rx_pause != 0;
+
+       sky2_phy_reinit(sky2);
+
+       return err;
+}
+
+#ifdef CONFIG_PM
+static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       wol->supported = WAKE_MAGIC;
+       wol->wolopts = sky2->wol ? WAKE_MAGIC : 0;
+}
+
+static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+
+       if (wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
+               return -EOPNOTSUPP;
+
+       sky2->wol = wol->wolopts == WAKE_MAGIC;
+
+       if (sky2->wol) {
+               memcpy_toio(hw->regs + WOL_MAC_ADDR, dev->dev_addr, ETH_ALEN);
+
+               sky2_write16(hw, WOL_CTRL_STAT,
+                            WOL_CTL_ENA_PME_ON_MAGIC_PKT |
+                            WOL_CTL_ENA_MAGIC_PKT_UNIT);
+       } else
+               sky2_write16(hw, WOL_CTRL_STAT, WOL_CTL_DEFAULT);
+
+       return 0;
+}
+#endif
+
+static int sky2_get_coalesce(struct net_device *dev,
+                            struct ethtool_coalesce *ecmd)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+
+       if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_STOP)
+               ecmd->tx_coalesce_usecs = 0;
+       else {
+               u32 clks = sky2_read32(hw, STAT_TX_TIMER_INI);
+               ecmd->tx_coalesce_usecs = sky2_clk2us(hw, clks);
+       }
+       ecmd->tx_max_coalesced_frames = sky2_read16(hw, STAT_TX_IDX_TH);
+
+       if (sky2_read8(hw, STAT_LEV_TIMER_CTRL) == TIM_STOP)
+               ecmd->rx_coalesce_usecs = 0;
+       else {
+               u32 clks = sky2_read32(hw, STAT_LEV_TIMER_INI);
+               ecmd->rx_coalesce_usecs = sky2_clk2us(hw, clks);
+       }
+       ecmd->rx_max_coalesced_frames = sky2_read8(hw, STAT_FIFO_WM);
+
+       if (sky2_read8(hw, STAT_ISR_TIMER_CTRL) == TIM_STOP)
+               ecmd->rx_coalesce_usecs_irq = 0;
+       else {
+               u32 clks = sky2_read32(hw, STAT_ISR_TIMER_INI);
+               ecmd->rx_coalesce_usecs_irq = sky2_clk2us(hw, clks);
+       }
+
+       ecmd->rx_max_coalesced_frames_irq = sky2_read8(hw, STAT_FIFO_ISR_WM);
+
+       return 0;
+}
+
+/* Note: this affect both ports */
+static int sky2_set_coalesce(struct net_device *dev,
+                            struct ethtool_coalesce *ecmd)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+       const u32 tmin = sky2_clk2us(hw, 1);
+       const u32 tmax = 5000;
+
+       if (ecmd->tx_coalesce_usecs != 0 &&
+           (ecmd->tx_coalesce_usecs < tmin || ecmd->tx_coalesce_usecs > tmax))
+               return -EINVAL;
+
+       if (ecmd->rx_coalesce_usecs != 0 &&
+           (ecmd->rx_coalesce_usecs < tmin || ecmd->rx_coalesce_usecs > tmax))
+               return -EINVAL;
+
+       if (ecmd->rx_coalesce_usecs_irq != 0 &&
+           (ecmd->rx_coalesce_usecs_irq < tmin || ecmd->rx_coalesce_usecs_irq > tmax))
+               return -EINVAL;
+
+       if (ecmd->tx_max_coalesced_frames > 0xffff)
+               return -EINVAL;
+       if (ecmd->rx_max_coalesced_frames > 0xff)
+               return -EINVAL;
+       if (ecmd->rx_max_coalesced_frames_irq > 0xff)
+               return -EINVAL;
+
+       if (ecmd->tx_coalesce_usecs == 0)
+               sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
+       else {
+               sky2_write32(hw, STAT_TX_TIMER_INI,
+                            sky2_us2clk(hw, ecmd->tx_coalesce_usecs));
+               sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
+       }
+       sky2_write16(hw, STAT_TX_IDX_TH, ecmd->tx_max_coalesced_frames);
+
+       if (ecmd->rx_coalesce_usecs == 0)
+               sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_STOP);
+       else {
+               sky2_write32(hw, STAT_LEV_TIMER_INI,
+                            sky2_us2clk(hw, ecmd->rx_coalesce_usecs));
+               sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START);
+       }
+       sky2_write8(hw, STAT_FIFO_WM, ecmd->rx_max_coalesced_frames);
+
+       if (ecmd->rx_coalesce_usecs_irq == 0)
+               sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_STOP);
+       else {
+               sky2_write32(hw, STAT_TX_TIMER_INI,
+                            sky2_us2clk(hw, ecmd->rx_coalesce_usecs_irq));
+               sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_START);
+       }
+       sky2_write8(hw, STAT_FIFO_ISR_WM, ecmd->rx_max_coalesced_frames_irq);
+       return 0;
+}
+
+static void sky2_get_ringparam(struct net_device *dev,
+                              struct ethtool_ringparam *ering)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+
+       ering->rx_max_pending = RX_MAX_PENDING;
+       ering->rx_mini_max_pending = 0;
+       ering->rx_jumbo_max_pending = 0;
+       ering->tx_max_pending = TX_RING_SIZE - 1;
+
+       ering->rx_pending = sky2->rx_pending;
+       ering->rx_mini_pending = 0;
+       ering->rx_jumbo_pending = 0;
+       ering->tx_pending = sky2->tx_pending;
+}
+
+static int sky2_set_ringparam(struct net_device *dev,
+                             struct ethtool_ringparam *ering)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       int err = 0;
+
+       if (ering->rx_pending > RX_MAX_PENDING ||
+           ering->rx_pending < 8 ||
+           ering->tx_pending < MAX_SKB_TX_LE ||
+           ering->tx_pending > TX_RING_SIZE - 1)
+               return -EINVAL;
+
+       if (netif_running(dev))
+               sky2_down(dev);
+
+       sky2->rx_pending = ering->rx_pending;
+       sky2->tx_pending = ering->tx_pending;
+
+       if (netif_running(dev)) {
+               err = sky2_up(dev);
+               if (err)
+                       dev_close(dev);
+               else
+                       sky2_set_multicast(dev);
+       }
+
+       return err;
+}
+
+static int sky2_get_regs_len(struct net_device *dev)
+{
+       return 0x4000;
+}
+
+/*
+ * Returns copy of control register region
+ * Note: access to the RAM address register set will cause timeouts.
+ */
+static void sky2_get_regs(struct net_device *dev, struct ethtool_regs *regs,
+                         void *p)
+{
+       const struct sky2_port *sky2 = netdev_priv(dev);
+       const void __iomem *io = sky2->hw->regs;
+
+       BUG_ON(regs->len < B3_RI_WTO_R1);
+       regs->version = 1;
+       memset(p, 0, regs->len);
+
+       memcpy_fromio(p, io, B3_RAM_ADDR);
+
+       memcpy_fromio(p + B3_RI_WTO_R1,
+                     io + B3_RI_WTO_R1,
+                     regs->len - B3_RI_WTO_R1);
+}
+
+static struct ethtool_ops sky2_ethtool_ops = {
+       .get_settings = sky2_get_settings,
+       .set_settings = sky2_set_settings,
+       .get_drvinfo = sky2_get_drvinfo,
+       .get_msglevel = sky2_get_msglevel,
+       .set_msglevel = sky2_set_msglevel,
+       .nway_reset   = sky2_nway_reset,
+       .get_regs_len = sky2_get_regs_len,
+       .get_regs = sky2_get_regs,
+       .get_link = ethtool_op_get_link,
+       .get_sg = ethtool_op_get_sg,
+       .set_sg = ethtool_op_set_sg,
+       .get_tx_csum = ethtool_op_get_tx_csum,
+       .set_tx_csum = ethtool_op_set_tx_csum,
+       .get_tso = ethtool_op_get_tso,
+       .set_tso = ethtool_op_set_tso,
+       .get_rx_csum = sky2_get_rx_csum,
+       .set_rx_csum = sky2_set_rx_csum,
+       .get_strings = sky2_get_strings,
+       .get_coalesce = sky2_get_coalesce,
+       .set_coalesce = sky2_set_coalesce,
+       .get_ringparam = sky2_get_ringparam,
+       .set_ringparam = sky2_set_ringparam,
+       .get_pauseparam = sky2_get_pauseparam,
+       .set_pauseparam = sky2_set_pauseparam,
+#ifdef CONFIG_PM
+       .get_wol = sky2_get_wol,
+       .set_wol = sky2_set_wol,
+#endif
+       .phys_id = sky2_phys_id,
+       .get_stats_count = sky2_get_stats_count,
+       .get_ethtool_stats = sky2_get_ethtool_stats,
+       .get_perm_addr  = ethtool_op_get_perm_addr,
+};
+
+/* Initialize network device */
+static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
+                                                    unsigned port, int highmem)
+{
+       struct sky2_port *sky2;
+       struct net_device *dev = alloc_etherdev(sizeof(*sky2));
+
+       if (!dev) {
+               printk(KERN_ERR "sky2 etherdev alloc failed");
+               return NULL;
+       }
+
+       SET_MODULE_OWNER(dev);
+       SET_NETDEV_DEV(dev, &hw->pdev->dev);
+       dev->irq = hw->pdev->irq;
+       dev->open = sky2_up;
+       dev->stop = sky2_down;
+       dev->do_ioctl = sky2_ioctl;
+       dev->hard_start_xmit = sky2_xmit_frame;
+       dev->get_stats = sky2_get_stats;
+       dev->set_multicast_list = sky2_set_multicast;
+       dev->set_mac_address = sky2_set_mac_address;
+       dev->change_mtu = sky2_change_mtu;
+       SET_ETHTOOL_OPS(dev, &sky2_ethtool_ops);
+       dev->tx_timeout = sky2_tx_timeout;
+       dev->watchdog_timeo = TX_WATCHDOG;
+       if (port == 0)
+               dev->poll = sky2_poll;
+       dev->weight = NAPI_WEIGHT;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       dev->poll_controller = sky2_netpoll;
+#endif
+
+       sky2 = netdev_priv(dev);
+       sky2->netdev = dev;
+       sky2->hw = hw;
+       sky2->msg_enable = netif_msg_init(debug, default_msg);
+
+       spin_lock_init(&sky2->tx_lock);
+       /* Auto speed and flow control */
+       sky2->autoneg = AUTONEG_ENABLE;
+       sky2->tx_pause = 1;
+       sky2->rx_pause = 1;
+       sky2->duplex = -1;
+       sky2->speed = -1;
+       sky2->advertising = sky2_supported_modes(hw);
+
+       /* Receive checksum disabled for Yukon XL
+        * because of observed problems with incorrect
+        * values when multiple packets are received in one interrupt
+        */
+       sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
+
+       INIT_WORK(&sky2->phy_task, sky2_phy_task, sky2);
+       init_MUTEX(&sky2->phy_sema);
+       sky2->tx_pending = TX_DEF_PENDING;
+       sky2->rx_pending = is_ec_a1(hw) ? 8 : RX_DEF_PENDING;
+       sky2->rx_bufsize = sky2_buf_size(ETH_DATA_LEN);
+
+       hw->dev[port] = dev;
+
+       sky2->port = port;
+
+       dev->features |= NETIF_F_LLTX;
+       if (hw->chip_id != CHIP_ID_YUKON_EC_U)
+               dev->features |= NETIF_F_TSO;
+       if (highmem)
+               dev->features |= NETIF_F_HIGHDMA;
+       dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
+
+#ifdef SKY2_VLAN_TAG_USED
+       dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+       dev->vlan_rx_register = sky2_vlan_rx_register;
+       dev->vlan_rx_kill_vid = sky2_vlan_rx_kill_vid;
+#endif
+
+       /* read the mac address */
+       memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN);
+       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
+
+       /* device is off until link detection */
+       netif_carrier_off(dev);
+       netif_stop_queue(dev);
+
+       return dev;
+}
+
+static inline void sky2_show_addr(struct net_device *dev)
+{
+       const struct sky2_port *sky2 = netdev_priv(dev);
+
+       if (netif_msg_probe(sky2))
+               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 sky2_probe(struct pci_dev *pdev,
+                               const struct pci_device_id *ent)
+{
+       struct net_device *dev, *dev1 = NULL;
+       struct sky2_hw *hw;
+       int err, pm_cap, using_dac = 0;
+
+       err = pci_enable_device(pdev);
+       if (err) {
+               printk(KERN_ERR PFX "%s cannot enable PCI device\n",
+                      pci_name(pdev));
+               goto err_out;
+       }
+
+       err = pci_request_regions(pdev, DRV_NAME);
+       if (err) {
+               printk(KERN_ERR PFX "%s cannot obtain PCI resources\n",
+                      pci_name(pdev));
+               goto err_out;
+       }
+
+       pci_set_master(pdev);
+
+       /* Find power-management capability. */
+       pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
+       if (pm_cap == 0) {
+               printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
+                      "aborting.\n");
+               err = -EIO;
+               goto err_out_free_regions;
+       }
+
+       if (sizeof(dma_addr_t) > sizeof(u32)) {
+               err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+               if (!err)
+                       using_dac = 1;
+       }
+
+       if (!using_dac) {
+               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               if (err) {
+                       printk(KERN_ERR PFX "%s no usable DMA configuration\n",
+                              pci_name(pdev));
+                       goto err_out_free_regions;
+               }
+       }
+#ifdef __BIG_ENDIAN
+       /* byte swap descriptors 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;
+
+       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;
+       }
+       hw->pm_cap = pm_cap;
+
+       err = sky2_reset(hw);
+       if (err)
+               goto err_out_iounmap;
+
+       printk(KERN_INFO PFX "v%s addr 0x%lx irq %d Yukon-%s (0x%x) rev %d\n",
+              DRV_VERSION, pci_resource_start(pdev, 0), pdev->irq,
+              yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL],
+              hw->chip_id, hw->chip_rev);
+
+       dev = sky2_init_netdev(hw, 0, using_dac);
+       if (!dev)
+               goto err_out_free_pci;
+
+       err = register_netdev(dev);
+       if (err) {
+               printk(KERN_ERR PFX "%s: cannot register net device\n",
+                      pci_name(pdev));
+               goto err_out_free_netdev;
+       }
+
+       sky2_show_addr(dev);
+
+       if (hw->ports > 1 && (dev1 = sky2_init_netdev(hw, 1, using_dac))) {
+               if (register_netdev(dev1) == 0)
+                       sky2_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);
+               }
+       }
+
+       err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ, DRV_NAME, hw);
+       if (err) {
+               printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
+                      pci_name(pdev), pdev->irq);
+               goto err_out_unregister;
+       }
+
+       hw->intr_mask = Y2_IS_BASE;
+       sky2_write32(hw, B0_IMSK, hw->intr_mask);
+
+       pci_set_drvdata(pdev, hw);
+
+       return 0;
+
+err_out_unregister:
+       if (dev1) {
+               unregister_netdev(dev1);
+               free_netdev(dev1);
+       }
+       unregister_netdev(dev);
+err_out_free_netdev:
+       free_netdev(dev);
+err_out_free_pci:
+       sky2_write8(hw, B0_CTST, CS_RST_SET);
+       pci_free_consistent(hw->pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
+err_out_iounmap:
+       iounmap(hw->regs);
+err_out_free_hw:
+       kfree(hw);
+err_out_free_regions:
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+err_out:
+       return err;
+}
+
+static void __devexit sky2_remove(struct pci_dev *pdev)
+{
+       struct sky2_hw *hw = pci_get_drvdata(pdev);
+       struct net_device *dev0, *dev1;
+
+       if (!hw)
+               return;
+
+       dev0 = hw->dev[0];
+       dev1 = hw->dev[1];
+       if (dev1)
+               unregister_netdev(dev1);
+       unregister_netdev(dev0);
+
+       sky2_write32(hw, B0_IMSK, 0);
+       sky2_set_power_state(hw, PCI_D3hot);
+       sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
+       sky2_write8(hw, B0_CTST, CS_RST_SET);
+       sky2_read8(hw, B0_CTST);
+
+       free_irq(pdev->irq, hw);
+       pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+
+       if (dev1)
+               free_netdev(dev1);
+       free_netdev(dev0);
+       iounmap(hw->regs);
+       kfree(hw);
+
+       pci_set_drvdata(pdev, NULL);
+}
+
+#ifdef CONFIG_PM
+static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
+{
+       struct sky2_hw *hw = pci_get_drvdata(pdev);
+       int i;
+
+       for (i = 0; i < 2; i++) {
+               struct net_device *dev = hw->dev[i];
+
+               if (dev) {
+                       if (!netif_running(dev))
+                               continue;
+
+                       sky2_down(dev);
+                       netif_device_detach(dev);
+               }
+       }
+
+       return sky2_set_power_state(hw, pci_choose_state(pdev, state));
+}
+
+static int sky2_resume(struct pci_dev *pdev)
+{
+       struct sky2_hw *hw = pci_get_drvdata(pdev);
+       int i;
+
+       pci_restore_state(pdev);
+       pci_enable_wake(pdev, PCI_D0, 0);
+       sky2_set_power_state(hw, PCI_D0);
+
+       sky2_reset(hw);
+
+       for (i = 0; i < 2; i++) {
+               struct net_device *dev = hw->dev[i];
+               if (dev) {
+                       if (netif_running(dev)) {
+                               netif_device_attach(dev);
+                               if (sky2_up(dev))
+                                       dev_close(dev);
+                       }
+               }
+       }
+       return 0;
+}
+#endif
+
+static struct pci_driver sky2_driver = {
+       .name = DRV_NAME,
+       .id_table = sky2_id_table,
+       .probe = sky2_probe,
+       .remove = __devexit_p(sky2_remove),
+#ifdef CONFIG_PM
+       .suspend = sky2_suspend,
+       .resume = sky2_resume,
+#endif
+};
+
+static int __init sky2_init_module(void)
+{
+       return pci_register_driver(&sky2_driver);
+}
+
+static void __exit sky2_cleanup_module(void)
+{
+       pci_unregister_driver(&sky2_driver);
+}
+
+module_init(sky2_init_module);
+module_exit(sky2_cleanup_module);
+
+MODULE_DESCRIPTION("Marvell Yukon 2 Gigabit Ethernet driver");
+MODULE_AUTHOR("Stephen Hemminger <shemminger@osdl.org>");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_VERSION);
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
new file mode 100644 (file)
index 0000000..9551892
--- /dev/null
@@ -0,0 +1,1922 @@
+/*
+ * Definitions for the new Marvell Yukon 2 driver.
+ */
+#ifndef _SKY2_H
+#define _SKY2_H
+
+/* PCI config registers */
+#define PCI_DEV_REG1   0x40
+#define PCI_DEV_REG2   0x44
+#define PCI_DEV_STATUS  0x7c
+#define PCI_OS_PCI_X    (1<<26)
+
+#define PEX_LNK_STAT   0xf2
+#define PEX_UNC_ERR_STAT 0x104
+#define PEX_DEV_CTRL   0xe8
+
+/* Yukon-2 */
+enum pci_dev_reg_1 {
+       PCI_Y2_PIG_ENA   = 1<<31, /* Enable Plug-in-Go (YUKON-2) */
+       PCI_Y2_DLL_DIS   = 1<<30, /* Disable PCI DLL (YUKON-2) */
+       PCI_Y2_PHY2_COMA = 1<<29, /* Set PHY 2 to Coma Mode (YUKON-2) */
+       PCI_Y2_PHY1_COMA = 1<<28, /* Set PHY 1 to Coma Mode (YUKON-2) */
+       PCI_Y2_PHY2_POWD = 1<<27, /* Set PHY 2 to Power Down (YUKON-2) */
+       PCI_Y2_PHY1_POWD = 1<<26, /* Set PHY 1 to Power Down (YUKON-2) */
+};
+
+enum pci_dev_reg_2 {
+       PCI_VPD_WR_THR  = 0xffL<<24,    /* Bit 31..24:  VPD Write Threshold */
+       PCI_DEV_SEL     = 0x7fL<<17,    /* Bit 23..17:  EEPROM Device Select */
+       PCI_VPD_ROM_SZ  = 7L<<14,       /* Bit 16..14:  VPD ROM Size    */
+
+       PCI_PATCH_DIR   = 0xfL<<8,      /* Bit 11.. 8:  Ext Patches dir 3..0 */
+       PCI_EXT_PATCHS  = 0xfL<<4,      /* Bit  7.. 4:  Extended Patches 3..0 */
+       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 */
+};
+
+
+#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 pex_dev_ctrl {
+       PEX_DC_MAX_RRS_MSK      = 7<<12, /* Bit 14..12: Max. Read Request Size */
+       PEX_DC_EN_NO_SNOOP      = 1<<11,/* Enable No Snoop */
+       PEX_DC_EN_AUX_POW       = 1<<10,/* Enable AUX Power */
+       PEX_DC_EN_PHANTOM       = 1<<9, /* Enable Phantom Functions */
+       PEX_DC_EN_EXT_TAG       = 1<<8, /* Enable Extended Tag Field */
+       PEX_DC_MAX_PLS_MSK      = 7<<5, /* Bit  7.. 5:  Max. Payload Size Mask */
+       PEX_DC_EN_REL_ORD       = 1<<4, /* Enable Relaxed Ordering */
+       PEX_DC_EN_UNS_RQ_RP     = 1<<3, /* Enable Unsupported Request Reporting */
+       PEX_DC_EN_FAT_ER_RP     = 1<<2, /* Enable Fatal Error Reporting */
+       PEX_DC_EN_NFA_ER_RP     = 1<<1, /* Enable Non-Fatal Error Reporting */
+       PEX_DC_EN_COR_ER_RP     = 1<<0, /* Enable Correctable Error Reporting */
+};
+#define  PEX_DC_MAX_RD_RQ_SIZE(x) (((x)<<12) & PEX_DC_MAX_RRS_MSK)
+
+/* PEX_UNC_ERR_STAT     PEX Uncorrectable Errors Status Register (Yukon-2) */
+enum pex_err {
+       PEX_UNSUP_REQ   = 1<<20, /* Unsupported Request Error */
+
+       PEX_MALFOR_TLP  = 1<<18, /* Malformed TLP */
+
+       PEX_UNEXP_COMP  = 1<<16, /* Unexpected Completion */
+
+       PEX_COMP_TO     = 1<<14, /* Completion Timeout */
+       PEX_FLOW_CTRL_P = 1<<13, /* Flow Control Protocol Error */
+       PEX_POIS_TLP    = 1<<12, /* Poisoned TLP */
+
+       PEX_DATA_LINK_P = 1<<4, /* Data Link Protocol Error */
+       PEX_FATAL_ERRORS= (PEX_MALFOR_TLP | PEX_FLOW_CTRL_P | PEX_DATA_LINK_P),
+};
+
+
+enum csr_regs {
+       B0_RAP          = 0x0000,
+       B0_CTST         = 0x0004,
+       B0_Y2LED        = 0x0005,
+       B0_POWER_CTRL   = 0x0007,
+       B0_ISRC         = 0x0008,
+       B0_IMSK         = 0x000c,
+       B0_HWE_ISRC     = 0x0010,
+       B0_HWE_IMSK     = 0x0014,
+
+       /* Special ISR registers (Yukon-2 only) */
+       B0_Y2_SP_ISRC2  = 0x001c,
+       B0_Y2_SP_ISRC3  = 0x0020,
+       B0_Y2_SP_EISR   = 0x0024,
+       B0_Y2_SP_LISR   = 0x0028,
+       B0_Y2_SP_ICR    = 0x002c,
+
+       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_Y2_CLK_GATE  = 0x011d,
+       B2_Y2_HW_RES    = 0x011e,
+       B2_E_3          = 0x011f,
+       B2_Y2_CLK_CTRL  = 0x0120,
+
+       B2_TI_INI       = 0x0130,
+       B2_TI_VAL       = 0x0134,
+       B2_TI_CTRL      = 0x0138,
+       B2_TI_TEST      = 0x0139,
+
+       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,
+
+       B3_RAM_ADDR     = 0x0180,
+       B3_RAM_DATA_LO  = 0x0184,
+       B3_RAM_DATA_HI  = 0x0188,
+
+/* RAM Interface Registers */
+/* Yukon-2: use RAM_BUFFER() to access the RAM buffer */
+/*
+ * The HW-Spec. calls this registers Timeout Value 0..11. But this names are
+ * not usable in SW. Please notice these are NOT real timeouts, these are
+ * the number of qWords transferred continuously.
+ */
+#define RAM_BUFFER(port, reg)  (reg | (port <<6))
+
+       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,
+
+       Y2_CFG_SPC      = 0x1c00,
+};
+
+/*     B0_CTST                 16 bit  Control/Status register */
+enum {
+       Y2_VMAIN_AVAIL  = 1<<17,/* VMAIN available (YUKON-2 only) */
+       Y2_VAUX_AVAIL   = 1<<16,/* VAUX available (YUKON-2 only) */
+       Y2_ASF_ENABLE   = 1<<13,/* ASF Unit Enable (YUKON-2 only) */
+       Y2_ASF_DISABLE  = 1<<12,/* ASF Unit Disable (YUKON-2 only) */
+       Y2_CLK_RUN_ENA  = 1<<11,/* CLK_RUN Enable  (YUKON-2 only) */
+       Y2_CLK_RUN_DIS  = 1<<10,/* CLK_RUN Disable (YUKON-2 only) */
+       Y2_LED_STAT_ON  = 1<<9, /* Status LED On  (YUKON-2 only) */
+       Y2_LED_STAT_OFF = 1<<8, /* Status LED Off (YUKON-2 only) */
+
+       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 */
+enum {
+/* 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) */
+enum {
+       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 */
+
+/*     B0_Y2_SP_ISRC2  32 bit  Special Interrupt Source Reg 2 */
+/*     B0_Y2_SP_ISRC3  32 bit  Special Interrupt Source Reg 3 */
+/*     B0_Y2_SP_EISR   32 bit  Enter ISR Reg */
+/*     B0_Y2_SP_LISR   32 bit  Leave ISR Reg */
+enum {
+       Y2_IS_HW_ERR    = 1<<31,        /* Interrupt HW Error */
+       Y2_IS_STAT_BMU  = 1<<30,        /* Status BMU Interrupt */
+       Y2_IS_ASF       = 1<<29,        /* ASF subsystem Interrupt */
+
+       Y2_IS_POLL_CHK  = 1<<27,        /* Check IRQ from polling unit */
+       Y2_IS_TWSI_RDY  = 1<<26,        /* IRQ on end of TWSI Tx */
+       Y2_IS_IRQ_SW    = 1<<25,        /* SW forced IRQ        */
+       Y2_IS_TIMINT    = 1<<24,        /* IRQ from Timer       */
+
+       Y2_IS_IRQ_PHY2  = 1<<12,        /* Interrupt from PHY 2 */
+       Y2_IS_IRQ_MAC2  = 1<<11,        /* Interrupt from MAC 2 */
+       Y2_IS_CHK_RX2   = 1<<10,        /* Descriptor error Rx 2 */
+       Y2_IS_CHK_TXS2  = 1<<9,         /* Descriptor error TXS 2 */
+       Y2_IS_CHK_TXA2  = 1<<8,         /* Descriptor error TXA 2 */
+
+       Y2_IS_IRQ_PHY1  = 1<<4,         /* Interrupt from PHY 1 */
+       Y2_IS_IRQ_MAC1  = 1<<3,         /* Interrupt from MAC 1 */
+       Y2_IS_CHK_RX1   = 1<<2,         /* Descriptor error Rx 1 */
+       Y2_IS_CHK_TXS1  = 1<<1,         /* Descriptor error TXS 1 */
+       Y2_IS_CHK_TXA1  = 1<<0,         /* Descriptor error TXA 1 */
+
+       Y2_IS_BASE      = Y2_IS_HW_ERR | Y2_IS_STAT_BMU |
+                         Y2_IS_POLL_CHK | Y2_IS_TWSI_RDY |
+                         Y2_IS_IRQ_SW | Y2_IS_TIMINT,
+       Y2_IS_PORT_1    = Y2_IS_IRQ_PHY1 | Y2_IS_IRQ_MAC1 |
+                         Y2_IS_CHK_RX1 | Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXS1,
+       Y2_IS_PORT_2    = Y2_IS_IRQ_PHY2 | Y2_IS_IRQ_MAC2 |
+                         Y2_IS_CHK_RX2 | Y2_IS_CHK_TXA2 | Y2_IS_CHK_TXS2,
+};
+
+/*     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 */
+};
+
+/* Hardware error interrupt mask for Yukon 2 */
+enum {
+       Y2_IS_TIST_OV   = 1<<29,/* Time Stamp Timer overflow interrupt */
+       Y2_IS_SENSOR    = 1<<28, /* Sensor interrupt */
+       Y2_IS_MST_ERR   = 1<<27, /* Master error interrupt */
+       Y2_IS_IRQ_STAT  = 1<<26, /* Status exception interrupt */
+       Y2_IS_PCI_EXP   = 1<<25, /* PCI-Express interrupt */
+       Y2_IS_PCI_NEXP  = 1<<24, /* PCI-Express error similar to PCI error */
+                                               /* Link 2 */
+       Y2_IS_PAR_RD2   = 1<<13, /* Read RAM parity error interrupt */
+       Y2_IS_PAR_WR2   = 1<<12, /* Write RAM parity error interrupt */
+       Y2_IS_PAR_MAC2  = 1<<11, /* MAC hardware fault interrupt */
+       Y2_IS_PAR_RX2   = 1<<10, /* Parity Error Rx Queue 2 */
+       Y2_IS_TCP_TXS2  = 1<<9, /* TCP length mismatch sync Tx queue IRQ */
+       Y2_IS_TCP_TXA2  = 1<<8, /* TCP length mismatch async Tx queue IRQ */
+                                               /* Link 1 */
+       Y2_IS_PAR_RD1   = 1<<5, /* Read RAM parity error interrupt */
+       Y2_IS_PAR_WR1   = 1<<4, /* Write RAM parity error interrupt */
+       Y2_IS_PAR_MAC1  = 1<<3, /* MAC hardware fault interrupt */
+       Y2_IS_PAR_RX1   = 1<<2, /* Parity Error Rx Queue 1 */
+       Y2_IS_TCP_TXS1  = 1<<1, /* TCP length mismatch sync Tx queue IRQ */
+       Y2_IS_TCP_TXA1  = 1<<0, /* TCP length mismatch async Tx queue IRQ */
+
+       Y2_HWE_L1_MASK  = Y2_IS_PAR_RD1 | Y2_IS_PAR_WR1 | Y2_IS_PAR_MAC1 |
+                         Y2_IS_PAR_RX1 | Y2_IS_TCP_TXS1| Y2_IS_TCP_TXA1,
+       Y2_HWE_L2_MASK  = Y2_IS_PAR_RD2 | Y2_IS_PAR_WR2 | Y2_IS_PAR_MAC2 |
+                         Y2_IS_PAR_RX2 | Y2_IS_TCP_TXS2| Y2_IS_TCP_TXA2,
+
+       Y2_HWE_ALL_MASK = Y2_IS_TIST_OV | Y2_IS_MST_ERR | Y2_IS_IRQ_STAT |
+                         Y2_IS_PCI_EXP |
+                         Y2_HWE_L1_MASK | Y2_HWE_L2_MASK,
+};
+
+/*     B28_DPT_CTRL     8 bit  Descriptor Poll Timer Ctrl Reg */
+enum {
+       DPT_START       = 1<<1,
+       DPT_STOP        = 1<<0,
+};
+
+/*     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_U = 0xb4, /* Chip ID for YUKON-2 EC Ultra */
+       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_EC_A1    = 0,  /* Chip Rev. for Yukon-EC A1/A0 */
+       CHIP_REV_YU_EC_A2    = 1,  /* Chip Rev. for Yukon-EC A2 */
+       CHIP_REV_YU_EC_A3    = 2,  /* Chip Rev. for Yukon-EC A3 */
+};
+
+/*     B2_Y2_CLK_GATE   8 bit  Clock Gating (Yukon-2 only) */
+enum {
+       Y2_STATUS_LNK2_INAC     = 1<<7, /* Status Link 2 inactive (0 = active) */
+       Y2_CLK_GAT_LNK2_DIS     = 1<<6, /* Disable clock gating Link 2 */
+       Y2_COR_CLK_LNK2_DIS     = 1<<5, /* Disable Core clock Link 2 */
+       Y2_PCI_CLK_LNK2_DIS     = 1<<4, /* Disable PCI clock Link 2 */
+       Y2_STATUS_LNK1_INAC     = 1<<3, /* Status Link 1 inactive (0 = active) */
+       Y2_CLK_GAT_LNK1_DIS     = 1<<2, /* Disable clock gating Link 1 */
+       Y2_COR_CLK_LNK1_DIS     = 1<<1, /* Disable Core clock Link 1 */
+       Y2_PCI_CLK_LNK1_DIS     = 1<<0, /* Disable PCI clock Link 1 */
+};
+
+/*     B2_Y2_HW_RES    8 bit   HW Resources (Yukon-2 only) */
+enum {
+       CFG_LED_MODE_MSK        = 7<<2, /* Bit  4.. 2:  LED Mode Mask */
+       CFG_LINK_2_AVAIL        = 1<<1, /* Link 2 available */
+       CFG_LINK_1_AVAIL        = 1<<0, /* Link 1 available */
+};
+#define CFG_LED_MODE(x)                (((x) & CFG_LED_MODE_MSK) >> 2)
+#define CFG_DUAL_MAC_MSK       (CFG_LINK_2_AVAIL | CFG_LINK_1_AVAIL)
+
+
+/* B2_Y2_CLK_CTRL      32 bit  Clock Frequency Control Register (Yukon-2/EC) */
+enum {
+       Y2_CLK_DIV_VAL_MSK      = 0xff<<16,/* Bit 23..16: Clock Divisor Value */
+#define        Y2_CLK_DIV_VAL(x)       (((x)<<16) & Y2_CLK_DIV_VAL_MSK)
+       Y2_CLK_DIV_VAL2_MSK     = 7<<21,   /* Bit 23..21: Clock Divisor Value */
+       Y2_CLK_SELECT2_MSK      = 0x1f<<16,/* Bit 20..16: Clock Select */
+#define Y2_CLK_DIV_VAL_2(x)    (((x)<<21) & Y2_CLK_DIV_VAL2_MSK)
+#define Y2_CLK_SEL_VAL_2(x)    (((x)<<16) & Y2_CLK_SELECT2_MSK)
+       Y2_CLK_DIV_ENA          = 1<<1, /* Enable  Core Clock Division */
+       Y2_CLK_DIV_DIS          = 1<<0, /* Disable Core Clock Division */
+};
+
+/*     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 */
+};
+
+/*     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 Interface 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 */
+};
+
+#define SK_RI_TO_53    36              /* RAM interface timeout */
+
+
+/* Port related registers FIFO, and Arbiter */
+#define SK_REG(port,reg)       (((port)<<7)+(reg))
+
+/* Transmit Arbiter Registers MAC 1 and 2, use SK_REG() 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 SK_REG() 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))
+
+
+/* Queue Prefetch Unit Offsets, use Y2_QADDR() to address (Yukon-2 only)*/
+enum {
+       Y2_B8_PREF_REGS         = 0x0450,
+
+       PREF_UNIT_CTRL          = 0x00, /* 32 bit       Control register */
+       PREF_UNIT_LAST_IDX      = 0x04, /* 16 bit       Last Index */
+       PREF_UNIT_ADDR_LO       = 0x08, /* 32 bit       List start addr, low part */
+       PREF_UNIT_ADDR_HI       = 0x0c, /* 32 bit       List start addr, high part*/
+       PREF_UNIT_GET_IDX       = 0x10, /* 16 bit       Get Index */
+       PREF_UNIT_PUT_IDX       = 0x14, /* 16 bit       Put Index */
+       PREF_UNIT_FIFO_WP       = 0x20, /*  8 bit       FIFO write pointer */
+       PREF_UNIT_FIFO_RP       = 0x24, /*  8 bit       FIFO read pointer */
+       PREF_UNIT_FIFO_WM       = 0x28, /*  8 bit       FIFO watermark */
+       PREF_UNIT_FIFO_LEV      = 0x2c, /*  8 bit       FIFO level */
+
+       PREF_UNIT_MASK_IDX      = 0x0fff,
+};
+#define Y2_QADDR(q,reg)                (Y2_B8_PREF_REGS + (q) + (reg))
+
+/* 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 PHY Types */
+enum {
+       PHY_ADDR_MARV   = 0,
+};
+
+#define RB_ADDR(offs, queue) (B16_RAM_REGS + (queue) + (offs))
+
+
+enum {
+       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 GMAC FIFO (YUKON and Yukon-2) */
+
+       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_UP_THR   = 0x0c58,/*  8 bit      Rx Upper Pause Thr (Yukon-EC_U) */
+       RX_GMF_LP_THR   = 0x0c5a,/*  8 bit      Rx Lower Pause Thr (Yukon-EC_U) */
+       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 */
+};
+
+
+/*     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 */
+
+/* Rx BMU Control / Status Registers (Yukon-2) */
+enum {
+       BMU_IDLE        = 1<<31, /* BMU Idle State */
+       BMU_RX_TCP_PKT  = 1<<30, /* Rx TCP Packet (when RSS Hash enabled) */
+       BMU_RX_IP_PKT   = 1<<29, /* Rx IP  Packet (when RSS Hash enabled) */
+
+       BMU_ENA_RX_RSS_HASH = 1<<15, /* Enable  Rx RSS Hash */
+       BMU_DIS_RX_RSS_HASH = 1<<14, /* Disable Rx RSS Hash */
+       BMU_ENA_RX_CHKSUM = 1<<13, /* Enable  Rx TCP/IP Checksum Check */
+       BMU_DIS_RX_CHKSUM = 1<<12, /* Disable Rx TCP/IP Checksum Check */
+       BMU_CLR_IRQ_PAR = 1<<11, /* Clear IRQ on Parity errors (Rx) */
+       BMU_CLR_IRQ_TCP = 1<<11, /* Clear IRQ on TCP segment. error (Tx) */
+       BMU_CLR_IRQ_CHK = 1<<10, /* Clear IRQ Check */
+       BMU_STOP        = 1<<9, /* Stop  Rx/Tx Queue */
+       BMU_START       = 1<<8, /* Start Rx/Tx Queue */
+       BMU_FIFO_OP_ON  = 1<<7, /* FIFO Operational On */
+       BMU_FIFO_OP_OFF = 1<<6, /* FIFO Operational Off */
+       BMU_FIFO_ENA    = 1<<5, /* Enable FIFO */
+       BMU_FIFO_RST    = 1<<4, /* Reset  FIFO */
+       BMU_OP_ON       = 1<<3, /* BMU Operational On */
+       BMU_OP_OFF      = 1<<2, /* BMU Operational Off */
+       BMU_RST_CLR     = 1<<1, /* Clear BMU Reset (Enable) */
+       BMU_RST_SET     = 1<<0, /* Set   BMU Reset */
+
+       BMU_CLR_RESET   = BMU_FIFO_RST | BMU_OP_OFF | BMU_RST_CLR,
+       BMU_OPER_INIT   = BMU_CLR_IRQ_PAR | BMU_CLR_IRQ_CHK | BMU_START |
+                         BMU_FIFO_ENA | BMU_OP_ON,
+
+       BMU_WM_DEFAULT = 0x600,
+};
+
+/* Tx BMU Control / Status Registers (Yukon-2) */
+                                                               /* Bit 31: same as for Rx */
+enum {
+       BMU_TX_IPIDINCR_ON      = 1<<13, /* Enable  IP ID Increment */
+       BMU_TX_IPIDINCR_OFF     = 1<<12, /* Disable IP ID Increment */
+       BMU_TX_CLR_IRQ_TCP      = 1<<11, /* Clear IRQ on TCP segment length mismatch */
+};
+
+/* Queue Prefetch Unit Offsets, use Y2_QADDR() to address (Yukon-2 only)*/
+/* PREF_UNIT_CTRL      32 bit  Prefetch Control register */
+enum {
+       PREF_UNIT_OP_ON         = 1<<3, /* prefetch unit operational */
+       PREF_UNIT_OP_OFF        = 1<<2, /* prefetch unit not operational */
+       PREF_UNIT_RST_CLR       = 1<<1, /* Clear Prefetch Unit Reset */
+       PREF_UNIT_RST_SET       = 1<<0, /* Set   Prefetch Unit Reset */
+};
+
+/* 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 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 */
+enum {
+       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) */
+enum {
+       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 */
+};
+
+/* Polling Unit Registers (Yukon-2 only) */
+enum {
+       POLL_CTRL       = 0x0e20, /* 32 bit     Polling Unit Control Reg */
+       POLL_LAST_IDX   = 0x0e24,/* 16 bit      Polling Unit List Last Index */
+
+       POLL_LIST_ADDR_LO= 0x0e28,/* 32 bit     Poll. List Start Addr (low) */
+       POLL_LIST_ADDR_HI= 0x0e2c,/* 32 bit     Poll. List Start Addr (high) */
+};
+
+/* ASF Subsystem Registers (Yukon-2 only) */
+enum {
+       B28_Y2_SMB_CONFIG  = 0x0e40,/* 32 bit   ASF SMBus Config Register */
+       B28_Y2_SMB_CSD_REG = 0x0e44,/* 32 bit   ASF SMB Control/Status/Data */
+       B28_Y2_ASF_IRQ_V_BASE=0x0e60,/* 32 bit  ASF IRQ Vector Base */
+
+       B28_Y2_ASF_STAT_CMD= 0x0e68,/* 32 bit   ASF Status and Command Reg */
+       B28_Y2_ASF_HOST_COM= 0x0e6c,/* 32 bit   ASF Host Communication Reg */
+       B28_Y2_DATA_REG_1  = 0x0e70,/* 32 bit   ASF/Host Data Register 1 */
+       B28_Y2_DATA_REG_2  = 0x0e74,/* 32 bit   ASF/Host Data Register 2 */
+       B28_Y2_DATA_REG_3  = 0x0e78,/* 32 bit   ASF/Host Data Register 3 */
+       B28_Y2_DATA_REG_4  = 0x0e7c,/* 32 bit   ASF/Host Data Register 4 */
+};
+
+/* 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 */
+
+       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 */
+};
+
+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_GMAC_1     = 0x2800,/* GMAC 1 registers */
+       BASE_GMAC_2     = 0x3800,/* GMAC 2 registers */
+};
+
+/*
+ * 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 */
+};
+
+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 Marvell PHY Ids */
+enum {
+       PHY_MARV_ID0_VAL= 0x0141, /* Marvell Unique Identifier */
+
+       PHY_BCOM_ID1_A1 = 0x6041,
+       PHY_BCOM_ID1_B2 = 0x6043,
+       PHY_BCOM_ID1_C0 = 0x6044,
+       PHY_BCOM_ID1_C5 = 0x6047,
+
+       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) */
+};
+
+/* Advertisement register bits */
+enum {
+       PHY_AN_NXT_PG   = 1<<15, /* Bit 15:     Request Next Page */
+       PHY_AN_ACK      = 1<<14, /* Bit 14:     (ro) Acknowledge Received */
+       PHY_AN_RF       = 1<<13, /* Bit 13:     Remote Fault Bits */
+
+       PHY_AN_PAUSE_ASYM = 1<<11,/* Bit 11:    Try for asymmetric */
+       PHY_AN_PAUSE_CAP = 1<<10, /* Bit 10:    Try for pause */
+       PHY_AN_100BASE4 = 1<<9, /* Bit 9:       Try for 100mbps 4k packets */
+       PHY_AN_100FULL  = 1<<8, /* Bit 8:       Try for 100mbps full-duplex */
+       PHY_AN_100HALF  = 1<<7, /* Bit 7:       Try for 100mbps half-duplex */
+       PHY_AN_10FULL   = 1<<6, /* Bit 6:       Try for 10mbps full-duplex */
+       PHY_AN_10HALF   = 1<<5, /* Bit 5:       Try for 10mbps half-duplex */
+       PHY_AN_CSMA     = 1<<0, /* Bit 0:       Only selector supported */
+       PHY_AN_SEL      = 0x1f, /* Bit 4..0:    Selector Field, 00001=Ethernet*/
+       PHY_AN_FULL     = PHY_AN_100FULL | PHY_AN_10FULL | PHY_AN_CSMA,
+       PHY_AN_ALL      = PHY_AN_10HALF | PHY_AN_10FULL |
+                         PHY_AN_100HALF | PHY_AN_100FULL,
+};
+
+/*****  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 */
+};
+
+/** 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 */
+
+       PHY_M_DEF_MSK           = PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE
+                                | PHY_M_IS_FIFO_ERROR,
+       PHY_M_AN_MSK           = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL,
+};
+
+
+/*****  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 & PHY_M_EC_M_DSC_MSK)
+                                       /* 00=1x; 01=2x; 10=3x; 11=4x */
+#define PHY_M_EC_S_DSC(x)      ((x)<<8 & PHY_M_EC_S_DSC_MSK)
+                                       /* 00=dis; 01=1x; 10=2x; 11=3x */
+#define PHY_M_EC_DSC_2(x)      ((x)<<9 & PHY_M_EC_M_DSC_MSK2)
+                                       /* 000=1x; 001=2x; 010=3x; 011=4x */
+#define PHY_M_EC_MAC_S(x)      ((x)<<4 & PHY_M_EC_MAC_S_MSK)
+                                       /* 01X=0; 110=2.5; 111=25 (MHz) */
+
+/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
+enum {
+       PHY_M_PC_DIS_LINK_Pa    = 1<<15,/* Disable Link Pulses */
+       PHY_M_PC_DSC_MSK        = 7<<12,/* Bit 14..12:  Downshift Counter */
+       PHY_M_PC_DOWN_S_ENA     = 1<<11,/* Downshift Enable */
+};
+/* !!! Errata in spec. (1 = disable) */
+
+#define PHY_M_PC_DSC(x)                        (((x)<<12) & PHY_M_PC_DSC_MSK)
+                                                                                       /* 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)
+
+/*****  PHY_MARV_PHY_STAT (page 3)16 bit r/w   Polarity Control Reg. *****/
+enum {
+       PHY_M_POLC_LS1M_MSK     = 0xf<<12, /* Bit 15..12: LOS,STAT1 Mix % Mask */
+       PHY_M_POLC_IS0M_MSK     = 0xf<<8,  /* Bit 11.. 8: INIT,STAT0 Mix % Mask */
+       PHY_M_POLC_LOS_MSK      = 0x3<<6,  /* Bit  7.. 6: LOS Pol. Ctrl. Mask */
+       PHY_M_POLC_INIT_MSK     = 0x3<<4,  /* Bit  5.. 4: INIT Pol. Ctrl. Mask */
+       PHY_M_POLC_STA1_MSK     = 0x3<<2,  /* Bit  3.. 2: STAT1 Pol. Ctrl. Mask */
+       PHY_M_POLC_STA0_MSK     = 0x3,     /* Bit  1.. 0: STAT0 Pol. Ctrl. Mask */
+};
+
+#define PHY_M_POLC_LS1_P_MIX(x)        (((x)<<12) & PHY_M_POLC_LS1M_MSK)
+#define PHY_M_POLC_IS0_P_MIX(x)        (((x)<<8) & PHY_M_POLC_IS0M_MSK)
+#define PHY_M_POLC_LOS_CTRL(x) (((x)<<6) & PHY_M_POLC_LOS_MSK)
+#define PHY_M_POLC_INIT_CTRL(x)        (((x)<<4) & PHY_M_POLC_INIT_MSK)
+#define PHY_M_POLC_STA1_CTRL(x)        (((x)<<2) & PHY_M_POLC_STA1_MSK)
+#define PHY_M_POLC_STA0_CTRL(x)        (((x)<<0) & PHY_M_POLC_STA0_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) */
+
+       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] */
+};
+
+/* 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 */
+       GM_TXPA_BO_LIM_MSK      = 0x0f,         /* Bit  3.. 0: Backoff Limit Mask */
+
+       TX_JAM_LEN_DEF          = 0x03,
+       TX_JAM_IPG_DEF          = 0x0b,
+       TX_IPG_JAM_DEF          = 0x1c,
+       TX_BOF_LIM_DEF          = 0x04,
+};
+
+#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)
+#define TX_BACK_OFF_LIM(x)     ((x) & GM_TXPA_BO_LIM_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, /* VLAN Packet */
+       GMR_FS_JABBER   = 1<<12, /* Jabber Packet */
+       GMR_FS_UN_SIZE  = 1<<11, /* Undersize Packet */
+       GMR_FS_MC       = 1<<10, /* Multicast Packet */
+       GMR_FS_BC       = 1<<9,  /* Broadcast Packet */
+       GMR_FS_RX_OK    = 1<<8,  /* Receive OK (Good Packet) */
+       GMR_FS_GOOD_FC  = 1<<7,  /* Good Flow-Control Packet */
+       GMR_FS_BAD_FC   = 1<<6,  /* Bad  Flow-Control Packet */
+       GMR_FS_MII_ERR  = 1<<5,  /* MII Error */
+       GMR_FS_LONG_ERR = 1<<4,  /* Too Long Packet */
+       GMR_FS_FRAGMENT = 1<<3,  /* Fragment */
+
+       GMR_FS_CRC_ERR  = 1<<1,  /* CRC Error */
+       GMR_FS_RX_FF_OV = 1<<0,  /* Rx FIFO Overflow */
+
+       GMR_FS_ANY_ERR  = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR |
+                         GMR_FS_FRAGMENT | GMR_FS_LONG_ERR |
+                         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 {
+       RX_TRUNC_ON     = 1<<27,        /* enable  packet truncation */
+       RX_TRUNC_OFF    = 1<<26,        /* disable packet truncation */
+       RX_VLAN_STRIP_ON = 1<<25,       /* enable  VLAN stripping */
+       RX_VLAN_STRIP_OFF = 1<<24,      /* disable VLAN stripping */
+
+       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_C    = 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) */
+
+       GMF_RX_CTRL_DEF = GMF_OPER_ON | GMF_RX_F_FL_ON,
+};
+
+
+/*     TX_GMF_CTRL_T   32 bit  Tx GMAC FIFO Control/Test */
+enum {
+       TX_STFW_DIS     = 1<<31,/* Disable Store & Forward (Yukon-EC Ultra) */
+       TX_STFW_ENA     = 1<<30,/* Enable  Store & Forward (Yukon-EC Ultra) */
+
+       TX_VLAN_TAG_ON  = 1<<25,/* enable  VLAN tagging */
+       TX_VLAN_TAG_OFF = 1<<24,/* disable VLAN tagging */
+
+       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 */
+};
+
+/* B28_Y2_ASF_STAT_CMD         32 bit  ASF Status and Command Reg */
+enum {
+       Y2_ASF_OS_PRES  = 1<<4, /* ASF operation system present */
+       Y2_ASF_RESET    = 1<<3, /* ASF system in reset state */
+       Y2_ASF_RUNNING  = 1<<2, /* ASF system operational */
+       Y2_ASF_CLR_HSTI = 1<<1, /* Clear ASF IRQ */
+       Y2_ASF_IRQ      = 1<<0, /* Issue an IRQ to ASF system */
+
+       Y2_ASF_UC_STATE = 3<<2, /* ASF uC State */
+       Y2_ASF_CLK_HALT = 0,    /* ASF system clock stopped */
+};
+
+/* B28_Y2_ASF_HOST_COM 32 bit  ASF Host Communication Reg */
+enum {
+       Y2_ASF_CLR_ASFI = 1<<1, /* Clear host IRQ */
+       Y2_ASF_HOST_IRQ = 1<<0, /* Issue an IRQ to HOST system */
+};
+
+/*     STAT_CTRL               32 bit  Status BMU control register (Yukon-2 only) */
+enum {
+       SC_STAT_CLR_IRQ = 1<<4, /* Status Burst IRQ clear */
+       SC_STAT_OP_ON   = 1<<3, /* Operational Mode On */
+       SC_STAT_OP_OFF  = 1<<2, /* Operational Mode Off */
+       SC_STAT_RST_CLR = 1<<1, /* Clear Status Unit Reset (Enable) */
+       SC_STAT_RST_SET = 1<<0, /* Set   Status Unit Reset */
+};
+
+/*     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 */
+};
+
+/*     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_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))
+
+
+/* Control flags */
+enum {
+       UDPTCP  = 1<<0,
+       CALSUM  = 1<<1,
+       WR_SUM  = 1<<2,
+       INIT_SUM= 1<<3,
+       LOCK_SUM= 1<<4,
+       INS_VLAN= 1<<5,
+       FRC_STAT= 1<<6,
+       EOP     = 1<<7,
+};
+
+enum {
+       HW_OWNER        = 1<<7,
+       OP_TCPWRITE     = 0x11,
+       OP_TCPSTART     = 0x12,
+       OP_TCPINIT      = 0x14,
+       OP_TCPLCK       = 0x18,
+       OP_TCPCHKSUM    = OP_TCPSTART,
+       OP_TCPIS        = OP_TCPINIT | OP_TCPSTART,
+       OP_TCPLW        = OP_TCPLCK | OP_TCPWRITE,
+       OP_TCPLSW       = OP_TCPLCK | OP_TCPSTART | OP_TCPWRITE,
+       OP_TCPLISW      = OP_TCPLCK | OP_TCPINIT | OP_TCPSTART | OP_TCPWRITE,
+
+       OP_ADDR64       = 0x21,
+       OP_VLAN         = 0x22,
+       OP_ADDR64VLAN   = OP_ADDR64 | OP_VLAN,
+       OP_LRGLEN       = 0x24,
+       OP_LRGLENVLAN   = OP_LRGLEN | OP_VLAN,
+       OP_BUFFER       = 0x40,
+       OP_PACKET       = 0x41,
+       OP_LARGESEND    = 0x43,
+
+/* YUKON-2 STATUS opcodes defines */
+       OP_RXSTAT       = 0x60,
+       OP_RXTIMESTAMP  = 0x61,
+       OP_RXVLAN       = 0x62,
+       OP_RXCHKS       = 0x64,
+       OP_RXCHKSVLAN   = OP_RXCHKS | OP_RXVLAN,
+       OP_RXTIMEVLAN   = OP_RXTIMESTAMP | OP_RXVLAN,
+       OP_RSS_HASH     = 0x65,
+       OP_TXINDEXLE    = 0x68,
+};
+
+/* Yukon 2 hardware interface
+ * Not tested on big endian
+ */
+struct sky2_tx_le {
+       union {
+               __le32  addr;
+               struct {
+                       __le16  offset;
+                       __le16  start;
+               } csum  __attribute((packed));
+               struct {
+                       __le16  size;
+                       __le16  rsvd;
+               } tso  __attribute((packed));
+       } tx;
+       __le16  length; /* also vlan tag or checksum start */
+       u8      ctrl;
+       u8      opcode;
+} __attribute((packed));
+
+struct sky2_rx_le {
+       __le32  addr;
+       __le16  length;
+       u8      ctrl;
+       u8      opcode;
+} __attribute((packed));;
+
+struct sky2_status_le {
+       __le32  status; /* also checksum */
+       __le16  length; /* also vlan tag */
+       u8      link;
+       u8      opcode;
+} __attribute((packed));
+
+struct tx_ring_info {
+       struct sk_buff  *skb;
+       DECLARE_PCI_UNMAP_ADDR(mapaddr);
+       u16             idx;
+};
+
+struct ring_info {
+       struct sk_buff  *skb;
+       dma_addr_t      mapaddr;
+};
+
+struct sky2_port {
+       struct sky2_hw       *hw;
+       struct net_device    *netdev;
+       unsigned             port;
+       u32                  msg_enable;
+
+       spinlock_t           tx_lock  ____cacheline_aligned_in_smp;
+       struct tx_ring_info  *tx_ring;
+       struct sky2_tx_le    *tx_le;
+       u16                  tx_cons;           /* next le to check */
+       u16                  tx_prod;           /* next le to use */
+       u32                  tx_addr64;
+       u16                  tx_pending;
+       u16                  tx_last_put;
+       u16                  tx_last_mss;
+
+       struct ring_info     *rx_ring ____cacheline_aligned_in_smp;
+       struct sky2_rx_le    *rx_le;
+       u32                  rx_addr64;
+       u16                  rx_next;           /* next re to check */
+       u16                  rx_put;            /* next le index to use */
+       u16                  rx_pending;
+       u16                  rx_last_put;
+       u16                  rx_bufsize;
+#ifdef SKY2_VLAN_TAG_USED
+       u16                  rx_tag;
+       struct vlan_group    *vlgrp;
+#endif
+
+       dma_addr_t           rx_le_map;
+       dma_addr_t           tx_le_map;
+       u32                  advertising;       /* ADVERTISED_ bits */
+       u16                  speed;     /* SPEED_1000, SPEED_100, ... */
+       u8                   autoneg;   /* AUTONEG_ENABLE, AUTONEG_DISABLE */
+       u8                   duplex;    /* DUPLEX_HALF, DUPLEX_FULL */
+       u8                   rx_pause;
+       u8                   tx_pause;
+       u8                   rx_csum;
+       u8                   wol;
+
+       struct net_device_stats net_stats;
+
+       struct work_struct   phy_task;
+       struct semaphore     phy_sema;
+};
+
+struct sky2_hw {
+       void __iomem         *regs;
+       struct pci_dev       *pdev;
+       u32                  intr_mask;
+       struct net_device    *dev[2];
+
+       int                  pm_cap;
+       u8                   chip_id;
+       u8                   chip_rev;
+       u8                   copper;
+       u8                   ports;
+
+       struct sky2_status_le *st_le;
+       u32                  st_idx;
+       dma_addr_t           st_dma;
+};
+
+/* Register accessor for memory mapped device */
+static inline u32 sky2_read32(const struct sky2_hw *hw, unsigned reg)
+{
+       return readl(hw->regs + reg);
+}
+
+static inline u16 sky2_read16(const struct sky2_hw *hw, unsigned reg)
+{
+       return readw(hw->regs + reg);
+}
+
+static inline u8 sky2_read8(const struct sky2_hw *hw, unsigned reg)
+{
+       return readb(hw->regs + reg);
+}
+
+/* This should probably go away, bus based tweeks suck */
+static inline int is_pciex(const struct sky2_hw *hw)
+{
+       u32 status;
+       pci_read_config_dword(hw->pdev, PCI_DEV_STATUS, &status);
+       return (status & PCI_OS_PCI_X) == 0;
+}
+
+static inline void sky2_write32(const struct sky2_hw *hw, unsigned reg, u32 val)
+{
+       writel(val, hw->regs + reg);
+}
+
+static inline void sky2_write16(const struct sky2_hw *hw, unsigned reg, u16 val)
+{
+       writew(val, hw->regs + reg);
+}
+
+static inline void sky2_write8(const struct sky2_hw *hw, unsigned reg, u8 val)
+{
+       writeb(val, hw->regs + reg);
+}
+
+/* Yukon PHY related registers */
+#define SK_GMAC_REG(port,reg) \
+       (BASE_GMAC_1 + (port) * (BASE_GMAC_2-BASE_GMAC_1) + (reg))
+#define GM_PHY_RETRIES 100
+
+static inline u16 gma_read16(const struct sky2_hw *hw, unsigned port, unsigned reg)
+{
+       return sky2_read16(hw, SK_GMAC_REG(port,reg));
+}
+
+static inline u32 gma_read32(struct sky2_hw *hw, unsigned port, unsigned reg)
+{
+       unsigned base = SK_GMAC_REG(port, reg);
+       return (u32) sky2_read16(hw, base)
+               | (u32) sky2_read16(hw, base+4) << 16;
+}
+
+static inline void gma_write16(const struct sky2_hw *hw, unsigned port, int r, u16 v)
+{
+       sky2_write16(hw, SK_GMAC_REG(port,r), v);
+}
+
+static inline void gma_set_addr(struct sky2_hw *hw, unsigned port, unsigned reg,
+                                   const u8 *addr)
+{
+       gma_write16(hw, port, reg,  (u16) addr[0] | ((u16) addr[1] << 8));
+       gma_write16(hw, port, reg+4,(u16) addr[2] | ((u16) addr[3] << 8));
+       gma_write16(hw, port, reg+8,(u16) addr[4] | ((u16) addr[5] << 8));
+}
+#endif
index 081717d01374349ce68386496f0eb079c064be18..28ce47a02408e9946c2e3941c491b5313ca56db2 100644 (file)
@@ -2907,7 +2907,7 @@ static int __devinit gem_get_device_address(struct gem *gp)
        return 0;
 }
 
-static void __devexit gem_remove_one(struct pci_dev *pdev)
+static void gem_remove_one(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
 
@@ -3181,7 +3181,7 @@ static struct pci_driver gem_driver = {
        .name           = GEM_MODULE_NAME,
        .id_table       = gem_pci_tbl,
        .probe          = gem_init_one,
-       .remove         = __devexit_p(gem_remove_one),
+       .remove         = gem_remove_one,
 #ifdef CONFIG_PM
        .suspend        = gem_suspend,
        .resume         = gem_resume,
index 1828a6bf845829267475b6e8e0bacee6f735dbd4..eb86b059809b6ac4242bbf91d16d258e7e9a7ab5 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/compiler.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/in.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/pci.h>
@@ -68,8 +69,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.43"
-#define DRV_MODULE_RELDATE     "Oct 24, 2005"
+#define DRV_MODULE_VERSION     "3.47"
+#define DRV_MODULE_RELDATE     "Dec 28, 2005"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
@@ -341,6 +342,16 @@ static struct {
        { "interrupt test (offline)" },
 };
 
+static void tg3_write32(struct tg3 *tp, u32 off, u32 val)
+{
+       writel(val, tp->regs + off);
+}
+
+static u32 tg3_read32(struct tg3 *tp, u32 off)
+{
+       return (readl(tp->regs + off)); 
+}
+
 static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
 {
        unsigned long flags;
@@ -411,13 +422,29 @@ static u32 tg3_read_indirect_mbox(struct tg3 *tp, u32 off)
        return val;
 }
 
-static void _tw32_flush(struct tg3 *tp, u32 off, u32 val)
+/* usec_wait specifies the wait time in usec when writing to certain registers
+ * where it is unsafe to read back the register without some delay.
+ * GRC_LOCAL_CTRL is one example if the GPIOs are toggled to switch power.
+ * TG3PCI_CLOCK_CTRL is another example if the clock frequencies are changed.
+ */
+static void _tw32_flush(struct tg3 *tp, u32 off, u32 val, u32 usec_wait)
 {
-       tp->write32(tp, off, val);
-       if (!(tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) &&
-           !(tp->tg3_flags & TG3_FLAG_5701_REG_WRITE_BUG) &&
-           !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
-               tp->read32(tp, off);    /* flush */
+       if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) ||
+           (tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
+               /* Non-posted methods */
+               tp->write32(tp, off, val);
+       else {
+               /* Posted method */
+               tg3_write32(tp, off, val);
+               if (usec_wait)
+                       udelay(usec_wait);
+               tp->read32(tp, off);
+       }
+       /* Wait again after the read for the posted method to guarantee that
+        * the wait time is met.
+        */
+       if (usec_wait)
+               udelay(usec_wait);
 }
 
 static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val)
@@ -438,16 +465,6 @@ static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val)
                readl(mbox);
 }
 
-static void tg3_write32(struct tg3 *tp, u32 off, u32 val)
-{
-       writel(val, tp->regs + off);
-}
-
-static u32 tg3_read32(struct tg3 *tp, u32 off)
-{
-       return (readl(tp->regs + off)); 
-}
-
 #define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val)
 #define tw32_mailbox_f(reg, val)       tw32_mailbox_flush(tp, (reg), (val))
 #define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val)
@@ -455,7 +472,8 @@ static u32 tg3_read32(struct tg3 *tp, u32 off)
 #define tr32_mailbox(reg)      tp->read32_mbox(tp, reg)
 
 #define tw32(reg,val)          tp->write32(tp, reg, val)
-#define tw32_f(reg,val)                _tw32_flush(tp,(reg),(val))
+#define tw32_f(reg,val)                _tw32_flush(tp,(reg),(val), 0)
+#define tw32_wait_f(reg,val,us)        _tw32_flush(tp,(reg),(val), (us))
 #define tr32(reg)              tp->read32(tp, reg)
 
 static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
@@ -595,21 +613,19 @@ static void tg3_switch_clocks(struct tg3 *tp)
 
        if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
                if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) {
-                       tw32_f(TG3PCI_CLOCK_CTRL,
-                              clock_ctrl | CLOCK_CTRL_625_CORE);
-                       udelay(40);
+                       tw32_wait_f(TG3PCI_CLOCK_CTRL,
+                                   clock_ctrl | CLOCK_CTRL_625_CORE, 40);
                }
        } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) {
-               tw32_f(TG3PCI_CLOCK_CTRL,
-                    clock_ctrl |
-                    (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK));
-               udelay(40);
-               tw32_f(TG3PCI_CLOCK_CTRL,
-                    clock_ctrl | (CLOCK_CTRL_ALTCLK));
-               udelay(40);
+               tw32_wait_f(TG3PCI_CLOCK_CTRL,
+                           clock_ctrl |
+                           (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK),
+                           40);
+               tw32_wait_f(TG3PCI_CLOCK_CTRL,
+                           clock_ctrl | (CLOCK_CTRL_ALTCLK),
+                           40);
        }
-       tw32_f(TG3PCI_CLOCK_CTRL, clock_ctrl);
-       udelay(40);
+       tw32_wait_f(TG3PCI_CLOCK_CTRL, clock_ctrl, 40);
 }
 
 #define PHY_BUSY_LOOPS 5000
@@ -1017,37 +1033,50 @@ static void tg3_frob_aux_power(struct tg3 *tp)
        if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0)
                return;
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
-               tp_peer = pci_get_drvdata(tp->pdev_peer);
-               if (!tp_peer)
+       if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
+           (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) {
+               struct net_device *dev_peer;
+
+               dev_peer = pci_get_drvdata(tp->pdev_peer);
+               if (!dev_peer)
                        BUG();
+               tp_peer = netdev_priv(dev_peer);
        }
 
-
        if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
-           (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0) {
+           (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 ||
+           (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
+           (tp_peer->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
                    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                            (GRC_LCLCTRL_GPIO_OE0 |
-                             GRC_LCLCTRL_GPIO_OE1 |
-                             GRC_LCLCTRL_GPIO_OE2 |
-                             GRC_LCLCTRL_GPIO_OUTPUT0 |
-                             GRC_LCLCTRL_GPIO_OUTPUT1));
-                       udelay(100);
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                   (GRC_LCLCTRL_GPIO_OE0 |
+                                    GRC_LCLCTRL_GPIO_OE1 |
+                                    GRC_LCLCTRL_GPIO_OE2 |
+                                    GRC_LCLCTRL_GPIO_OUTPUT0 |
+                                    GRC_LCLCTRL_GPIO_OUTPUT1),
+                                   100);
                } else {
                        u32 no_gpio2;
-                       u32 grc_local_ctrl;
+                       u32 grc_local_ctrl = 0;
 
                        if (tp_peer != tp &&
                            (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
                                return;
 
+                       /* Workaround to prevent overdrawing Amps. */
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
+                           ASIC_REV_5714) {
+                               grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
+                               tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                           grc_local_ctrl, 100);
+                       }
+
                        /* On 5753 and variants, GPIO2 cannot be used. */
                        no_gpio2 = tp->nic_sram_data_cfg &
                                    NIC_SRAM_DATA_CFG_NO_GPIO2;
 
-                       grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 |
+                       grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 |
                                         GRC_LCLCTRL_GPIO_OE1 |
                                         GRC_LCLCTRL_GPIO_OE2 |
                                         GRC_LCLCTRL_GPIO_OUTPUT1 |
@@ -1056,21 +1085,18 @@ static void tg3_frob_aux_power(struct tg3 *tp)
                                grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 |
                                                    GRC_LCLCTRL_GPIO_OUTPUT2);
                        }
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                                               grc_local_ctrl);
-                       udelay(100);
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                                   grc_local_ctrl, 100);
 
                        grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0;
 
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                                               grc_local_ctrl);
-                       udelay(100);
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                                   grc_local_ctrl, 100);
 
                        if (!no_gpio2) {
                                grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2;
-                               tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                                      grc_local_ctrl);
-                               udelay(100);
+                               tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                           grc_local_ctrl, 100);
                        }
                }
        } else {
@@ -1080,19 +1106,16 @@ static void tg3_frob_aux_power(struct tg3 *tp)
                            (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
                                return;
 
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                            (GRC_LCLCTRL_GPIO_OE1 |
-                             GRC_LCLCTRL_GPIO_OUTPUT1));
-                       udelay(100);
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                   (GRC_LCLCTRL_GPIO_OE1 |
+                                    GRC_LCLCTRL_GPIO_OUTPUT1), 100);
 
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                            (GRC_LCLCTRL_GPIO_OE1));
-                       udelay(100);
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                   GRC_LCLCTRL_GPIO_OE1, 100);
 
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                            (GRC_LCLCTRL_GPIO_OE1 |
-                             GRC_LCLCTRL_GPIO_OUTPUT1));
-                       udelay(100);
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
+                                   (GRC_LCLCTRL_GPIO_OE1 |
+                                    GRC_LCLCTRL_GPIO_OUTPUT1), 100);
                }
        }
 }
@@ -1105,6 +1128,8 @@ static int tg3_setup_phy(struct tg3 *, int);
 
 static void tg3_write_sig_post_reset(struct tg3 *, int);
 static int tg3_halt_cpu(struct tg3 *, u32);
+static int tg3_nvram_lock(struct tg3 *);
+static void tg3_nvram_unlock(struct tg3 *);
 
 static int tg3_set_power_state(struct tg3 *tp, int state)
 {
@@ -1133,10 +1158,8 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
                udelay(100);    /* Delay after power state change */
 
                /* Switch out of Vaux if it is not a LOM */
-               if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT)) {
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
-                       udelay(100);
-               }
+               if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT))
+                       tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, 100);
 
                return 0;
 
@@ -1179,6 +1202,21 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
                tg3_setup_phy(tp, 0);
        }
 
+       if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
+               int i;
+               u32 val;
+
+               for (i = 0; i < 200; i++) {
+                       tg3_read_mem(tp, NIC_SRAM_FW_ASF_STATUS_MBOX, &val);
+                       if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
+                               break;
+                       msleep(1);
+               }
+       }
+       tg3_write_mem(tp, NIC_SRAM_WOL_MBOX, WOL_SIGNATURE |
+                                            WOL_DRV_STATE_SHUTDOWN |
+                                            WOL_DRV_WOL | WOL_SET_MAGIC_PKT);
+
        pci_read_config_word(tp->pdev, pm + PCI_PM_PMC, &power_caps);
 
        if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) {
@@ -1220,10 +1258,8 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
                base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
                             CLOCK_CTRL_TXCLK_DISABLE);
 
-               tw32_f(TG3PCI_CLOCK_CTRL, base_val |
-                    CLOCK_CTRL_ALTCLK |
-                    CLOCK_CTRL_PWRDOWN_PLL133);
-               udelay(40);
+               tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK |
+                           CLOCK_CTRL_PWRDOWN_PLL133, 40);
        } else if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
                /* do nothing */
        } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
@@ -1244,11 +1280,11 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
                        newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
                }
 
-               tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1);
-               udelay(40);
+               tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1,
+                           40);
 
-               tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2);
-               udelay(40);
+               tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2,
+                           40);
 
                if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
                        u32 newbits3;
@@ -1262,9 +1298,20 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
                                newbits3 = CLOCK_CTRL_44MHZ_CORE;
                        }
 
-                       tw32_f(TG3PCI_CLOCK_CTRL,
-                                        tp->pci_clock_ctrl | newbits3);
-                       udelay(40);
+                       tw32_wait_f(TG3PCI_CLOCK_CTRL,
+                                   tp->pci_clock_ctrl | newbits3, 40);
+               }
+       }
+
+       if (!(tp->tg3_flags & TG3_FLAG_WOL_ENABLE) &&
+           !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
+               /* Turn off the PHY */
+               if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
+                       tg3_writephy(tp, MII_TG3_EXT_CTRL,
+                                    MII_TG3_EXT_CTRL_FORCE_LED_OFF);
+                       tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700)
+                               tg3_writephy(tp, MII_BMCR, BMCR_PDOWN);
                }
        }
 
@@ -1277,8 +1324,12 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
 
                val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1);
                tw32(0x7d00, val);
-               if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
+               if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
+                       tg3_nvram_lock(tp);
                        tg3_halt_cpu(tp, RX_CPU_BASE);
+                       tw32_f(NVRAM_SWARB, SWARB_REQ_CLR0);
+                       tg3_nvram_unlock(tp);
+               }
        }
 
        /* Finally, set the new power state. */
@@ -1812,7 +1863,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
                }
        }
 relink:
-       if (current_link_up == 0) {
+       if (current_link_up == 0 || tp->link_config.phy_is_low_power) {
                u32 tmp;
 
                tg3_phy_copper_begin(tp);
@@ -3565,12 +3616,15 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
        if (!spin_trylock(&tp->tx_lock))
                return NETDEV_TX_LOCKED; 
 
-       /* This is a hard error, log it. */
        if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
-               netif_stop_queue(dev);
+               if (!netif_queue_stopped(dev)) {
+                       netif_stop_queue(dev);
+
+                       /* This is a hard error, log it. */
+                       printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
+                              "queue awake!\n", dev->name);
+               }
                spin_unlock(&tp->tx_lock);
-               printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
-                      dev->name);
                return NETDEV_TX_BUSY;
        }
 
@@ -3597,7 +3651,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                               TXD_FLAG_CPU_POST_DMA);
 
                skb->nh.iph->check = 0;
-               skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
+               skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
                if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
                        skb->h.th->check = 0;
                        base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
@@ -7098,8 +7152,13 @@ do {     p = (u32 *)(orig_p + (reg));            \
        GET_REG32_LOOP(BUFMGR_MODE, 0x58);
        GET_REG32_LOOP(RDMAC_MODE, 0x08);
        GET_REG32_LOOP(WDMAC_MODE, 0x08);
-       GET_REG32_LOOP(RX_CPU_BASE, 0x280);
-       GET_REG32_LOOP(TX_CPU_BASE, 0x280);
+       GET_REG32_1(RX_CPU_MODE);
+       GET_REG32_1(RX_CPU_STATE);
+       GET_REG32_1(RX_CPU_PGMCTR);
+       GET_REG32_1(RX_CPU_HWBKPT);
+       GET_REG32_1(TX_CPU_MODE);
+       GET_REG32_1(TX_CPU_STATE);
+       GET_REG32_1(TX_CPU_PGMCTR);
        GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110);
        GET_REG32_LOOP(FTQ_RESET, 0x120);
        GET_REG32_LOOP(MSGINT_MODE, 0x0c);
@@ -7922,13 +7981,12 @@ static int tg3_test_memory(struct tg3 *tp)
                u32 offset;
                u32 len;
        } mem_tbl_570x[] = {
-               { 0x00000000, 0x01000},
+               { 0x00000000, 0x00b50},
                { 0x00002000, 0x1c000},
                { 0xffffffff, 0x00000}
        }, mem_tbl_5705[] = {
                { 0x00000100, 0x0000c},
                { 0x00000200, 0x00008},
-               { 0x00000b50, 0x00400},
                { 0x00004000, 0x00800},
                { 0x00006000, 0x01000},
                { 0x00008000, 0x02000},
@@ -8530,6 +8588,7 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
                tp->tg3_flags |= TG3_FLAG_NVRAM;
 
+               tg3_nvram_lock(tp);
                tg3_enable_nvram_access(tp);
 
                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
@@ -8540,6 +8599,7 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
                tg3_get_nvram_size(tp);
 
                tg3_disable_nvram_access(tp);
+               tg3_nvram_unlock(tp);
 
        } else {
                tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
@@ -8637,10 +8697,10 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
        if (ret == 0)
                *val = swab32(tr32(NVRAM_RDDATA));
 
-       tg3_nvram_unlock(tp);
-
        tg3_disable_nvram_access(tp);
 
+       tg3_nvram_unlock(tp);
+
        return ret;
 }
 
@@ -8725,6 +8785,10 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
 
                offset = offset + (pagesize - page_off);
 
+               /* Nvram lock released by tg3_nvram_read() above,
+                * so need to get it again.
+                */
+               tg3_nvram_lock(tp);
                tg3_enable_nvram_access(tp);
 
                /*
@@ -10423,7 +10487,7 @@ static char * __devinit tg3_bus_string(struct tg3 *tp, char *str)
        return str;
 }
 
-static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp)
+static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp)
 {
        struct pci_dev *peer;
        unsigned int func, devnr = tp->pdev->devfn & ~7;
@@ -10434,8 +10498,13 @@ static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp)
                        break;
                pci_dev_put(peer);
        }
-       if (!peer || peer == tp->pdev)
-               BUG();
+       /* 5704 can be configured in single-port mode, set peer to
+        * tp->pdev in that case.
+        */
+       if (!peer) {
+               peer = tp->pdev;
+               return peer;
+       }
 
        /*
         * We don't need to keep the refcount elevated; there's no way
@@ -10671,8 +10740,9 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                tp->rx_pending = 63;
        }
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
-               tp->pdev_peer = tg3_find_5704_peer(tp);
+       if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
+           (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714))
+               tp->pdev_peer = tg3_find_peer(tp);
 
        err = tg3_get_device_address(tp);
        if (err) {
@@ -10817,12 +10887,14 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
 
        tg3_full_lock(tp, 0);
        tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+       tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
        tg3_full_unlock(tp);
 
        err = tg3_set_power_state(tp, pci_choose_state(pdev, state));
        if (err) {
                tg3_full_lock(tp, 0);
 
+               tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
                tg3_init_hw(tp);
 
                tp->timer.expires = jiffies + tp->timer_offset;
@@ -10856,6 +10928,7 @@ static int tg3_resume(struct pci_dev *pdev)
 
        tg3_full_lock(tp, 0);
 
+       tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
        tg3_init_hw(tp);
 
        tp->timer.expires = jiffies + tp->timer_offset;
index fb7e2a5f4a088baa0c683f36dfeca1aaf7ff8517..890e1635996b56294fdaca69a9bb37e78ea7ce94 100644 (file)
 /* 0x280 --> 0x400 unused */
 
 #define RX_CPU_BASE                    0x00005000
+#define RX_CPU_MODE                    0x00005000
+#define RX_CPU_STATE                   0x00005004
+#define RX_CPU_PGMCTR                  0x0000501c
+#define RX_CPU_HWBKPT                  0x00005034
 #define TX_CPU_BASE                    0x00005400
+#define TX_CPU_MODE                    0x00005400
+#define TX_CPU_STATE                   0x00005404
+#define TX_CPU_PGMCTR                  0x0000541c
 
 /* Mailboxes */
 #define GRCMBOX_INTERRUPT_0            0x00005800 /* 64-bit */
 #define NIC_SRAM_MAC_ADDR_HIGH_MBOX    0x00000c14
 #define NIC_SRAM_MAC_ADDR_LOW_MBOX     0x00000c18
 
+#define NIC_SRAM_WOL_MBOX              0x00000d30
+#define  WOL_SIGNATURE                  0x474c0000
+#define  WOL_DRV_STATE_SHUTDOWN                 0x00000001
+#define  WOL_DRV_WOL                    0x00000002
+#define  WOL_SET_MAGIC_PKT              0x00000004
+
 #define NIC_SRAM_DATA_CFG_2            0x00000d38
 
 #define  SHASTA_EXT_LED_MODE_MASK       0x00018000
 #define MII_TG3_EXT_CTRL               0x10 /* Extended control register */
 #define  MII_TG3_EXT_CTRL_FIFO_ELASTIC 0x0001
 #define  MII_TG3_EXT_CTRL_LNK3_LED_MODE        0x0002
+#define  MII_TG3_EXT_CTRL_FORCE_LED_OFF        0x0008
 #define  MII_TG3_EXT_CTRL_TBI          0x8000
 
 #define MII_TG3_EXT_STAT               0x11 /* Extended status register */
index 942fae0f2130227794dfcd17d7ccfdeaee63d655..c2506b56a18691f0eb4f4bfa9830fc8f877657a6 100644 (file)
@@ -2865,11 +2865,11 @@ void TLan_PhyMonitor( struct net_device *dev )
         *                              for this device.
         *              phy             The address of the PHY to be queried.
         *              reg             The register whose contents are to be
-        *                              retreived.
+        *                              retrieved.
         *              val             A pointer to a variable to store the
         *                              retrieved value.
         *
-        *      This function uses the TLAN's MII bus to retreive the contents
+        *      This function uses the TLAN's MII bus to retrieve the contents
         *      of a given register on a PHY.  It sends the appropriate info
         *      and then reads the 16-bit register value from the MII bus via
         *      the TLAN SIO register.
diff --git a/drivers/net/wan/lmc/lmc_prot.h b/drivers/net/wan/lmc/lmc_prot.h
deleted file mode 100644 (file)
index f3b1df9..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _LMC_PROTO_H_
-#define _LMC_PROTO_H_
-
-void lmc_proto_init(lmc_softc_t * const)
-void lmc_proto_attach(lmc_softc_t *sc const)
-void lmc_proto_detach(lmc_softc *sc const)
-void lmc_proto_reopen(lmc_softc_t *sc const)
-int lmc_proto_ioctl(lmc_softc_t *sc const, struct ifreq *ifr, int cmd)
-void lmc_proto_open(lmc_softc_t *sc const)
-void lmc_proto_close(lmc_softc_t *sc const)
-unsigned short lmc_proto_type(lmc_softc_t *sc const, struct skbuff *skb)
-
-
-#endif
-
index 00e55165b760506fe7e1f21c3aaf4197e3e3a3b8..24f7967aab67218f8f68fd1cdeae19a47183b3e1 100644 (file)
@@ -173,7 +173,7 @@ config IPW2100_MONITOR
          promiscuous mode via the Wireless Tool's Monitor mode.  While in this
          mode, no packets can be sent.
 
-config IPW_DEBUG
+config IPW2100_DEBUG
        bool "Enable full debugging output in IPW2100 module."
        depends on IPW2100
        ---help---
@@ -192,7 +192,7 @@ config IPW_DEBUG
 
 config IPW2200
        tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection"
-       depends on IEEE80211 && PCI
+       depends on NET_RADIO && IEEE80211 && PCI
        select FW_LOADER
        ---help---
           A driver for the Intel PRO/Wireless 2200BG and 2915ABG Network
@@ -217,7 +217,7 @@ config IPW2200
           say M here and read <file:Documentation/modules.txt>.  The module
           will be called ipw2200.ko.
 
-config IPW_DEBUG
+config IPW2200_DEBUG
        bool "Enable full debugging output in IPW2200 module."
        depends on IPW2200
        ---help---
index 340ab4ee4b67a1157a699f6f7b25778014af1116..ee866fd6957de2cf9ed0f3b75a9ca37971c4534b 100644 (file)
@@ -2755,8 +2755,8 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
        SET_NETDEV_DEV(dev, dmdev);
 
 
-       if (test_bit(FLAG_MPI,&ai->flags))
-               reset_card (dev, 1);
+       reset_card (dev, 1);
+       msleep(400);
 
        rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev );
        if (rc) {
@@ -4037,7 +4037,7 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid,
                Cmd cmd;
                Resp rsp;
 
-               if (test_bit(FLAG_ENABLED, &ai->flags))
+               if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid))
                        printk(KERN_ERR
                                "%s: MAC should be disabled (rid=%04x)\n",
                                __FUNCTION__, rid);
@@ -5093,9 +5093,9 @@ static int set_wep_key(struct airo_info *ai, u16 index,
                printk(KERN_INFO "Setting key %d\n", index);
        }
 
-       disable_MAC(ai, lock);
+       if (perm) disable_MAC(ai, lock);
        writeWepKeyRid(ai, &wkr, perm, lock);
-       enable_MAC(ai, &rsp, lock);
+       if (perm) enable_MAC(ai, &rsp, lock);
        return 0;
 }
 
@@ -6170,6 +6170,8 @@ static int airo_set_encode(struct net_device *dev,
 {
        struct airo_info *local = dev->priv;
        CapabilityRid cap_rid;          /* Card capability info */
+       int perm = ( dwrq->flags & IW_ENCODE_TEMP ? 0 : 1 );
+       u16 currentAuthType = local->config.authType;
 
        /* Is WEP supported ? */
        readCapabilityRid(local, &cap_rid, 1);
@@ -6212,7 +6214,7 @@ static int airo_set_encode(struct net_device *dev,
                        /* Copy the key in the driver */
                        memcpy(key.key, extra, dwrq->length);
                        /* Send the key to the card */
-                       set_wep_key(local, index, key.key, key.len, 1, 1);
+                       set_wep_key(local, index, key.key, key.len, perm, 1);
                }
                /* WE specify that if a valid key is set, encryption
                 * should be enabled (user may turn it off later)
@@ -6220,13 +6222,12 @@ static int airo_set_encode(struct net_device *dev,
                if((index == current_index) && (key.len > 0) &&
                   (local->config.authType == AUTH_OPEN)) {
                        local->config.authType = AUTH_ENCRYPT;
-                       set_bit (FLAG_COMMIT, &local->flags);
                }
        } else {
                /* Do we want to just set the transmit key index ? */
                int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
                if ((index >= 0) && (index < ((cap_rid.softCap & 0x80)?4:1))) {
-                       set_wep_key(local, index, NULL, 0, 1, 1);
+                       set_wep_key(local, index, NULL, 0, perm, 1);
                } else
                        /* Don't complain if only change the mode */
                        if(!dwrq->flags & IW_ENCODE_MODE) {
@@ -6241,7 +6242,7 @@ static int airo_set_encode(struct net_device *dev,
        if(dwrq->flags & IW_ENCODE_OPEN)
                local->config.authType = AUTH_ENCRYPT;  // Only Wep
        /* Commit the changes to flags if needed */
-       if(dwrq->flags & IW_ENCODE_MODE)
+       if (local->config.authType != currentAuthType)
                set_bit (FLAG_COMMIT, &local->flags);
        return -EINPROGRESS;            /* Call commit handler */
 }
index 5e53c5258a33e82933f92e2fe8e04a6698eb2465..e4729ddf29fd652b023601d1f523affd6aa88e53 100644 (file)
@@ -5,9 +5,9 @@
         Copyright 2000-2001 ATMEL Corporation.
         Copyright 2003-2004 Simon Kelley.
 
-    This code was developed from version 2.1.1 of the Atmel drivers, 
-    released by Atmel corp. under the GPL in December 2002. It also 
-    includes code from the Linux aironet drivers (C) Benjamin Reed, 
+    This code was developed from version 2.1.1 of the Atmel drivers,
+    released by Atmel corp. under the GPL in December 2002. It also
+    includes code from the Linux aironet drivers (C) Benjamin Reed,
     and the Linux PCMCIA package, (C) David Hinds and the Linux wireless
     extensions, (C) Jean Tourrilhes.
 
@@ -31,7 +31,7 @@
     along with Atmel wireless lan drivers; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-    For all queries about this code, please contact the current author, 
+    For all queries about this code, please contact the current author,
     Simon Kelley <simon@thekelleys.org.uk> and not Atmel Corporation.
 
     Credit is due to HP UK and Cambridge Online Systems Ltd for supplying
@@ -79,13 +79,13 @@ MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards.")
 MODULE_LICENSE("GPL");
 MODULE_SUPPORTED_DEVICE("Atmel at76c50x wireless cards");
 
-/* The name of the firmware file to be loaded 
+/* The name of the firmware file to be loaded
    over-rides any automatic selection */
 static char *firmware = NULL;
 module_param(firmware, charp, 0);
 
 /* table of firmware file names */
-static struct { 
+static struct {
        AtmelFWType fw_type;
        const char *fw_file;
        const char *fw_file_ext;
@@ -104,17 +104,17 @@ static struct {
 #define MAX_SSID_LENGTH 32
 #define MGMT_JIFFIES (256 * HZ / 100)
 
-#define MAX_BSS_ENTRIES        64      
+#define MAX_BSS_ENTRIES        64
 
 /* registers */
-#define GCR  0x00    //      (SIR0)  General Configuration Register        
-#define BSR  0x02    //      (SIR1)  Bank Switching Select Register 
+#define GCR  0x00    //      (SIR0)  General Configuration Register
+#define BSR  0x02    //      (SIR1)  Bank Switching Select Register
 #define AR   0x04
 #define DR   0x08
-#define MR1  0x12    //      Mirror Register 1                  
-#define MR2  0x14    //      Mirror Register 2  
-#define MR3  0x16    //      Mirror Register 3  
-#define MR4  0x18    //      Mirror Register 4   
+#define MR1  0x12    //      Mirror Register 1
+#define MR2  0x14    //      Mirror Register 2
+#define MR3  0x16    //      Mirror Register 3
+#define MR4  0x18    //      Mirror Register 4
 
 #define GPR1                            0x0c
 #define GPR2                            0x0e
@@ -123,9 +123,9 @@ static struct {
 // Constants for the GCR register.
 //
 #define GCR_REMAP     0x0400          // Remap internal SRAM to 0
-#define GCR_SWRES     0x0080          // BIU reset (ARM and PAI are NOT reset) 
+#define GCR_SWRES     0x0080          // BIU reset (ARM and PAI are NOT reset)
 #define GCR_CORES     0x0060          // Core Reset (ARM and PAI are reset)
-#define GCR_ENINT     0x0002          // Enable Interrupts    
+#define GCR_ENINT     0x0002          // Enable Interrupts
 #define GCR_ACKINT    0x0008          // Acknowledge Interrupts
 
 #define BSS_SRAM      0x0200          // AMBA module selection --> SRAM
@@ -190,7 +190,7 @@ struct rx_desc {
         u32          Next;
         u16          MsduPos;
         u16          MsduSize;
-       
+
         u8           State;
         u8           Status;
         u8           Rate;
@@ -199,7 +199,6 @@ struct rx_desc {
         u8           PreambleType;
         u16          Duration;
         u32          RxTime;
-
 };
 
 #define RX_DESC_FLAG_VALID       0x80
@@ -218,16 +217,15 @@ struct rx_desc {
 #define RX_DESC_DURATION_OFFSET      14
 #define RX_DESC_RX_TIME_OFFSET       16
 
-
 struct tx_desc {
        u32       NextDescriptor;
        u16       TxStartOfFrame;
        u16       TxLength;
-       
+
        u8        TxState;
        u8        TxStatus;
        u8        RetryCount;
-       
+
        u8        TxRate;
 
        u8        KeyIndex;
@@ -238,10 +236,8 @@ struct tx_desc {
        u8        Reserved;
        u8        PacketType;
        u16       HostTxLength;
-       
 };
 
-
 #define TX_DESC_NEXT_OFFSET          0
 #define TX_DESC_POS_OFFSET           4
 #define TX_DESC_SIZE_OFFSET          6
@@ -255,8 +251,6 @@ struct tx_desc {
 #define TX_DESC_PACKET_TYPE_OFFSET   17
 #define TX_DESC_HOST_LENGTH_OFFSET   18
 
-
-
 ///////////////////////////////////////////////////////
 // Host-MAC interface
 ///////////////////////////////////////////////////////
@@ -266,7 +260,6 @@ struct tx_desc {
 #define TX_FIRM_OWN             0x80
 #define TX_DONE                 0x40
 
-
 #define TX_ERROR                0x01
 
 #define TX_PACKET_TYPE_DATA     0x01
@@ -280,8 +273,7 @@ struct tx_desc {
 #define ISR_COMMAND_COMPLETE    0x10        // command completed
 #define ISR_OUT_OF_RANGE        0x20        // command completed
 #define ISR_IBSS_MERGE          0x40        // (4.1.2.30): IBSS merge
-#define ISR_GENERIC_IRQ         0x80                
-
+#define ISR_GENERIC_IRQ         0x80
 
 #define Local_Mib_Type          0x01
 #define Mac_Address_Mib_Type    0x02
@@ -317,7 +309,6 @@ struct tx_desc {
 #define LOCAL_MIB_PREAMBLE_TYPE               9
 #define MAC_ADDR_MIB_MAC_ADDR_POS             0
 
-
 #define         CMD_Set_MIB_Vars              0x01
 #define         CMD_Get_MIB_Vars              0x02
 #define         CMD_Scan                      0x03
@@ -338,7 +329,6 @@ struct tx_desc {
 #define         CMD_STATUS_HOST_ERROR             0xFF
 #define         CMD_STATUS_BUSY                   0xFE
 
-
 #define CMD_BLOCK_COMMAND_OFFSET        0
 #define CMD_BLOCK_STATUS_OFFSET         1
 #define CMD_BLOCK_PARAMETERS_OFFSET     4
@@ -347,15 +337,15 @@ struct tx_desc {
 
 #define MGMT_FRAME_BODY_OFFSET         24
 #define MAX_AUTHENTICATION_RETRIES     3
-#define MAX_ASSOCIATION_RETRIES        3
+#define MAX_ASSOCIATION_RETRIES                3
 
 #define AUTHENTICATION_RESPONSE_TIME_OUT  1000
 
 #define MAX_WIRELESS_BODY  2316 /* mtu is 2312, CRC is 4 */
 #define LOOP_RETRY_LIMIT   500000
 
-#define ACTIVE_MODE    1
-#define PS_MODE        2
+#define ACTIVE_MODE    1
+#define PS_MODE                2
 
 #define MAX_ENCRYPTION_KEYS 4
 #define MAX_ENCRYPTION_KEY_SIZE 40
@@ -377,7 +367,7 @@ struct tx_desc {
 #define REG_DOMAIN_MKK1                0x41    //Channel       1-14    Japan(MKK1)
 #define REG_DOMAIN_ISRAEL      0x50    //Channel       3-9     ISRAEL
 
-#define BSS_TYPE_AD_HOC        1
+#define BSS_TYPE_AD_HOC                1
 #define BSS_TYPE_INFRASTRUCTURE 2
 
 #define SCAN_TYPE_ACTIVE       0
@@ -389,7 +379,7 @@ struct tx_desc {
 
 #define DATA_FRAME_WS_HEADER_SIZE   30
 
-/* promiscuous mode control */ 
+/* promiscuous mode control */
 #define PROM_MODE_OFF                  0x0
 #define PROM_MODE_UNKNOWN              0x1
 #define PROM_MODE_CRC_FAILED           0x2
@@ -398,8 +388,7 @@ struct tx_desc {
 #define PROM_MODE_CTRL                 0x10
 #define PROM_MODE_BAD_PROTOCOL         0x20
 
-
-#define IFACE_INT_STATUS_OFFSET        0
+#define IFACE_INT_STATUS_OFFSET                0
 #define IFACE_INT_MASK_OFFSET          1
 #define IFACE_LOCKOUT_HOST_OFFSET      2
 #define IFACE_LOCKOUT_MAC_OFFSET       3
@@ -407,7 +396,7 @@ struct tx_desc {
 #define IFACE_MAC_STAT_OFFSET          30
 #define IFACE_GENERIC_INT_TYPE_OFFSET  32
 
-#define CIPHER_SUITE_NONE     0 
+#define CIPHER_SUITE_NONE     0
 #define CIPHER_SUITE_WEP_64   1
 #define CIPHER_SUITE_TKIP     2
 #define CIPHER_SUITE_AES      3
@@ -419,11 +408,11 @@ struct tx_desc {
 //
 //
 
-// FuncCtrl field: 
+// FuncCtrl field:
 //
 #define FUNC_CTRL_TxENABLE             0x10
 #define FUNC_CTRL_RxENABLE             0x20
-#define FUNC_CTRL_INIT_COMPLETE        0x01
+#define FUNC_CTRL_INIT_COMPLETE                0x01
 
 /* A stub firmware image which reads the MAC address from NVRAM on the card.
    For copyright information and source see the end of this file. */
@@ -486,10 +475,10 @@ struct atmel_private {
        struct net_device_stats stats;  // device stats
        spinlock_t irqlock, timerlock;  // spinlocks
        enum { BUS_TYPE_PCCARD, BUS_TYPE_PCI } bus_type;
-       enum { 
-               CARD_TYPE_PARALLEL_FLASH, 
+       enum {
+               CARD_TYPE_PARALLEL_FLASH,
                CARD_TYPE_SPI_FLASH,
-               CARD_TYPE_EEPROM 
+               CARD_TYPE_EEPROM
        } card_type;
        int do_rx_crc; /* If we need to CRC incoming packets */
        int probe_crc; /* set if we don't yet know */
@@ -497,18 +486,18 @@ struct atmel_private {
        u16 rx_desc_head;
        u16 tx_desc_free, tx_desc_head, tx_desc_tail, tx_desc_previous;
        u16 tx_free_mem, tx_buff_head, tx_buff_tail;
-       
+
        u16 frag_seq, frag_len, frag_no;
-       u8 frag_source[6]; 
-       
+       u8 frag_source[6];
+
        u8 wep_is_on, default_key, exclude_unencrypted, encryption_level;
        u8 group_cipher_suite, pairwise_cipher_suite;
        u8 wep_keys[MAX_ENCRYPTION_KEYS][MAX_ENCRYPTION_KEY_SIZE];
-       int wep_key_len[MAX_ENCRYPTION_KEYS]; 
+       int wep_key_len[MAX_ENCRYPTION_KEYS];
        int use_wpa, radio_on_broken; /* firmware dependent stuff. */
 
        u16 host_info_base;
-       struct host_info_struct { 
+       struct host_info_struct {
                /* NB this is matched to the hardware, don't change. */
                u8 volatile int_status;
                u8 volatile int_mask;
@@ -524,20 +513,20 @@ struct atmel_private {
                u16 rx_buff_size;
                u16 rx_desc_pos;
                u16 rx_desc_count;
-               
+
                u16 build_version;
-               u16 command_pos;        
-               
+               u16 command_pos;
+
                u16 major_version;
                u16 minor_version;
-               
+
                u16 func_ctrl;
                u16 mac_status;
                u16 generic_IRQ_type;
                u8  reserved[2];
        } host_info;
 
-       enum { 
+       enum {
                STATION_STATE_SCANNING,
                STATION_STATE_JOINNING,
                STATION_STATE_AUTHENTICATING,
@@ -547,7 +536,7 @@ struct atmel_private {
                STATION_STATE_DOWN,
                STATION_STATE_MGMT_ERROR
        } station_state;
-       
+
        int operating_mode, power_mode;
        time_t last_qual;
        int beacons_this_sec;
@@ -560,18 +549,18 @@ struct atmel_private {
        int long_retry, short_retry;
        int preamble;
        int default_beacon_period, beacon_period, listen_interval;
-       int CurrentAuthentTransactionSeqNum, ExpectedAuthentTransactionSeqNum;  
+       int CurrentAuthentTransactionSeqNum, ExpectedAuthentTransactionSeqNum;
        int AuthenticationRequestRetryCnt, AssociationRequestRetryCnt, ReAssociationRequestRetryCnt;
        enum {
                SITE_SURVEY_IDLE,
                SITE_SURVEY_IN_PROGRESS,
-               SITE_SURVEY_COMPLETED 
+               SITE_SURVEY_COMPLETED
        } site_survey_state;
        time_t last_survey;
 
        int station_was_associated, station_is_associated;
        int fast_scan;
-                               
+
        struct bss_info {
                int channel;
                int SSIDsize;
@@ -584,13 +573,12 @@ struct atmel_private {
                u8 SSID[MAX_SSID_LENGTH];
        } BSSinfo[MAX_BSS_ENTRIES];
        int BSS_list_entries, current_BSS;
-       int connect_to_any_BSS; 
+       int connect_to_any_BSS;
        int SSID_size, new_SSID_size;
        u8 CurrentBSSID[6], BSSID[6];
        u8 SSID[MAX_SSID_LENGTH], new_SSID[MAX_SSID_LENGTH];
        u64 last_beacon_timestamp;
        u8 rx_buf[MAX_WIRELESS_BODY];
-       
 };
 
 static u8 atmel_basic_rates[4] = {0x82,0x84,0x0b,0x16};
@@ -598,39 +586,49 @@ static u8 atmel_basic_rates[4] = {0x82,0x84,0x0b,0x16};
 static const struct {
        int reg_domain;
        int min, max;
-       char *name; 
+       char *name;
 } channel_table[] = { { REG_DOMAIN_FCC, 1, 11, "USA" },
                      { REG_DOMAIN_DOC, 1, 11, "Canada" },
                      { REG_DOMAIN_ETSI, 1, 13, "Europe" },
                      { REG_DOMAIN_SPAIN, 10, 11, "Spain" },
-                     { REG_DOMAIN_FRANCE, 10, 13, "France" }, 
+                     { REG_DOMAIN_FRANCE, 10, 13, "France" },
                      { REG_DOMAIN_MKK, 14, 14, "MKK" },
                      { REG_DOMAIN_MKK1, 1, 14, "MKK1" },
                      { REG_DOMAIN_ISRAEL, 3, 9, "Israel"} };
 
 static void build_wpa_mib(struct atmel_private *priv);
 static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-static void atmel_copy_to_card(struct net_device *dev, u16 dest, unsigned char *src, u16 len);
-static void atmel_copy_to_host(struct net_device *dev, unsigned char *dest, u16 src, u16 len);
+static void atmel_copy_to_card(struct net_device *dev, u16 dest,
+                              unsigned char *src, u16 len);
+static void atmel_copy_to_host(struct net_device *dev, unsigned char *dest,
+                              u16 src, u16 len);
 static void atmel_set_gcr(struct net_device *dev, u16 mask);
 static void atmel_clear_gcr(struct net_device *dev, u16 mask);
 static int atmel_lock_mac(struct atmel_private *priv);
 static void atmel_wmem32(struct atmel_private *priv, u16 pos, u32 data);
 static void atmel_command_irq(struct atmel_private *priv);
 static int atmel_validate_channel(struct atmel_private *priv, int channel);
-static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_hdr_4addr *header, 
+static void atmel_management_frame(struct atmel_private *priv,
+                                  struct ieee80211_hdr_4addr *header,
                                   u16 frame_len, u8 rssi);
 static void atmel_management_timer(u_long a);
-static void atmel_send_command(struct atmel_private *priv, int command, void *cmd, int cmd_size);
-static int atmel_send_command_wait(struct atmel_private *priv, int command, void *cmd, int cmd_size);
-static void atmel_transmit_management_frame(struct atmel_private *priv, struct ieee80211_hdr_4addr *header,
+static void atmel_send_command(struct atmel_private *priv, int command,
+                              void *cmd, int cmd_size);
+static int atmel_send_command_wait(struct atmel_private *priv, int command,
+                                  void *cmd, int cmd_size);
+static void atmel_transmit_management_frame(struct atmel_private *priv,
+                                           struct ieee80211_hdr_4addr *header,
                                            u8 *body, int body_len);
 
 static u8 atmel_get_mib8(struct atmel_private *priv, u8 type, u8 index);
-static void atmel_set_mib8(struct atmel_private *priv, u8 type, u8 index, u8 data);
-static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index, u16 data);
-static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index, u8 *data, int data_len);
-static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index, u8 *data, int data_len);
+static void atmel_set_mib8(struct atmel_private *priv, u8 type, u8 index,
+                          u8 data);
+static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index,
+                           u16 data);
+static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index,
+                         u8 *data, int data_len);
+static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index,
+                         u8 *data, int data_len);
 static void atmel_scan(struct atmel_private *priv, int specific_ssid);
 static void atmel_join_bss(struct atmel_private *priv, int bss_index);
 static void atmel_smooth_qual(struct atmel_private *priv);
@@ -650,12 +648,12 @@ static inline u16 atmel_co(struct atmel_private *priv, u16 offset)
        return priv->host_info.command_pos + offset;
 }
 
-static inline u16 atmel_rx(struct atmel_private *priv, u16 offset, u16  desc)
+static inline u16 atmel_rx(struct atmel_private *priv, u16 offset, u16 desc)
 {
        return priv->host_info.rx_desc_pos + (sizeof(struct rx_desc) * desc) + offset;
 }
 
-static inline u16 atmel_tx(struct atmel_private *priv, u16 offset, u16  desc)
+static inline u16 atmel_tx(struct atmel_private *priv, u16 offset, u16 desc)
 {
        return priv->host_info.tx_desc_pos + (sizeof(struct tx_desc) * desc) + offset;
 }
@@ -682,25 +680,25 @@ static inline void atmel_write16(struct net_device *dev, u16 offset, u16 data)
 
 static inline u8 atmel_rmem8(struct atmel_private *priv, u16 pos)
 {
-       atmel_writeAR(priv->dev, pos);  
+       atmel_writeAR(priv->dev, pos);
        return atmel_read8(priv->dev, DR);
 }
 
 static inline void atmel_wmem8(struct atmel_private *priv, u16 pos, u16 data)
 {
-       atmel_writeAR(priv->dev, pos);  
+       atmel_writeAR(priv->dev, pos);
        atmel_write8(priv->dev, DR, data);
 }
 
 static inline u16 atmel_rmem16(struct atmel_private *priv, u16 pos)
 {
-               atmel_writeAR(priv->dev, pos);  
+       atmel_writeAR(priv->dev, pos);
        return atmel_read16(priv->dev, DR);
 }
 
 static inline void atmel_wmem16(struct atmel_private *priv, u16 pos, u16 data)
 {
-               atmel_writeAR(priv->dev, pos);  
+       atmel_writeAR(priv->dev, pos);
        atmel_write16(priv->dev, DR, data);
 }
 
@@ -710,11 +708,10 @@ static void tx_done_irq(struct atmel_private *priv)
 {
        int i;
 
-       for (i = 0; 
+       for (i = 0;
             atmel_rmem8(priv, atmel_tx(priv, TX_DESC_FLAGS_OFFSET, priv->tx_desc_head)) == TX_DONE &&
                     i < priv->host_info.tx_desc_count;
             i++) {
-               
                u8 status = atmel_rmem8(priv, atmel_tx(priv, TX_DESC_STATUS_OFFSET, priv->tx_desc_head));
                u16 msdu_size = atmel_rmem16(priv, atmel_tx(priv, TX_DESC_SIZE_OFFSET, priv->tx_desc_head));
                u8 type = atmel_rmem8(priv, atmel_tx(priv, TX_DESC_PACKET_TYPE_OFFSET, priv->tx_desc_head));
@@ -728,16 +725,16 @@ static void tx_done_irq(struct atmel_private *priv)
                        priv->tx_buff_head = 0;
                else
                        priv->tx_buff_head += msdu_size;
-                       
+
                if (priv->tx_desc_head < (priv->host_info.tx_desc_count - 1))
-                       priv->tx_desc_head++ ;                                  
+                       priv->tx_desc_head++ ;
                else
                        priv->tx_desc_head = 0;
-               
+
                if (type == TX_PACKET_TYPE_DATA) {
                        if (status == TX_STATUS_SUCCESS)
                                priv->stats.tx_packets++;
-                       else 
+                       else
                                priv->stats.tx_errors++;
                        netif_wake_queue(priv->dev);
                }
@@ -748,21 +745,22 @@ static u16 find_tx_buff(struct atmel_private *priv, u16 len)
 {
        u16 bottom_free = priv->host_info.tx_buff_size - priv->tx_buff_tail;
 
-       if (priv->tx_desc_free == 3 || priv->tx_free_mem < len) 
+       if (priv->tx_desc_free == 3 || priv->tx_free_mem < len)
                return 0;
-       
+
        if (bottom_free >= len)
                return priv->host_info.tx_buff_pos + priv->tx_buff_tail;
-       
+
        if (priv->tx_free_mem - bottom_free >= len) {
                priv->tx_buff_tail = 0;
                return priv->host_info.tx_buff_pos;
        }
-       
+
        return 0;
 }
 
-static void tx_update_descriptor(struct atmel_private *priv, int is_bcast, u16 len, u16 buff, u8 type)
+static void tx_update_descriptor(struct atmel_private *priv, int is_bcast,
+                                u16 len, u16 buff, u8 type)
 {
        atmel_wmem16(priv, atmel_tx(priv, TX_DESC_POS_OFFSET, priv->tx_desc_tail), buff);
        atmel_wmem16(priv, atmel_tx(priv, TX_DESC_SIZE_OFFSET, priv->tx_desc_tail), len);
@@ -775,8 +773,8 @@ static void tx_update_descriptor(struct atmel_private *priv, int is_bcast, u16 l
                int cipher_type, cipher_length;
                if (is_bcast) {
                        cipher_type = priv->group_cipher_suite;
-                       if (cipher_type == CIPHER_SUITE_WEP_64 || 
-                           cipher_type == CIPHER_SUITE_WEP_128 )
+                       if (cipher_type == CIPHER_SUITE_WEP_64 ||
+                           cipher_type == CIPHER_SUITE_WEP_128)
                                cipher_length = 8;
                        else if (cipher_type == CIPHER_SUITE_TKIP)
                                cipher_length = 12;
@@ -790,8 +788,8 @@ static void tx_update_descriptor(struct atmel_private *priv, int is_bcast, u16 l
                        }
                } else {
                        cipher_type = priv->pairwise_cipher_suite;
-                       if (cipher_type == CIPHER_SUITE_WEP_64 || 
-                           cipher_type == CIPHER_SUITE_WEP_128 )
+                       if (cipher_type == CIPHER_SUITE_WEP_64 ||
+                           cipher_type == CIPHER_SUITE_WEP_128)
                                cipher_length = 8;
                        else if (cipher_type == CIPHER_SUITE_TKIP)
                                cipher_length = 12;
@@ -804,9 +802,9 @@ static void tx_update_descriptor(struct atmel_private *priv, int is_bcast, u16 l
                                cipher_length = 0;
                        }
                }
-               
+
                atmel_wmem8(priv, atmel_tx(priv, TX_DESC_CIPHER_TYPE_OFFSET, priv->tx_desc_tail),
-                           cipher_type);       
+                           cipher_type);
                atmel_wmem8(priv, atmel_tx(priv, TX_DESC_CIPHER_LENGTH_OFFSET, priv->tx_desc_tail),
                            cipher_length);
        }
@@ -815,46 +813,46 @@ static void tx_update_descriptor(struct atmel_private *priv, int is_bcast, u16 l
        if (priv->tx_desc_previous != priv->tx_desc_tail)
                atmel_wmem32(priv, atmel_tx(priv, TX_DESC_NEXT_OFFSET, priv->tx_desc_previous), 0);
        priv->tx_desc_previous = priv->tx_desc_tail;
-       if (priv->tx_desc_tail < (priv->host_info.tx_desc_count -))
+       if (priv->tx_desc_tail < (priv->host_info.tx_desc_count - 1))
                priv->tx_desc_tail++;
        else
                priv->tx_desc_tail = 0;
        priv->tx_desc_free--;
        priv->tx_free_mem -= len;
-
 }
 
-static int start_tx (struct sk_buff *skb, struct net_device *dev)
+static int start_tx(struct sk_buff *skb, struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
        struct ieee80211_hdr_4addr header;
        unsigned long flags;
        u16 buff, frame_ctl, len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
        u8 SNAP_RFC1024[6] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
-       if (priv->card && priv->present_callback && 
+
+       if (priv->card && priv->present_callback &&
            !(*priv->present_callback)(priv->card)) {
                priv->stats.tx_errors++;
                dev_kfree_skb(skb);
                return 0;
        }
-       
+
        if (priv->station_state != STATION_STATE_READY) {
                priv->stats.tx_errors++;
                dev_kfree_skb(skb);
                return 0;
        }
-       
+
        /* first ensure the timer func cannot run */
-       spin_lock_bh(&priv->timerlock); 
+       spin_lock_bh(&priv->timerlock);
        /* then stop the hardware ISR */
-       spin_lock_irqsave(&priv->irqlock, flags); 
+       spin_lock_irqsave(&priv->irqlock, flags);
        /* nb doing the above in the opposite order will deadlock */
-       
+
        /* The Wireless Header is 30 bytes. In the Ethernet packet we "cut" the
-          12 first bytes (containing DA/SA) and put them in the appropriate fields of
-          the Wireless Header. Thus the packet length is then the initial + 18 (+30-12) */
-       
+          12 first bytes (containing DA/SA) and put them in the appropriate
+          fields of the Wireless Header. Thus the packet length is then the
+          initial + 18 (+30-12) */
+
        if (!(buff = find_tx_buff(priv, len + 18))) {
                priv->stats.tx_dropped++;
                spin_unlock_irqrestore(&priv->irqlock, flags);
@@ -862,7 +860,7 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
                netif_stop_queue(dev);
                return 1;
        }
-       
+
        frame_ctl = IEEE80211_FTYPE_DATA;
        header.duration_id = 0;
        header.seq_ctl = 0;
@@ -878,7 +876,7 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
                memcpy(&header.addr2, dev->dev_addr, 6);
                memcpy(&header.addr3, skb->data, 6);
        }
-       
+
        if (priv->use_wpa)
                memcpy(&header.addr4, SNAP_RFC1024, 6);
 
@@ -888,27 +886,27 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
        /* Copy the packet sans its 802.3 header addresses which have been replaced */
        atmel_copy_to_card(dev, buff + DATA_FRAME_WS_HEADER_SIZE, skb->data + 12, len - 12);
        priv->tx_buff_tail += len - 12 + DATA_FRAME_WS_HEADER_SIZE;
-       
+
        /* low bit of first byte of destination tells us if broadcast */
        tx_update_descriptor(priv, *(skb->data) & 0x01, len + 18, buff, TX_PACKET_TYPE_DATA);
        dev->trans_start = jiffies;
        priv->stats.tx_bytes += len;
-       
+
        spin_unlock_irqrestore(&priv->irqlock, flags);
        spin_unlock_bh(&priv->timerlock);
        dev_kfree_skb(skb);
-       
-       return 0;       
+
+       return 0;
 }
 
-static void atmel_transmit_management_frame(struct atmel_private *priv, 
+static void atmel_transmit_management_frame(struct atmel_private *priv,
                                            struct ieee80211_hdr_4addr *header,
                                            u8 *body, int body_len)
 {
        u16 buff;
-       int len =  MGMT_FRAME_BODY_OFFSET + body_len;
-       
-       if (!(buff = find_tx_buff(priv, len))) 
+       int len = MGMT_FRAME_BODY_OFFSET + body_len;
+
+       if (!(buff = find_tx_buff(priv, len)))
                return;
 
        atmel_copy_to_card(priv->dev, buff, (u8 *)header, MGMT_FRAME_BODY_OFFSET);
@@ -916,24 +914,25 @@ static void atmel_transmit_management_frame(struct atmel_private *priv,
        priv->tx_buff_tail += len;
        tx_update_descriptor(priv, header->addr1[0] & 0x01, len, buff, TX_PACKET_TYPE_MGMT);
 }
-       
-static void fast_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr *header, 
+
+static void fast_rx_path(struct atmel_private *priv,
+                        struct ieee80211_hdr_4addr *header,
                         u16 msdu_size, u16 rx_packet_loc, u32 crc)
 {
        /* fast path: unfragmented packet copy directly into skbuf */
-       u8 mac4[6]; 
-       struct sk_buff  *skb;
+       u8 mac4[6];
+       struct sk_buff  *skb;
        unsigned char *skbp;
-       
+
        /* get the final, mac 4 header field, this tells us encapsulation */
        atmel_copy_to_host(priv->dev, mac4, rx_packet_loc + 24, 6);
        msdu_size -= 6;
-       
+
        if (priv->do_rx_crc) {
                crc = crc32_le(crc, mac4, 6);
                msdu_size -= 4;
        }
-       
+
        if (!(skb = dev_alloc_skb(msdu_size + 14))) {
                priv->stats.rx_dropped++;
                return;
@@ -942,7 +941,7 @@ static void fast_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr
        skb_reserve(skb, 2);
        skbp = skb_put(skb, msdu_size + 12);
        atmel_copy_to_host(priv->dev, skbp + 12, rx_packet_loc + 30, msdu_size);
-       
+
        if (priv->do_rx_crc) {
                u32 netcrc;
                crc = crc32_le(crc, skbp + 12, msdu_size);
@@ -953,24 +952,25 @@ static void fast_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr
                        return;
                }
        }
-       
+
        memcpy(skbp, header->addr1, 6); /* destination address */
-       if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS) 
+       if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS)
                memcpy(&skbp[6], header->addr3, 6);
        else
                memcpy(&skbp[6], header->addr2, 6); /* source address */
-       
-       priv->dev->last_rx=jiffies;
+
+       priv->dev->last_rx = jiffies;
        skb->dev = priv->dev;
        skb->protocol = eth_type_trans(skb, priv->dev);
-       skb->ip_summed = CHECKSUM_NONE; 
+       skb->ip_summed = CHECKSUM_NONE;
        netif_rx(skb);
        priv->stats.rx_bytes += 12 + msdu_size;
        priv->stats.rx_packets++;
 }
 
 /* Test to see if the packet in card memory at packet_loc has a valid CRC
-   It doesn't matter that this is slow: it is only used to proble the first few packets. */
+   It doesn't matter that this is slow: it is only used to proble the first few
+   packets. */
 static int probe_crc(struct atmel_private *priv, u16 packet_loc, u16 msdu_size)
 {
        int i = msdu_size - 4;
@@ -980,7 +980,7 @@ static int probe_crc(struct atmel_private *priv, u16 packet_loc, u16 msdu_size)
                return 0;
 
        atmel_copy_to_host(priv->dev, (void *)&netcrc, packet_loc + i, 4);
-       
+
        atmel_writeAR(priv->dev, packet_loc);
        while (i--) {
                u8 octet = atmel_read8(priv->dev, DR);
@@ -990,20 +990,22 @@ static int probe_crc(struct atmel_private *priv, u16 packet_loc, u16 msdu_size)
        return (crc ^ 0xffffffff) == netcrc;
 }
 
-static void frag_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr *header, 
-                        u16 msdu_size, u16 rx_packet_loc, u32 crc, u16 seq_no, u8 frag_no, int more_frags)
+static void frag_rx_path(struct atmel_private *priv,
+                        struct ieee80211_hdr_4addr *header,
+                        u16 msdu_size, u16 rx_packet_loc, u32 crc, u16 seq_no,
+                        u8 frag_no, int more_frags)
 {
-       u8 mac4[6]; 
+       u8 mac4[6];
        u8 source[6];
        struct sk_buff *skb;
 
-       if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS) 
+       if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS)
                memcpy(source, header->addr3, 6);
        else
-               memcpy(source, header->addr2, 6); 
-       
+               memcpy(source, header->addr2, 6);
+
        rx_packet_loc += 24; /* skip header */
-       
+
        if (priv->do_rx_crc)
                msdu_size -= 4;
 
@@ -1012,16 +1014,16 @@ static void frag_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr
                msdu_size -= 6;
                rx_packet_loc += 6;
 
-               if (priv->do_rx_crc) 
+               if (priv->do_rx_crc)
                        crc = crc32_le(crc, mac4, 6);
-              
+
                priv->frag_seq = seq_no;
                priv->frag_no = 1;
                priv->frag_len = msdu_size;
-               memcpy(priv->frag_source, source, 6); 
+               memcpy(priv->frag_source, source, 6);
                memcpy(&priv->rx_buf[6], source, 6);
                memcpy(priv->rx_buf, header->addr1, 6);
-                               
+
                atmel_copy_to_host(priv->dev, &priv->rx_buf[12], rx_packet_loc, msdu_size);
 
                if (priv->do_rx_crc) {
@@ -1033,17 +1035,17 @@ static void frag_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr
                                memset(priv->frag_source, 0xff, 6);
                        }
                }
-               
+
        } else if (priv->frag_no == frag_no &&
                   priv->frag_seq == seq_no &&
                   memcmp(priv->frag_source, source, 6) == 0) {
-               
-               atmel_copy_to_host(priv->dev, &priv->rx_buf[12 + priv->frag_len], 
+
+               atmel_copy_to_host(priv->dev, &priv->rx_buf[12 + priv->frag_len],
                                   rx_packet_loc, msdu_size);
                if (priv->do_rx_crc) {
                        u32 netcrc;
-                       crc = crc32_le(crc, 
-                                      &priv->rx_buf[12 + priv->frag_len], 
+                       crc = crc32_le(crc,
+                                      &priv->rx_buf[12 + priv->frag_len],
                                       msdu_size);
                        atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);
                        if ((crc ^ 0xffffffff) != netcrc) {
@@ -1052,7 +1054,7 @@ static void frag_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr
                                more_frags = 1; /* don't send broken assembly */
                        }
                }
-               
+
                priv->frag_len += msdu_size;
                priv->frag_no++;
 
@@ -1062,60 +1064,60 @@ static void frag_rx_path(struct atmel_private *priv, struct ieee80211_hdr_4addr
                                priv->stats.rx_dropped++;
                        } else {
                                skb_reserve(skb, 2);
-                               memcpy(skb_put(skb, priv->frag_len + 12), 
+                               memcpy(skb_put(skb, priv->frag_len + 12),
                                       priv->rx_buf,
                                       priv->frag_len + 12);
                                priv->dev->last_rx = jiffies;
                                skb->dev = priv->dev;
                                skb->protocol = eth_type_trans(skb, priv->dev);
-                               skb->ip_summed = CHECKSUM_NONE; 
+                               skb->ip_summed = CHECKSUM_NONE;
                                netif_rx(skb);
                                priv->stats.rx_bytes += priv->frag_len + 12;
                                priv->stats.rx_packets++;
                        }
                }
-               
        } else
                priv->wstats.discard.fragment++;
 }
-               
+
 static void rx_done_irq(struct atmel_private *priv)
 {
        int i;
        struct ieee80211_hdr_4addr header;
-       
-       for (i = 0; 
+
+       for (i = 0;
             atmel_rmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head)) == RX_DESC_FLAG_VALID &&
                     i < priv->host_info.rx_desc_count;
             i++) {
-                               
+
                u16 msdu_size, rx_packet_loc, frame_ctl, seq_control;
                u8 status = atmel_rmem8(priv, atmel_rx(priv, RX_DESC_STATUS_OFFSET, priv->rx_desc_head));
                u32 crc = 0xffffffff;
-               
+
                if (status != RX_STATUS_SUCCESS) {
                        if (status == 0xc1) /* determined by experiment */
                                priv->wstats.discard.nwid++;
                        else
-                               priv->stats.rx_errors++; 
+                               priv->stats.rx_errors++;
                        goto next;
                }
 
                msdu_size = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_SIZE_OFFSET, priv->rx_desc_head));
                rx_packet_loc = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_POS_OFFSET, priv->rx_desc_head));
-               
+
                if (msdu_size < 30) {
-                       priv->stats.rx_errors++; 
+                       priv->stats.rx_errors++;
                        goto next;
                }
-               
+
                /* Get header as far as end of seq_ctl */
                atmel_copy_to_host(priv->dev, (char *)&header, rx_packet_loc, 24);
                frame_ctl = le16_to_cpu(header.frame_ctl);
                seq_control = le16_to_cpu(header.seq_ctl);
 
-               /* probe for CRC use here if needed  once five packets have arrived with
-                  the same crc status, we assume we know what's happening and stop probing */
+               /* probe for CRC use here if needed  once five packets have
+                  arrived with the same crc status, we assume we know what's
+                  happening and stop probing */
                if (priv->probe_crc) {
                        if (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED)) {
                                priv->do_rx_crc = probe_crc(priv, rx_packet_loc, msdu_size);
@@ -1130,34 +1132,33 @@ static void rx_done_irq(struct atmel_private *priv)
                                        priv->probe_crc = 0;
                        }
                }
-                   
+
                /* don't CRC header when WEP in use */
                if (priv->do_rx_crc && (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED))) {
                        crc = crc32_le(0xffffffff, (unsigned char *)&header, 24);
                }
                msdu_size -= 24; /* header */
 
-               if ((frame_ctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) { 
-                       
+               if ((frame_ctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) {
                        int more_fragments = frame_ctl & IEEE80211_FCTL_MOREFRAGS;
                        u8 packet_fragment_no = seq_control & IEEE80211_SCTL_FRAG;
                        u16 packet_sequence_no = (seq_control & IEEE80211_SCTL_SEQ) >> 4;
-                       
-                       if (!more_fragments && packet_fragment_no == 0 ) {
+
+                       if (!more_fragments && packet_fragment_no == 0) {
                                fast_rx_path(priv, &header, msdu_size, rx_packet_loc, crc);
                        } else {
                                frag_rx_path(priv, &header, msdu_size, rx_packet_loc, crc,
                                             packet_sequence_no, packet_fragment_no, more_fragments);
                        }
                }
-               
+
                if ((frame_ctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) {
                        /* copy rest of packet into buffer */
                        atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size);
-                       
+
                        /* we use the same buffer for frag reassembly and control packets */
                        memset(priv->frag_source, 0xff, 6);
-                       
+
                        if (priv->do_rx_crc) {
                                /* last 4 octets is crc */
                                msdu_size -= 4;
@@ -1170,18 +1171,18 @@ static void rx_done_irq(struct atmel_private *priv)
 
                        atmel_management_frame(priv, &header, msdu_size,
                                               atmel_rmem8(priv, atmel_rx(priv, RX_DESC_RSSI_OFFSET, priv->rx_desc_head)));
-               } 
+               }
 
-       next:
+next:
                /* release descriptor */
-               atmel_wmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head), RX_DESC_FLAG_CONSUMED);  
-               
+               atmel_wmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head), RX_DESC_FLAG_CONSUMED);
+
                if (priv->rx_desc_head < (priv->host_info.rx_desc_count - 1))
-                       priv->rx_desc_head++;                                   
+                       priv->rx_desc_head++;
                else
                        priv->rx_desc_head = 0;
        }
-}      
+}
 
 static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
@@ -1189,7 +1190,7 @@ static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs
        struct atmel_private *priv = netdev_priv(dev);
        u8 isr;
        int i = -1;
-       static u8 irq_order[] = { 
+       static u8 irq_order[] = {
                ISR_OUT_OF_RANGE,
                ISR_RxCOMPLETE,
                ISR_TxCOMPLETE,
@@ -1199,20 +1200,19 @@ static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs
                ISR_IBSS_MERGE,
                ISR_GENERIC_IRQ
        };
-               
 
-       if (priv->card && priv->present_callback && 
+       if (priv->card && priv->present_callback &&
            !(*priv->present_callback)(priv->card))
                return IRQ_HANDLED;
 
        /* In this state upper-level code assumes it can mess with
           the card unhampered by interrupts which may change register state.
           Note that even though the card shouldn't generate interrupts
-          the inturrupt line may be shared. This allows card setup 
+          the inturrupt line may be shared. This allows card setup
           to go on without disabling interrupts for a long time. */
        if (priv->station_state == STATION_STATE_DOWN)
                return IRQ_NONE;
-       
+
        atmel_clear_gcr(dev, GCR_ENINT); /* disable interrupts */
 
        while (1) {
@@ -1221,36 +1221,36 @@ static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs
                        printk(KERN_ALERT "%s: failed to contact MAC.\n", dev->name);
                        return IRQ_HANDLED;
                }
-               
+
                isr = atmel_rmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET));
                atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0);
-               
+
                if (!isr) {
                        atmel_set_gcr(dev, GCR_ENINT); /* enable interrupts */
                        return i == -1 ? IRQ_NONE : IRQ_HANDLED;
                }
-               
+
                atmel_set_gcr(dev, GCR_ACKINT); /* acknowledge interrupt */
-               
+
                for (i = 0; i < sizeof(irq_order)/sizeof(u8); i++)
                        if (isr & irq_order[i])
                                break;
-               
+
                if (!atmel_lock_mac(priv)) {
                        /* failed to contact card */
                        printk(KERN_ALERT "%s: failed to contact MAC.\n", dev->name);
                        return IRQ_HANDLED;
                }
-               
+
                isr = atmel_rmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET));
                isr ^= irq_order[i];
                atmel_wmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET), isr);
                atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0);
-               
+
                switch (irq_order[i]) {
-                       
-               case ISR_OUT_OF_RANGE: 
-                       if (priv->operating_mode == IW_MODE_INFRA && 
+
+               case ISR_OUT_OF_RANGE:
+                       if (priv->operating_mode == IW_MODE_INFRA &&
                            priv->station_state == STATION_STATE_READY) {
                                priv->station_is_associated = 0;
                                atmel_scan(priv, 1);
@@ -1261,24 +1261,24 @@ static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs
                        priv->wstats.discard.misc++;
                        /* fall through */
                case ISR_RxCOMPLETE:
-                       rx_done_irq(priv); 
+                       rx_done_irq(priv);
                        break;
-                       
+
                case ISR_TxCOMPLETE:
-                       tx_done_irq(priv); 
+                       tx_done_irq(priv);
                        break;
-                       
+
                case ISR_FATAL_ERROR:
                        printk(KERN_ALERT "%s: *** FATAL error interrupt ***\n", dev->name);
                        atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
                        break;
-                       
-               case ISR_COMMAND_COMPLETE: 
+
+               case ISR_COMMAND_COMPLETE:
                        atmel_command_irq(priv);
                        break;
 
                case ISR_IBSS_MERGE:
-                       atmel_get_mib(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_BSSID_POS, 
+                       atmel_get_mib(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_BSSID_POS,
                                      priv->CurrentBSSID, 6);
                        /* The WPA stuff cares about the current AP address */
                        if (priv->use_wpa)
@@ -1288,24 +1288,23 @@ static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs
                        printk(KERN_INFO "%s: Generic_irq received.\n", dev->name);
                        break;
                }
-       }       
+       }
 }
 
-
-static struct net_device_stats *atmel_get_stats (struct net_device *dev)
+static struct net_device_stats *atmel_get_stats(struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
        return &priv->stats;
 }
 
-static struct iw_statistics *atmel_get_wireless_stats (struct net_device *dev)
+static struct iw_statistics *atmel_get_wireless_stats(struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
 
-       /* update the link quality here in case we are seeing no beacons 
+       /* update the link quality here in case we are seeing no beacons
           at all to drive the process */
        atmel_smooth_qual(priv);
-       
+
        priv->wstats.status = priv->station_state;
 
        if (priv->operating_mode == IW_MODE_INFRA) {
@@ -1328,8 +1327,8 @@ static struct iw_statistics *atmel_get_wireless_stats (struct net_device *dev)
                                        | IW_QUAL_NOISE_INVALID;
                priv->wstats.miss.beacon = 0;
        }
-       
-       return (&priv->wstats);
+
+       return &priv->wstats;
 }
 
 static int atmel_change_mtu(struct net_device *dev, int new_mtu)
@@ -1343,21 +1342,21 @@ static int atmel_change_mtu(struct net_device *dev, int new_mtu)
 static int atmel_set_mac_address(struct net_device *dev, void *p)
 {
        struct sockaddr *addr = p;
-        
+
         memcpy (dev->dev_addr, addr->sa_data, dev->addr_len);
        return atmel_open(dev);
 }
 
 EXPORT_SYMBOL(atmel_open);
 
-int atmel_open (struct net_device *dev)
+int atmel_open(struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
        int i, channel;
 
        /* any scheduled timer is no longer needed and might screw things up.. */
        del_timer_sync(&priv->management_timer);
-       
+
        /* Interrupts will not touch the card once in this state... */
        priv->station_state = STATION_STATE_DOWN;
 
@@ -1377,7 +1376,7 @@ int atmel_open (struct net_device *dev)
        priv->site_survey_state = SITE_SURVEY_IDLE;
        priv->station_is_associated = 0;
 
-       if (!reset_atmel_card(dev)) 
+       if (!reset_atmel_card(dev))
                return -EAGAIN;
 
        if (priv->config_reg_domain) {
@@ -1391,26 +1390,26 @@ int atmel_open (struct net_device *dev)
                if (i == sizeof(channel_table)/sizeof(channel_table[0])) {
                        priv->reg_domain = REG_DOMAIN_MKK1;
                        printk(KERN_ALERT "%s: failed to get regulatory domain: assuming MKK1.\n", dev->name);
-               } 
+               }
        }
-       
+
        if ((channel = atmel_validate_channel(priv, priv->channel)))
                priv->channel = channel;
 
-       /* this moves station_state on.... */ 
-       atmel_scan(priv, 1);    
+       /* this moves station_state on.... */
+       atmel_scan(priv, 1);
 
        atmel_set_gcr(priv->dev, GCR_ENINT); /* enable interrupts */
        return 0;
 }
 
-static int atmel_close (struct net_device *dev)
+static int atmel_close(struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
-               
+
        atmel_enter_state(priv, STATION_STATE_DOWN);
-       
-       if (priv->bus_type == BUS_TYPE_PCCARD) 
+
+       if (priv->bus_type == BUS_TYPE_PCCARD)
                atmel_write16(dev, GCR, 0x0060);
        atmel_write16(dev, GCR, 0x0040);
        return 0;
@@ -1438,43 +1437,46 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
        int i;
        char *p = buf;
        char *s, *r, *c;
-       
-       p += sprintf(p, "Driver version:\t\t%d.%d\n", DRIVER_MAJOR, DRIVER_MINOR);
-       
+
+       p += sprintf(p, "Driver version:\t\t%d.%d\n",
+                    DRIVER_MAJOR, DRIVER_MINOR);
+
        if (priv->station_state != STATION_STATE_DOWN) {
-               p += sprintf(p, "Firmware version:\t%d.%d build %d\nFirmware location:\t", 
+               p += sprintf(p, "Firmware version:\t%d.%d build %d\n"
+                               "Firmware location:\t",
                             priv->host_info.major_version,
                             priv->host_info.minor_version,
                             priv->host_info.build_version);
-               
-               if (priv->card_type != CARD_TYPE_EEPROM) 
+
+               if (priv->card_type != CARD_TYPE_EEPROM)
                        p += sprintf(p, "on card\n");
-               else if (priv->firmware) 
-                       p += sprintf(p, "%s loaded by host\n", priv->firmware_id);
+               else if (priv->firmware)
+                       p += sprintf(p, "%s loaded by host\n",
+                                    priv->firmware_id);
                else
-                       p += sprintf(p, "%s loaded by hotplug\n", priv->firmware_id);
-               
-               switch(priv->card_type) {
+                       p += sprintf(p, "%s loaded by hotplug\n",
+                                    priv->firmware_id);
+
+               switch (priv->card_type) {
                case CARD_TYPE_PARALLEL_FLASH: c = "Parallel flash"; break;
                case CARD_TYPE_SPI_FLASH: c = "SPI flash\n"; break;
                case CARD_TYPE_EEPROM: c = "EEPROM"; break;
                default: c = "<unknown>";
                }
 
-               
                r = "<unknown>";
                for (i = 0; i < sizeof(channel_table)/sizeof(channel_table[0]); i++)
                        if (priv->reg_domain == channel_table[i].reg_domain)
                                r = channel_table[i].name;
-               
+
                p += sprintf(p, "MAC memory type:\t%s\n", c);
                p += sprintf(p, "Regulatory domain:\t%s\n", r);
-               p += sprintf(p, "Host CRC checking:\t%s\n", 
+               p += sprintf(p, "Host CRC checking:\t%s\n",
                             priv->do_rx_crc ? "On" : "Off");
                p += sprintf(p, "WPA-capable firmware:\t%s\n",
                             priv->use_wpa ? "Yes" : "No");
        }
-       
+
        switch(priv->station_state) {
        case STATION_STATE_SCANNING: s = "Scanning"; break;
        case STATION_STATE_JOINNING: s = "Joining"; break;
@@ -1486,9 +1488,9 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
        case STATION_STATE_DOWN: s = "Down"; break;
        default: s = "<unknown>";
        }
-      
+
        p += sprintf(p, "Current state:\t\t%s\n", s);
-       return  p - buf;
+       return p - buf;
 }
 
 static int atmel_read_proc(char *page, char **start, off_t off,
@@ -1504,9 +1506,12 @@ static int atmel_read_proc(char *page, char **start, off_t off,
         return len;
 }
 
-struct net_device *init_atmel_card( unsigned short irq, unsigned long port, const AtmelFWType fw_type,  
-                                   struct device *sys_dev, int (*card_present)(void *), void *card)
+struct net_device *init_atmel_card(unsigned short irq, unsigned long port,
+                                  const AtmelFWType fw_type,
+                                  struct device *sys_dev,
+                                  int (*card_present)(void *), void *card)
 {
+       struct proc_dir_entry *ent;
        struct net_device *dev;
        struct atmel_private *priv;
        int rc;
@@ -1514,11 +1519,11 @@ struct net_device *init_atmel_card( unsigned short irq, unsigned long port, cons
        /* Create the network device object. */
         dev = alloc_etherdev(sizeof(*priv));
         if (!dev) {
-               printk(KERN_ERR "atmel:  Couldn't alloc_etherdev\n");
+               printk(KERN_ERR "atmel: Couldn't alloc_etherdev\n");
                return NULL;
         }
        if (dev_alloc_name(dev, dev->name) < 0) {
-               printk(KERN_ERR "atmel:  Couldn't get name!\n");
+               printk(KERN_ERR "atmel: Couldn't get name!\n");
                goto err_out_free;
        }
 
@@ -1550,7 +1555,7 @@ struct net_device *init_atmel_card( unsigned short irq, unsigned long port, cons
        memset(priv->BSSID, 0, 6);
        priv->CurrentBSSID[0] = 0xFF; /* Initialize to something invalid.... */
        priv->station_was_associated = 0;
-       
+
        priv->last_survey = jiffies;
        priv->preamble = LONG_PREAMBLE;
        priv->operating_mode = IW_MODE_INFRA;
@@ -1586,7 +1591,7 @@ struct net_device *init_atmel_card( unsigned short irq, unsigned long port, cons
        spin_lock_init(&priv->timerlock);
        priv->management_timer.function = atmel_management_timer;
        priv->management_timer.data = (unsigned long) dev;
-       
+
        dev->open = atmel_open;
        dev->stop = atmel_close;
        dev->change_mtu = atmel_change_mtu;
@@ -1597,44 +1602,46 @@ struct net_device *init_atmel_card( unsigned short irq, unsigned long port, cons
        dev->do_ioctl = atmel_ioctl;
        dev->irq = irq;
        dev->base_addr = port;
-       
+
        SET_NETDEV_DEV(dev, sys_dev);
-       
+
        if ((rc = request_irq(dev->irq, service_interrupt, SA_SHIRQ, dev->name, dev))) {
-               printk(KERN_ERR "%s: register interrupt %d failed, rc %d\n", dev->name, irq, rc );
+               printk(KERN_ERR "%s: register interrupt %d failed, rc %d\n", dev->name, irq, rc);
                goto err_out_free;
        }
 
-       if (!request_region(dev->base_addr, 32, 
+       if (!request_region(dev->base_addr, 32,
                            priv->bus_type == BUS_TYPE_PCCARD ?  "atmel_cs" : "atmel_pci")) {
                goto err_out_irq;
        }
-       
+
        if (register_netdev(dev))
                goto err_out_res;
-       
+
        if (!probe_atmel_card(dev)){
                unregister_netdev(dev);
                goto err_out_res;
        }
-       
+
        netif_carrier_off(dev);
-       
-       create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv);        
-       
+
+       ent = create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv);
+       if (!ent)
+               printk(KERN_WARNING "atmel: unable to create /proc entry.\n");
+
        printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
               dev->name, DRIVER_MAJOR, DRIVER_MINOR,
               dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
               dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] );
-       
+
        SET_MODULE_OWNER(dev);
        return dev;
-       
- err_out_res:
+
+err_out_res:
        release_region( dev->base_addr, 32);
- err_out_irq:
+err_out_irq:
        free_irq(dev->irq, dev);
- err_out_free:
+err_out_free:
        free_netdev(dev);
        return NULL;
 }
@@ -1644,12 +1651,12 @@ EXPORT_SYMBOL(init_atmel_card);
 void stop_atmel_card(struct net_device *dev)
 {
        struct atmel_private *priv = netdev_priv(dev);
-               
+
        /* put a brick on it... */
-       if (priv->bus_type == BUS_TYPE_PCCARD) 
+       if (priv->bus_type == BUS_TYPE_PCCARD)
                atmel_write16(dev, GCR, 0x0060);
        atmel_write16(dev, GCR, 0x0040);
-       
+
        del_timer_sync(&priv->management_timer);
        unregister_netdev(dev);
        remove_proc_entry("driver/atmel", NULL);
@@ -1675,13 +1682,13 @@ static int atmel_set_essid(struct net_device *dev,
                int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
 
                priv->connect_to_any_BSS = 0;
-               
+
                /* Check the size of the string */
                if (dwrq->length > MAX_SSID_LENGTH + 1)
-                        return -E2BIG ;
+                        return -E2BIG;
                if (index != 0)
                        return -EINVAL;
-               
+
                memcpy(priv->new_SSID, extra, dwrq->length - 1);
                priv->new_SSID_size = dwrq->length - 1;
        }
@@ -1706,7 +1713,7 @@ static int atmel_get_essid(struct net_device *dev,
                extra[priv->SSID_size] = '\0';
                dwrq->length = priv->SSID_size + 1;
        }
-       
+
        dwrq->flags = !priv->connect_to_any_BSS; /* active */
 
        return 0;
@@ -1768,7 +1775,7 @@ static int atmel_set_encode(struct net_device *dev,
                /* WE specify that if a valid key is set, encryption
                 * should be enabled (user may turn it off later)
                 * This is also how "iwconfig ethX key on" works */
-               if (index == current_index && 
+               if (index == current_index &&
                    priv->wep_key_len[index] > 0) {
                        priv->wep_is_on = 1;
                        priv->exclude_unencrypted = 1;
@@ -1783,18 +1790,18 @@ static int atmel_set_encode(struct net_device *dev,
        } else {
                /* Do we want to just set the transmit key index ? */
                int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
-               if ( index>=0 && index < 4 ) {
+               if (index >= 0 && index < 4) {
                        priv->default_key = index;
                } else
                        /* Don't complain if only change the mode */
-                       if(!dwrq->flags & IW_ENCODE_MODE) {
+                       if (!dwrq->flags & IW_ENCODE_MODE) {
                                return -EINVAL;
                        }
        }
        /* Read the flags */
-       if(dwrq->flags & IW_ENCODE_DISABLED) {
+       if (dwrq->flags & IW_ENCODE_DISABLED) {
                priv->wep_is_on = 0;
-               priv->encryption_level = 0;     
+               priv->encryption_level = 0;
                priv->pairwise_cipher_suite = CIPHER_SUITE_NONE;
        } else {
                priv->wep_is_on = 1;
@@ -1806,15 +1813,14 @@ static int atmel_set_encode(struct net_device *dev,
                        priv->encryption_level = 1;
                }
        }
-       if(dwrq->flags & IW_ENCODE_RESTRICTED)
+       if (dwrq->flags & IW_ENCODE_RESTRICTED)
                priv->exclude_unencrypted = 1;
-               if(dwrq->flags & IW_ENCODE_OPEN) 
+       if(dwrq->flags & IW_ENCODE_OPEN)
                priv->exclude_unencrypted = 0;
-       
+
        return -EINPROGRESS;            /* Call commit handler */
 }
 
-
 static int atmel_get_encode(struct net_device *dev,
                            struct iw_request_info *info,
                            struct iw_point *dwrq,
@@ -1822,7 +1828,7 @@ static int atmel_get_encode(struct net_device *dev,
 {
        struct atmel_private *priv = netdev_priv(dev);
        int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
-       
+
        if (!priv->wep_is_on)
                dwrq->flags = IW_ENCODE_DISABLED;
        else {
@@ -1843,7 +1849,7 @@ static int atmel_get_encode(struct net_device *dev,
                memset(extra, 0, 16);
                memcpy(extra, priv->wep_keys[index], dwrq->length);
        }
-       
+
        return 0;
 }
 
@@ -1862,17 +1868,17 @@ static int atmel_set_rate(struct net_device *dev,
                          char *extra)
 {
        struct atmel_private *priv = netdev_priv(dev);
-       
+
        if (vwrq->fixed == 0) {
                priv->tx_rate = 3;
                priv->auto_tx_rate = 1;
        } else {
                priv->auto_tx_rate = 0;
-               
+
                /* Which type of value ? */
-               if((vwrq->value < 4) && (vwrq->value >= 0)) {
+               if ((vwrq->value < 4) && (vwrq->value >= 0)) {
                        /* Setting by rate index */
-               priv->tx_rate = vwrq->value;
+                       priv->tx_rate = vwrq->value;
                } else {
                /* Setting by frequency value */
                        switch (vwrq->value) {
@@ -1899,7 +1905,7 @@ static int atmel_set_mode(struct net_device *dev,
                return -EINVAL;
 
        priv->operating_mode = *uwrq;
-       return -EINPROGRESS;  
+       return -EINPROGRESS;
 }
 
 static int atmel_get_mode(struct net_device *dev,
@@ -1908,7 +1914,7 @@ static int atmel_get_mode(struct net_device *dev,
                          char *extra)
 {
        struct atmel_private *priv = netdev_priv(dev);
-       
+
        *uwrq = priv->operating_mode;
        return 0;
 }
@@ -1962,9 +1968,9 @@ static int atmel_set_retry(struct net_device *dev,
                           char *extra)
 {
        struct atmel_private *priv = netdev_priv(dev);
-       
-       if(!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) {
-               if(vwrq->flags & IW_RETRY_MAX)
+
+       if (!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) {
+               if (vwrq->flags & IW_RETRY_MAX)
                        priv->long_retry = vwrq->value;
                else if (vwrq->flags & IW_RETRY_MIN)
                        priv->short_retry = vwrq->value;
@@ -1973,9 +1979,9 @@ static int atmel_set_retry(struct net_device *dev,
                        priv->long_retry = vwrq->value;
                        priv->short_retry = vwrq->value;
                }
-               return -EINPROGRESS;            
+               return -EINPROGRESS;
        }
-          
+
        return -EINVAL;
 }
 
@@ -1989,13 +1995,13 @@ static int atmel_get_retry(struct net_device *dev,
        vwrq->disabled = 0;      /* Can't be disabled */
 
        /* Note : by default, display the min retry number */
-       if((vwrq->flags & IW_RETRY_MAX)) {
+       if (vwrq->flags & IW_RETRY_MAX) {
                vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
                vwrq->value = priv->long_retry;
        } else {
                vwrq->flags = IW_RETRY_LIMIT;
                vwrq->value = priv->short_retry;
-               if(priv->long_retry != priv->short_retry)
+               if (priv->long_retry != priv->short_retry)
                        vwrq->flags |= IW_RETRY_MIN;
        }
 
@@ -2010,13 +2016,13 @@ static int atmel_set_rts(struct net_device *dev,
        struct atmel_private *priv = netdev_priv(dev);
        int rthr = vwrq->value;
 
-       if(vwrq->disabled)
+       if (vwrq->disabled)
                rthr = 2347;
-       if((rthr < 0) || (rthr > 2347)) {
+       if ((rthr < 0) || (rthr > 2347)) {
                return -EINVAL;
        }
        priv->rts_threshold = rthr;
-       
+
        return -EINPROGRESS;            /* Call commit handler */
 }
 
@@ -2026,7 +2032,7 @@ static int atmel_get_rts(struct net_device *dev,
                         char *extra)
 {
        struct atmel_private *priv = netdev_priv(dev);
-       
+
        vwrq->value = priv->rts_threshold;
        vwrq->disabled = (vwrq->value >= 2347);
        vwrq->fixed = 1;
@@ -2042,14 +2048,14 @@ static int atmel_set_frag(struct net_device *dev,
        struct atmel_private *priv = netdev_priv(dev);
        int fthr = vwrq->value;
 
-       if(vwrq->disabled)
+       if (vwrq->disabled)
                fthr = 2346;
-       if((fthr < 256) || (fthr > 2346)) {
+       if ((fthr < 256) || (fthr > 2346)) {
                return -EINVAL;
        }
        fthr &= ~0x1;   /* Get an even value - is it really needed ??? */
        priv->frag_threshold = fthr;
-       
+
        return -EINPROGRESS;            /* Call commit handler */
 }
 
@@ -2077,21 +2083,21 @@ static int atmel_set_freq(struct net_device *dev,
 {
        struct atmel_private *priv = netdev_priv(dev);
        int rc = -EINPROGRESS;          /* Call commit handler */
-       
+
        /* If setting by frequency, convert to a channel */
-       if((fwrq->e == 1) &&
-          (fwrq->m >= (int) 241200000) &&
-          (fwrq->m <= (int) 248700000)) {
+       if ((fwrq->e == 1) &&
+           (fwrq->m >= (int) 241200000) &&
+           (fwrq->m <= (int) 248700000)) {
                int f = fwrq->m / 100000;
                int c = 0;
-               while((c < 14) && (f != frequency_list[c]))
+               while ((c < 14) && (f != frequency_list[c]))
                        c++;
                /* Hack to fall through... */
                fwrq->e = 0;
                fwrq->m = c + 1;
        }
        /* Setting by channel number */
-       if((fwrq->m > 1000) || (fwrq->e > 0))
+       if ((fwrq->m > 1000) || (fwrq->e > 0))
                rc = -EOPNOTSUPP;
        else {
                int channel = fwrq->m;
@@ -2099,7 +2105,7 @@ static int atmel_set_freq(struct net_device *dev,
                        priv->channel = channel;
                } else {
                        rc = -EINVAL;
-               } 
+               }
        }
        return rc;
 }
@@ -2130,7 +2136,7 @@ static int atmel_set_scan(struct net_device *dev,
         * This is not an error, while the device perform scanning,
         * traffic doesn't flow, so it's a perfect DoS...
         * Jean II */
-       
+
        if (priv->station_state == STATION_STATE_DOWN)
                return -EAGAIN;
 
@@ -2142,15 +2148,15 @@ static int atmel_set_scan(struct net_device *dev,
        /* Initiate a scan command */
        if (priv->site_survey_state == SITE_SURVEY_IN_PROGRESS)
                return -EBUSY;
-               
+
        del_timer_sync(&priv->management_timer);
        spin_lock_irqsave(&priv->irqlock, flags);
-       
+
        priv->site_survey_state = SITE_SURVEY_IN_PROGRESS;
        priv->fast_scan = 0;
        atmel_scan(priv, 0);
        spin_unlock_irqrestore(&priv->irqlock, flags);
-       
+
        return 0;
 }
 
@@ -2163,11 +2169,11 @@ static int atmel_get_scan(struct net_device *dev,
        int i;
        char *current_ev = extra;
        struct iw_event iwe;
-       
+
        if (priv->site_survey_state != SITE_SURVEY_COMPLETED)
                return -EAGAIN;
-       
-       for(i=0; i<priv->BSS_list_entries; i++) { 
+
+       for (i = 0; i < priv->BSS_list_entries; i++) {
                iwe.cmd = SIOCGIWAP;
                iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
                memcpy(iwe.u.ap_addr.sa_data, priv->BSSinfo[i].BSSID, 6);
@@ -2179,16 +2185,16 @@ static int atmel_get_scan(struct net_device *dev,
                iwe.cmd = SIOCGIWESSID;
                iwe.u.data.flags = 1;
                current_ev = iwe_stream_add_point(current_ev, extra + IW_SCAN_MAX_DATA, &iwe, priv->BSSinfo[i].SSID);
-               
+
                iwe.cmd = SIOCGIWMODE;
                iwe.u.mode = priv->BSSinfo[i].BSStype;
                current_ev = iwe_stream_add_event(current_ev, extra + IW_SCAN_MAX_DATA, &iwe, IW_EV_UINT_LEN);
-       
+
                iwe.cmd = SIOCGIWFREQ;
                iwe.u.freq.m = priv->BSSinfo[i].channel;
                iwe.u.freq.e = 0;
                current_ev = iwe_stream_add_event(current_ev, extra + IW_SCAN_MAX_DATA, &iwe, IW_EV_FREQ_LEN);
-               
+
                iwe.cmd = SIOCGIWENCODE;
                if (priv->BSSinfo[i].UsingWEP)
                        iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
@@ -2196,13 +2202,12 @@ static int atmel_get_scan(struct net_device *dev,
                        iwe.u.data.flags = IW_ENCODE_DISABLED;
                iwe.u.data.length = 0;
                current_ev = iwe_stream_add_point(current_ev, extra + IW_SCAN_MAX_DATA, &iwe, NULL);
-               
        }
 
        /* Length of data */
        dwrq->length = (current_ev - extra);
-       dwrq->flags = 0;   
-       
+       dwrq->flags = 0;
+
        return 0;
 }
 
@@ -2213,7 +2218,7 @@ static int atmel_get_range(struct net_device *dev,
 {
        struct atmel_private *priv = netdev_priv(dev);
        struct iw_range *range = (struct iw_range *) extra;
-       int k,i,j;
+       int k, i, j;
 
        dwrq->length = sizeof(struct iw_range);
        memset(range, 0, sizeof(struct iw_range));
@@ -2226,14 +2231,14 @@ static int atmel_get_range(struct net_device *dev,
                        break;
                }
        if (range->num_channels != 0) {
-               for(k = 0, i = channel_table[j].min; i <= channel_table[j].max; i++) {
+               for (k = 0, i = channel_table[j].min; i <= channel_table[j].max; i++) {
                        range->freq[k].i = i; /* List index */
-                       range->freq[k].m = frequency_list[i-1] * 100000;
+                       range->freq[k].m = frequency_list[i - 1] * 100000;
                        range->freq[k++].e = 1; /* Values in table in MHz -> * 10^5 * 10 */
                }
                range->num_frequency = k;
        }
-       
+
        range->max_qual.qual = 100;
        range->max_qual.level = 100;
        range->max_qual.noise = 0;
@@ -2261,11 +2266,11 @@ static int atmel_get_range(struct net_device *dev,
        range->encoding_size[1] = 13;
        range->num_encoding_sizes = 2;
        range->max_encoding_tokens = 4;
-       
+
        range->pmp_flags = IW_POWER_ON;
        range->pmt_flags = IW_POWER_ON;
        range->pm_capa = 0;
-       
+
        range->we_version_source = WIRELESS_EXT;
        range->we_version_compiled = WIRELESS_EXT;
        range->retry_capa = IW_RETRY_LIMIT ;
@@ -2289,7 +2294,7 @@ static int atmel_set_wap(struct net_device *dev,
 
        if (awrq->sa_family != ARPHRD_ETHER)
                return -EINVAL;
-       
+
        if (memcmp(bcast, awrq->sa_data, 6) == 0) {
                del_timer_sync(&priv->management_timer);
                spin_lock_irqsave(&priv->irqlock, flags);
@@ -2297,8 +2302,8 @@ static int atmel_set_wap(struct net_device *dev,
                spin_unlock_irqrestore(&priv->irqlock, flags);
                return 0;
        }
-       
-       for(i=0; i<priv->BSS_list_entries; i++) {
+
+       for (i = 0; i < priv->BSS_list_entries; i++) {
                if (memcmp(priv->BSSinfo[i].BSSID, awrq->sa_data, 6) == 0) {
                        if (!priv->wep_is_on && priv->BSSinfo[i].UsingWEP) {
                                return -EINVAL;
@@ -2313,10 +2318,10 @@ static int atmel_set_wap(struct net_device *dev,
                        }
                }
        }
-               
+
        return -EINVAL;
 }
-       
+
 static int atmel_config_commit(struct net_device *dev,
                               struct iw_request_info *info,    /* NULL */
                               void *zwrq,                      /* NULL */
@@ -2325,18 +2330,18 @@ static int atmel_config_commit(struct net_device *dev,
        return atmel_open(dev);
 }
 
-static const iw_handler                atmel_handler[] =
+static const iw_handler atmel_handler[] =
 {
        (iw_handler) atmel_config_commit,       /* SIOCSIWCOMMIT */
-       (iw_handler) atmel_get_name,            /* SIOCGIWNAME */
+       (iw_handler) atmel_get_name,            /* SIOCGIWNAME */
        (iw_handler) NULL,                      /* SIOCSIWNWID */
        (iw_handler) NULL,                      /* SIOCGIWNWID */
        (iw_handler) atmel_set_freq,            /* SIOCSIWFREQ */
        (iw_handler) atmel_get_freq,            /* SIOCGIWFREQ */
        (iw_handler) atmel_set_mode,            /* SIOCSIWMODE */
        (iw_handler) atmel_get_mode,            /* SIOCGIWMODE */
-       (iw_handler) NULL,                      /* SIOCSIWSENS */
-       (iw_handler) NULL,                      /* SIOCGIWSENS */
+       (iw_handler) NULL,                      /* SIOCSIWSENS */
+       (iw_handler) NULL,                      /* SIOCGIWSENS */
        (iw_handler) NULL,                      /* SIOCSIWRANGE */
        (iw_handler) atmel_get_range,           /* SIOCGIWRANGE */
        (iw_handler) NULL,                      /* SIOCSIWPRIV */
@@ -2350,13 +2355,13 @@ static const iw_handler         atmel_handler[] =
        (iw_handler) atmel_set_wap,             /* SIOCSIWAP */
        (iw_handler) atmel_get_wap,             /* SIOCGIWAP */
        (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) NULL,                      /* SIOCGIWAPLIST */
+       (iw_handler) NULL,                      /* SIOCGIWAPLIST */
        (iw_handler) atmel_set_scan,            /* SIOCSIWSCAN */
        (iw_handler) atmel_get_scan,            /* SIOCGIWSCAN */
        (iw_handler) atmel_set_essid,           /* SIOCSIWESSID */
        (iw_handler) atmel_get_essid,           /* SIOCGIWESSID */
-       (iw_handler) NULL,                      /* SIOCSIWNICKN */
-       (iw_handler) NULL,                      /* SIOCGIWNICKN */
+       (iw_handler) NULL,                      /* SIOCSIWNICKN */
+       (iw_handler) NULL,                      /* SIOCGIWNICKN */
        (iw_handler) NULL,                      /* -- hole -- */
        (iw_handler) NULL,                      /* -- hole -- */
        (iw_handler) atmel_set_rate,            /* SIOCSIWRATE */
@@ -2365,8 +2370,8 @@ static const iw_handler           atmel_handler[] =
        (iw_handler) atmel_get_rts,             /* SIOCGIWRTS */
        (iw_handler) atmel_set_frag,            /* SIOCSIWFRAG */
        (iw_handler) atmel_get_frag,            /* SIOCGIWFRAG */
-       (iw_handler) NULL,                      /* SIOCSIWTXPOW */
-       (iw_handler) NULL,                      /* SIOCGIWTXPOW */
+       (iw_handler) NULL,                      /* SIOCSIWTXPOW */
+       (iw_handler) NULL,                      /* SIOCGIWTXPOW */
        (iw_handler) atmel_set_retry,           /* SIOCSIWRETRY */
        (iw_handler) atmel_get_retry,           /* SIOCGIWRETRY */
        (iw_handler) atmel_set_encode,          /* SIOCSIWENCODE */
@@ -2375,39 +2380,51 @@ static const iw_handler         atmel_handler[] =
        (iw_handler) atmel_get_power,           /* SIOCGIWPOWER */
 };
 
-
-static const iw_handler                atmel_private_handler[] =
+static const iw_handler atmel_private_handler[] =
 {
        NULL,                           /* SIOCIWFIRSTPRIV */
 };
 
 typedef struct atmel_priv_ioctl {
        char id[32];
-       unsigned char __user *data;             
-       unsigned short len;             
+       unsigned char __user *data;
+       unsigned short len;
 } atmel_priv_ioctl;
 
-       
-#define ATMELFWL SIOCIWFIRSTPRIV
-#define ATMELIDIFC ATMELFWL + 1
-#define ATMELRD ATMELFWL + 2
-#define ATMELMAGIC 0x51807 
+#define ATMELFWL       SIOCIWFIRSTPRIV
+#define ATMELIDIFC     ATMELFWL + 1
+#define ATMELRD                ATMELFWL + 2
+#define ATMELMAGIC 0x51807
 #define REGDOMAINSZ 20
 
 static const struct iw_priv_args atmel_private_args[] = {
-/*{ cmd,         set_args,                            get_args, name } */
-  { ATMELFWL, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof (atmel_priv_ioctl), IW_PRIV_TYPE_NONE, "atmelfwl" },
-  { ATMELIDIFC, IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "atmelidifc" },
-  { ATMELRD, IW_PRIV_TYPE_CHAR | REGDOMAINSZ, IW_PRIV_TYPE_NONE, "regdomain" },
+       {
+               .cmd = ATMELFWL,
+               .set_args = IW_PRIV_TYPE_BYTE
+                               | IW_PRIV_SIZE_FIXED
+                               | sizeof (atmel_priv_ioctl),
+               .get_args = IW_PRIV_TYPE_NONE,
+               .name = "atmelfwl"
+       }, {
+               .cmd = ATMELIDIFC,
+               .set_args = IW_PRIV_TYPE_NONE,
+               .get_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+               .name = "atmelidifc"
+       }, {
+               .cmd = ATMELRD,
+               .set_args = IW_PRIV_TYPE_CHAR | REGDOMAINSZ,
+               .get_args = IW_PRIV_TYPE_NONE,
+               .name = "regdomain"
+       },
 };
 
-static const struct iw_handler_def     atmel_handler_def =
+static const struct iw_handler_def atmel_handler_def =
 {
        .num_standard   = sizeof(atmel_handler)/sizeof(iw_handler),
-       .num_private    = sizeof(atmel_private_handler)/sizeof(iw_handler), 
-       .num_private_args = sizeof(atmel_private_args)/sizeof(struct iw_priv_args), 
+       .num_private    = sizeof(atmel_private_handler)/sizeof(iw_handler),
+       .num_private_args = sizeof(atmel_private_args)/sizeof(struct iw_priv_args),
        .standard       = (iw_handler *) atmel_handler,
-       .private        = (iw_handler *) atmel_private_handler, 
+       .private        = (iw_handler *) atmel_private_handler,
        .private_args   = (struct iw_priv_args *) atmel_private_args,
        .get_wireless_stats = atmel_get_wireless_stats
 };
@@ -2419,13 +2436,13 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
        atmel_priv_ioctl com;
        struct iwreq *wrq = (struct iwreq *) rq;
        unsigned char *new_firmware;
-       char domain[REGDOMAINSZ+1];
+       char domain[REGDOMAINSZ + 1];
 
        switch (cmd) {
        case ATMELIDIFC:
-               wrq->u.param.value = ATMELMAGIC;                
+               wrq->u.param.value = ATMELMAGIC;
                break;
-       
+
        case ATMELFWL:
                if (copy_from_user(&com, rq->ifr_data, sizeof(com))) {
                        rc = -EFAULT;
@@ -2449,7 +2466,7 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                }
 
                kfree(priv->firmware);
-               
+
                priv->firmware = new_firmware;
                priv->firmware_length = com.len;
                strncpy(priv->firmware_id, com.id, 31);
@@ -2461,7 +2478,7 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        rc = -EFAULT;
                        break;
                }
-               
+
                if (!capable(CAP_NET_ADMIN)) {
                        rc = -EPERM;
                        break;
@@ -2484,15 +2501,15 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                                rc = 0;
                        }
                }
-               
+
                if (rc == 0 &&  priv->station_state != STATION_STATE_DOWN)
                        rc = atmel_open(dev);
                break;
-               
+
        default:
                rc = -EOPNOTSUPP;
        }
-       
+
        return rc;
 }
 
@@ -2503,17 +2520,17 @@ struct auth_body {
        u8 el_id;
        u8 chall_text_len;
        u8 chall_text[253];
-}; 
+};
 
 static void atmel_enter_state(struct atmel_private *priv, int new_state)
 {
        int old_state = priv->station_state;
-               
+
        if (new_state == old_state)
                return;
-       
+
        priv->station_state = new_state;
-               
+
        if (new_state == STATION_STATE_READY) {
                netif_start_queue(priv->dev);
                netif_carrier_on(priv->dev);
@@ -2540,7 +2557,7 @@ static void atmel_scan(struct atmel_private *priv, int specific_ssid)
                u8 options;
                u8 SSID_size;
        } cmd;
-       
+
        memset(cmd.BSSID, 0xff, 6);
 
        if (priv->fast_scan) {
@@ -2554,17 +2571,17 @@ static void atmel_scan(struct atmel_private *priv, int specific_ssid)
                cmd.min_channel_time = cpu_to_le16(10);
                cmd.max_channel_time = cpu_to_le16(120);
        }
-       
+
        cmd.options = 0;
-       
+
        if (!specific_ssid)
                cmd.options |= SCAN_OPTIONS_SITE_SURVEY;
-       
-       cmd.channel = (priv->channel & 0x7f); 
+
+       cmd.channel = (priv->channel & 0x7f);
        cmd.scan_type = SCAN_TYPE_ACTIVE;
-       cmd.BSS_type = cpu_to_le16(priv->operating_mode == IW_MODE_ADHOC ? 
+       cmd.BSS_type = cpu_to_le16(priv->operating_mode == IW_MODE_ADHOC ?
                BSS_TYPE_AD_HOC : BSS_TYPE_INFRASTRUCTURE);
-       
+
        atmel_send_command(priv, CMD_Scan, &cmd, sizeof(cmd));
 
        /* This must come after all hardware access to avoid being messed up
@@ -2591,16 +2608,15 @@ static void join(struct atmel_private *priv, int type)
        cmd.BSS_type = type;
        cmd.timeout = cpu_to_le16(2000);
 
-       atmel_send_command(priv, CMD_Join, &cmd, sizeof(cmd));
+       atmel_send_command(priv, CMD_Join, &cmd, sizeof(cmd));
 }
 
-
 static void start(struct atmel_private *priv, int type)
 {
        struct {
                u8 BSSID[6];
                u8 SSID[MAX_SSID_LENGTH];
-               u8 BSS_type;                                
+               u8 BSS_type;
                u8 channel;
                u8 SSID_size;
                u8 reserved[3];
@@ -2612,13 +2628,14 @@ static void start(struct atmel_private *priv, int type)
        cmd.BSS_type = type;
        cmd.channel = (priv->channel & 0x7f);
 
-       atmel_send_command(priv, CMD_Start, &cmd, sizeof(cmd)); 
+       atmel_send_command(priv, CMD_Start, &cmd, sizeof(cmd));
 }
 
-static void handle_beacon_probe(struct atmel_private *priv, u16 capability, u8 channel)
+static void handle_beacon_probe(struct atmel_private *priv, u16 capability,
+                               u8 channel)
 {
        int rejoin = 0;
-       int new = capability  & C80211_MGMT_CAPABILITY_ShortPreamble ? 
+       int new = capability  & C80211_MGMT_CAPABILITY_ShortPreamble ?
                SHORT_PREAMBLE : LONG_PREAMBLE;
 
        if (priv->preamble != new) {
@@ -2626,48 +2643,48 @@ static void handle_beacon_probe(struct atmel_private *priv, u16 capability, u8 c
                rejoin = 1;
                atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_PREAMBLE_TYPE, new);
        }
-               
+
        if (priv->channel != channel) {
                priv->channel = channel;
                rejoin = 1;
                atmel_set_mib8(priv, Phy_Mib_Type, PHY_MIB_CHANNEL_POS, channel);
        }
-       
+
        if (rejoin) {
                priv->station_is_associated = 0;
                atmel_enter_state(priv, STATION_STATE_JOINNING);
-               
+
                if (priv->operating_mode == IW_MODE_INFRA)
                        join(priv, BSS_TYPE_INFRASTRUCTURE);
-               else 
+               else
                        join(priv, BSS_TYPE_AD_HOC);
-       } 
+       }
 }
 
-
-static void send_authentication_request(struct atmel_private *priv, u16 system, u8 *challenge, int challenge_len)
+static void send_authentication_request(struct atmel_private *priv, u16 system,
+                                       u8 *challenge, int challenge_len)
 {
        struct ieee80211_hdr_4addr header;
        struct auth_body auth;
-       
-       header.frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH); 
-       header.duration_id      = cpu_to_le16(0x8000);  
+
+       header.frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
+       header.duration_id = cpu_to_le16(0x8000);
        header.seq_ctl = 0;
        memcpy(header.addr1, priv->CurrentBSSID, 6);
        memcpy(header.addr2, priv->dev->dev_addr, 6);
        memcpy(header.addr3, priv->CurrentBSSID, 6);
-       
-       if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1) 
+
+       if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1)
                /* no WEP for authentication frames with TrSeqNo 1 */
                 header.frame_ctl |=  cpu_to_le16(IEEE80211_FCTL_PROTECTED);
-       
-       auth.alg = cpu_to_le16(system); 
+
+       auth.alg = cpu_to_le16(system);
 
        auth.status = 0;
        auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum);
-       priv->ExpectedAuthentTransactionSeqNum = priv->CurrentAuthentTransactionSeqNum+1; 
+       priv->ExpectedAuthentTransactionSeqNum = priv->CurrentAuthentTransactionSeqNum+1;
        priv->CurrentAuthentTransactionSeqNum += 2;
-       
+
        if (challenge_len != 0) {
                auth.el_id = 16; /* challenge_text */
                auth.chall_text_len = challenge_len;
@@ -2685,7 +2702,7 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc)
        struct ieee80211_hdr_4addr header;
        struct ass_req_format {
                u16 capability;
-               u16 listen_interval; 
+               u16 listen_interval;
                u8 ap[6]; /* nothing after here directly accessible */
                u8 ssid_el_id;
                u8 ssid_len;
@@ -2694,15 +2711,15 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc)
                u8 sup_rates_len;
                u8 rates[4];
        } body;
-               
-       header.frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
+
+       header.frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT |
                (is_reassoc ? IEEE80211_STYPE_REASSOC_REQ : IEEE80211_STYPE_ASSOC_REQ));
        header.duration_id = cpu_to_le16(0x8000);
        header.seq_ctl = 0;
 
-       memcpy(header.addr1, priv->CurrentBSSID, 6); 
+       memcpy(header.addr1, priv->CurrentBSSID, 6);
        memcpy(header.addr2, priv->dev->dev_addr, 6);
-       memcpy(header.addr3, priv->CurrentBSSID, 6); 
+       memcpy(header.addr3, priv->CurrentBSSID, 6);
 
        body.capability = cpu_to_le16(C80211_MGMT_CAPABILITY_ESS);
        if (priv->wep_is_on)
@@ -2711,18 +2728,18 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc)
                body.capability |= cpu_to_le16(C80211_MGMT_CAPABILITY_ShortPreamble);
 
        body.listen_interval = cpu_to_le16(priv->listen_interval * priv->beacon_period);
-       
+
        /* current AP address - only in reassoc frame */
        if (is_reassoc) {
-               memcpy(body.ap,  priv->CurrentBSSID, 6);
+               memcpy(body.ap, priv->CurrentBSSID, 6);
                ssid_el_p = (u8 *)&body.ssid_el_id;
                bodysize = 18 + priv->SSID_size;
        } else {
                ssid_el_p = (u8 *)&body.ap[0];
                bodysize = 12 + priv->SSID_size;
        }
-               
-       ssid_el_p[0]= C80211_MGMT_ElementID_SSID;
+
+       ssid_el_p[0] = C80211_MGMT_ElementID_SSID;
        ssid_el_p[1] = priv->SSID_size;
        memcpy(ssid_el_p + 2, priv->SSID, priv->SSID_size);
        ssid_el_p[2 + priv->SSID_size] = C80211_MGMT_ElementID_SupportedRates;
@@ -2732,7 +2749,8 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc)
        atmel_transmit_management_frame(priv, &header, (void *)&body, bodysize);
 }
 
-static int is_frame_from_current_bss(struct atmel_private *priv, struct ieee80211_hdr_4addr *header)
+static int is_frame_from_current_bss(struct atmel_private *priv,
+                                    struct ieee80211_hdr_4addr *header)
 {
        if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS)
                return memcmp(header->addr3, priv->CurrentBSSID, 6) == 0;
@@ -2745,29 +2763,29 @@ static int retrieve_bss(struct atmel_private *priv)
        int i;
        int max_rssi = -128;
        int max_index = -1;
-       
+
        if (priv->BSS_list_entries == 0)
                return -1;
-                       
+
        if (priv->connect_to_any_BSS) {
-               /* Select a BSS with the max-RSSI but of the same type and of the same WEP mode
-                  and that it is not marked as 'bad' (i.e. we had previously failed to connect to
-                  this BSS with the settings that we currently use) */
+               /* Select a BSS with the max-RSSI but of the same type and of
+                  the same WEP mode and that it is not marked as 'bad' (i.e.
+                  we had previously failed to connect to this BSS with the
+                  settings that we currently use) */
                priv->current_BSS = 0;
-               for(i=0; i<priv->BSS_list_entries; i++) { 
+               for (i = 0; i < priv->BSS_list_entries; i++) {
                        if (priv->operating_mode == priv->BSSinfo[i].BSStype &&
-                           ((!priv->wep_is_on && !priv->BSSinfo[i].UsingWEP) || 
+                           ((!priv->wep_is_on && !priv->BSSinfo[i].UsingWEP) ||
                             (priv->wep_is_on && priv->BSSinfo[i].UsingWEP)) &&
                            !(priv->BSSinfo[i].channel & 0x80)) {
                                max_rssi = priv->BSSinfo[i].RSSI;
                                priv->current_BSS = max_index = i;
                        }
-                       
                }
                return max_index;
        }
-               
-       for(i=0; i<priv->BSS_list_entries; i++) {
+
+       for (i = 0; i < priv->BSS_list_entries; i++) {
                if (priv->SSID_size == priv->BSSinfo[i].SSIDsize &&
                    memcmp(priv->SSID, priv->BSSinfo[i].SSID, priv->SSID_size) == 0 &&
                    priv->operating_mode == priv->BSSinfo[i].BSStype &&
@@ -2781,19 +2799,19 @@ static int retrieve_bss(struct atmel_private *priv)
        return max_index;
 }
 
-
-static void store_bss_info(struct atmel_private *priv, struct ieee80211_hdr_4addr *header,
-                          u16 capability, u16 beacon_period, u8 channel, u8 rssi, 
-                          u8 ssid_len, u8 *ssid, int is_beacon)
+static void store_bss_info(struct atmel_private *priv,
+                          struct ieee80211_hdr_4addr *header, u16 capability,
+                          u16 beacon_period, u8 channel, u8 rssi, u8 ssid_len,
+                          u8 *ssid, int is_beacon)
 {
        u8 *bss = capability & C80211_MGMT_CAPABILITY_ESS ? header->addr2 : header->addr3;
        int i, index;
-               
-       for (index = -1, i = 0; i < priv->BSS_list_entries; i++) 
-               if (memcmp(bss, priv->BSSinfo[i].BSSID, 6) == 0) 
+
+       for (index = -1, i = 0; i < priv->BSS_list_entries; i++)
+               if (memcmp(bss, priv->BSSinfo[i].BSSID, 6) == 0)
                        index = i;
 
-        /* If we process a probe and an entry from this BSS exists 
+        /* If we process a probe and an entry from this BSS exists
           we will update the BSS entry with the info from this BSS.
           If we process a beacon we will only update RSSI */
 
@@ -2820,8 +2838,8 @@ static void store_bss_info(struct atmel_private *priv, struct ieee80211_hdr_4add
                priv->BSSinfo[index].BSStype = IW_MODE_ADHOC;
        else if (capability & C80211_MGMT_CAPABILITY_ESS)
                priv->BSSinfo[index].BSStype =IW_MODE_INFRA;
-       
-       priv->BSSinfo[index].preamble = capability  & C80211_MGMT_CAPABILITY_ShortPreamble ? 
+
+       priv->BSSinfo[index].preamble = capability & C80211_MGMT_CAPABILITY_ShortPreamble ?
                SHORT_PREAMBLE : LONG_PREAMBLE;
 }
 
@@ -2831,8 +2849,8 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
        u16 status = le16_to_cpu(auth->status);
        u16 trans_seq_no = le16_to_cpu(auth->trans_seq);
        u16 system = le16_to_cpu(auth->alg);
-       
-       if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) { 
+
+       if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) {
                /* no WEP */
                if (priv->station_was_associated) {
                        atmel_enter_state(priv, STATION_STATE_REASSOCIATING);
@@ -2842,20 +2860,20 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
                        atmel_enter_state(priv, STATION_STATE_ASSOCIATING);
                        send_association_request(priv, 0);
                        return;
-               } 
+               }
        }
-               
-       if (status == C80211_MGMT_SC_Success && priv->wep_is_on) { 
+
+       if (status == C80211_MGMT_SC_Success && priv->wep_is_on) {
                /* WEP */
                if (trans_seq_no != priv->ExpectedAuthentTransactionSeqNum)
                        return;
-                               
+
                if (trans_seq_no == 0x0002 &&
                    auth->el_id == C80211_MGMT_ElementID_ChallengeText) {
                        send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len);
                        return;
                }
-               
+
                if (trans_seq_no == 0x0004) {
                        if(priv->station_was_associated) {
                                atmel_enter_state(priv, STATION_STATE_REASSOCIATING);
@@ -2865,10 +2883,10 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
                                atmel_enter_state(priv, STATION_STATE_ASSOCIATING);
                                send_association_request(priv, 0);
                                return;
-                       } 
+                       }
                }
-       }                       
-       
+       }
+
        if (status == C80211_MGMT_SC_AuthAlgNotSupported) {
                /* Do opensystem first, then try sharedkey */
                if (system ==  C80211_MGMT_AAN_OPENSYSTEM) {
@@ -2876,17 +2894,16 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
                        send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0);
                } else if (priv->connect_to_any_BSS) {
                        int bss_index;
-                       
+
                        priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80;
-                       
+
                        if ((bss_index  = retrieve_bss(priv)) != -1) {
                                atmel_join_bss(priv, bss_index);
                                return;
                        }
                }
        }
-       
-       
+
        priv->AuthenticationRequestRetryCnt = 0;
        atmel_enter_state(priv,  STATION_STATE_MGMT_ERROR);
        priv->station_is_associated = 0;
@@ -2902,38 +2919,44 @@ static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype)
                u8 length;
                u8 rates[4];
        } *ass_resp = (struct ass_resp_format *)priv->rx_buf;
-       
-               u16 status = le16_to_cpu(ass_resp->status);
+
+       u16 status = le16_to_cpu(ass_resp->status);
        u16 ass_id = le16_to_cpu(ass_resp->ass_id);
-       u16 rates_len = ass_resp->length > 4 ? 4 : ass_resp->length;
-       
+       u16 rates_len = ass_resp->length > 4 ? 4 : ass_resp->length;
+
        if (frame_len < 8 + rates_len)
                return;
-       
+
        if (status == C80211_MGMT_SC_Success) {
                if (subtype == C80211_SUBTYPE_MGMT_ASS_RESPONSE)
                        priv->AssociationRequestRetryCnt = 0;
                else
                        priv->ReAssociationRequestRetryCnt = 0;
-               
-               atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_STATION_ID_POS, ass_id & 0x3fff);
-               atmel_set_mib(priv, Phy_Mib_Type, PHY_MIB_RATE_SET_POS, ass_resp->rates, rates_len);
+
+               atmel_set_mib16(priv, Mac_Mgmt_Mib_Type,
+                               MAC_MGMT_MIB_STATION_ID_POS, ass_id & 0x3fff);
+               atmel_set_mib(priv, Phy_Mib_Type,
+                             PHY_MIB_RATE_SET_POS, ass_resp->rates, rates_len);
                if (priv->power_mode == 0) {
                        priv->listen_interval = 1;
-                       atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_PS_MODE_POS,  ACTIVE_MODE);
-                       atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 1);
+                       atmel_set_mib8(priv, Mac_Mgmt_Mib_Type,
+                                      MAC_MGMT_MIB_PS_MODE_POS, ACTIVE_MODE);
+                       atmel_set_mib16(priv, Mac_Mgmt_Mib_Type,
+                                       MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 1);
                } else {
                        priv->listen_interval = 2;
-                       atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_PS_MODE_POS,  PS_MODE);
-                       atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 2);
+                       atmel_set_mib8(priv, Mac_Mgmt_Mib_Type,
+                                      MAC_MGMT_MIB_PS_MODE_POS,  PS_MODE);
+                       atmel_set_mib16(priv, Mac_Mgmt_Mib_Type,
+                                       MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 2);
                }
-               
+
                priv->station_is_associated = 1;
                priv->station_was_associated = 1;
                atmel_enter_state(priv, STATION_STATE_READY);
                return;
        }
-       
+
        if (subtype == C80211_SUBTYPE_MGMT_ASS_RESPONSE &&
            status != C80211_MGMT_SC_AssDeniedBSSRate &&
            status != C80211_MGMT_SC_SupportCapabilities &&
@@ -2943,7 +2966,7 @@ static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype)
                send_association_request(priv, 0);
                return;
        }
-               
+
        if (subtype == C80211_SUBTYPE_MGMT_REASS_RESPONSE &&
            status != C80211_MGMT_SC_AssDeniedBSSRate &&
            status != C80211_MGMT_SC_SupportCapabilities &&
@@ -2953,17 +2976,16 @@ static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype)
                send_association_request(priv, 1);
                return;
        }
-       
+
        atmel_enter_state(priv,  STATION_STATE_MGMT_ERROR);
        priv->station_is_associated = 0;
-       
-       if(priv->connect_to_any_BSS) {
+
+       if (priv->connect_to_any_BSS) {
                int bss_index;
                priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80;
-               
-               if ((bss_index = retrieve_bss(priv)) != -1) 
+
+               if ((bss_index = retrieve_bss(priv)) != -1)
                        atmel_join_bss(priv, bss_index);
-               
        }
 }
 
@@ -2977,7 +2999,7 @@ void atmel_join_bss(struct atmel_private *priv, int bss_index)
        /* The WPA stuff cares about the current AP address */
        if (priv->use_wpa)
                build_wpa_mib(priv);
-       
+
        /* When switching to AdHoc turn OFF Power Save if needed */
 
        if (bss->BSStype == IW_MODE_ADHOC &&
@@ -2985,25 +3007,28 @@ void atmel_join_bss(struct atmel_private *priv, int bss_index)
            priv->power_mode) {
                priv->power_mode = 0;
                priv->listen_interval = 1;
-               atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_PS_MODE_POS,  ACTIVE_MODE);
-               atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 1);
+               atmel_set_mib8(priv, Mac_Mgmt_Mib_Type,
+                              MAC_MGMT_MIB_PS_MODE_POS,  ACTIVE_MODE);
+               atmel_set_mib16(priv, Mac_Mgmt_Mib_Type,
+                               MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 1);
        }
-               
+
        priv->operating_mode = bss->BSStype;
-       priv->channel = bss->channel & 0x7f;    
+       priv->channel = bss->channel & 0x7f;
        priv->beacon_period = bss->beacon_period;
-       
+
        if (priv->preamble != bss->preamble) {
                priv->preamble = bss->preamble;
-               atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_PREAMBLE_TYPE, bss->preamble);
+               atmel_set_mib8(priv, Local_Mib_Type,
+                              LOCAL_MIB_PREAMBLE_TYPE, bss->preamble);
        }
-       
+
        if (!priv->wep_is_on && bss->UsingWEP) {
                atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
                priv->station_is_associated = 0;
                return;
        }
-               
+
        if (priv->wep_is_on && !bss->UsingWEP) {
                atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
                priv->station_is_associated = 0;
@@ -3011,30 +3036,28 @@ void atmel_join_bss(struct atmel_private *priv, int bss_index)
        }
 
        atmel_enter_state(priv, STATION_STATE_JOINNING);
-       
+
        if (priv->operating_mode == IW_MODE_INFRA)
                join(priv, BSS_TYPE_INFRASTRUCTURE);
-       else 
+       else
                join(priv, BSS_TYPE_AD_HOC);
 }
 
-
 static void restart_search(struct atmel_private *priv)
 {
        int bss_index;
-       
+
        if (!priv->connect_to_any_BSS) {
                atmel_scan(priv, 1);
        } else {
                priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80;
-               
-               if ((bss_index = retrieve_bss(priv)) != -1) 
+
+               if ((bss_index = retrieve_bss(priv)) != -1)
                        atmel_join_bss(priv, bss_index);
                else
                        atmel_scan(priv, 0);
-               
-       } 
-}      
+       }
+}
 
 static void smooth_rssi(struct atmel_private *priv, u8 rssi)
 {
@@ -3050,21 +3073,21 @@ static void smooth_rssi(struct atmel_private *priv, u8 rssi)
        }
 
        rssi = rssi * 100 / max_rssi;
-       if((rssi + old) % 2)
-               priv->wstats.qual.level =  ((rssi + old)/2) + 1;
+       if ((rssi + old) % 2)
+               priv->wstats.qual.level = (rssi + old) / 2 + 1;
        else
-               priv->wstats.qual.level =  ((rssi + old)/2);            
+               priv->wstats.qual.level = (rssi + old) / 2;
        priv->wstats.qual.updated |= IW_QUAL_LEVEL_UPDATED;
        priv->wstats.qual.updated &= ~IW_QUAL_LEVEL_INVALID;
 }
 
 static void atmel_smooth_qual(struct atmel_private *priv)
 {
-       unsigned long time_diff = (jiffies - priv->last_qual)/HZ;
+       unsigned long time_diff = (jiffies - priv->last_qual) / HZ;
        while (time_diff--) {
                priv->last_qual += HZ;
-               priv->wstats.qual.qual = priv->wstats.qual.qual/2;
-               priv->wstats.qual.qual += 
+               priv->wstats.qual.qual = priv->wstats.qual.qual / 2;
+               priv->wstats.qual.qual +=
                        priv->beacons_this_sec * priv->beacon_period * (priv->wstats.qual.level + 100) / 4000;
                priv->beacons_this_sec = 0;
        }
@@ -3073,15 +3096,17 @@ static void atmel_smooth_qual(struct atmel_private *priv)
 }
 
 /* deals with incoming managment frames. */
-static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_hdr_4addr *header, 
-                     u16 frame_len, u8 rssi)
+static void atmel_management_frame(struct atmel_private *priv,
+                                  struct ieee80211_hdr_4addr *header,
+                                  u16 frame_len, u8 rssi)
 {
        u16 subtype;
-       
-       switch (subtype = le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_STYPE) {
-       case C80211_SUBTYPE_MGMT_BEACON :
+
+       subtype = le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_STYPE;
+       switch (subtype) {
+       case C80211_SUBTYPE_MGMT_BEACON:
        case C80211_SUBTYPE_MGMT_ProbeResponse:
-               
+
                /* beacon frame has multiple variable-length fields -
                   never let an engineer loose with a data structure design. */
                {
@@ -3099,7 +3124,7 @@ static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_
                                u8 ds_length;
                                /* ds here */
                        } *beacon = (struct beacon_format *)priv->rx_buf;
-                       
+
                        u8 channel, rates_length, ssid_length;
                        u64 timestamp = le64_to_cpu(beacon->timestamp);
                        u16 beacon_interval = le16_to_cpu(beacon->interval);
@@ -3107,7 +3132,7 @@ static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_
                        u8 *beaconp = priv->rx_buf;
                        ssid_length = beacon->ssid_length;
                        /* this blows chunks. */
-                       if (frame_len < 14 || frame_len < ssid_length + 15) 
+                       if (frame_len < 14 || frame_len < ssid_length + 15)
                                return;
                        rates_length = beaconp[beacon->ssid_length + 15];
                        if (frame_len < ssid_length + rates_length + 18)
@@ -3115,10 +3140,10 @@ static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_
                        if (ssid_length >  MAX_SSID_LENGTH)
                                return;
                        channel = beaconp[ssid_length + rates_length + 18];
-                      
+
                        if (priv->station_state == STATION_STATE_READY) {
                                smooth_rssi(priv, rssi);
-                               if (is_frame_from_current_bss(priv, header)) { 
+                               if (is_frame_from_current_bss(priv, header)) {
                                        priv->beacons_this_sec++;
                                        atmel_smooth_qual(priv);
                                        if (priv->last_beacon_timestamp) {
@@ -3132,41 +3157,43 @@ static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_
                                        handle_beacon_probe(priv, capability, channel);
                                }
                        }
-                       
-                       if (priv->station_state == STATION_STATE_SCANNING ) 
-                               store_bss_info(priv, header, capability, beacon_interval, channel,
-                                              rssi, ssid_length, &beacon->rates_el_id,
-                                              subtype == C80211_SUBTYPE_MGMT_BEACON) ;
+
+                       if (priv->station_state == STATION_STATE_SCANNING)
+                               store_bss_info(priv, header, capability,
+                                              beacon_interval, channel, rssi,
+                                              ssid_length,
+                                              &beacon->rates_el_id,
+                                              subtype == C80211_SUBTYPE_MGMT_BEACON);
                }
                break;
-               
+
        case C80211_SUBTYPE_MGMT_Authentication:
 
                if (priv->station_state == STATION_STATE_AUTHENTICATING)
                        authenticate(priv, frame_len);
-       
+
                break;
-               
+
        case C80211_SUBTYPE_MGMT_ASS_RESPONSE:
        case C80211_SUBTYPE_MGMT_REASS_RESPONSE:
-               
-               if (priv->station_state == STATION_STATE_ASSOCIATING || 
+
+               if (priv->station_state == STATION_STATE_ASSOCIATING ||
                    priv->station_state == STATION_STATE_REASSOCIATING)
                        associate(priv, frame_len, subtype);
-               
+
                break;
 
        case C80211_SUBTYPE_MGMT_DISASSOSIATION:
-               if (priv->station_is_associated && 
-                   priv->operating_mode == IW_MODE_INFRA && 
+               if (priv->station_is_associated &&
+                   priv->operating_mode == IW_MODE_INFRA &&
                    is_frame_from_current_bss(priv, header)) {
                        priv->station_was_associated = 0;
                        priv->station_is_associated = 0;
-                       
+
                        atmel_enter_state(priv, STATION_STATE_JOINNING);
                        join(priv, BSS_TYPE_INFRASTRUCTURE);
                }
-               
+
                break;
 
        case C80211_SUBTYPE_MGMT_Deauthentication:
@@ -3177,7 +3204,7 @@ static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_
                        atmel_enter_state(priv, STATION_STATE_JOINNING);
                        join(priv, BSS_TYPE_INFRASTRUCTURE);
                }
-               
+
                break;
        }
 }
@@ -3185,76 +3212,73 @@ static void atmel_management_frame(struct atmel_private *priv, struct ieee80211_
 /* run when timer expires */
 static void atmel_management_timer(u_long a)
 {
-  struct net_device *dev = (struct net_device *) a;
-  struct atmel_private *priv = netdev_priv(dev);
-  unsigned long flags;
-  
-  /* Check if the card has been yanked. */
-  if (priv->card && priv->present_callback && 
-      !(*priv->present_callback)(priv->card))
-         return;
-  
-  spin_lock_irqsave(&priv->irqlock, flags);
-
-  switch (priv->station_state) {
-         
-  case STATION_STATE_AUTHENTICATING:
-         if (priv->AuthenticationRequestRetryCnt >= MAX_AUTHENTICATION_RETRIES) {
-                 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
-                 priv->station_is_associated = 0;
-                 priv->AuthenticationRequestRetryCnt = 0;
-                 restart_search(priv);
-         } else {
-                 priv->AuthenticationRequestRetryCnt++;
-                 priv->CurrentAuthentTransactionSeqNum = 0x0001;
-                 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
-                 send_authentication_request(priv, C80211_MGMT_AAN_OPENSYSTEM, NULL, 0);
-         }
-         
-         break;
+       struct net_device *dev = (struct net_device *) a;
+       struct atmel_private *priv = netdev_priv(dev);
+       unsigned long flags;
 
-  case STATION_STATE_ASSOCIATING:
-         if (priv->AssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) {
-                 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
-                 priv->station_is_associated = 0;
-                 priv->AssociationRequestRetryCnt = 0;
-                 restart_search(priv);
-         } else {
-                 priv->AssociationRequestRetryCnt++;
-                 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
-                 send_association_request(priv, 0);
-         }
+       /* Check if the card has been yanked. */
+       if (priv->card && priv->present_callback &&
+               !(*priv->present_callback)(priv->card))
+               return;
 
-         break;
-                 
-  case STATION_STATE_REASSOCIATING:    
-         if (priv->ReAssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) {
-                 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
-                 priv->station_is_associated = 0;
-                 priv->ReAssociationRequestRetryCnt = 0;
-                 restart_search(priv);
-         } else {
-                 priv->ReAssociationRequestRetryCnt++;
-                 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
-                 send_association_request(priv, 1);
-         }
+       spin_lock_irqsave(&priv->irqlock, flags);
+
+       switch (priv->station_state) {
 
+       case STATION_STATE_AUTHENTICATING:
+               if (priv->AuthenticationRequestRetryCnt >= MAX_AUTHENTICATION_RETRIES) {
+                       atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
+                       priv->station_is_associated = 0;
+                       priv->AuthenticationRequestRetryCnt = 0;
+                       restart_search(priv);
+               } else {
+                       priv->AuthenticationRequestRetryCnt++;
+                       priv->CurrentAuthentTransactionSeqNum = 0x0001;
+                       mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
+                       send_authentication_request(priv, C80211_MGMT_AAN_OPENSYSTEM, NULL, 0);
+         }
          break;
-  
-  default:
+
+       case STATION_STATE_ASSOCIATING:
+               if (priv->AssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) {
+                       atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
+                       priv->station_is_associated = 0;
+                       priv->AssociationRequestRetryCnt = 0;
+                       restart_search(priv);
+               } else {
+                       priv->AssociationRequestRetryCnt++;
+                       mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
+                       send_association_request(priv, 0);
+               }
          break;
-  }
-  
-  spin_unlock_irqrestore(&priv->irqlock, flags);
+
+       case STATION_STATE_REASSOCIATING:
+               if (priv->ReAssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) {
+                       atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);
+                       priv->station_is_associated = 0;
+                       priv->ReAssociationRequestRetryCnt = 0;
+                       restart_search(priv);
+               } else {
+                       priv->ReAssociationRequestRetryCnt++;
+                       mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
+                       send_association_request(priv, 1);
+               }
+               break;
+
+       default:
+               break;
+       }
+
+       spin_unlock_irqrestore(&priv->irqlock, flags);
 }
-  
+
 static void atmel_command_irq(struct atmel_private *priv)
 {
        u8 status = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET));
        u8 command = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_COMMAND_OFFSET));
        int fast_scan;
-       
-       if (status == CMD_STATUS_IDLE || 
+
+       if (status == CMD_STATUS_IDLE ||
            status == CMD_STATUS_IN_PROGRESS)
                return;
 
@@ -3266,20 +3290,20 @@ static void atmel_command_irq(struct atmel_private *priv)
                        atmel_get_mib(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_BSSID_POS,
                                      (u8 *)priv->CurrentBSSID, 6);
                        atmel_enter_state(priv, STATION_STATE_READY);
-               }                       
+               }
                break;
-               
+
        case CMD_Scan:
                fast_scan = priv->fast_scan;
                priv->fast_scan = 0;
-               
+
                if (status != CMD_STATUS_COMPLETE) {
                        atmel_scan(priv, 1);
                } else {
                        int bss_index = retrieve_bss(priv);
                        if (bss_index != -1) {
                                atmel_join_bss(priv, bss_index);
-                       } else if (priv->operating_mode == IW_MODE_ADHOC && 
+                       } else if (priv->operating_mode == IW_MODE_ADHOC &&
                                   priv->SSID_size != 0) {
                                start(priv, BSS_TYPE_AD_HOC);
                        } else {
@@ -3289,16 +3313,16 @@ static void atmel_command_irq(struct atmel_private *priv)
                        priv->site_survey_state = SITE_SURVEY_COMPLETED;
                }
                break;
-               
+
        case CMD_SiteSurvey:
                priv->fast_scan = 0;
-               
+
                if (status != CMD_STATUS_COMPLETE)
                        return;
-               
+
                priv->site_survey_state = SITE_SURVEY_COMPLETED;
                if (priv->station_is_associated) {
-                       atmel_enter_state(priv, STATION_STATE_READY);                           
+                       atmel_enter_state(priv, STATION_STATE_READY);
                } else {
                        atmel_scan(priv, 1);
                }
@@ -3312,16 +3336,15 @@ static void atmel_command_irq(struct atmel_private *priv)
                        } else {
                                priv->AuthenticationRequestRetryCnt = 0;
                                atmel_enter_state(priv, STATION_STATE_AUTHENTICATING);
-                               
+
                                mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
                                priv->CurrentAuthentTransactionSeqNum = 0x0001;
                                send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0);
                        }
                        return;
                }
-               
+
                atmel_scan(priv, 1);
-               
        }
 }
 
@@ -3333,20 +3356,20 @@ static int atmel_wakeup_firmware(struct atmel_private *priv)
 
        if (priv->card_type == CARD_TYPE_SPI_FLASH)
                atmel_set_gcr(priv->dev, GCR_REMAP);
-       
+
        /* wake up on-board processor */
        atmel_clear_gcr(priv->dev, 0x0040);
        atmel_write16(priv->dev, BSR, BSS_SRAM);
-       
+
        if (priv->card_type == CARD_TYPE_SPI_FLASH)
                mdelay(100);
 
        /* and wait for it */
-       for (i =  LOOP_RETRY_LIMIT; i; i--) {
+       for (i = LOOP_RETRY_LIMIT; i; i--) {
                mr1 = atmel_read16(priv->dev, MR1);
                mr3 = atmel_read16(priv->dev, MR3);
-               
-               if (mr3 & MAC_BOOT_COMPLETE) 
+
+               if (mr3 & MAC_BOOT_COMPLETE)
                        break;
                if (mr1 & MAC_BOOT_COMPLETE &&
                    priv->bus_type == BUS_TYPE_PCCARD)
@@ -3357,35 +3380,36 @@ static int atmel_wakeup_firmware(struct atmel_private *priv)
                printk(KERN_ALERT "%s: MAC failed to boot.\n", priv->dev->name);
                return 0;
        }
-               
+
        if ((priv->host_info_base = atmel_read16(priv->dev, MR2)) == 0xffff) {
                printk(KERN_ALERT "%s: card missing.\n", priv->dev->name);
                return 0;
        }
-       
-       /* now check for completion of MAC initialization through  
-          the FunCtrl field of the IFACE, poll MR1 to detect completion of       
-          MAC initialization, check completion status, set interrupt mask,  
-          enables interrupts and calls Tx and Rx initialization functions */  
-       
+
+       /* now check for completion of MAC initialization through
+          the FunCtrl field of the IFACE, poll MR1 to detect completion of
+          MAC initialization, check completion status, set interrupt mask,
+          enables interrupts and calls Tx and Rx initialization functions */
+
        atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET), FUNC_CTRL_INIT_COMPLETE);
-       
-       for (i =  LOOP_RETRY_LIMIT; i; i--) {
+
+       for (i = LOOP_RETRY_LIMIT; i; i--) {
                mr1 = atmel_read16(priv->dev, MR1);
                mr3 = atmel_read16(priv->dev, MR3);
-               
-               if (mr3 & MAC_INIT_COMPLETE) 
+
+               if (mr3 & MAC_INIT_COMPLETE)
                        break;
                if (mr1 & MAC_INIT_COMPLETE &&
                    priv->bus_type == BUS_TYPE_PCCARD)
                        break;
        }
-       
+
        if (i == 0) {
-               printk(KERN_ALERT "%s: MAC failed to initialise.\n", priv->dev->name);
+               printk(KERN_ALERT "%s: MAC failed to initialise.\n",
+                               priv->dev->name);
                return 0;
        }
-       
+
        /* Check for MAC_INIT_OK only on the register that the MAC_INIT_OK was set */
        if ((mr3 & MAC_INIT_COMPLETE) &&
            !(atmel_read16(priv->dev, MR3) & MAC_INIT_OK)) {
@@ -3398,9 +3422,9 @@ static int atmel_wakeup_firmware(struct atmel_private *priv)
                return 0;
        }
 
-       atmel_copy_to_host(priv->dev, (unsigned char *)iface, 
+       atmel_copy_to_host(priv->dev, (unsigned char *)iface,
                           priv->host_info_base, sizeof(*iface));
-        
+
        iface->tx_buff_pos = le16_to_cpu(iface->tx_buff_pos);
        iface->tx_buff_size = le16_to_cpu(iface->tx_buff_size);
        iface->tx_desc_pos = le16_to_cpu(iface->tx_desc_pos);
@@ -3424,16 +3448,16 @@ static int probe_atmel_card(struct net_device *dev)
 {
        int rc = 0;
        struct atmel_private *priv = netdev_priv(dev);
-        
+
        /* reset pccard */
-       if (priv->bus_type == BUS_TYPE_PCCARD) 
+       if (priv->bus_type == BUS_TYPE_PCCARD)
                atmel_write16(dev, GCR, 0x0060);
-       
+
        atmel_write16(dev, GCR, 0x0040);
        mdelay(500);
-       
+
        if (atmel_read16(dev, MR2) == 0) {
-               /* No stored firmware so load a small stub which just 
+               /* No stored firmware so load a small stub which just
                   tells us the MAC address */
                int i;
                priv->card_type = CARD_TYPE_EEPROM;
@@ -3442,7 +3466,7 @@ static int probe_atmel_card(struct net_device *dev)
                atmel_set_gcr(dev, GCR_REMAP);
                atmel_clear_gcr(priv->dev, 0x0040);
                atmel_write16(dev, BSR, BSS_SRAM);
-               for (i =  LOOP_RETRY_LIMIT; i; i--) 
+               for (i = LOOP_RETRY_LIMIT; i; i--)
                        if (atmel_read16(dev, MR3) & MAC_BOOT_COMPLETE)
                                break;
                if (i == 0) {
@@ -3451,7 +3475,7 @@ static int probe_atmel_card(struct net_device *dev)
                        atmel_copy_to_host(dev, dev->dev_addr, atmel_read16(dev, MR2), 6);
                        /* got address, now squash it again until the network
                           interface is opened */
-                       if (priv->bus_type == BUS_TYPE_PCCARD) 
+                       if (priv->bus_type == BUS_TYPE_PCCARD)
                                atmel_write16(dev, GCR, 0x0060);
                        atmel_write16(dev, GCR, 0x0040);
                        rc = 1;
@@ -3459,7 +3483,7 @@ static int probe_atmel_card(struct net_device *dev)
        } else if (atmel_read16(dev, MR4) == 0) {
                /* Mac address easy in this case. */
                priv->card_type = CARD_TYPE_PARALLEL_FLASH;
-               atmel_write16(dev,  BSR, 1);    
+               atmel_write16(dev,  BSR, 1);
                atmel_copy_to_host(dev, dev->dev_addr, 0xc000, 6);
                atmel_write16(dev,  BSR, 0x200);
                rc = 1;
@@ -3469,16 +3493,16 @@ static int probe_atmel_card(struct net_device *dev)
                priv->card_type = CARD_TYPE_SPI_FLASH;
                if (atmel_wakeup_firmware(priv)) {
                        atmel_get_mib(priv, Mac_Address_Mib_Type, 0, dev->dev_addr, 6);
-                       
+
                        /* got address, now squash it again until the network
                           interface is opened */
-                       if (priv->bus_type == BUS_TYPE_PCCARD) 
+                       if (priv->bus_type == BUS_TYPE_PCCARD)
                                atmel_write16(dev, GCR, 0x0060);
                        atmel_write16(dev, GCR, 0x0040);
                        rc = 1;
                }
        }
-       
+
        if (rc) {
                if (dev->dev_addr[0] == 0xFF) {
                        u8 default_mac[] = {0x00,0x04, 0x25, 0x00, 0x00, 0x00};
@@ -3486,27 +3510,27 @@ static int probe_atmel_card(struct net_device *dev)
                        memcpy(dev->dev_addr, default_mac, 6);
                }
        }
-       
+
        return rc;
 }
 
-static void build_wep_mib(struct atmel_private *priv)
 /* Move the encyption information on the MIB structure.
    This routine is for the pre-WPA firmware: later firmware has
    a different format MIB and a different routine. */
+static void build_wep_mib(struct atmel_private *priv)
 {
        struct { /* NB this is matched to the hardware, don't change. */
-               u8 wep_is_on;                 
+               u8 wep_is_on;
                u8 default_key; /* 0..3 */
                u8 reserved;
                u8 exclude_unencrypted;
-               
+
                u32 WEPICV_error_count;
                u32 WEP_excluded_count;
-               
+
                u8 wep_keys[MAX_ENCRYPTION_KEYS][13];
-               u8 encryption_level; /* 0, 1, 2 */
-               u8 reserved2[3]; 
+               u8 encryption_level; /* 0, 1, 2 */
+               u8 reserved2[3];
        } mib;
        int i;
 
@@ -3515,54 +3539,55 @@ static void build_wep_mib(struct atmel_private *priv)
                if (priv->wep_key_len[priv->default_key] > 5)
                        mib.encryption_level = 2;
                else
-                       mib.encryption_level = 1;       
+                       mib.encryption_level = 1;
        } else {
                mib.encryption_level = 0;
        }
 
        mib.default_key = priv->default_key;
        mib.exclude_unencrypted = priv->exclude_unencrypted;
-       
-       for(i = 0; i < MAX_ENCRYPTION_KEYS;  i++)
+
+       for (i = 0; i < MAX_ENCRYPTION_KEYS; i++)
                memcpy(mib.wep_keys[i], priv->wep_keys[i], 13);
-               
+
        atmel_set_mib(priv, Mac_Wep_Mib_Type, 0, (u8 *)&mib, sizeof(mib));
 }
 
 static void build_wpa_mib(struct atmel_private *priv)
 {
-       /* This is for the later (WPA enabled) firmware. */        
+       /* This is for the later (WPA enabled) firmware. */
 
        struct { /* NB this is matched to the hardware, don't change. */
                u8 cipher_default_key_value[MAX_ENCRYPTION_KEYS][MAX_ENCRYPTION_KEY_SIZE];
                u8 receiver_address[6];
-               u8 wep_is_on;                 
+               u8 wep_is_on;
                u8 default_key; /* 0..3 */
                u8 group_key;
                u8 exclude_unencrypted;
                u8 encryption_type;
                u8 reserved;
-               
+
                u32 WEPICV_error_count;
                u32 WEP_excluded_count;
-               
+
                u8 key_RSC[4][8];
        } mib;
-       
+
        int i;
 
        mib.wep_is_on = priv->wep_is_on;
        mib.exclude_unencrypted = priv->exclude_unencrypted;
        memcpy(mib.receiver_address, priv->CurrentBSSID, 6);
-       
+
        /* zero all the keys before adding in valid ones. */
        memset(mib.cipher_default_key_value, 0, sizeof(mib.cipher_default_key_value));
-       
+
        if (priv->wep_is_on) {
-               /* There's a comment in the Atmel code to the effect that this is only valid
-                  when still using WEP, it may need to be set to something to use WPA */
+               /* There's a comment in the Atmel code to the effect that this
+                  is only valid when still using WEP, it may need to be set to
+                  something to use WPA */
                memset(mib.key_RSC, 0, sizeof(mib.key_RSC));
-               
+
                mib.default_key = mib.group_key = 255;
                for (i = 0; i < MAX_ENCRYPTION_KEYS; i++) {
                        if (priv->wep_key_len[i] > 0) {
@@ -3570,12 +3595,12 @@ static void build_wpa_mib(struct atmel_private *priv)
                                if (i == priv->default_key) {
                                        mib.default_key = i;
                                        mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-1] = 7;
-                                       mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->pairwise_cipher_suite; 
+                                       mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->pairwise_cipher_suite;
                                } else {
                                        mib.group_key = i;
                                        priv->group_cipher_suite = priv->pairwise_cipher_suite;
                                        mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-1] = 1;
-                                       mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->group_cipher_suite;  
+                                       mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->group_cipher_suite;
                                }
                        }
                }
@@ -3583,47 +3608,47 @@ static void build_wpa_mib(struct atmel_private *priv)
                        mib.default_key = mib.group_key != 255 ? mib.group_key : 0;
                if (mib.group_key == 255)
                        mib.group_key = mib.default_key;
-               
+
        }
-       
+
        atmel_set_mib(priv, Mac_Wep_Mib_Type, 0, (u8 *)&mib, sizeof(mib));
 }
-                                       
-static int reset_atmel_card(struct net_device *dev) 
+
+static int reset_atmel_card(struct net_device *dev)
 {
        /* do everything necessary to wake up the hardware, including
           waiting for the lightning strike and throwing the knife switch....
 
-          set all the Mib values which matter in the card to match 
+          set all the Mib values which matter in the card to match
           their settings in the atmel_private structure. Some of these
           can be altered on the fly, but many (WEP, infrastucture or ad-hoc)
           can only be changed by tearing down the world and coming back through
           here.
 
-          This routine is also responsible for initialising some 
-          hardware-specific fields in the atmel_private structure, 
+          This routine is also responsible for initialising some
+          hardware-specific fields in the atmel_private structure,
           including a copy of the firmware's hostinfo stucture
           which is the route into the rest of the firmare datastructures. */
 
        struct atmel_private *priv = netdev_priv(dev);
        u8 configuration;
-       
+
        /* data to add to the firmware names, in priority order
           this implemenents firmware versioning */
-       
+
        static char *firmware_modifier[] = {
                "-wpa",
                "",
                NULL
        };
-               
+
        /* reset pccard */
-       if (priv->bus_type == BUS_TYPE_PCCARD) 
+       if (priv->bus_type == BUS_TYPE_PCCARD)
                atmel_write16(priv->dev, GCR, 0x0060);
-               
+
        /* stop card , disable interrupts */
        atmel_write16(priv->dev, GCR, 0x0040);
-               
+
        if (priv->card_type == CARD_TYPE_EEPROM) {
                /* copy in firmware if needed */
                const struct firmware *fw_entry = NULL;
@@ -3636,13 +3661,13 @@ static int reset_atmel_card(struct net_device *dev)
                                               "%s: card type is unknown: assuming at76c502 firmware is OK.\n",
                                               dev->name);
                                        printk(KERN_INFO
-                                              "%s: if not, use the firmware= module parameter.\n", 
+                                              "%s: if not, use the firmware= module parameter.\n",
                                               dev->name);
                                        strcpy(priv->firmware_id, "atmel_at76c502.bin");
                                }
                                if (request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev) != 0) {
-                                       printk(KERN_ALERT 
-                                              "%s: firmware %s is missing, cannot continue.\n", 
+                                       printk(KERN_ALERT
+                                              "%s: firmware %s is missing, cannot continue.\n",
                                               dev->name, priv->firmware_id);
                                        return 0;
                                }
@@ -3654,7 +3679,7 @@ static int reset_atmel_card(struct net_device *dev)
                                while (fw_table[fw_index].fw_type != priv->firmware_type
                                                && fw_table[fw_index].fw_type != ATMEL_FW_TYPE_NONE)
                                        fw_index++;
-                               
+
                                /* construct the actual firmware file name */
                                if (fw_table[fw_index].fw_type != ATMEL_FW_TYPE_NONE) {
                                        int i;
@@ -3669,24 +3694,24 @@ static int reset_atmel_card(struct net_device *dev)
                                        }
                                }
                                if (!success) {
-                                       printk(KERN_ALERT 
-                                              "%s: firmware %s is missing, cannot start.\n", 
+                                       printk(KERN_ALERT
+                                              "%s: firmware %s is missing, cannot start.\n",
                                               dev->name, priv->firmware_id);
                                        priv->firmware_id[0] = '\0';
-                                       return 0;       
+                                       return 0;
                                }
                        }
-                       
+
                        fw = fw_entry->data;
                        len = fw_entry->size;
                }
-               
+
                if (len <= 0x6000) {
                        atmel_write16(priv->dev, BSR, BSS_IRAM);
                        atmel_copy_to_card(priv->dev, 0, fw, len);
                        atmel_set_gcr(priv->dev, GCR_REMAP);
                } else {
-                       /* Remap */ 
+                       /* Remap */
                        atmel_set_gcr(priv->dev, GCR_REMAP);
                        atmel_write16(priv->dev, BSR, BSS_IRAM);
                        atmel_copy_to_card(priv->dev, 0, fw, 0x6000);
@@ -3708,45 +3733,45 @@ static int reset_atmel_card(struct net_device *dev)
           the 3com broken-ness filter. */
        priv->use_wpa = (priv->host_info.major_version == 4);
        priv->radio_on_broken = (priv->host_info.major_version == 5);
-       
+
         /* unmask all irq sources */
        atmel_wmem8(priv, atmel_hi(priv, IFACE_INT_MASK_OFFSET), 0xff);
-       
+
        /* int Tx system and enable Tx */
        atmel_wmem8(priv, atmel_tx(priv, TX_DESC_FLAGS_OFFSET, 0), 0);
        atmel_wmem32(priv, atmel_tx(priv, TX_DESC_NEXT_OFFSET, 0), 0x80000000L);
        atmel_wmem16(priv, atmel_tx(priv, TX_DESC_POS_OFFSET, 0), 0);
        atmel_wmem16(priv, atmel_tx(priv, TX_DESC_SIZE_OFFSET, 0), 0);
 
-       priv->tx_desc_free = priv->host_info.tx_desc_count;             
-       priv->tx_desc_head = 0;                                                                 
-       priv->tx_desc_tail = 0;                                                                 
+       priv->tx_desc_free = priv->host_info.tx_desc_count;
+       priv->tx_desc_head = 0;
+       priv->tx_desc_tail = 0;
        priv->tx_desc_previous = 0;
        priv->tx_free_mem = priv->host_info.tx_buff_size;
-       priv->tx_buff_head = 0; 
-       priv->tx_buff_tail = 0; 
-               
-       configuration = atmel_rmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET)); 
-       atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET), 
+       priv->tx_buff_head = 0;
+       priv->tx_buff_tail = 0;
+
+       configuration = atmel_rmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET));
+       atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET),
                                   configuration | FUNC_CTRL_TxENABLE);
 
        /* init Rx system and enable */
        priv->rx_desc_head = 0;
-       
-       configuration = atmel_rmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET)); 
-       atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET), 
+
+       configuration = atmel_rmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET));
+       atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET),
                                   configuration | FUNC_CTRL_RxENABLE);
-                       
+
        if (!priv->radio_on_broken) {
-               if (atmel_send_command_wait(priv, CMD_EnableRadio, NULL, 0) == 
+               if (atmel_send_command_wait(priv, CMD_EnableRadio, NULL, 0) ==
                    CMD_STATUS_REJECTED_RADIO_OFF) {
-                       printk(KERN_INFO 
+                       printk(KERN_INFO
                               "%s: cannot turn the radio on. (Hey radio, you're beautiful!)\n",
                               dev->name);
                         return 0;
                }
        }
-       
+
        /* set up enough MIB values to run. */
        atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_AUTO_TX_RATE_POS, priv->auto_tx_rate);
        atmel_set_mib8(priv, Local_Mib_Type,  LOCAL_MIB_TX_PROMISCUOUS_POS,  PROM_MODE_OFF);
@@ -3755,7 +3780,7 @@ static int reset_atmel_card(struct net_device *dev)
        atmel_set_mib8(priv, Mac_Mib_Type, MAC_MIB_SHORT_RETRY_POS, priv->short_retry);
        atmel_set_mib8(priv, Mac_Mib_Type, MAC_MIB_LONG_RETRY_POS, priv->long_retry);
        atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_PREAMBLE_TYPE, priv->preamble);
-       atmel_set_mib(priv, Mac_Address_Mib_Type, MAC_ADDR_MIB_MAC_ADDR_POS, 
+       atmel_set_mib(priv, Mac_Address_Mib_Type, MAC_ADDR_MIB_MAC_ADDR_POS,
                      priv->dev->dev_addr, 6);
        atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_PS_MODE_POS, ACTIVE_MODE);
        atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 1);
@@ -3766,42 +3791,44 @@ static int reset_atmel_card(struct net_device *dev)
                build_wpa_mib(priv);
        else
                build_wep_mib(priv);
-       
+
        return 1;
 }
 
-static void atmel_send_command(struct atmel_private *priv, int command, void *cmd, int cmd_size)
+static void atmel_send_command(struct atmel_private *priv, int command,
+                              void *cmd, int cmd_size)
 {
        if (cmd)
-               atmel_copy_to_card(priv->dev, atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET), 
+               atmel_copy_to_card(priv->dev, atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET),
                                   cmd, cmd_size);
-       
+
        atmel_wmem8(priv, atmel_co(priv, CMD_BLOCK_COMMAND_OFFSET), command);
        atmel_wmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET), 0);
 }
-       
-static int atmel_send_command_wait(struct atmel_private *priv, int command, void *cmd, int cmd_size)
+
+static int atmel_send_command_wait(struct atmel_private *priv, int command,
+                                  void *cmd, int cmd_size)
 {
        int i, status;
-       
+
        atmel_send_command(priv, command, cmd, cmd_size);
-       
+
        for (i = 5000; i; i--) {
                status = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET));
-               if (status != CMD_STATUS_IDLE && 
+               if (status != CMD_STATUS_IDLE &&
                    status != CMD_STATUS_IN_PROGRESS)
                        break;
                udelay(20);
        }
-       
+
        if (i == 0) {
                printk(KERN_ALERT "%s: failed to contact MAC.\n", priv->dev->name);
                status =  CMD_STATUS_HOST_ERROR;
-       } else { 
+       } else {
                if (command != CMD_EnableRadio)
                        status = CMD_STATUS_COMPLETE;
        }
-       
+
        return status;
 }
 
@@ -3827,7 +3854,8 @@ static void atmel_set_mib8(struct atmel_private *priv, u8 type, u8 index, u8 dat
        atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + 1);
 }
 
-static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index, u16 data)
+static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index,
+                           u16 data)
 {
        struct get_set_mib m;
        m.type = type;
@@ -3839,7 +3867,8 @@ static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index, u16 d
        atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + 2);
 }
 
-static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index, u8 *data, int data_len)
+static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index,
+                         u8 *data, int data_len)
 {
        struct get_set_mib m;
        m.type = type;
@@ -3848,23 +3877,24 @@ static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index, u8 *dat
 
        if (data_len > MIB_MAX_DATA_BYTES)
                printk(KERN_ALERT "%s: MIB buffer too small.\n", priv->dev->name);
-       
+
        memcpy(m.data, data, data_len);
        atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + data_len);
 }
 
-static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index, u8 *data, int data_len)
+static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index,
+                         u8 *data, int data_len)
 {
        struct get_set_mib m;
        m.type = type;
        m.size = data_len;
        m.index = index;
-       
+
        if (data_len > MIB_MAX_DATA_BYTES)
                printk(KERN_ALERT "%s: MIB buffer too small.\n", priv->dev->name);
-       
+
        atmel_send_command_wait(priv, CMD_Get_MIB_Vars, &m, MIB_HEADER_SIZE + data_len);
-       atmel_copy_to_host(priv->dev, data, 
+       atmel_copy_to_host(priv->dev, data,
                           atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET + MIB_HEADER_SIZE), data_len);
 }
 
@@ -3873,11 +3903,12 @@ static void atmel_writeAR(struct net_device *dev, u16 data)
        int i;
        outw(data, dev->base_addr + AR);
        /* Address register appears to need some convincing..... */
-       for (i = 0; data != inw(dev->base_addr + AR) && i<10; i++)
+       for (i = 0; data != inw(dev->base_addr + AR) && i < 10; i++)
                outw(data, dev->base_addr + AR);
 }
 
-static void atmel_copy_to_card(struct net_device *dev, u16 dest, unsigned char *src, u16 len)
+static void atmel_copy_to_card(struct net_device *dev, u16 dest,
+                              unsigned char *src, u16 len)
 {
        int i;
        atmel_writeAR(dev, dest);
@@ -3894,7 +3925,8 @@ static void atmel_copy_to_card(struct net_device *dev, u16 dest, unsigned char *
                atmel_write8(dev, DR, *src);
 }
 
-static void atmel_copy_to_host(struct net_device *dev, unsigned char *dest, u16 src, u16 len)
+static void atmel_copy_to_host(struct net_device *dev, unsigned char *dest,
+                              u16 src, u16 len)
 {
        int i;
        atmel_writeAR(dev, src);
@@ -3930,22 +3962,24 @@ static int atmel_lock_mac(struct atmel_private *priv)
                        break;
                udelay(20);
        }
-       
-       if (!i) return 0; /* timed out */
-       
+
+       if (!i)
+               return 0; /* timed out */
+
        atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 1);
        if (atmel_rmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_HOST_OFFSET))) {
                atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0);
-               if (!j--) return 0; /* timed out */
+               if (!j--)
+                       return 0; /* timed out */
                goto retry;
        }
-       
+
        return 1;
 }
 
 static void atmel_wmem32(struct atmel_private *priv, u16 pos, u32 data)
 {
-               atmel_writeAR(priv->dev, pos);  
+       atmel_writeAR(priv->dev, pos);
        atmel_write16(priv->dev, DR, data); /* card is little-endian */
        atmel_write16(priv->dev, DR, data >> 16);
 }
@@ -4017,9 +4051,9 @@ static void atmel_wmem32(struct atmel_private *priv, u16 pos, u32 data)
                                  serial output, since SO is normally high.  But it
                                  does cause 8 clock cycles and thus 8 bits to be
                                  clocked in to the chip.  See Atmel's SPI
-                                 controller (e.g. AT91M55800) timing and 4K 
+                                 controller (e.g. AT91M55800) timing and 4K
                                  SPI EEPROM manuals */
-                                
+
        .set NVRAM_SCRATCH, 0x02000100  /* arbitrary area for scratchpad memory */
        .set NVRAM_IMAGE, 0x02000200
        .set NVRAM_LENGTH, 0x0200
@@ -4032,24 +4066,24 @@ static void atmel_wmem32(struct atmel_private *priv, u16 pos, u32 data)
        .set MR4, 0xC
 RESET_VECTOR:
         b RESET_HANDLER
-UNDEF_VECTOR:  
+UNDEF_VECTOR:
         b HALT1
-SWI_VECTOR:            
+SWI_VECTOR:
         b HALT1
-IABORT_VECTOR: 
+IABORT_VECTOR:
         b HALT1
-DABORT_VECTOR:         
-RESERVED_VECTOR:    
+DABORT_VECTOR:
+RESERVED_VECTOR:
         b HALT1
-IRQ_VECTOR:    
+IRQ_VECTOR:
         b HALT1
-FIQ_VECTOR:    
+FIQ_VECTOR:
        b HALT1
 HALT1: b HALT1
 RESET_HANDLER:
        mov     r0, #CPSR_INITIAL
        msr     CPSR_c, r0      /* This is probably unnecessary */
-                       
+
 /* I'm guessing this is initializing clock generator electronics for SPI */
        ldr     r0, =SPI_CGEN_BASE
        mov     r1, #0
@@ -4061,7 +4095,7 @@ RESET_HANDLER:
        str     r1, [r0, #28]
        mov     r1, #1
        str     r1, [r0, #8]
-       
+
        ldr     r0, =MRBASE
        mov     r1, #0
        strh    r1, [r0, #MR1]
@@ -4094,7 +4128,7 @@ GET_WHOLE_NVRAM:
        ldmia   sp!, {lr}
        bx      lr
 .endfunc
-       
+
 .func Get_MAC_Addr, GET_MAC_ADDR
 GET_MAC_ADDR:
        stmdb   sp!, {lr}
@@ -4110,13 +4144,13 @@ GET_MAC_ADDR:
 .func Delay9, DELAY9
 DELAY9:
        adds    r0, r0, r0, LSL #3   /* r0 = r0 * 9 */
-DELAYLOOP:     
+DELAYLOOP:
        beq     DELAY9_done
        subs    r0, r0, #1
        b       DELAYLOOP
-DELAY9_done:   
+DELAY9_done:
        bx      lr
-.endfunc       
+.endfunc
 
 .func SP_Init, SP_INIT
 SP_INIT:
@@ -4145,26 +4179,26 @@ SP_INIT:
        ldr     r0, [r0, #SP_RDR]
        bx      lr
 .endfunc
-.func NVRAM_Init, NVRAM_INIT   
+.func NVRAM_Init, NVRAM_INIT
 NVRAM_INIT:
        ldr     r1, =SP_BASE
        ldr     r0, [r1, #SP_RDR]
        mov     r0, #NVRAM_CMD_RDSR
        str     r0, [r1, #SP_TDR]
-SP_loop1:      
+SP_loop1:
        ldr     r0, [r1, #SP_SR]
        tst     r0, #SP_TDRE
        beq     SP_loop1
 
        mov     r0, #SPI_8CLOCKS
-       str     r0, [r1, #SP_TDR] 
-SP_loop2:      
+       str     r0, [r1, #SP_TDR]
+SP_loop2:
        ldr     r0, [r1, #SP_SR]
        tst     r0, #SP_TDRE
        beq     SP_loop2
 
        ldr     r0, [r1, #SP_RDR]
-SP_loop3:      
+SP_loop3:
        ldr     r0, [r1, #SP_SR]
        tst     r0, #SP_RDRF
        beq     SP_loop3
@@ -4173,7 +4207,7 @@ SP_loop3:
        and     r0, r0, #255
        bx      lr
 .endfunc
-       
+
 .func NVRAM_Xfer, NVRAM_XFER
        /* r0 = dest address */
        /* r1 = not used */
@@ -4185,11 +4219,11 @@ NVRAM_XFER:
        mov     r4, r3          /* save r3 (length) */
        mov     r0, r2, LSR #5 /*  SPI memories put A8 in the command field */
        and     r0, r0, #8
-       add     r0, r0, #NVRAM_CMD_READ 
+       add     r0, r0, #NVRAM_CMD_READ
        ldr     r1, =NVRAM_SCRATCH
        strb    r0, [r1, #0]    /* save command in NVRAM_SCRATCH[0] */
        strb    r2, [r1, #1]    /* save low byte of source address in NVRAM_SCRATCH[1] */
-_local1:       
+_local1:
        bl      NVRAM_INIT
        tst     r0, #NVRAM_SR_RDY
        bne     _local1
@@ -4211,7 +4245,7 @@ NVRAM_XFER2:
        cmp     r0, #0
        bls     _local2
        ldr     r5, =NVRAM_SCRATCH
-_local4:       
+_local4:
        ldrb    r6, [r5, r3]
        str     r6, [r4, #SP_TDR]
 _local3:
@@ -4225,7 +4259,7 @@ _local2:
        mov     r3, #SPI_8CLOCKS
        str     r3, [r4, #SP_TDR]
        ldr     r0, [r4, #SP_RDR]
-_local5:       
+_local5:
        ldr     r0, [r4, #SP_SR]
        tst     r0, #SP_RDRF
        beq     _local5
@@ -4233,12 +4267,12 @@ _local5:
        mov     r0, #0
        cmp     r2, #0  /* r2 is # of bytes to copy in */
        bls     _local6
-_local7:       
+_local7:
        ldr     r5, [r4, #SP_SR]
        tst     r5, #SP_TDRE
        beq     _local7
        str     r3, [r4, #SP_TDR]  /* r3 has SPI_8CLOCKS */
-_local8:       
+_local8:
        ldr     r5, [r4, #SP_SR]
        tst     r5, #SP_RDRF
        beq     _local8
index fc62235bfc24c169c1a04f4e93926f7782e94dcc..353ccb93134b79e70e38bb4a349cd681018c9576 100644 (file)
@@ -1,3 +1,4 @@
+hostap-y := hostap_main.o
 obj-$(CONFIG_HOSTAP) += hostap.o
 
 obj-$(CONFIG_HOSTAP_CS) += hostap_cs.o
diff --git a/drivers/net/wireless/hostap/hostap.c b/drivers/net/wireless/hostap/hostap.c
deleted file mode 100644 (file)
index 3d2ea61..0000000
+++ /dev/null
@@ -1,1191 +0,0 @@
-/*
- * Host AP (software wireless LAN access point) driver for
- * Intersil Prism2/2.5/3 - hostap.o module, common routines
- *
- * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
- * <jkmaline@cc.hut.fi>
- * Copyright (c) 2002-2005, Jouni Malinen <jkmaline@cc.hut.fi>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/proc_fs.h>
-#include <linux/if_arp.h>
-#include <linux/delay.h>
-#include <linux/random.h>
-#include <linux/workqueue.h>
-#include <linux/kmod.h>
-#include <linux/rtnetlink.h>
-#include <linux/wireless.h>
-#include <net/iw_handler.h>
-#include <net/ieee80211.h>
-#include <net/ieee80211_crypt.h>
-#include <asm/uaccess.h>
-
-#include "hostap_wlan.h"
-#include "hostap_80211.h"
-#include "hostap_ap.h"
-#include "hostap.h"
-
-MODULE_AUTHOR("Jouni Malinen");
-MODULE_DESCRIPTION("Host AP common routines");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(PRISM2_VERSION);
-
-#define TX_TIMEOUT (2 * HZ)
-
-#define PRISM2_MAX_FRAME_SIZE 2304
-#define PRISM2_MIN_MTU 256
-/* FIX: */
-#define PRISM2_MAX_MTU (PRISM2_MAX_FRAME_SIZE - (6 /* LLC */ + 8 /* WEP */))
-
-
-/* hostap.c */
-static int prism2_wds_add(local_info_t *local, u8 *remote_addr,
-                         int rtnl_locked);
-static int prism2_wds_del(local_info_t *local, u8 *remote_addr,
-                         int rtnl_locked, int do_not_remove);
-
-/* hostap_ap.c */
-static int prism2_ap_get_sta_qual(local_info_t *local, struct sockaddr addr[],
-                                 struct iw_quality qual[], int buf_size,
-                                 int aplist);
-static int prism2_ap_translate_scan(struct net_device *dev, char *buffer);
-static int prism2_hostapd(struct ap_data *ap,
-                         struct prism2_hostapd_param *param);
-static void * ap_crypt_get_ptrs(struct ap_data *ap, u8 *addr, int permanent,
-                               struct ieee80211_crypt_data ***crypt);
-static void ap_control_kickall(struct ap_data *ap);
-#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
-static int ap_control_add_mac(struct mac_restrictions *mac_restrictions,
-                             u8 *mac);
-static int ap_control_del_mac(struct mac_restrictions *mac_restrictions,
-                             u8 *mac);
-static void ap_control_flush_macs(struct mac_restrictions *mac_restrictions);
-static int ap_control_kick_mac(struct ap_data *ap, struct net_device *dev,
-                              u8 *mac);
-#endif /* !PRISM2_NO_KERNEL_IEEE80211_MGMT */
-
-
-static const long freq_list[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442,
-                                 2447, 2452, 2457, 2462, 2467, 2472, 2484 };
-#define FREQ_COUNT (sizeof(freq_list) / sizeof(freq_list[0]))
-
-
-/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
-/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
-static unsigned char rfc1042_header[] =
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
-static unsigned char bridge_tunnel_header[] =
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
-/* No encapsulation header if EtherType < 0x600 (=length) */
-
-
-/* FIX: these could be compiled separately and linked together to hostap.o */
-#include "hostap_ap.c"
-#include "hostap_info.c"
-#include "hostap_ioctl.c"
-#include "hostap_proc.c"
-#include "hostap_80211_rx.c"
-#include "hostap_80211_tx.c"
-
-
-struct net_device * hostap_add_interface(struct local_info *local,
-                                        int type, int rtnl_locked,
-                                        const char *prefix,
-                                        const char *name)
-{
-       struct net_device *dev, *mdev;
-       struct hostap_interface *iface;
-       int ret;
-
-       dev = alloc_etherdev(sizeof(struct hostap_interface));
-       if (dev == NULL)
-               return NULL;
-
-       iface = netdev_priv(dev);
-       iface->dev = dev;
-       iface->local = local;
-       iface->type = type;
-       list_add(&iface->list, &local->hostap_interfaces);
-
-       mdev = local->dev;
-       memcpy(dev->dev_addr, mdev->dev_addr, ETH_ALEN);
-       dev->base_addr = mdev->base_addr;
-       dev->irq = mdev->irq;
-       dev->mem_start = mdev->mem_start;
-       dev->mem_end = mdev->mem_end;
-
-       hostap_setup_dev(dev, local, 0);
-       dev->destructor = free_netdev;
-
-       sprintf(dev->name, "%s%s", prefix, name);
-       if (!rtnl_locked)
-               rtnl_lock();
-
-       ret = 0;
-       if (strchr(dev->name, '%'))
-               ret = dev_alloc_name(dev, dev->name);
-
-       SET_NETDEV_DEV(dev, mdev->class_dev.dev);
-       if (ret >= 0)
-               ret = register_netdevice(dev);
-
-       if (!rtnl_locked)
-               rtnl_unlock();
-
-       if (ret < 0) {
-               printk(KERN_WARNING "%s: failed to add new netdevice!\n",
-                      dev->name);
-               free_netdev(dev);
-               return NULL;
-       }
-
-       printk(KERN_DEBUG "%s: registered netdevice %s\n",
-              mdev->name, dev->name);
-
-       return dev;
-}
-
-
-void hostap_remove_interface(struct net_device *dev, int rtnl_locked,
-                            int remove_from_list)
-{
-       struct hostap_interface *iface;
-
-       if (!dev)
-               return;
-
-       iface = netdev_priv(dev);
-
-       if (remove_from_list) {
-               list_del(&iface->list);
-       }
-
-       if (dev == iface->local->ddev)
-               iface->local->ddev = NULL;
-       else if (dev == iface->local->apdev)
-               iface->local->apdev = NULL;
-       else if (dev == iface->local->stadev)
-               iface->local->stadev = NULL;
-
-       if (rtnl_locked)
-               unregister_netdevice(dev);
-       else
-               unregister_netdev(dev);
-
-       /* dev->destructor = free_netdev() will free the device data, including
-        * private data, when removing the device */
-}
-
-
-static inline int prism2_wds_special_addr(u8 *addr)
-{
-       if (addr[0] || addr[1] || addr[2] || addr[3] || addr[4] || addr[5])
-               return 0;
-
-       return 1;
-}
-
-
-static int prism2_wds_add(local_info_t *local, u8 *remote_addr,
-                         int rtnl_locked)
-{
-       struct net_device *dev;
-       struct list_head *ptr;
-       struct hostap_interface *iface, *empty, *match;
-
-       empty = match = NULL;
-       read_lock_bh(&local->iface_lock);
-       list_for_each(ptr, &local->hostap_interfaces) {
-               iface = list_entry(ptr, struct hostap_interface, list);
-               if (iface->type != HOSTAP_INTERFACE_WDS)
-                       continue;
-
-               if (prism2_wds_special_addr(iface->u.wds.remote_addr))
-                       empty = iface;
-               else if (memcmp(iface->u.wds.remote_addr, remote_addr,
-                               ETH_ALEN) == 0) {
-                       match = iface;
-                       break;
-               }
-       }
-       if (!match && empty && !prism2_wds_special_addr(remote_addr)) {
-               /* take pre-allocated entry into use */
-               memcpy(empty->u.wds.remote_addr, remote_addr, ETH_ALEN);
-               read_unlock_bh(&local->iface_lock);
-               printk(KERN_DEBUG "%s: using pre-allocated WDS netdevice %s\n",
-                      local->dev->name, empty->dev->name);
-               return 0;
-       }
-       read_unlock_bh(&local->iface_lock);
-
-       if (!prism2_wds_special_addr(remote_addr)) {
-               if (match)
-                       return -EEXIST;
-               hostap_add_sta(local->ap, remote_addr);
-       }
-
-       if (local->wds_connections >= local->wds_max_connections)
-               return -ENOBUFS;
-
-       /* verify that there is room for wds# postfix in the interface name */
-       if (strlen(local->dev->name) > IFNAMSIZ - 5) {
-               printk(KERN_DEBUG "'%s' too long base device name\n",
-                      local->dev->name);
-               return -EINVAL;
-       }
-
-       dev = hostap_add_interface(local, HOSTAP_INTERFACE_WDS, rtnl_locked,
-                                  local->ddev->name, "wds%d");
-       if (dev == NULL)
-               return -ENOMEM;
-
-       iface = netdev_priv(dev);
-       memcpy(iface->u.wds.remote_addr, remote_addr, ETH_ALEN);
-
-       local->wds_connections++;
-
-       return 0;
-}
-
-
-static int prism2_wds_del(local_info_t *local, u8 *remote_addr,
-                         int rtnl_locked, int do_not_remove)
-{
-       unsigned long flags;
-       struct list_head *ptr;
-       struct hostap_interface *iface, *selected = NULL;
-
-       write_lock_irqsave(&local->iface_lock, flags);
-       list_for_each(ptr, &local->hostap_interfaces) {
-               iface = list_entry(ptr, struct hostap_interface, list);
-               if (iface->type != HOSTAP_INTERFACE_WDS)
-                       continue;
-
-               if (memcmp(iface->u.wds.remote_addr, remote_addr,
-                          ETH_ALEN) == 0) {
-                       selected = iface;
-                       break;
-               }
-       }
-       if (selected && !do_not_remove)
-               list_del(&selected->list);
-       write_unlock_irqrestore(&local->iface_lock, flags);
-
-       if (selected) {
-               if (do_not_remove)
-                       memset(selected->u.wds.remote_addr, 0, ETH_ALEN);
-               else {
-                       hostap_remove_interface(selected->dev, rtnl_locked, 0);
-                       local->wds_connections--;
-               }
-       }
-
-       return selected ? 0 : -ENODEV;
-}
-
-
-u16 hostap_tx_callback_register(local_info_t *local,
-                               void (*func)(struct sk_buff *, int ok, void *),
-                               void *data)
-{
-       unsigned long flags;
-       struct hostap_tx_callback_info *entry;
-
-       entry = (struct hostap_tx_callback_info *) kmalloc(sizeof(*entry),
-                                                          GFP_ATOMIC);
-       if (entry == NULL)
-               return 0;
-
-       entry->func = func;
-       entry->data = data;
-
-       spin_lock_irqsave(&local->lock, flags);
-       entry->idx = local->tx_callback ? local->tx_callback->idx + 1 : 1;
-       entry->next = local->tx_callback;
-       local->tx_callback = entry;
-       spin_unlock_irqrestore(&local->lock, flags);
-
-       return entry->idx;
-}
-
-
-int hostap_tx_callback_unregister(local_info_t *local, u16 idx)
-{
-       unsigned long flags;
-       struct hostap_tx_callback_info *cb, *prev = NULL;
-
-       spin_lock_irqsave(&local->lock, flags);
-       cb = local->tx_callback;
-       while (cb != NULL && cb->idx != idx) {
-               prev = cb;
-               cb = cb->next;
-       }
-       if (cb) {
-               if (prev == NULL)
-                       local->tx_callback = cb->next;
-               else
-                       prev->next = cb->next;
-               kfree(cb);
-       }
-       spin_unlock_irqrestore(&local->lock, flags);
-
-       return cb ? 0 : -1;
-}
-
-
-/* val is in host byte order */
-int hostap_set_word(struct net_device *dev, int rid, u16 val)
-{
-       struct hostap_interface *iface;
-       u16 tmp = cpu_to_le16(val);
-       iface = netdev_priv(dev);
-       return iface->local->func->set_rid(dev, rid, &tmp, 2);
-}
-
-
-int hostap_set_string(struct net_device *dev, int rid, const char *val)
-{
-       struct hostap_interface *iface;
-       char buf[MAX_SSID_LEN + 2];
-       int len;
-
-       iface = netdev_priv(dev);
-       len = strlen(val);
-       if (len > MAX_SSID_LEN)
-               return -1;
-       memset(buf, 0, sizeof(buf));
-       buf[0] = len; /* little endian 16 bit word */
-       memcpy(buf + 2, val, len);
-
-       return iface->local->func->set_rid(dev, rid, &buf, MAX_SSID_LEN + 2);
-}
-
-
-u16 hostap_get_porttype(local_info_t *local)
-{
-       if (local->iw_mode == IW_MODE_ADHOC && local->pseudo_adhoc)
-               return HFA384X_PORTTYPE_PSEUDO_IBSS;
-       if (local->iw_mode == IW_MODE_ADHOC)
-               return HFA384X_PORTTYPE_IBSS;
-       if (local->iw_mode == IW_MODE_INFRA)
-               return HFA384X_PORTTYPE_BSS;
-       if (local->iw_mode == IW_MODE_REPEAT)
-               return HFA384X_PORTTYPE_WDS;
-       if (local->iw_mode == IW_MODE_MONITOR)
-               return HFA384X_PORTTYPE_PSEUDO_IBSS;
-       return HFA384X_PORTTYPE_HOSTAP;
-}
-
-
-int hostap_set_encryption(local_info_t *local)
-{
-       u16 val, old_val;
-       int i, keylen, len, idx;
-       char keybuf[WEP_KEY_LEN + 1];
-       enum { NONE, WEP, OTHER } encrypt_type;
-
-       idx = local->tx_keyidx;
-       if (local->crypt[idx] == NULL || local->crypt[idx]->ops == NULL)
-               encrypt_type = NONE;
-       else if (strcmp(local->crypt[idx]->ops->name, "WEP") == 0)
-               encrypt_type = WEP;
-       else
-               encrypt_type = OTHER;
-
-       if (local->func->get_rid(local->dev, HFA384X_RID_CNFWEPFLAGS, &val, 2,
-                                1) < 0) {
-               printk(KERN_DEBUG "Could not read current WEP flags.\n");
-               goto fail;
-       }
-       le16_to_cpus(&val);
-       old_val = val;
-
-       if (encrypt_type != NONE || local->privacy_invoked)
-               val |= HFA384X_WEPFLAGS_PRIVACYINVOKED;
-       else
-               val &= ~HFA384X_WEPFLAGS_PRIVACYINVOKED;
-
-       if (local->open_wep || encrypt_type == NONE ||
-           ((local->ieee_802_1x || local->wpa) && local->host_decrypt))
-               val &= ~HFA384X_WEPFLAGS_EXCLUDEUNENCRYPTED;
-       else
-               val |= HFA384X_WEPFLAGS_EXCLUDEUNENCRYPTED;
-
-       if ((encrypt_type != NONE || local->privacy_invoked) &&
-           (encrypt_type == OTHER || local->host_encrypt))
-               val |= HFA384X_WEPFLAGS_HOSTENCRYPT;
-       else
-               val &= ~HFA384X_WEPFLAGS_HOSTENCRYPT;
-       if ((encrypt_type != NONE || local->privacy_invoked) &&
-           (encrypt_type == OTHER || local->host_decrypt))
-               val |= HFA384X_WEPFLAGS_HOSTDECRYPT;
-       else
-               val &= ~HFA384X_WEPFLAGS_HOSTDECRYPT;
-
-       if (val != old_val &&
-           hostap_set_word(local->dev, HFA384X_RID_CNFWEPFLAGS, val)) {
-               printk(KERN_DEBUG "Could not write new WEP flags (0x%x)\n",
-                      val);
-               goto fail;
-       }
-
-       if (encrypt_type != WEP)
-               return 0;
-
-       /* 104-bit support seems to require that all the keys are set to the
-        * same keylen */
-       keylen = 6; /* first 5 octets */
-       len = local->crypt[idx]->ops->get_key(keybuf, sizeof(keybuf),
-                                             NULL, local->crypt[idx]->priv);
-       if (idx >= 0 && idx < WEP_KEYS && len > 5)
-               keylen = WEP_KEY_LEN + 1; /* first 13 octets */
-
-       for (i = 0; i < WEP_KEYS; i++) {
-               memset(keybuf, 0, sizeof(keybuf));
-               if (local->crypt[i]) {
-                       (void) local->crypt[i]->ops->get_key(
-                               keybuf, sizeof(keybuf),
-                               NULL, local->crypt[i]->priv);
-               }
-               if (local->func->set_rid(local->dev,
-                                        HFA384X_RID_CNFDEFAULTKEY0 + i,
-                                        keybuf, keylen)) {
-                       printk(KERN_DEBUG "Could not set key %d (len=%d)\n",
-                              i, keylen);
-                       goto fail;
-               }
-       }
-       if (hostap_set_word(local->dev, HFA384X_RID_CNFWEPDEFAULTKEYID, idx)) {
-               printk(KERN_DEBUG "Could not set default keyid %d\n", idx);
-               goto fail;
-       }
-
-       return 0;
-
- fail:
-       printk(KERN_DEBUG "%s: encryption setup failed\n", local->dev->name);
-       return -1;
-}
-
-
-int hostap_set_antsel(local_info_t *local)
-{
-       u16 val;
-       int ret = 0;
-
-       if (local->antsel_tx != HOSTAP_ANTSEL_DO_NOT_TOUCH &&
-           local->func->cmd(local->dev, HFA384X_CMDCODE_READMIF,
-                            HFA386X_CR_TX_CONFIGURE,
-                            NULL, &val) == 0) {
-               val &= ~(BIT(2) | BIT(1));
-               switch (local->antsel_tx) {
-               case HOSTAP_ANTSEL_DIVERSITY:
-                       val |= BIT(1);
-                       break;
-               case HOSTAP_ANTSEL_LOW:
-                       break;
-               case HOSTAP_ANTSEL_HIGH:
-                       val |= BIT(2);
-                       break;
-               }
-
-               if (local->func->cmd(local->dev, HFA384X_CMDCODE_WRITEMIF,
-                                    HFA386X_CR_TX_CONFIGURE, &val, NULL)) {
-                       printk(KERN_INFO "%s: setting TX AntSel failed\n",
-                              local->dev->name);
-                       ret = -1;
-               }
-       }
-
-       if (local->antsel_rx != HOSTAP_ANTSEL_DO_NOT_TOUCH &&
-           local->func->cmd(local->dev, HFA384X_CMDCODE_READMIF,
-                            HFA386X_CR_RX_CONFIGURE,
-                            NULL, &val) == 0) {
-               val &= ~(BIT(1) | BIT(0));
-               switch (local->antsel_rx) {
-               case HOSTAP_ANTSEL_DIVERSITY:
-                       break;
-               case HOSTAP_ANTSEL_LOW:
-                       val |= BIT(0);
-                       break;
-               case HOSTAP_ANTSEL_HIGH:
-                       val |= BIT(0) | BIT(1);
-                       break;
-               }
-
-               if (local->func->cmd(local->dev, HFA384X_CMDCODE_WRITEMIF,
-                                    HFA386X_CR_RX_CONFIGURE, &val, NULL)) {
-                       printk(KERN_INFO "%s: setting RX AntSel failed\n",
-                              local->dev->name);
-                       ret = -1;
-               }
-       }
-
-       return ret;
-}
-
-
-int hostap_set_roaming(local_info_t *local)
-{
-       u16 val;
-
-       switch (local->host_roaming) {
-       case 1:
-               val = HFA384X_ROAMING_HOST;
-               break;
-       case 2:
-               val = HFA384X_ROAMING_DISABLED;
-               break;
-       case 0:
-       default:
-               val = HFA384X_ROAMING_FIRMWARE;
-               break;
-       }
-
-       return hostap_set_word(local->dev, HFA384X_RID_CNFROAMINGMODE, val);
-}
-
-
-int hostap_set_auth_algs(local_info_t *local)
-{
-       int val = local->auth_algs;
-       /* At least STA f/w v0.6.2 seems to have issues with cnfAuthentication
-        * set to include both Open and Shared Key flags. It tries to use
-        * Shared Key authentication in that case even if WEP keys are not
-        * configured.. STA f/w v0.7.6 is able to handle such configuration,
-        * but it is unknown when this was fixed between 0.6.2 .. 0.7.6. */
-       if (local->sta_fw_ver < PRISM2_FW_VER(0,7,0) &&
-           val != PRISM2_AUTH_OPEN && val != PRISM2_AUTH_SHARED_KEY)
-               val = PRISM2_AUTH_OPEN;
-
-       if (hostap_set_word(local->dev, HFA384X_RID_CNFAUTHENTICATION, val)) {
-               printk(KERN_INFO "%s: cnfAuthentication setting to 0x%x "
-                      "failed\n", local->dev->name, local->auth_algs);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-
-void hostap_dump_rx_header(const char *name, const struct hfa384x_rx_frame *rx)
-{
-       u16 status, fc;
-
-       status = __le16_to_cpu(rx->status);
-
-       printk(KERN_DEBUG "%s: RX status=0x%04x (port=%d, type=%d, "
-              "fcserr=%d) silence=%d signal=%d rate=%d rxflow=%d; "
-              "jiffies=%ld\n",
-              name, status, (status >> 8) & 0x07, status >> 13, status & 1,
-              rx->silence, rx->signal, rx->rate, rx->rxflow, jiffies);
-
-       fc = __le16_to_cpu(rx->frame_control);
-       printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d) dur=0x%04x seq=0x%04x "
-              "data_len=%d%s%s\n",
-              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
-              __le16_to_cpu(rx->duration_id), __le16_to_cpu(rx->seq_ctrl),
-              __le16_to_cpu(rx->data_len),
-              fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
-              fc & IEEE80211_FCTL_FROMDS ? " [FromDS]" : "");
-
-       printk(KERN_DEBUG "   A1=" MACSTR " A2=" MACSTR " A3=" MACSTR " A4="
-              MACSTR "\n",
-              MAC2STR(rx->addr1), MAC2STR(rx->addr2), MAC2STR(rx->addr3),
-              MAC2STR(rx->addr4));
-
-       printk(KERN_DEBUG "   dst=" MACSTR " src=" MACSTR " len=%d\n",
-              MAC2STR(rx->dst_addr), MAC2STR(rx->src_addr),
-              __be16_to_cpu(rx->len));
-}
-
-
-void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx)
-{
-       u16 fc;
-
-       printk(KERN_DEBUG "%s: TX status=0x%04x retry_count=%d tx_rate=%d "
-              "tx_control=0x%04x; jiffies=%ld\n",
-              name, __le16_to_cpu(tx->status), tx->retry_count, tx->tx_rate,
-              __le16_to_cpu(tx->tx_control), jiffies);
-
-       fc = __le16_to_cpu(tx->frame_control);
-       printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d) dur=0x%04x seq=0x%04x "
-              "data_len=%d%s%s\n",
-              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
-              __le16_to_cpu(tx->duration_id), __le16_to_cpu(tx->seq_ctrl),
-              __le16_to_cpu(tx->data_len),
-              fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
-              fc & IEEE80211_FCTL_FROMDS ? " [FromDS]" : "");
-
-       printk(KERN_DEBUG "   A1=" MACSTR " A2=" MACSTR " A3=" MACSTR " A4="
-              MACSTR "\n",
-              MAC2STR(tx->addr1), MAC2STR(tx->addr2), MAC2STR(tx->addr3),
-              MAC2STR(tx->addr4));
-
-       printk(KERN_DEBUG "   dst=" MACSTR " src=" MACSTR " len=%d\n",
-              MAC2STR(tx->dst_addr), MAC2STR(tx->src_addr),
-              __be16_to_cpu(tx->len));
-}
-
-
-int hostap_80211_header_parse(struct sk_buff *skb, unsigned char *haddr)
-{
-       memcpy(haddr, skb->mac.raw + 10, ETH_ALEN); /* addr2 */
-       return ETH_ALEN;
-}
-
-
-int hostap_80211_prism_header_parse(struct sk_buff *skb, unsigned char *haddr)
-{
-       if (*(u32 *)skb->mac.raw == LWNG_CAP_DID_BASE) {
-               memcpy(haddr, skb->mac.raw +
-                      sizeof(struct linux_wlan_ng_prism_hdr) + 10,
-                      ETH_ALEN); /* addr2 */
-       } else { /* (*(u32 *)skb->mac.raw == htonl(LWNG_CAPHDR_VERSION)) */
-               memcpy(haddr, skb->mac.raw +
-                      sizeof(struct linux_wlan_ng_cap_hdr) + 10,
-                      ETH_ALEN); /* addr2 */
-       }
-       return ETH_ALEN;
-}
-
-
-int hostap_80211_get_hdrlen(u16 fc)
-{
-       int hdrlen = 24;
-
-       switch (WLAN_FC_GET_TYPE(fc)) {
-       case IEEE80211_FTYPE_DATA:
-               if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
-                       hdrlen = 30; /* Addr4 */
-               break;
-       case IEEE80211_FTYPE_CTL:
-               switch (WLAN_FC_GET_STYPE(fc)) {
-               case IEEE80211_STYPE_CTS:
-               case IEEE80211_STYPE_ACK:
-                       hdrlen = 10;
-                       break;
-               default:
-                       hdrlen = 16;
-                       break;
-               }
-               break;
-       }
-
-       return hdrlen;
-}
-
-
-struct net_device_stats *hostap_get_stats(struct net_device *dev)
-{
-       struct hostap_interface *iface;
-       iface = netdev_priv(dev);
-       return &iface->stats;
-}
-
-
-static int prism2_close(struct net_device *dev)
-{
-       struct hostap_interface *iface;
-       local_info_t *local;
-
-       PDEBUG(DEBUG_FLOW, "%s: prism2_close\n", dev->name);
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-
-       if (dev == local->ddev) {
-               prism2_sta_deauth(local, WLAN_REASON_DEAUTH_LEAVING);
-       }
-#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
-       if (!local->hostapd && dev == local->dev &&
-           (!local->func->card_present || local->func->card_present(local)) &&
-           local->hw_ready && local->ap && local->iw_mode == IW_MODE_MASTER)
-               hostap_deauth_all_stas(dev, local->ap, 1);
-#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
-
-       if (dev == local->dev) {
-               local->func->hw_shutdown(dev, HOSTAP_HW_ENABLE_CMDCOMPL);
-       }
-
-       if (netif_running(dev)) {
-               netif_stop_queue(dev);
-               netif_device_detach(dev);
-       }
-
-       flush_scheduled_work();
-
-       module_put(local->hw_module);
-
-       local->num_dev_open--;
-
-       if (dev != local->dev && local->dev->flags & IFF_UP &&
-           local->master_dev_auto_open && local->num_dev_open == 1) {
-               /* Close master radio interface automatically if it was also
-                * opened automatically and we are now closing the last
-                * remaining non-master device. */
-               dev_close(local->dev);
-       }
-
-       return 0;
-}
-
-
-static int prism2_open(struct net_device *dev)
-{
-       struct hostap_interface *iface;
-       local_info_t *local;
-
-       PDEBUG(DEBUG_FLOW, "%s: prism2_open\n", dev->name);
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-
-       if (local->no_pri) {
-               printk(KERN_DEBUG "%s: could not set interface UP - no PRI "
-                      "f/w\n", dev->name);
-               return 1;
-       }
-
-       if ((local->func->card_present && !local->func->card_present(local)) ||
-           local->hw_downloading)
-               return -ENODEV;
-
-       if (!try_module_get(local->hw_module))
-               return -ENODEV;
-       local->num_dev_open++;
-
-       if (!local->dev_enabled && local->func->hw_enable(dev, 1)) {
-               printk(KERN_WARNING "%s: could not enable MAC port\n",
-                      dev->name);
-               prism2_close(dev);
-               return 1;
-       }
-       if (!local->dev_enabled)
-               prism2_callback(local, PRISM2_CALLBACK_ENABLE);
-       local->dev_enabled = 1;
-
-       if (dev != local->dev && !(local->dev->flags & IFF_UP)) {
-               /* Master radio interface is needed for all operation, so open
-                * it automatically when any virtual net_device is opened. */
-               local->master_dev_auto_open = 1;
-               dev_open(local->dev);
-       }
-
-       netif_device_attach(dev);
-       netif_start_queue(dev);
-
-       return 0;
-}
-
-
-static int prism2_set_mac_address(struct net_device *dev, void *p)
-{
-       struct hostap_interface *iface;
-       local_info_t *local;
-       struct list_head *ptr;
-       struct sockaddr *addr = p;
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-
-       if (local->func->set_rid(dev, HFA384X_RID_CNFOWNMACADDR, addr->sa_data,
-                                ETH_ALEN) < 0 || local->func->reset_port(dev))
-               return -EINVAL;
-
-       read_lock_bh(&local->iface_lock);
-       list_for_each(ptr, &local->hostap_interfaces) {
-               iface = list_entry(ptr, struct hostap_interface, list);
-               memcpy(iface->dev->dev_addr, addr->sa_data, ETH_ALEN);
-       }
-       memcpy(local->dev->dev_addr, addr->sa_data, ETH_ALEN);
-       read_unlock_bh(&local->iface_lock);
-
-       return 0;
-}
-
-
-/* TODO: to be further implemented as soon as Prism2 fully supports
- *       GroupAddresses and correct documentation is available */
-void hostap_set_multicast_list_queue(void *data)
-{
-       struct net_device *dev = (struct net_device *) data;
-       struct hostap_interface *iface;
-       local_info_t *local;
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-       if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE,
-                           local->is_promisc)) {
-               printk(KERN_INFO "%s: %sabling promiscuous mode failed\n",
-                      dev->name, local->is_promisc ? "en" : "dis");
-       }
-}
-
-
-static void hostap_set_multicast_list(struct net_device *dev)
-{
-#if 0
-       /* FIX: promiscuous mode seems to be causing a lot of problems with
-        * some station firmware versions (FCSErr frames, invalid MACPort, etc.
-        * corrupted incoming frames). This code is now commented out while the
-        * problems are investigated. */
-       struct hostap_interface *iface;
-       local_info_t *local;
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-       if ((dev->flags & IFF_ALLMULTI) || (dev->flags & IFF_PROMISC)) {
-               local->is_promisc = 1;
-       } else {
-               local->is_promisc = 0;
-       }
-
-       schedule_work(&local->set_multicast_list_queue);
-#endif
-}
-
-
-static int prism2_change_mtu(struct net_device *dev, int new_mtu)
-{
-       if (new_mtu < PRISM2_MIN_MTU || new_mtu > PRISM2_MAX_MTU)
-               return -EINVAL;
-
-       dev->mtu = new_mtu;
-       return 0;
-}
-
-
-static void prism2_tx_timeout(struct net_device *dev)
-{
-       struct hostap_interface *iface;
-       local_info_t *local;
-       struct hfa384x_regs regs;
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-
-       printk(KERN_WARNING "%s Tx timed out! Resetting card\n", dev->name);
-       netif_stop_queue(local->dev);
-
-       local->func->read_regs(dev, &regs);
-       printk(KERN_DEBUG "%s: CMD=%04x EVSTAT=%04x "
-              "OFFSET0=%04x OFFSET1=%04x SWSUPPORT0=%04x\n",
-              dev->name, regs.cmd, regs.evstat, regs.offset0, regs.offset1,
-              regs.swsupport0);
-
-       local->func->schedule_reset(local);
-}
-
-
-void hostap_setup_dev(struct net_device *dev, local_info_t *local,
-                     int main_dev)
-{
-       struct hostap_interface *iface;
-
-       iface = netdev_priv(dev);
-       ether_setup(dev);
-
-       /* kernel callbacks */
-       dev->get_stats = hostap_get_stats;
-       if (iface) {
-               /* Currently, we point to the proper spy_data only on
-                * the main_dev. This could be fixed. Jean II */
-               iface->wireless_data.spy_data = &iface->spy_data;
-               dev->wireless_data = &iface->wireless_data;
-       }
-       dev->wireless_handlers =
-               (struct iw_handler_def *) &hostap_iw_handler_def;
-       dev->do_ioctl = hostap_ioctl;
-       dev->open = prism2_open;
-       dev->stop = prism2_close;
-       dev->hard_start_xmit = hostap_data_start_xmit;
-       dev->set_mac_address = prism2_set_mac_address;
-       dev->set_multicast_list = hostap_set_multicast_list;
-       dev->change_mtu = prism2_change_mtu;
-       dev->tx_timeout = prism2_tx_timeout;
-       dev->watchdog_timeo = TX_TIMEOUT;
-
-       dev->mtu = local->mtu;
-       if (!main_dev) {
-               /* use main radio device queue */
-               dev->tx_queue_len = 0;
-       }
-
-       SET_ETHTOOL_OPS(dev, &prism2_ethtool_ops);
-
-       netif_stop_queue(dev);
-}
-
-
-static int hostap_enable_hostapd(local_info_t *local, int rtnl_locked)
-{
-       struct net_device *dev = local->dev;
-
-       if (local->apdev)
-               return -EEXIST;
-
-       printk(KERN_DEBUG "%s: enabling hostapd mode\n", dev->name);
-
-       local->apdev = hostap_add_interface(local, HOSTAP_INTERFACE_AP,
-                                           rtnl_locked, local->ddev->name,
-                                           "ap");
-       if (local->apdev == NULL)
-               return -ENOMEM;
-
-       local->apdev->hard_start_xmit = hostap_mgmt_start_xmit;
-       local->apdev->type = ARPHRD_IEEE80211;
-       local->apdev->hard_header_parse = hostap_80211_header_parse;
-
-       return 0;
-}
-
-
-static int hostap_disable_hostapd(local_info_t *local, int rtnl_locked)
-{
-       struct net_device *dev = local->dev;
-
-       printk(KERN_DEBUG "%s: disabling hostapd mode\n", dev->name);
-
-       hostap_remove_interface(local->apdev, rtnl_locked, 1);
-       local->apdev = NULL;
-
-       return 0;
-}
-
-
-static int hostap_enable_hostapd_sta(local_info_t *local, int rtnl_locked)
-{
-       struct net_device *dev = local->dev;
-
-       if (local->stadev)
-               return -EEXIST;
-
-       printk(KERN_DEBUG "%s: enabling hostapd STA mode\n", dev->name);
-
-       local->stadev = hostap_add_interface(local, HOSTAP_INTERFACE_STA,
-                                            rtnl_locked, local->ddev->name,
-                                            "sta");
-       if (local->stadev == NULL)
-               return -ENOMEM;
-
-       return 0;
-}
-
-
-static int hostap_disable_hostapd_sta(local_info_t *local, int rtnl_locked)
-{
-       struct net_device *dev = local->dev;
-
-       printk(KERN_DEBUG "%s: disabling hostapd mode\n", dev->name);
-
-       hostap_remove_interface(local->stadev, rtnl_locked, 1);
-       local->stadev = NULL;
-
-       return 0;
-}
-
-
-int hostap_set_hostapd(local_info_t *local, int val, int rtnl_locked)
-{
-       int ret;
-
-       if (val < 0 || val > 1)
-               return -EINVAL;
-
-       if (local->hostapd == val)
-               return 0;
-
-       if (val) {
-               ret = hostap_enable_hostapd(local, rtnl_locked);
-               if (ret == 0)
-                       local->hostapd = 1;
-       } else {
-               local->hostapd = 0;
-               ret = hostap_disable_hostapd(local, rtnl_locked);
-               if (ret != 0)
-                       local->hostapd = 1;
-       }
-
-       return ret;
-}
-
-
-int hostap_set_hostapd_sta(local_info_t *local, int val, int rtnl_locked)
-{
-       int ret;
-
-       if (val < 0 || val > 1)
-               return -EINVAL;
-
-       if (local->hostapd_sta == val)
-               return 0;
-
-       if (val) {
-               ret = hostap_enable_hostapd_sta(local, rtnl_locked);
-               if (ret == 0)
-                       local->hostapd_sta = 1;
-       } else {
-               local->hostapd_sta = 0;
-               ret = hostap_disable_hostapd_sta(local, rtnl_locked);
-               if (ret != 0)
-                       local->hostapd_sta = 1;
-       }
-
-
-       return ret;
-}
-
-
-int prism2_update_comms_qual(struct net_device *dev)
-{
-       struct hostap_interface *iface;
-       local_info_t *local;
-       int ret = 0;
-       struct hfa384x_comms_quality sq;
-
-       iface = netdev_priv(dev);
-       local = iface->local;
-       if (!local->sta_fw_ver)
-               ret = -1;
-       else if (local->sta_fw_ver >= PRISM2_FW_VER(1,3,1)) {
-               if (local->func->get_rid(local->dev,
-                                        HFA384X_RID_DBMCOMMSQUALITY,
-                                        &sq, sizeof(sq), 1) >= 0) {
-                       local->comms_qual = (s16) le16_to_cpu(sq.comm_qual);
-                       local->avg_signal = (s16) le16_to_cpu(sq.signal_level);
-                       local->avg_noise = (s16) le16_to_cpu(sq.noise_level);
-                       local->last_comms_qual_update = jiffies;
-               } else
-                       ret = -1;
-       } else {
-               if (local->func->get_rid(local->dev, HFA384X_RID_COMMSQUALITY,
-                                        &sq, sizeof(sq), 1) >= 0) {
-                       local->comms_qual = le16_to_cpu(sq.comm_qual);
-                       local->avg_signal = HFA384X_LEVEL_TO_dBm(
-                               le16_to_cpu(sq.signal_level));
-                       local->avg_noise = HFA384X_LEVEL_TO_dBm(
-                               le16_to_cpu(sq.noise_level));
-                       local->last_comms_qual_update = jiffies;
-               } else
-                       ret = -1;
-       }
-
-       return ret;
-}
-
-
-int prism2_sta_send_mgmt(local_info_t *local, u8 *dst, u16 stype,
-                        u8 *body, size_t bodylen)
-{
-       struct sk_buff *skb;
-       struct hostap_ieee80211_mgmt *mgmt;
-       struct hostap_skb_tx_data *meta;
-       struct net_device *dev = local->dev;
-
-       skb = dev_alloc_skb(IEEE80211_MGMT_HDR_LEN + bodylen);
-       if (skb == NULL)
-               return -ENOMEM;
-
-       mgmt = (struct hostap_ieee80211_mgmt *)
-               skb_put(skb, IEEE80211_MGMT_HDR_LEN);
-       memset(mgmt, 0, IEEE80211_MGMT_HDR_LEN);
-       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
-       memcpy(mgmt->da, dst, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
-       memcpy(mgmt->bssid, dst, ETH_ALEN);
-       if (body)
-               memcpy(skb_put(skb, bodylen), body, bodylen);
-
-       meta = (struct hostap_skb_tx_data *) skb->cb;
-       memset(meta, 0, sizeof(*meta));
-       meta->magic = HOSTAP_SKB_TX_DATA_MAGIC;
-       meta->iface = netdev_priv(dev);
-
-       skb->dev = dev;
-       skb->mac.raw = skb->nh.raw = skb->data;
-       dev_queue_xmit(skb);
-
-       return 0;
-}
-
-
-int prism2_sta_deauth(local_info_t *local, u16 reason)
-{
-       union iwreq_data wrqu;
-       int ret;
-
-       if (local->iw_mode != IW_MODE_INFRA ||
-           memcmp(local->bssid, "\x00\x00\x00\x00\x00\x00", ETH_ALEN) == 0 ||
-           memcmp(local->bssid, "\x44\x44\x44\x44\x44\x44", ETH_ALEN) == 0)
-               return 0;
-
-       reason = cpu_to_le16(reason);
-       ret = prism2_sta_send_mgmt(local, local->bssid, IEEE80211_STYPE_DEAUTH,
-                                  (u8 *) &reason, 2);
-       memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
-       wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL);
-       return ret;
-}
-
-
-struct proc_dir_entry *hostap_proc;
-
-static int __init hostap_init(void)
-{
-       if (proc_net != NULL) {
-               hostap_proc = proc_mkdir("hostap", proc_net);
-               if (!hostap_proc)
-                       printk(KERN_WARNING "Failed to mkdir "
-                              "/proc/net/hostap\n");
-       } else
-               hostap_proc = NULL;
-
-       return 0;
-}
-
-
-static void __exit hostap_exit(void)
-{
-       if (hostap_proc != NULL) {
-               hostap_proc = NULL;
-               remove_proc_entry("hostap", proc_net);
-       }
-}
-
-
-EXPORT_SYMBOL(hostap_set_word);
-EXPORT_SYMBOL(hostap_set_string);
-EXPORT_SYMBOL(hostap_get_porttype);
-EXPORT_SYMBOL(hostap_set_encryption);
-EXPORT_SYMBOL(hostap_set_antsel);
-EXPORT_SYMBOL(hostap_set_roaming);
-EXPORT_SYMBOL(hostap_set_auth_algs);
-EXPORT_SYMBOL(hostap_dump_rx_header);
-EXPORT_SYMBOL(hostap_dump_tx_header);
-EXPORT_SYMBOL(hostap_80211_header_parse);
-EXPORT_SYMBOL(hostap_80211_prism_header_parse);
-EXPORT_SYMBOL(hostap_80211_get_hdrlen);
-EXPORT_SYMBOL(hostap_get_stats);
-EXPORT_SYMBOL(hostap_setup_dev);
-EXPORT_SYMBOL(hostap_proc);
-EXPORT_SYMBOL(hostap_set_multicast_list_queue);
-EXPORT_SYMBOL(hostap_set_hostapd);
-EXPORT_SYMBOL(hostap_set_hostapd_sta);
-EXPORT_SYMBOL(hostap_add_interface);
-EXPORT_SYMBOL(hostap_remove_interface);
-EXPORT_SYMBOL(prism2_update_comms_qual);
-
-module_init(hostap_init);
-module_exit(hostap_exit);
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
new file mode 100644 (file)
index 0000000..3d2ea61
--- /dev/null
@@ -0,0 +1,1191 @@
+/*
+ * Host AP (software wireless LAN access point) driver for
+ * Intersil Prism2/2.5/3 - hostap.o module, common routines
+ *
+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+ * <jkmaline@cc.hut.fi>
+ * Copyright (c) 2002-2005, Jouni Malinen <jkmaline@cc.hut.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/proc_fs.h>
+#include <linux/if_arp.h>
+#include <linux/delay.h>
+#include <linux/random.h>
+#include <linux/workqueue.h>
+#include <linux/kmod.h>
+#include <linux/rtnetlink.h>
+#include <linux/wireless.h>
+#include <net/iw_handler.h>
+#include <net/ieee80211.h>
+#include <net/ieee80211_crypt.h>
+#include <asm/uaccess.h>
+
+#include "hostap_wlan.h"
+#include "hostap_80211.h"
+#include "hostap_ap.h"
+#include "hostap.h"
+
+MODULE_AUTHOR("Jouni Malinen");
+MODULE_DESCRIPTION("Host AP common routines");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(PRISM2_VERSION);
+
+#define TX_TIMEOUT (2 * HZ)
+
+#define PRISM2_MAX_FRAME_SIZE 2304
+#define PRISM2_MIN_MTU 256
+/* FIX: */
+#define PRISM2_MAX_MTU (PRISM2_MAX_FRAME_SIZE - (6 /* LLC */ + 8 /* WEP */))
+
+
+/* hostap.c */
+static int prism2_wds_add(local_info_t *local, u8 *remote_addr,
+                         int rtnl_locked);
+static int prism2_wds_del(local_info_t *local, u8 *remote_addr,
+                         int rtnl_locked, int do_not_remove);
+
+/* hostap_ap.c */
+static int prism2_ap_get_sta_qual(local_info_t *local, struct sockaddr addr[],
+                                 struct iw_quality qual[], int buf_size,
+                                 int aplist);
+static int prism2_ap_translate_scan(struct net_device *dev, char *buffer);
+static int prism2_hostapd(struct ap_data *ap,
+                         struct prism2_hostapd_param *param);
+static void * ap_crypt_get_ptrs(struct ap_data *ap, u8 *addr, int permanent,
+                               struct ieee80211_crypt_data ***crypt);
+static void ap_control_kickall(struct ap_data *ap);
+#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
+static int ap_control_add_mac(struct mac_restrictions *mac_restrictions,
+                             u8 *mac);
+static int ap_control_del_mac(struct mac_restrictions *mac_restrictions,
+                             u8 *mac);
+static void ap_control_flush_macs(struct mac_restrictions *mac_restrictions);
+static int ap_control_kick_mac(struct ap_data *ap, struct net_device *dev,
+                              u8 *mac);
+#endif /* !PRISM2_NO_KERNEL_IEEE80211_MGMT */
+
+
+static const long freq_list[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442,
+                                 2447, 2452, 2457, 2462, 2467, 2472, 2484 };
+#define FREQ_COUNT (sizeof(freq_list) / sizeof(freq_list[0]))
+
+
+/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
+/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
+static unsigned char rfc1042_header[] =
+{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
+/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
+static unsigned char bridge_tunnel_header[] =
+{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
+/* No encapsulation header if EtherType < 0x600 (=length) */
+
+
+/* FIX: these could be compiled separately and linked together to hostap.o */
+#include "hostap_ap.c"
+#include "hostap_info.c"
+#include "hostap_ioctl.c"
+#include "hostap_proc.c"
+#include "hostap_80211_rx.c"
+#include "hostap_80211_tx.c"
+
+
+struct net_device * hostap_add_interface(struct local_info *local,
+                                        int type, int rtnl_locked,
+                                        const char *prefix,
+                                        const char *name)
+{
+       struct net_device *dev, *mdev;
+       struct hostap_interface *iface;
+       int ret;
+
+       dev = alloc_etherdev(sizeof(struct hostap_interface));
+       if (dev == NULL)
+               return NULL;
+
+       iface = netdev_priv(dev);
+       iface->dev = dev;
+       iface->local = local;
+       iface->type = type;
+       list_add(&iface->list, &local->hostap_interfaces);
+
+       mdev = local->dev;
+       memcpy(dev->dev_addr, mdev->dev_addr, ETH_ALEN);
+       dev->base_addr = mdev->base_addr;
+       dev->irq = mdev->irq;
+       dev->mem_start = mdev->mem_start;
+       dev->mem_end = mdev->mem_end;
+
+       hostap_setup_dev(dev, local, 0);
+       dev->destructor = free_netdev;
+
+       sprintf(dev->name, "%s%s", prefix, name);
+       if (!rtnl_locked)
+               rtnl_lock();
+
+       ret = 0;
+       if (strchr(dev->name, '%'))
+               ret = dev_alloc_name(dev, dev->name);
+
+       SET_NETDEV_DEV(dev, mdev->class_dev.dev);
+       if (ret >= 0)
+               ret = register_netdevice(dev);
+
+       if (!rtnl_locked)
+               rtnl_unlock();
+
+       if (ret < 0) {
+               printk(KERN_WARNING "%s: failed to add new netdevice!\n",
+                      dev->name);
+               free_netdev(dev);
+               return NULL;
+       }
+
+       printk(KERN_DEBUG "%s: registered netdevice %s\n",
+              mdev->name, dev->name);
+
+       return dev;
+}
+
+
+void hostap_remove_interface(struct net_device *dev, int rtnl_locked,
+                            int remove_from_list)
+{
+       struct hostap_interface *iface;
+
+       if (!dev)
+               return;
+
+       iface = netdev_priv(dev);
+
+       if (remove_from_list) {
+               list_del(&iface->list);
+       }
+
+       if (dev == iface->local->ddev)
+               iface->local->ddev = NULL;
+       else if (dev == iface->local->apdev)
+               iface->local->apdev = NULL;
+       else if (dev == iface->local->stadev)
+               iface->local->stadev = NULL;
+
+       if (rtnl_locked)
+               unregister_netdevice(dev);
+       else
+               unregister_netdev(dev);
+
+       /* dev->destructor = free_netdev() will free the device data, including
+        * private data, when removing the device */
+}
+
+
+static inline int prism2_wds_special_addr(u8 *addr)
+{
+       if (addr[0] || addr[1] || addr[2] || addr[3] || addr[4] || addr[5])
+               return 0;
+
+       return 1;
+}
+
+
+static int prism2_wds_add(local_info_t *local, u8 *remote_addr,
+                         int rtnl_locked)
+{
+       struct net_device *dev;
+       struct list_head *ptr;
+       struct hostap_interface *iface, *empty, *match;
+
+       empty = match = NULL;
+       read_lock_bh(&local->iface_lock);
+       list_for_each(ptr, &local->hostap_interfaces) {
+               iface = list_entry(ptr, struct hostap_interface, list);
+               if (iface->type != HOSTAP_INTERFACE_WDS)
+                       continue;
+
+               if (prism2_wds_special_addr(iface->u.wds.remote_addr))
+                       empty = iface;
+               else if (memcmp(iface->u.wds.remote_addr, remote_addr,
+                               ETH_ALEN) == 0) {
+                       match = iface;
+                       break;
+               }
+       }
+       if (!match && empty && !prism2_wds_special_addr(remote_addr)) {
+               /* take pre-allocated entry into use */
+               memcpy(empty->u.wds.remote_addr, remote_addr, ETH_ALEN);
+               read_unlock_bh(&local->iface_lock);
+               printk(KERN_DEBUG "%s: using pre-allocated WDS netdevice %s\n",
+                      local->dev->name, empty->dev->name);
+               return 0;
+       }
+       read_unlock_bh(&local->iface_lock);
+
+       if (!prism2_wds_special_addr(remote_addr)) {
+               if (match)
+                       return -EEXIST;
+               hostap_add_sta(local->ap, remote_addr);
+       }
+
+       if (local->wds_connections >= local->wds_max_connections)
+               return -ENOBUFS;
+
+       /* verify that there is room for wds# postfix in the interface name */
+       if (strlen(local->dev->name) > IFNAMSIZ - 5) {
+               printk(KERN_DEBUG "'%s' too long base device name\n",
+                      local->dev->name);
+               return -EINVAL;
+       }
+
+       dev = hostap_add_interface(local, HOSTAP_INTERFACE_WDS, rtnl_locked,
+                                  local->ddev->name, "wds%d");
+       if (dev == NULL)
+               return -ENOMEM;
+
+       iface = netdev_priv(dev);
+       memcpy(iface->u.wds.remote_addr, remote_addr, ETH_ALEN);
+
+       local->wds_connections++;
+
+       return 0;
+}
+
+
+static int prism2_wds_del(local_info_t *local, u8 *remote_addr,
+                         int rtnl_locked, int do_not_remove)
+{
+       unsigned long flags;
+       struct list_head *ptr;
+       struct hostap_interface *iface, *selected = NULL;
+
+       write_lock_irqsave(&local->iface_lock, flags);
+       list_for_each(ptr, &local->hostap_interfaces) {
+               iface = list_entry(ptr, struct hostap_interface, list);
+               if (iface->type != HOSTAP_INTERFACE_WDS)
+                       continue;
+
+               if (memcmp(iface->u.wds.remote_addr, remote_addr,
+                          ETH_ALEN) == 0) {
+                       selected = iface;
+                       break;
+               }
+       }
+       if (selected && !do_not_remove)
+               list_del(&selected->list);
+       write_unlock_irqrestore(&local->iface_lock, flags);
+
+       if (selected) {
+               if (do_not_remove)
+                       memset(selected->u.wds.remote_addr, 0, ETH_ALEN);
+               else {
+                       hostap_remove_interface(selected->dev, rtnl_locked, 0);
+                       local->wds_connections--;
+               }
+       }
+
+       return selected ? 0 : -ENODEV;
+}
+
+
+u16 hostap_tx_callback_register(local_info_t *local,
+                               void (*func)(struct sk_buff *, int ok, void *),
+                               void *data)
+{
+       unsigned long flags;
+       struct hostap_tx_callback_info *entry;
+
+       entry = (struct hostap_tx_callback_info *) kmalloc(sizeof(*entry),
+                                                          GFP_ATOMIC);
+       if (entry == NULL)
+               return 0;
+
+       entry->func = func;
+       entry->data = data;
+
+       spin_lock_irqsave(&local->lock, flags);
+       entry->idx = local->tx_callback ? local->tx_callback->idx + 1 : 1;
+       entry->next = local->tx_callback;
+       local->tx_callback = entry;
+       spin_unlock_irqrestore(&local->lock, flags);
+
+       return entry->idx;
+}
+
+
+int hostap_tx_callback_unregister(local_info_t *local, u16 idx)
+{
+       unsigned long flags;
+       struct hostap_tx_callback_info *cb, *prev = NULL;
+
+       spin_lock_irqsave(&local->lock, flags);
+       cb = local->tx_callback;
+       while (cb != NULL && cb->idx != idx) {
+               prev = cb;
+               cb = cb->next;
+       }
+       if (cb) {
+               if (prev == NULL)
+                       local->tx_callback = cb->next;
+               else
+                       prev->next = cb->next;
+               kfree(cb);
+       }
+       spin_unlock_irqrestore(&local->lock, flags);
+
+       return cb ? 0 : -1;
+}
+
+
+/* val is in host byte order */
+int hostap_set_word(struct net_device *dev, int rid, u16 val)
+{
+       struct hostap_interface *iface;
+       u16 tmp = cpu_to_le16(val);
+       iface = netdev_priv(dev);
+       return iface->local->func->set_rid(dev, rid, &tmp, 2);
+}
+
+
+int hostap_set_string(struct net_device *dev, int rid, const char *val)
+{
+       struct hostap_interface *iface;
+       char buf[MAX_SSID_LEN + 2];
+       int len;
+
+       iface = netdev_priv(dev);
+       len = strlen(val);
+       if (len > MAX_SSID_LEN)
+               return -1;
+       memset(buf, 0, sizeof(buf));
+       buf[0] = len; /* little endian 16 bit word */
+       memcpy(buf + 2, val, len);
+
+       return iface->local->func->set_rid(dev, rid, &buf, MAX_SSID_LEN + 2);
+}
+
+
+u16 hostap_get_porttype(local_info_t *local)
+{
+       if (local->iw_mode == IW_MODE_ADHOC && local->pseudo_adhoc)
+               return HFA384X_PORTTYPE_PSEUDO_IBSS;
+       if (local->iw_mode == IW_MODE_ADHOC)
+               return HFA384X_PORTTYPE_IBSS;
+       if (local->iw_mode == IW_MODE_INFRA)
+               return HFA384X_PORTTYPE_BSS;
+       if (local->iw_mode == IW_MODE_REPEAT)
+               return HFA384X_PORTTYPE_WDS;
+       if (local->iw_mode == IW_MODE_MONITOR)
+               return HFA384X_PORTTYPE_PSEUDO_IBSS;
+       return HFA384X_PORTTYPE_HOSTAP;
+}
+
+
+int hostap_set_encryption(local_info_t *local)
+{
+       u16 val, old_val;
+       int i, keylen, len, idx;
+       char keybuf[WEP_KEY_LEN + 1];
+       enum { NONE, WEP, OTHER } encrypt_type;
+
+       idx = local->tx_keyidx;
+       if (local->crypt[idx] == NULL || local->crypt[idx]->ops == NULL)
+               encrypt_type = NONE;
+       else if (strcmp(local->crypt[idx]->ops->name, "WEP") == 0)
+               encrypt_type = WEP;
+       else
+               encrypt_type = OTHER;
+
+       if (local->func->get_rid(local->dev, HFA384X_RID_CNFWEPFLAGS, &val, 2,
+                                1) < 0) {
+               printk(KERN_DEBUG "Could not read current WEP flags.\n");
+               goto fail;
+       }
+       le16_to_cpus(&val);
+       old_val = val;
+
+       if (encrypt_type != NONE || local->privacy_invoked)
+               val |= HFA384X_WEPFLAGS_PRIVACYINVOKED;
+       else
+               val &= ~HFA384X_WEPFLAGS_PRIVACYINVOKED;
+
+       if (local->open_wep || encrypt_type == NONE ||
+           ((local->ieee_802_1x || local->wpa) && local->host_decrypt))
+               val &= ~HFA384X_WEPFLAGS_EXCLUDEUNENCRYPTED;
+       else
+               val |= HFA384X_WEPFLAGS_EXCLUDEUNENCRYPTED;
+
+       if ((encrypt_type != NONE || local->privacy_invoked) &&
+           (encrypt_type == OTHER || local->host_encrypt))
+               val |= HFA384X_WEPFLAGS_HOSTENCRYPT;
+       else
+               val &= ~HFA384X_WEPFLAGS_HOSTENCRYPT;
+       if ((encrypt_type != NONE || local->privacy_invoked) &&
+           (encrypt_type == OTHER || local->host_decrypt))
+               val |= HFA384X_WEPFLAGS_HOSTDECRYPT;
+       else
+               val &= ~HFA384X_WEPFLAGS_HOSTDECRYPT;
+
+       if (val != old_val &&
+           hostap_set_word(local->dev, HFA384X_RID_CNFWEPFLAGS, val)) {
+               printk(KERN_DEBUG "Could not write new WEP flags (0x%x)\n",
+                      val);
+               goto fail;
+       }
+
+       if (encrypt_type != WEP)
+               return 0;
+
+       /* 104-bit support seems to require that all the keys are set to the
+        * same keylen */
+       keylen = 6; /* first 5 octets */
+       len = local->crypt[idx]->ops->get_key(keybuf, sizeof(keybuf),
+                                             NULL, local->crypt[idx]->priv);
+       if (idx >= 0 && idx < WEP_KEYS && len > 5)
+               keylen = WEP_KEY_LEN + 1; /* first 13 octets */
+
+       for (i = 0; i < WEP_KEYS; i++) {
+               memset(keybuf, 0, sizeof(keybuf));
+               if (local->crypt[i]) {
+                       (void) local->crypt[i]->ops->get_key(
+                               keybuf, sizeof(keybuf),
+                               NULL, local->crypt[i]->priv);
+               }
+               if (local->func->set_rid(local->dev,
+                                        HFA384X_RID_CNFDEFAULTKEY0 + i,
+                                        keybuf, keylen)) {
+                       printk(KERN_DEBUG "Could not set key %d (len=%d)\n",
+                              i, keylen);
+                       goto fail;
+               }
+       }
+       if (hostap_set_word(local->dev, HFA384X_RID_CNFWEPDEFAULTKEYID, idx)) {
+               printk(KERN_DEBUG "Could not set default keyid %d\n", idx);
+               goto fail;
+       }
+
+       return 0;
+
+ fail:
+       printk(KERN_DEBUG "%s: encryption setup failed\n", local->dev->name);
+       return -1;
+}
+
+
+int hostap_set_antsel(local_info_t *local)
+{
+       u16 val;
+       int ret = 0;
+
+       if (local->antsel_tx != HOSTAP_ANTSEL_DO_NOT_TOUCH &&
+           local->func->cmd(local->dev, HFA384X_CMDCODE_READMIF,
+                            HFA386X_CR_TX_CONFIGURE,
+                            NULL, &val) == 0) {
+               val &= ~(BIT(2) | BIT(1));
+               switch (local->antsel_tx) {
+               case HOSTAP_ANTSEL_DIVERSITY:
+                       val |= BIT(1);
+                       break;
+               case HOSTAP_ANTSEL_LOW:
+                       break;
+               case HOSTAP_ANTSEL_HIGH:
+                       val |= BIT(2);
+                       break;
+               }
+
+               if (local->func->cmd(local->dev, HFA384X_CMDCODE_WRITEMIF,
+                                    HFA386X_CR_TX_CONFIGURE, &val, NULL)) {
+                       printk(KERN_INFO "%s: setting TX AntSel failed\n",
+                              local->dev->name);
+                       ret = -1;
+               }
+       }
+
+       if (local->antsel_rx != HOSTAP_ANTSEL_DO_NOT_TOUCH &&
+           local->func->cmd(local->dev, HFA384X_CMDCODE_READMIF,
+                            HFA386X_CR_RX_CONFIGURE,
+                            NULL, &val) == 0) {
+               val &= ~(BIT(1) | BIT(0));
+               switch (local->antsel_rx) {
+               case HOSTAP_ANTSEL_DIVERSITY:
+                       break;
+               case HOSTAP_ANTSEL_LOW:
+                       val |= BIT(0);
+                       break;
+               case HOSTAP_ANTSEL_HIGH:
+                       val |= BIT(0) | BIT(1);
+                       break;
+               }
+
+               if (local->func->cmd(local->dev, HFA384X_CMDCODE_WRITEMIF,
+                                    HFA386X_CR_RX_CONFIGURE, &val, NULL)) {
+                       printk(KERN_INFO "%s: setting RX AntSel failed\n",
+                              local->dev->name);
+                       ret = -1;
+               }
+       }
+
+       return ret;
+}
+
+
+int hostap_set_roaming(local_info_t *local)
+{
+       u16 val;
+
+       switch (local->host_roaming) {
+       case 1:
+               val = HFA384X_ROAMING_HOST;
+               break;
+       case 2:
+               val = HFA384X_ROAMING_DISABLED;
+               break;
+       case 0:
+       default:
+               val = HFA384X_ROAMING_FIRMWARE;
+               break;
+       }
+
+       return hostap_set_word(local->dev, HFA384X_RID_CNFROAMINGMODE, val);
+}
+
+
+int hostap_set_auth_algs(local_info_t *local)
+{
+       int val = local->auth_algs;
+       /* At least STA f/w v0.6.2 seems to have issues with cnfAuthentication
+        * set to include both Open and Shared Key flags. It tries to use
+        * Shared Key authentication in that case even if WEP keys are not
+        * configured.. STA f/w v0.7.6 is able to handle such configuration,
+        * but it is unknown when this was fixed between 0.6.2 .. 0.7.6. */
+       if (local->sta_fw_ver < PRISM2_FW_VER(0,7,0) &&
+           val != PRISM2_AUTH_OPEN && val != PRISM2_AUTH_SHARED_KEY)
+               val = PRISM2_AUTH_OPEN;
+
+       if (hostap_set_word(local->dev, HFA384X_RID_CNFAUTHENTICATION, val)) {
+               printk(KERN_INFO "%s: cnfAuthentication setting to 0x%x "
+                      "failed\n", local->dev->name, local->auth_algs);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+
+void hostap_dump_rx_header(const char *name, const struct hfa384x_rx_frame *rx)
+{
+       u16 status, fc;
+
+       status = __le16_to_cpu(rx->status);
+
+       printk(KERN_DEBUG "%s: RX status=0x%04x (port=%d, type=%d, "
+              "fcserr=%d) silence=%d signal=%d rate=%d rxflow=%d; "
+              "jiffies=%ld\n",
+              name, status, (status >> 8) & 0x07, status >> 13, status & 1,
+              rx->silence, rx->signal, rx->rate, rx->rxflow, jiffies);
+
+       fc = __le16_to_cpu(rx->frame_control);
+       printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d) dur=0x%04x seq=0x%04x "
+              "data_len=%d%s%s\n",
+              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
+              __le16_to_cpu(rx->duration_id), __le16_to_cpu(rx->seq_ctrl),
+              __le16_to_cpu(rx->data_len),
+              fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
+              fc & IEEE80211_FCTL_FROMDS ? " [FromDS]" : "");
+
+       printk(KERN_DEBUG "   A1=" MACSTR " A2=" MACSTR " A3=" MACSTR " A4="
+              MACSTR "\n",
+              MAC2STR(rx->addr1), MAC2STR(rx->addr2), MAC2STR(rx->addr3),
+              MAC2STR(rx->addr4));
+
+       printk(KERN_DEBUG "   dst=" MACSTR " src=" MACSTR " len=%d\n",
+              MAC2STR(rx->dst_addr), MAC2STR(rx->src_addr),
+              __be16_to_cpu(rx->len));
+}
+
+
+void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx)
+{
+       u16 fc;
+
+       printk(KERN_DEBUG "%s: TX status=0x%04x retry_count=%d tx_rate=%d "
+              "tx_control=0x%04x; jiffies=%ld\n",
+              name, __le16_to_cpu(tx->status), tx->retry_count, tx->tx_rate,
+              __le16_to_cpu(tx->tx_control), jiffies);
+
+       fc = __le16_to_cpu(tx->frame_control);
+       printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d) dur=0x%04x seq=0x%04x "
+              "data_len=%d%s%s\n",
+              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
+              __le16_to_cpu(tx->duration_id), __le16_to_cpu(tx->seq_ctrl),
+              __le16_to_cpu(tx->data_len),
+              fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
+              fc & IEEE80211_FCTL_FROMDS ? " [FromDS]" : "");
+
+       printk(KERN_DEBUG "   A1=" MACSTR " A2=" MACSTR " A3=" MACSTR " A4="
+              MACSTR "\n",
+              MAC2STR(tx->addr1), MAC2STR(tx->addr2), MAC2STR(tx->addr3),
+              MAC2STR(tx->addr4));
+
+       printk(KERN_DEBUG "   dst=" MACSTR " src=" MACSTR " len=%d\n",
+              MAC2STR(tx->dst_addr), MAC2STR(tx->src_addr),
+              __be16_to_cpu(tx->len));
+}
+
+
+int hostap_80211_header_parse(struct sk_buff *skb, unsigned char *haddr)
+{
+       memcpy(haddr, skb->mac.raw + 10, ETH_ALEN); /* addr2 */
+       return ETH_ALEN;
+}
+
+
+int hostap_80211_prism_header_parse(struct sk_buff *skb, unsigned char *haddr)
+{
+       if (*(u32 *)skb->mac.raw == LWNG_CAP_DID_BASE) {
+               memcpy(haddr, skb->mac.raw +
+                      sizeof(struct linux_wlan_ng_prism_hdr) + 10,
+                      ETH_ALEN); /* addr2 */
+       } else { /* (*(u32 *)skb->mac.raw == htonl(LWNG_CAPHDR_VERSION)) */
+               memcpy(haddr, skb->mac.raw +
+                      sizeof(struct linux_wlan_ng_cap_hdr) + 10,
+                      ETH_ALEN); /* addr2 */
+       }
+       return ETH_ALEN;
+}
+
+
+int hostap_80211_get_hdrlen(u16 fc)
+{
+       int hdrlen = 24;
+
+       switch (WLAN_FC_GET_TYPE(fc)) {
+       case IEEE80211_FTYPE_DATA:
+               if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
+                       hdrlen = 30; /* Addr4 */
+               break;
+       case IEEE80211_FTYPE_CTL:
+               switch (WLAN_FC_GET_STYPE(fc)) {
+               case IEEE80211_STYPE_CTS:
+               case IEEE80211_STYPE_ACK:
+                       hdrlen = 10;
+                       break;
+               default:
+                       hdrlen = 16;
+                       break;
+               }
+               break;
+       }
+
+       return hdrlen;
+}
+
+
+struct net_device_stats *hostap_get_stats(struct net_device *dev)
+{
+       struct hostap_interface *iface;
+       iface = netdev_priv(dev);
+       return &iface->stats;
+}
+
+
+static int prism2_close(struct net_device *dev)
+{
+       struct hostap_interface *iface;
+       local_info_t *local;
+
+       PDEBUG(DEBUG_FLOW, "%s: prism2_close\n", dev->name);
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+
+       if (dev == local->ddev) {
+               prism2_sta_deauth(local, WLAN_REASON_DEAUTH_LEAVING);
+       }
+#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
+       if (!local->hostapd && dev == local->dev &&
+           (!local->func->card_present || local->func->card_present(local)) &&
+           local->hw_ready && local->ap && local->iw_mode == IW_MODE_MASTER)
+               hostap_deauth_all_stas(dev, local->ap, 1);
+#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
+
+       if (dev == local->dev) {
+               local->func->hw_shutdown(dev, HOSTAP_HW_ENABLE_CMDCOMPL);
+       }
+
+       if (netif_running(dev)) {
+               netif_stop_queue(dev);
+               netif_device_detach(dev);
+       }
+
+       flush_scheduled_work();
+
+       module_put(local->hw_module);
+
+       local->num_dev_open--;
+
+       if (dev != local->dev && local->dev->flags & IFF_UP &&
+           local->master_dev_auto_open && local->num_dev_open == 1) {
+               /* Close master radio interface automatically if it was also
+                * opened automatically and we are now closing the last
+                * remaining non-master device. */
+               dev_close(local->dev);
+       }
+
+       return 0;
+}
+
+
+static int prism2_open(struct net_device *dev)
+{
+       struct hostap_interface *iface;
+       local_info_t *local;
+
+       PDEBUG(DEBUG_FLOW, "%s: prism2_open\n", dev->name);
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+
+       if (local->no_pri) {
+               printk(KERN_DEBUG "%s: could not set interface UP - no PRI "
+                      "f/w\n", dev->name);
+               return 1;
+       }
+
+       if ((local->func->card_present && !local->func->card_present(local)) ||
+           local->hw_downloading)
+               return -ENODEV;
+
+       if (!try_module_get(local->hw_module))
+               return -ENODEV;
+       local->num_dev_open++;
+
+       if (!local->dev_enabled && local->func->hw_enable(dev, 1)) {
+               printk(KERN_WARNING "%s: could not enable MAC port\n",
+                      dev->name);
+               prism2_close(dev);
+               return 1;
+       }
+       if (!local->dev_enabled)
+               prism2_callback(local, PRISM2_CALLBACK_ENABLE);
+       local->dev_enabled = 1;
+
+       if (dev != local->dev && !(local->dev->flags & IFF_UP)) {
+               /* Master radio interface is needed for all operation, so open
+                * it automatically when any virtual net_device is opened. */
+               local->master_dev_auto_open = 1;
+               dev_open(local->dev);
+       }
+
+       netif_device_attach(dev);
+       netif_start_queue(dev);
+
+       return 0;
+}
+
+
+static int prism2_set_mac_address(struct net_device *dev, void *p)
+{
+       struct hostap_interface *iface;
+       local_info_t *local;
+       struct list_head *ptr;
+       struct sockaddr *addr = p;
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+
+       if (local->func->set_rid(dev, HFA384X_RID_CNFOWNMACADDR, addr->sa_data,
+                                ETH_ALEN) < 0 || local->func->reset_port(dev))
+               return -EINVAL;
+
+       read_lock_bh(&local->iface_lock);
+       list_for_each(ptr, &local->hostap_interfaces) {
+               iface = list_entry(ptr, struct hostap_interface, list);
+               memcpy(iface->dev->dev_addr, addr->sa_data, ETH_ALEN);
+       }
+       memcpy(local->dev->dev_addr, addr->sa_data, ETH_ALEN);
+       read_unlock_bh(&local->iface_lock);
+
+       return 0;
+}
+
+
+/* TODO: to be further implemented as soon as Prism2 fully supports
+ *       GroupAddresses and correct documentation is available */
+void hostap_set_multicast_list_queue(void *data)
+{
+       struct net_device *dev = (struct net_device *) data;
+       struct hostap_interface *iface;
+       local_info_t *local;
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+       if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE,
+                           local->is_promisc)) {
+               printk(KERN_INFO "%s: %sabling promiscuous mode failed\n",
+                      dev->name, local->is_promisc ? "en" : "dis");
+       }
+}
+
+
+static void hostap_set_multicast_list(struct net_device *dev)
+{
+#if 0
+       /* FIX: promiscuous mode seems to be causing a lot of problems with
+        * some station firmware versions (FCSErr frames, invalid MACPort, etc.
+        * corrupted incoming frames). This code is now commented out while the
+        * problems are investigated. */
+       struct hostap_interface *iface;
+       local_info_t *local;
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+       if ((dev->flags & IFF_ALLMULTI) || (dev->flags & IFF_PROMISC)) {
+               local->is_promisc = 1;
+       } else {
+               local->is_promisc = 0;
+       }
+
+       schedule_work(&local->set_multicast_list_queue);
+#endif
+}
+
+
+static int prism2_change_mtu(struct net_device *dev, int new_mtu)
+{
+       if (new_mtu < PRISM2_MIN_MTU || new_mtu > PRISM2_MAX_MTU)
+               return -EINVAL;
+
+       dev->mtu = new_mtu;
+       return 0;
+}
+
+
+static void prism2_tx_timeout(struct net_device *dev)
+{
+       struct hostap_interface *iface;
+       local_info_t *local;
+       struct hfa384x_regs regs;
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+
+       printk(KERN_WARNING "%s Tx timed out! Resetting card\n", dev->name);
+       netif_stop_queue(local->dev);
+
+       local->func->read_regs(dev, &regs);
+       printk(KERN_DEBUG "%s: CMD=%04x EVSTAT=%04x "
+              "OFFSET0=%04x OFFSET1=%04x SWSUPPORT0=%04x\n",
+              dev->name, regs.cmd, regs.evstat, regs.offset0, regs.offset1,
+              regs.swsupport0);
+
+       local->func->schedule_reset(local);
+}
+
+
+void hostap_setup_dev(struct net_device *dev, local_info_t *local,
+                     int main_dev)
+{
+       struct hostap_interface *iface;
+
+       iface = netdev_priv(dev);
+       ether_setup(dev);
+
+       /* kernel callbacks */
+       dev->get_stats = hostap_get_stats;
+       if (iface) {
+               /* Currently, we point to the proper spy_data only on
+                * the main_dev. This could be fixed. Jean II */
+               iface->wireless_data.spy_data = &iface->spy_data;
+               dev->wireless_data = &iface->wireless_data;
+       }
+       dev->wireless_handlers =
+               (struct iw_handler_def *) &hostap_iw_handler_def;
+       dev->do_ioctl = hostap_ioctl;
+       dev->open = prism2_open;
+       dev->stop = prism2_close;
+       dev->hard_start_xmit = hostap_data_start_xmit;
+       dev->set_mac_address = prism2_set_mac_address;
+       dev->set_multicast_list = hostap_set_multicast_list;
+       dev->change_mtu = prism2_change_mtu;
+       dev->tx_timeout = prism2_tx_timeout;
+       dev->watchdog_timeo = TX_TIMEOUT;
+
+       dev->mtu = local->mtu;
+       if (!main_dev) {
+               /* use main radio device queue */
+               dev->tx_queue_len = 0;
+       }
+
+       SET_ETHTOOL_OPS(dev, &prism2_ethtool_ops);
+
+       netif_stop_queue(dev);
+}
+
+
+static int hostap_enable_hostapd(local_info_t *local, int rtnl_locked)
+{
+       struct net_device *dev = local->dev;
+
+       if (local->apdev)
+               return -EEXIST;
+
+       printk(KERN_DEBUG "%s: enabling hostapd mode\n", dev->name);
+
+       local->apdev = hostap_add_interface(local, HOSTAP_INTERFACE_AP,
+                                           rtnl_locked, local->ddev->name,
+                                           "ap");
+       if (local->apdev == NULL)
+               return -ENOMEM;
+
+       local->apdev->hard_start_xmit = hostap_mgmt_start_xmit;
+       local->apdev->type = ARPHRD_IEEE80211;
+       local->apdev->hard_header_parse = hostap_80211_header_parse;
+
+       return 0;
+}
+
+
+static int hostap_disable_hostapd(local_info_t *local, int rtnl_locked)
+{
+       struct net_device *dev = local->dev;
+
+       printk(KERN_DEBUG "%s: disabling hostapd mode\n", dev->name);
+
+       hostap_remove_interface(local->apdev, rtnl_locked, 1);
+       local->apdev = NULL;
+
+       return 0;
+}
+
+
+static int hostap_enable_hostapd_sta(local_info_t *local, int rtnl_locked)
+{
+       struct net_device *dev = local->dev;
+
+       if (local->stadev)
+               return -EEXIST;
+
+       printk(KERN_DEBUG "%s: enabling hostapd STA mode\n", dev->name);
+
+       local->stadev = hostap_add_interface(local, HOSTAP_INTERFACE_STA,
+                                            rtnl_locked, local->ddev->name,
+                                            "sta");
+       if (local->stadev == NULL)
+               return -ENOMEM;
+
+       return 0;
+}
+
+
+static int hostap_disable_hostapd_sta(local_info_t *local, int rtnl_locked)
+{
+       struct net_device *dev = local->dev;
+
+       printk(KERN_DEBUG "%s: disabling hostapd mode\n", dev->name);
+
+       hostap_remove_interface(local->stadev, rtnl_locked, 1);
+       local->stadev = NULL;
+
+       return 0;
+}
+
+
+int hostap_set_hostapd(local_info_t *local, int val, int rtnl_locked)
+{
+       int ret;
+
+       if (val < 0 || val > 1)
+               return -EINVAL;
+
+       if (local->hostapd == val)
+               return 0;
+
+       if (val) {
+               ret = hostap_enable_hostapd(local, rtnl_locked);
+               if (ret == 0)
+                       local->hostapd = 1;
+       } else {
+               local->hostapd = 0;
+               ret = hostap_disable_hostapd(local, rtnl_locked);
+               if (ret != 0)
+                       local->hostapd = 1;
+       }
+
+       return ret;
+}
+
+
+int hostap_set_hostapd_sta(local_info_t *local, int val, int rtnl_locked)
+{
+       int ret;
+
+       if (val < 0 || val > 1)
+               return -EINVAL;
+
+       if (local->hostapd_sta == val)
+               return 0;
+
+       if (val) {
+               ret = hostap_enable_hostapd_sta(local, rtnl_locked);
+               if (ret == 0)
+                       local->hostapd_sta = 1;
+       } else {
+               local->hostapd_sta = 0;
+               ret = hostap_disable_hostapd_sta(local, rtnl_locked);
+               if (ret != 0)
+                       local->hostapd_sta = 1;
+       }
+
+
+       return ret;
+}
+
+
+int prism2_update_comms_qual(struct net_device *dev)
+{
+       struct hostap_interface *iface;
+       local_info_t *local;
+       int ret = 0;
+       struct hfa384x_comms_quality sq;
+
+       iface = netdev_priv(dev);
+       local = iface->local;
+       if (!local->sta_fw_ver)
+               ret = -1;
+       else if (local->sta_fw_ver >= PRISM2_FW_VER(1,3,1)) {
+               if (local->func->get_rid(local->dev,
+                                        HFA384X_RID_DBMCOMMSQUALITY,
+                                        &sq, sizeof(sq), 1) >= 0) {
+                       local->comms_qual = (s16) le16_to_cpu(sq.comm_qual);
+                       local->avg_signal = (s16) le16_to_cpu(sq.signal_level);
+                       local->avg_noise = (s16) le16_to_cpu(sq.noise_level);
+                       local->last_comms_qual_update = jiffies;
+               } else
+                       ret = -1;
+       } else {
+               if (local->func->get_rid(local->dev, HFA384X_RID_COMMSQUALITY,
+                                        &sq, sizeof(sq), 1) >= 0) {
+                       local->comms_qual = le16_to_cpu(sq.comm_qual);
+                       local->avg_signal = HFA384X_LEVEL_TO_dBm(
+                               le16_to_cpu(sq.signal_level));
+                       local->avg_noise = HFA384X_LEVEL_TO_dBm(
+                               le16_to_cpu(sq.noise_level));
+                       local->last_comms_qual_update = jiffies;
+               } else
+                       ret = -1;
+       }
+
+       return ret;
+}
+
+
+int prism2_sta_send_mgmt(local_info_t *local, u8 *dst, u16 stype,
+                        u8 *body, size_t bodylen)
+{
+       struct sk_buff *skb;
+       struct hostap_ieee80211_mgmt *mgmt;
+       struct hostap_skb_tx_data *meta;
+       struct net_device *dev = local->dev;
+
+       skb = dev_alloc_skb(IEEE80211_MGMT_HDR_LEN + bodylen);
+       if (skb == NULL)
+               return -ENOMEM;
+
+       mgmt = (struct hostap_ieee80211_mgmt *)
+               skb_put(skb, IEEE80211_MGMT_HDR_LEN);
+       memset(mgmt, 0, IEEE80211_MGMT_HDR_LEN);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
+       memcpy(mgmt->da, dst, ETH_ALEN);
+       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->bssid, dst, ETH_ALEN);
+       if (body)
+               memcpy(skb_put(skb, bodylen), body, bodylen);
+
+       meta = (struct hostap_skb_tx_data *) skb->cb;
+       memset(meta, 0, sizeof(*meta));
+       meta->magic = HOSTAP_SKB_TX_DATA_MAGIC;
+       meta->iface = netdev_priv(dev);
+
+       skb->dev = dev;
+       skb->mac.raw = skb->nh.raw = skb->data;
+       dev_queue_xmit(skb);
+
+       return 0;
+}
+
+
+int prism2_sta_deauth(local_info_t *local, u16 reason)
+{
+       union iwreq_data wrqu;
+       int ret;
+
+       if (local->iw_mode != IW_MODE_INFRA ||
+           memcmp(local->bssid, "\x00\x00\x00\x00\x00\x00", ETH_ALEN) == 0 ||
+           memcmp(local->bssid, "\x44\x44\x44\x44\x44\x44", ETH_ALEN) == 0)
+               return 0;
+
+       reason = cpu_to_le16(reason);
+       ret = prism2_sta_send_mgmt(local, local->bssid, IEEE80211_STYPE_DEAUTH,
+                                  (u8 *) &reason, 2);
+       memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
+       wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL);
+       return ret;
+}
+
+
+struct proc_dir_entry *hostap_proc;
+
+static int __init hostap_init(void)
+{
+       if (proc_net != NULL) {
+               hostap_proc = proc_mkdir("hostap", proc_net);
+               if (!hostap_proc)
+                       printk(KERN_WARNING "Failed to mkdir "
+                              "/proc/net/hostap\n");
+       } else
+               hostap_proc = NULL;
+
+       return 0;
+}
+
+
+static void __exit hostap_exit(void)
+{
+       if (hostap_proc != NULL) {
+               hostap_proc = NULL;
+               remove_proc_entry("hostap", proc_net);
+       }
+}
+
+
+EXPORT_SYMBOL(hostap_set_word);
+EXPORT_SYMBOL(hostap_set_string);
+EXPORT_SYMBOL(hostap_get_porttype);
+EXPORT_SYMBOL(hostap_set_encryption);
+EXPORT_SYMBOL(hostap_set_antsel);
+EXPORT_SYMBOL(hostap_set_roaming);
+EXPORT_SYMBOL(hostap_set_auth_algs);
+EXPORT_SYMBOL(hostap_dump_rx_header);
+EXPORT_SYMBOL(hostap_dump_tx_header);
+EXPORT_SYMBOL(hostap_80211_header_parse);
+EXPORT_SYMBOL(hostap_80211_prism_header_parse);
+EXPORT_SYMBOL(hostap_80211_get_hdrlen);
+EXPORT_SYMBOL(hostap_get_stats);
+EXPORT_SYMBOL(hostap_setup_dev);
+EXPORT_SYMBOL(hostap_proc);
+EXPORT_SYMBOL(hostap_set_multicast_list_queue);
+EXPORT_SYMBOL(hostap_set_hostapd);
+EXPORT_SYMBOL(hostap_set_hostapd_sta);
+EXPORT_SYMBOL(hostap_add_interface);
+EXPORT_SYMBOL(hostap_remove_interface);
+EXPORT_SYMBOL(prism2_update_comms_qual);
+
+module_init(hostap_init);
+module_exit(hostap_exit);
index 77d2a21d4cd00f879abe206480f80ea75441aca7..44cd3fcd15720916d0cf9984a02bc8adb2afcb83 100644 (file)
@@ -175,7 +175,7 @@ that only one external action is invoked at a time.
 #define DRV_COPYRIGHT  "Copyright(c) 2003-2005 Intel Corporation"
 
 /* Debugging stuff */
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
 #define CONFIG_IPW2100_RX_DEBUG        /* Reception debugging */
 #endif
 
@@ -208,7 +208,7 @@ MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
 
 static u32 ipw2100_debug_level = IPW_DL_NONE;
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
 #define IPW_DEBUG(level, message...) \
 do { \
        if (ipw2100_debug_level & (level)) { \
@@ -219,9 +219,9 @@ do { \
 } while (0)
 #else
 #define IPW_DEBUG(level, message...) do {} while (0)
-#endif                         /* CONFIG_IPW_DEBUG */
+#endif                         /* CONFIG_IPW2100_DEBUG */
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
 static const char *command_types[] = {
        "undefined",
        "unused",               /* HOST_ATTENTION */
@@ -2081,7 +2081,7 @@ static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
        priv->status &= ~STATUS_SCANNING;
 }
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
 #define IPW2100_HANDLER(v, f) { v, f, # v }
 struct ipw2100_status_indicator {
        int status;
@@ -2094,7 +2094,7 @@ struct ipw2100_status_indicator {
        int status;
        void (*cb) (struct ipw2100_priv * priv, u32 status);
 };
-#endif                         /* CONFIG_IPW_DEBUG */
+#endif                         /* CONFIG_IPW2100_DEBUG */
 
 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
 {
@@ -2149,7 +2149,7 @@ static void isr_status_change(struct ipw2100_priv *priv, int status)
 static void isr_rx_complete_command(struct ipw2100_priv *priv,
                                    struct ipw2100_cmd_header *cmd)
 {
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
        if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
                IPW_DEBUG_HC("Command completed '%s (%d)'\n",
                             command_types[cmd->host_command_reg],
@@ -2167,7 +2167,7 @@ static void isr_rx_complete_command(struct ipw2100_priv *priv,
        wake_up_interruptible(&priv->wait_command_queue);
 }
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
 static const char *frame_types[] = {
        "COMMAND_STATUS_VAL",
        "STATUS_CHANGE_VAL",
@@ -2290,7 +2290,7 @@ static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
 
 static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
 {
-#ifdef CONFIG_IPW_DEBUG_C3
+#ifdef CONFIG_IPW2100_DEBUG_C3
        struct ipw2100_status *status = &priv->status_queue.drv[i];
        u32 match, reg;
        int j;
@@ -2312,7 +2312,7 @@ static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
        }
 #endif
 
-#ifdef CONFIG_IPW_DEBUG_C3
+#ifdef CONFIG_IPW2100_DEBUG_C3
        /* Halt the fimrware so we can get a good image */
        write_register(priv->net_dev, IPW_REG_RESET_REG,
                       IPW_AUX_HOST_RESET_REG_STOP_MASTER);
@@ -2716,7 +2716,7 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
        list_del(element);
        DEC_STAT(&priv->fw_pend_stat);
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
        {
                int i = txq->oldest;
                IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
@@ -2782,7 +2782,7 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
                               "something else: ids %d=%d.\n",
                               priv->net_dev->name, txq->oldest, packet->index);
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
                if (packet->info.c_struct.cmd->host_command_reg <
                    sizeof(command_types) / sizeof(*command_types))
                        IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
@@ -2975,7 +2975,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
 
                IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
                             packet->index, tbd->host_addr, tbd->buf_length);
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
                if (packet->info.d_struct.txb->nr_frags > 1)
                        IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
                                       packet->info.d_struct.txb->nr_frags);
@@ -3827,7 +3827,7 @@ static ssize_t show_stats(struct device *d, struct device_attribute *attr,
                       priv->rx_interrupts, priv->inta_other);
        out += sprintf(out, "firmware resets: %d\n", priv->resets);
        out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
        out += sprintf(out, "packet mismatch image: %s\n",
                       priv->snapshot[0] ? "YES" : "NO");
 #endif
@@ -3982,7 +3982,7 @@ static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
 
 static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
 static ssize_t show_debug_level(struct device_driver *d, char *buf)
 {
        return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
@@ -4011,7 +4011,7 @@ static ssize_t store_debug_level(struct device_driver *d,
 
 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
                   store_debug_level);
-#endif                         /* CONFIG_IPW_DEBUG */
+#endif                         /* CONFIG_IPW2100_DEBUG */
 
 static ssize_t show_fatal_error(struct device *d,
                                struct device_attribute *attr, char *buf)
@@ -4937,7 +4937,7 @@ static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
        };
        int err;
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
        if (bssid != NULL)
                IPW_DEBUG_HC("MANDATORY_BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n",
                             bssid[0], bssid[1], bssid[2], bssid[3], bssid[4],
@@ -6858,7 +6858,7 @@ static int __init ipw2100_init(void)
 
        ret = pci_module_init(&ipw2100_pci_driver);
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
        ipw2100_debug_level = debug;
        driver_create_file(&ipw2100_pci_driver.driver,
                           &driver_attr_debug_level);
@@ -6873,7 +6873,7 @@ static int __init ipw2100_init(void)
 static void __exit ipw2100_exit(void)
 {
        /* FIXME: IPG: check that we have no instances of the devices open */
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
        driver_remove_file(&ipw2100_pci_driver.driver,
                           &driver_attr_debug_level);
 #endif
@@ -8558,7 +8558,7 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
 
                quality = min(beacon_qual, min(tx_qual, rssi_qual));
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2100_DEBUG
                if (beacon_qual == quality)
                        IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
                else if (tx_qual == quality)
index 7c65b10bb164d00b0d2a0fb393b4ec1e97cdd85b..f6c51441fa878a85baa868a9d23af18d69f7c207 100644 (file)
@@ -73,7 +73,7 @@ struct ipw2100_rx_packet;
  * you simply need to add your entry to the ipw2100_debug_levels array.
  *
  * If you do not see debug_level in /proc/net/ipw2100 then you do not have
- * CONFIG_IPW_DEBUG defined in your kernel configuration
+ * CONFIG_IPW2100_DEBUG defined in your kernel configuration
  *
  */
 
index 5e7c7e944c9deb8190d271486737041275f85dcf..cdfe50207757392176a538f9276d13bffd730c31 100644 (file)
@@ -462,7 +462,7 @@ static inline void ipw_disable_interrupts(struct ipw_priv *priv)
        ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
 }
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
 static char *ipw_error_desc(u32 val)
 {
        switch (val) {
@@ -1235,7 +1235,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
                              const char *buf, size_t count)
 {
        struct ipw_priv *priv = dev_get_drvdata(d);
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
        struct net_device *dev = priv->net_dev;
 #endif
        char buffer[] = "00000000";
@@ -1754,7 +1754,7 @@ static void ipw_irq_tasklet(struct ipw_priv *priv)
                IPW_ERROR("Firmware error detected.  Restarting.\n");
                if (priv->error) {
                        IPW_ERROR("Sysfs 'error' log already exists.\n");
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
                        if (ipw_debug_level & IPW_DL_FW_ERRORS) {
                                struct ipw_fw_error *error =
                                    ipw_alloc_error_log(priv);
@@ -1770,7 +1770,7 @@ static void ipw_irq_tasklet(struct ipw_priv *priv)
                        else
                                IPW_ERROR("Error allocating sysfs 'error' "
                                          "log.\n");
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
                        if (ipw_debug_level & IPW_DL_FW_ERRORS)
                                ipw_dump_error_log(priv, priv->error);
 #endif
@@ -3778,7 +3778,7 @@ static const struct ipw_status_code ipw_status_codes[] = {
        {0x2E, "Cipher suite is rejected per security policy"},
 };
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
 static const char *ipw_get_status_code(u16 status)
 {
        int i;
@@ -4250,7 +4250,7 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
                                        if (priv->
                                            status & (STATUS_ASSOCIATED |
                                                      STATUS_AUTH)) {
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
                                                struct notif_authenticate *auth
                                                    = &notif->u.auth;
                                                IPW_DEBUG(IPW_DL_NOTIF |
@@ -4944,12 +4944,11 @@ static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *priv)
        struct ipw_rx_queue *rxq;
        int i;
 
-       rxq = (struct ipw_rx_queue *)kmalloc(sizeof(*rxq), GFP_KERNEL);
+       rxq = kzalloc(sizeof(*rxq), GFP_KERNEL);
        if (unlikely(!rxq)) {
                IPW_ERROR("memory allocation failed\n");
                return NULL;
        }
-       memset(rxq, 0, sizeof(*rxq));
        spin_lock_init(&rxq->lock);
        INIT_LIST_HEAD(&rxq->rx_free);
        INIT_LIST_HEAD(&rxq->rx_used);
@@ -5828,7 +5827,7 @@ static void ipw_bg_adhoc_check(void *data)
        up(&priv->sem);
 }
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
 static void ipw_debug_config(struct ipw_priv *priv)
 {
        IPW_DEBUG_INFO("Scan completed, no valid APs matched "
@@ -7456,8 +7455,7 @@ static void ipw_handle_data_packet(struct ipw_priv *priv,
        /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
        hdr = (struct ieee80211_hdr_4addr *)rxb->skb->data;
        if (priv->ieee->iw_mode != IW_MODE_MONITOR &&
-           ((is_multicast_ether_addr(hdr->addr1) ||
-             is_broadcast_ether_addr(hdr->addr1)) ?
+           (is_multicast_ether_addr(hdr->addr1) ?
             !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt))
                ipw_rebuild_decrypted_skb(priv, rxb->skb);
 
@@ -7648,8 +7646,7 @@ static inline int is_network_packet(struct ipw_priv *priv,
                        return 0;
 
                /* {broad,multi}cast packets to our BSSID go through */
-               if (is_multicast_ether_addr(header->addr1) ||
-                   is_broadcast_ether_addr(header->addr1))
+               if (is_multicast_ether_addr(header->addr1))
                        return !memcmp(header->addr3, priv->bssid, ETH_ALEN);
 
                /* packets to our adapter go through */
@@ -7662,8 +7659,7 @@ static inline int is_network_packet(struct ipw_priv *priv,
                        return 0;
 
                /* {broad,multi}cast packets to our BSS go through */
-               if (is_multicast_ether_addr(header->addr1) ||
-                   is_broadcast_ether_addr(header->addr1))
+               if (is_multicast_ether_addr(header->addr1))
                        return !memcmp(header->addr2, priv->bssid, ETH_ALEN);
 
                /* packets to our adapter go through */
@@ -7815,7 +7811,7 @@ static void ipw_rx(struct ipw_priv *priv)
 
        while (i != r) {
                rxb = priv->rxq->queue[i];
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
                if (unlikely(rxb == NULL)) {
                        printk(KERN_CRIT "Queue not allocated!\n");
                        break;
@@ -9657,8 +9653,7 @@ static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
        switch (priv->ieee->iw_mode) {
        case IW_MODE_ADHOC:
                hdr_len = IEEE80211_3ADDR_LEN;
-               unicast = !(is_multicast_ether_addr(hdr->addr1) ||
-                           is_broadcast_ether_addr(hdr->addr1));
+               unicast = !is_multicast_ether_addr(hdr->addr1);
                id = ipw_find_station(priv, hdr->addr1);
                if (id == IPW_INVALID_STATION) {
                        id = ipw_add_station(priv, hdr->addr1);
@@ -9673,8 +9668,7 @@ static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
 
        case IW_MODE_INFRA:
        default:
-               unicast = !(is_multicast_ether_addr(hdr->addr3) ||
-                           is_broadcast_ether_addr(hdr->addr3));
+               unicast = !is_multicast_ether_addr(hdr->addr3);
                hdr_len = IEEE80211_3ADDR_LEN;
                id = 0;
                break;
@@ -10956,7 +10950,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        priv->net_dev = net_dev;
        priv->pci_dev = pdev;
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
        ipw_debug_level = debug;
 #endif
        spin_lock_init(&priv->lock);
index 1c98db0652c9458a9c61079e8e91cd8a6edb4d39..e65620a4d79ea957d624be65f3e89cf12c54c099 100644 (file)
@@ -1301,14 +1301,14 @@ struct ipw_priv {
 
 /* debug macros */
 
-#ifdef CONFIG_IPW_DEBUG
+#ifdef CONFIG_IPW2200_DEBUG
 #define IPW_DEBUG(level, fmt, args...) \
 do { if (ipw_debug_level & (level)) \
   printk(KERN_DEBUG DRV_NAME": %c %s " fmt, \
          in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
 #else
 #define IPW_DEBUG(level, fmt, args...) do {} while (0)
-#endif                         /* CONFIG_IPW_DEBUG */
+#endif                         /* CONFIG_IPW2200_DEBUG */
 
 /*
  * To use the debug system;
@@ -1332,7 +1332,7 @@ do { if (ipw_debug_level & (level)) \
  * you simply need to add your entry to the ipw_debug_levels array.
  *
  * If you do not see debug_level in /proc/net/ipw then you do not have
- * CONFIG_IPW_DEBUG defined in your kernel configuration
+ * CONFIG_IPW2200_DEBUG defined in your kernel configuration
  *
  */
 
index 488ab06fb79f46e81061f75d72c872121f286ee5..6fd0bf736830f4c7a0694005d32b50613f05818b 100644 (file)
@@ -3512,9 +3512,8 @@ static int orinoco_ioctl_setpower(struct net_device *dev,
                        break;
                default:
                        err = -EINVAL;
-               }
-               if (err)
                        goto out;
+               }
                
                if (prq->flags & IW_POWER_TIMEOUT) {
                        priv->pm_on = 1;
index d8afd51ff8a59010dd89f26dddcc38ff2e20496c..d1a670b35338e54eaec7548309819b1d1985eb6c 100644 (file)
@@ -1,6 +1,8 @@
 /* orinoco_nortel.c
  * 
  * Driver for Prism II devices which would usually be driven by orinoco_cs,
+ * but are connected to the PCI bus by a PCI-to-PCMCIA adapter used in
+ * Nortel emobility, Symbol LA-4113 and Symbol LA-4123.
  * but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter. 
  *
  * Copyright (C) 2002 Tobias Hoffmann
@@ -165,7 +167,7 @@ static int nortel_pci_init_one(struct pci_dev *pdev,
                goto fail_resources;
        }
 
-       iomem = pci_iomap(pdev, 3, 0);
+       iomem = pci_iomap(pdev, 2, 0);
        if (!iomem) {
                err = -ENOMEM;
                goto fail_map_io;
@@ -265,6 +267,8 @@ static void __devexit nortel_pci_remove_one(struct pci_dev *pdev)
 static struct pci_device_id nortel_pci_id_table[] = {
        /* Nortel emobility PCI */
        {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,},
+       /* Symbol LA-4123 PCI */
+       {0x1562, 0x0001, PCI_ANY_ID, PCI_ANY_ID,},
        {0,},
 };
 
index 716df015f8d017b4a5216f1e34e345bc5b813dd1..6707df9689345926ead7ed90b5f6726de6620de5 100644 (file)
@@ -6,6 +6,9 @@ obj-y           += access.o bus.o probe.o remove.o pci.o quirks.o \
                        pci-driver.o search.o pci-sysfs.o rom.o setup-res.o
 obj-$(CONFIG_PROC_FS) += proc.o
 
+# Build PCI Express stuff if needed
+obj-$(CONFIG_PCIEPORTBUS) += pcie/
+
 obj-$(CONFIG_HOTPLUG) += hotplug.o
 
 # Build the PCI Hotplug drivers if we were asked to
@@ -40,7 +43,3 @@ endif
 ifeq ($(CONFIG_PCI_DEBUG),y)
 EXTRA_CFLAGS += -DDEBUG
 endif
-
-# Build PCI Express stuff if needed
-obj-$(CONFIG_PCIEPORTBUS) += pcie/
-
index c42b68d3aa2410d27741e51c01585603c58c10b8..6a61b9f286e14a320e59815dfcaf53832bea93e3 100644 (file)
@@ -59,7 +59,6 @@ struct slot {
        struct slot *next;
        u8 bus;
        u8 device;
-       u16 status;
        u32 number;
        u8 state;
        struct timer_list task_event;
index 5e582eca21d8df27f2a1bf83314781e22047c3ab..83c4b865718a15239361b9f314391b9f31d32de4 100644 (file)
@@ -207,7 +207,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
                 * power fault Cleared
                 */
                info("Power fault cleared on Slot(%d)\n", ctrl->first_slot + hp_slot);
-               p_slot->status = 0x00;
                taskInfo->event_type = INT_POWER_FAULT_CLEAR;
        } else {
                /*
@@ -215,8 +214,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
                 */
                info("Power fault on Slot(%d)\n", ctrl->first_slot + hp_slot);
                taskInfo->event_type = INT_POWER_FAULT;
-               /* set power fault status for this board */
-               p_slot->status = 0xFF;
                info("power fault bit %x set\n", hp_slot);
        }
        if (rc)
@@ -317,13 +314,10 @@ static int board_added(struct slot *p_slot)
                return rc;
        }
 
-       dbg("%s: slot status = %x\n", __FUNCTION__, p_slot->status);
-
        /* Check for a power fault */
-       if (p_slot->status == 0xFF) {
-               /* power fault occurred, but it was benign */
+       if (p_slot->hpc_ops->query_power_fault(p_slot)) {
+               dbg("%s: power fault detected\n", __FUNCTION__);
                rc = POWER_FAILURE;
-               p_slot->status = 0;
                goto err_exit;
        }
 
@@ -334,8 +328,6 @@ static int board_added(struct slot *p_slot)
                goto err_exit;
        }
 
-       p_slot->status = 0;
-
        /*
         * Some PCI Express root ports require fixup after hot-plug operation.
         */
@@ -382,9 +374,6 @@ static int remove_board(struct slot *p_slot)
 
        dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot);
 
-       /* Change status to shutdown */
-       p_slot->status = 0x01;
-
        /* Wait for exclusive access to hardware */
        down(&ctrl->crit_sect);
 
index 2387e75da0feee0ab93e4491fc3b1ee0ad0d0f62..0b8b26beb1636ca5875d24e6891504ac81f33899 100644 (file)
@@ -750,7 +750,7 @@ static int hpc_power_on_slot(struct slot * slot)
 {
        struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle;
        u16 slot_cmd;
-       u16 slot_ctrl;
+       u16 slot_ctrl, slot_status;
 
        int retval = 0;
 
@@ -767,6 +767,14 @@ static int hpc_power_on_slot(struct slot * slot)
                return -1;
        }
 
+       /* Clear sticky power-fault bit from previous power failures */
+       hp_register_read_word(php_ctlr->pci_dev,
+                       SLOT_STATUS(slot->ctrl->cap_base), slot_status);
+       slot_status &= PWR_FAULT_DETECTED;
+       if (slot_status)
+               hp_register_write_word(php_ctlr->pci_dev,
+                       SLOT_STATUS(slot->ctrl->cap_base), slot_status);
+
        retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
        if (retval) {
index a9b00cc2d8850da7d958b8fbc1e13119894fe06d..6917c6cb091287a407a6274fa7ebdd382237bed5 100644 (file)
@@ -178,6 +178,7 @@ EXPORT_SYMBOL(pci_osc_support_set);
 
 /**
  * pci_osc_control_set - commit requested control to Firmware
+ * @handle: acpi_handle for the target ACPI object
  * @flags: driver's requested control bits
  *
  * Attempt to take control from Firmware on requested control bits.
index 3a4f49f4effbfd647371bae04c040ec761d924a3..f28ebdd3958a557466ff347abc21b3c8f14d1a49 100644 (file)
@@ -1098,6 +1098,23 @@ static void __init quirk_alder_ioapic(struct pci_dev *pdev)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_EESSC,      quirk_alder_ioapic );
 #endif
 
+enum ide_combined_type { COMBINED = 0, IDE = 1, LIBATA = 2 };
+/* Defaults to combined */
+static enum ide_combined_type combined_mode;
+
+static int __init combined_setup(char *str)
+{
+       if (!strncmp(str, "ide", 3))
+               combined_mode = IDE;
+       else if (!strncmp(str, "libata", 6))
+               combined_mode = LIBATA;
+       else /* "combined" or anything else defaults to old behavior */
+               combined_mode = COMBINED;
+
+       return 1;
+}
+__setup("combined_mode=", combined_setup);
+
 #ifdef CONFIG_SCSI_SATA_INTEL_COMBINED
 static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev)
 {
@@ -1164,6 +1181,19 @@ static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev)
        if (prog & comb)
                return;
 
+       /* Don't reserve any so the IDE driver can get them (but only if
+        * combined_mode=ide).
+        */
+       if (combined_mode == IDE)
+               return;
+
+       /* Grab them both for libata if combined_mode=libata. */
+       if (combined_mode == LIBATA) {
+               request_region(0x1f0, 8, "libata");     /* port 0 */
+               request_region(0x170, 8, "libata");     /* port 1 */
+               return;
+       }
+
        /* SATA port is in legacy mode.  Reserve port so that
         * IDE driver does not attempt to use it.  If request_region
         * fails, it will be obvious at boot time, so we don't bother
index 2c22b4b3619d58f6c1c1a5c107597eb724b2a7e5..078579ae635905477212d8894414b6e0be86c204 100644 (file)
@@ -355,9 +355,10 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr, kio_addr_t ioaddr
 #ifndef CONFIG_PLAT_USRV
        /* insert interrupt */
        request_irq(irq, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt);
+#ifndef CONFIG_PLAT_MAPPI3
        /* eject interrupt */
        request_irq(irq+1, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt);
-
+#endif
        debug(3, "m32r_cfc: enable CFMSK, RDYSEL\n");
        pcc_set(pcc_sockets, (unsigned int)PLD_CFIMASK, 0x01);
 #endif /* CONFIG_PLAT_USRV */
index 011915d5e243c885eccca9e7e3d1131e08963b29..f94f1f25eec60a8e57ba9d311a90c47b2df58594 100644 (file)
@@ -62,7 +62,8 @@ qeth_eddp_free_context(struct qeth_eddp_context *ctx)
        for (i = 0; i < ctx->num_pages; ++i)
                free_page((unsigned long)ctx->pages[i]);
        kfree(ctx->pages);
-       kfree(ctx->elements);
+       if (ctx->elements != NULL)
+               kfree(ctx->elements);
        kfree(ctx);
 }
 
index 99cceb242ec4e31e4d815d8b623cc65f68363bfe..f8f55cc468bacdbe2d386b06dc7ad5e72751b5a5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.242 $)
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.251 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  *
@@ -12,7 +12,7 @@
  *                       Frank Pavlic (fpavlic@de.ibm.com) and
  *                       Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.242 $        $Date: 2005/05/04 20:19:18 $
+ *    $Revision: 1.251 $        $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
@@ -72,7 +72,7 @@
 #include "qeth_eddp.h"
 #include "qeth_tso.h"
 
-#define VERSION_QETH_C "$Revision: 1.242 $"
+#define VERSION_QETH_C "$Revision: 1.251 $"
 static const char *version = "qeth S/390 OSA-Express driver";
 
 /**
@@ -518,7 +518,8 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
 
        QETH_DBF_TEXT(setup, 3, "setoffl");
        QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
-
+       
+       netif_carrier_off(card->dev);
        recover_flag = card->state;
        if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){
                PRINT_WARN("Stopping card %s interrupted by user!\n",
@@ -1020,7 +1021,6 @@ void
 qeth_schedule_recovery(struct qeth_card *card)
 {
        QETH_DBF_TEXT(trace,2,"startrec");
-
        if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
                schedule_work(&card->kernel_thread_starter);
 }
@@ -1710,7 +1710,6 @@ qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
                                           "IP address reset.\n",
                                           QETH_CARD_IFNAME(card),
                                           card->info.chpid);
-                               netif_carrier_on(card->dev);
                                qeth_schedule_recovery(card);
                                return NULL;
                        case IPA_CMD_MODCCID:
@@ -1959,7 +1958,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
 {
        u16 s1, s2;
 
-QETH_DBF_TEXT(trace,4,"osndipa");
+       QETH_DBF_TEXT(trace,4,"osndipa");
 
        qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
        s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
@@ -2203,24 +2202,21 @@ qeth_ulp_setup(struct qeth_card *card)
 }
 
 static inline int
-qeth_check_for_inbound_error(struct qeth_qdio_buffer *buf,
-                            unsigned int qdio_error,
-                            unsigned int siga_error)
+qeth_check_qdio_errors(struct qdio_buffer *buf, unsigned int qdio_error,
+                      unsigned int siga_error, const char *dbftext)
 {
-       int rc = 0;
-
        if (qdio_error || siga_error) {
-               QETH_DBF_TEXT(trace, 2, "qdinerr");
-               QETH_DBF_TEXT(qerr, 2, "qdinerr");
+               QETH_DBF_TEXT(trace, 2, dbftext);
+               QETH_DBF_TEXT(qerr, 2, dbftext);
                QETH_DBF_TEXT_(qerr, 2, " F15=%02X",
-                              buf->buffer->element[15].flags & 0xff);
+                              buf->element[15].flags & 0xff);
                QETH_DBF_TEXT_(qerr, 2, " F14=%02X",
-                              buf->buffer->element[14].flags & 0xff);
+                              buf->element[14].flags & 0xff);
                QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);
                QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);
-               rc = 1;
+               return 1;
        }
-       return rc;
+       return 0;
 }
 
 static inline struct sk_buff *
@@ -2769,8 +2765,9 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
        for (i = first_element; i < (first_element + count); ++i) {
                index = i % QDIO_MAX_BUFFERS_PER_Q;
                buffer = &card->qdio.in_q->bufs[index];
-               if (!((status == QDIO_STATUS_LOOK_FOR_ERROR) &&
-                     qeth_check_for_inbound_error(buffer, qdio_err, siga_err)))
+               if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) &&
+                     qeth_check_qdio_errors(buffer->buffer, 
+                                            qdio_err, siga_err,"qinerr")))
                        qeth_process_inbound_buffer(card, buffer, index);
                /* clear buffer and give back to hardware */
                qeth_put_buffer_pool_entry(card, buffer->pool_entry);
@@ -2785,12 +2782,13 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
 static inline int
 qeth_handle_send_error(struct qeth_card *card,
                       struct qeth_qdio_out_buffer *buffer,
-                      int qdio_err, int siga_err)
+                      unsigned int qdio_err, unsigned int siga_err)
 {
        int sbalf15 = buffer->buffer->element[15].flags & 0xff;
        int cc = siga_err & 3;
 
        QETH_DBF_TEXT(trace, 6, "hdsnderr");
+       qeth_check_qdio_errors(buffer->buffer, qdio_err, siga_err, "qouterr");
        switch (cc) {
        case 0:
                if (qdio_err){
@@ -3047,7 +3045,8 @@ qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status,
        for(i = first_element; i < (first_element + count); ++i){
                buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
                /*we only handle the KICK_IT error by doing a recovery */
-               if (qeth_handle_send_error(card, buffer, qdio_error, siga_error)
+               if (qeth_handle_send_error(card, buffer,
+                                          qdio_error, siga_error)
                                == QETH_SEND_ERROR_KICK_IT){
                        netif_stop_queue(card->dev);
                        qeth_schedule_recovery(card);
@@ -3289,7 +3288,6 @@ qeth_init_qdio_info(struct qeth_card *card)
        card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
        INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
        INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
-       /* outbound */
 }
 
 static int
@@ -3731,6 +3729,9 @@ qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card)
                        break;
                }
        }
+       if (rc && !(VLAN_DEV_INFO(dev)->real_dev->priv == (void *)card))
+               return 0;
+
 #endif
        return rc;
 }
@@ -3807,10 +3808,8 @@ qeth_open(struct net_device *dev)
        card->data.state = CH_STATE_UP;
        card->state = CARD_STATE_UP;
 
-       if (!card->lan_online){
-               if (netif_carrier_ok(dev))
-                       netif_carrier_off(dev);
-       }
+       if (!card->lan_online && netif_carrier_ok(dev))
+               netif_carrier_off(dev);
        return 0;
 }
 
@@ -5870,10 +5869,8 @@ qeth_add_multicast_ipv6(struct qeth_card *card)
        struct inet6_dev *in6_dev;
 
        QETH_DBF_TEXT(trace,4,"chkmcv6");
-       if ((card->options.layer2 == 0) &&
-           (!qeth_is_supported(card, IPA_IPV6)) )
+       if (!qeth_is_supported(card, IPA_IPV6)) 
                return ;
-
        in6_dev = in6_dev_get(card->dev);
        if (in6_dev == NULL)
                return;
@@ -7936,8 +7933,8 @@ __qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode)
                QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
                goto out_remove;
        }
-/*maybe it was set offline without ifconfig down
- * we can also use this state for recovery purposes*/
+       netif_carrier_on(card->dev);
+
        qeth_set_allowed_threads(card, 0xffffffff, 0);
        if (recover_flag == CARD_STATE_RECOVER)
                qeth_start_again(card, recovery_mode);
index f0a080a9e5155cdc9cde20731586065a756b7b0c..5f8754addc14fe62fc0f4d675fc6822594644579 100644 (file)
@@ -11,7 +11,7 @@
 #include <asm/cio.h>
 #include "qeth_mpc.h"
 
-const char *VERSION_QETH_MPC_C = "$Revision: 1.12 $";
+const char *VERSION_QETH_MPC_C = "$Revision: 1.13 $";
 
 unsigned char IDX_ACTIVATE_READ[]={
        0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,
index 5f71486e708cf0ee4cf96e4640aac699ad3aacd7..864cec5f6c62c516aa91ed360ee5fd80f3f0c899 100644 (file)
 
 #include <asm/qeth.h>
 
-#define VERSION_QETH_MPC_H "$Revision: 1.44 $"
+#define VERSION_QETH_MPC_H "$Revision: 1.46 $"
 
 extern const char *VERSION_QETH_MPC_C;
 
 #define IPA_PDU_HEADER_SIZE    0x40
 #define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
 #define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
-#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x2a)
+#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x29)
 #define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)
 
 extern unsigned char IPA_PDU_HEADER[];
index f2ccfea8fdb89cabe2bf65a7885c3fbcde3b4798..7bf35098831e50603107d74befd95314d4062893 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_fs.c ($Revision: 1.13 $)
+ * linux/drivers/s390/net/qeth_fs.c ($Revision: 1.16 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to procfs.
@@ -21,7 +21,7 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-const char *VERSION_QETH_PROC_C = "$Revision: 1.13 $";
+const char *VERSION_QETH_PROC_C = "$Revision: 1.16 $";
 
 /***** /proc/qeth *****/
 #define QETH_PROCFILE_NAME "qeth"
@@ -30,30 +30,26 @@ static struct proc_dir_entry *qeth_procfile;
 static int
 qeth_procfile_seq_match(struct device *dev, void *data)
 {
-       return 1;
+       return(dev ? 1 : 0);
 }
 
 static void *
 qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
 {
-       struct device *dev;
-       loff_t nr;
-
+       struct device *dev = NULL;
+       loff_t nr = 0;
+       
        down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-
-       nr = *offset;
-       if (nr == 0)
+       if (*offset == 0)
                return SEQ_START_TOKEN;
-
-       dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL,
-                                NULL, qeth_procfile_seq_match);
-
-       /* get card at pos *offset */
-       nr = *offset;
-       while (nr-- > 1 && dev)
+       while (1) {
                dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
                                         NULL, qeth_procfile_seq_match);
-       return (void *) dev;
+               if (++nr == *offset)
+                       break;
+               put_device(dev);
+       }
+       return dev;
 }
 
 static void
@@ -66,19 +62,14 @@ static void *
 qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
 {
        struct device *prev, *next;
-
-       if (it == SEQ_START_TOKEN) {
-               next = driver_find_device(&qeth_ccwgroup_driver.driver,
-                                         NULL, NULL, qeth_procfile_seq_match);
-               if (next)
-                       (*offset)++;
-               return (void *) next;
-       }
-       prev = (struct device *) it;
+       
+       if (it == SEQ_START_TOKEN) 
+               prev = NULL;
+       else
+               prev = (struct device *) it;
        next = driver_find_device(&qeth_ccwgroup_driver.driver,
                                  prev, NULL, qeth_procfile_seq_match);
-       if (next)
-               (*offset)++;
+       (*offset)++;
        return (void *) next;
 }
 
@@ -87,7 +78,7 @@ qeth_get_router_str(struct qeth_card *card, int ipv)
 {
        int routing_type = 0;
 
-       if (ipv == 4){
+       if (ipv == 4) {
                routing_type = card->options.route4.type;
        } else {
 #ifdef CONFIG_QETH_IPV6
@@ -154,6 +145,7 @@ qeth_procfile_seq_show(struct seq_file *s, void *it)
                                        card->qdio.in_buf_pool.buf_count);
                else
                        seq_printf(s, "  +++ LAN OFFLINE +++\n");
+               put_device(device);
        }
        return 0;
 }
@@ -184,51 +176,16 @@ static struct file_operations qeth_procfile_fops = {
 static struct proc_dir_entry *qeth_perf_procfile;
 
 #ifdef CONFIG_QETH_PERF_STATS
-
-static void *
-qeth_perf_procfile_seq_start(struct seq_file *s, loff_t *offset)
-{
-       struct device *dev = NULL;
-       int nr;
-
-       down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-       /* get card at pos *offset */
-       dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
-                                qeth_procfile_seq_match);
-
-       /* get card at pos *offset */
-       nr = *offset;
-       while (nr-- > 1 && dev)
-               dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
-                                        NULL, qeth_procfile_seq_match);
-       return (void *) dev;
-}
-
-static void
-qeth_perf_procfile_seq_stop(struct seq_file *s, void* it)
-{
-       up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-}
-
-static void *
-qeth_perf_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
-{
-       struct device *prev, *next;
-
-       prev = (struct device *) it;
-       next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
-                                 NULL, qeth_procfile_seq_match);
-       if (next)
-               (*offset)++;
-       return (void *) next;
-}
-
 static int
 qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
 {
        struct device *device;
        struct qeth_card *card;
 
+       
+       if (it == SEQ_START_TOKEN)
+               return 0;
+
        device = (struct device *) it;
        card = device->driver_data;
        seq_printf(s, "For card with devnos %s/%s/%s (%s):\n",
@@ -295,13 +252,14 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
                        card->perf_stats.outbound_do_qdio_time,
                        card->perf_stats.outbound_do_qdio_cnt
                  );
+       put_device(device);
        return 0;
 }
 
 static struct seq_operations qeth_perf_procfile_seq_ops = {
-       .start = qeth_perf_procfile_seq_start,
-       .stop  = qeth_perf_procfile_seq_stop,
-       .next  = qeth_perf_procfile_seq_next,
+       .start = qeth_procfile_seq_start,
+       .stop  = qeth_procfile_seq_stop,
+       .next  = qeth_procfile_seq_next,
        .show  = qeth_perf_procfile_seq_show,
 };
 
@@ -324,93 +282,6 @@ static struct file_operations qeth_perf_procfile_fops = {
 #define qeth_perf_procfile_created 1
 #endif /* CONFIG_QETH_PERF_STATS */
 
-/***** /proc/qeth_ipa_takeover *****/
-#define QETH_IPATO_PROCFILE_NAME "qeth_ipa_takeover"
-static struct proc_dir_entry *qeth_ipato_procfile;
-
-static void *
-qeth_ipato_procfile_seq_start(struct seq_file *s, loff_t *offset)
-{
-       struct device *dev;
-       loff_t nr;
-
-       down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-       /* TODO: finish this */
-       /*
-        * maybe SEQ_SATRT_TOKEN can be returned for offset 0
-        * output driver settings then;
-        * else output setting for respective card
-        */
-
-       dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
-                                qeth_procfile_seq_match);
-
-       /* get card at pos *offset */
-       nr = *offset;
-       while (nr-- > 1 && dev)
-               dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
-                                        NULL, qeth_procfile_seq_match);
-       return (void *) dev;
-}
-
-static void
-qeth_ipato_procfile_seq_stop(struct seq_file *s, void* it)
-{
-       up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-}
-
-static void *
-qeth_ipato_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
-{
-       struct device *prev, *next;
-
-       prev = (struct device *) it;
-       next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
-                                 NULL, qeth_procfile_seq_match);
-       if (next)
-               (*offset)++;
-       return (void *) next;
-}
-
-static int
-qeth_ipato_procfile_seq_show(struct seq_file *s, void *it)
-{
-       struct device *device;
-       struct qeth_card *card;
-
-       /* TODO: finish this */
-       /*
-        * maybe SEQ_SATRT_TOKEN can be returned for offset 0
-        * output driver settings then;
-        * else output setting for respective card
-        */
-       device = (struct device *) it;
-       card = device->driver_data;
-
-       return 0;
-}
-
-static struct seq_operations qeth_ipato_procfile_seq_ops = {
-       .start = qeth_ipato_procfile_seq_start,
-       .stop  = qeth_ipato_procfile_seq_stop,
-       .next  = qeth_ipato_procfile_seq_next,
-       .show  = qeth_ipato_procfile_seq_show,
-};
-
-static int
-qeth_ipato_procfile_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &qeth_ipato_procfile_seq_ops);
-}
-
-static struct file_operations qeth_ipato_procfile_fops = {
-       .owner   = THIS_MODULE,
-       .open    = qeth_ipato_procfile_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release,
-};
-
 int __init
 qeth_create_procfs_entries(void)
 {
@@ -426,13 +297,7 @@ qeth_create_procfs_entries(void)
                qeth_perf_procfile->proc_fops = &qeth_perf_procfile_fops;
 #endif /* CONFIG_QETH_PERF_STATS */
 
-       qeth_ipato_procfile = create_proc_entry(QETH_IPATO_PROCFILE_NAME,
-                                          S_IFREG | 0444, NULL);
-       if (qeth_ipato_procfile)
-               qeth_ipato_procfile->proc_fops = &qeth_ipato_procfile_fops;
-
        if (qeth_procfile &&
-           qeth_ipato_procfile &&
            qeth_perf_procfile_created)
                return 0;
        else
@@ -446,62 +311,5 @@ qeth_remove_procfs_entries(void)
                remove_proc_entry(QETH_PROCFILE_NAME, NULL);
        if (qeth_perf_procfile)
                remove_proc_entry(QETH_PERF_PROCFILE_NAME, NULL);
-       if (qeth_ipato_procfile)
-               remove_proc_entry(QETH_IPATO_PROCFILE_NAME, NULL);
 }
 
-
-/* ONLY FOR DEVELOPMENT! -> make it as module */
-/*
-static void
-qeth_create_sysfs_entries(void)
-{
-       struct device *dev;
-
-       down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-
-       list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
-                       driver_list)
-               qeth_create_device_attributes(dev);
-
-       up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-}
-
-static void
-qeth_remove_sysfs_entries(void)
-{
-       struct device *dev;
-
-       down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-
-       list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
-                       driver_list)
-               qeth_remove_device_attributes(dev);
-
-       up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
-}
-
-static int __init
-qeth_fs_init(void)
-{
-       printk(KERN_INFO "qeth_fs_init\n");
-       qeth_create_procfs_entries();
-       qeth_create_sysfs_entries();
-
-       return 0;
-}
-
-static void __exit
-qeth_fs_exit(void)
-{
-       printk(KERN_INFO "qeth_fs_exit\n");
-       qeth_remove_procfs_entries();
-       qeth_remove_sysfs_entries();
-}
-
-
-module_init(qeth_fs_init);
-module_exit(qeth_fs_exit);
-
-MODULE_LICENSE("GPL");
-*/
index ddd6019ba0926a7272b3b1090147b3c5fca4a678..0ea185f70f75277f49a26221640db8c3bbf8859c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.58 $)
+ * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.60 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to sysfs.
@@ -20,7 +20,7 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-const char *VERSION_QETH_SYS_C = "$Revision: 1.58 $";
+const char *VERSION_QETH_SYS_C = "$Revision: 1.60 $";
 
 /*****************************************************************************/
 /*                                                                           */
@@ -160,7 +160,7 @@ qeth_dev_portname_store(struct device *dev, struct device_attribute *attr, const
                return -EPERM;
 
        tmp = strsep((char **) &buf, "\n");
-       if ((strlen(tmp) > 8) || (strlen(tmp) < 2))
+       if ((strlen(tmp) > 8) || (strlen(tmp) == 0))
                return -EINVAL;
 
        card->info.portname[0] = strlen(tmp);
index e245af3c4cbdfdb65bf2dfa83c75a801df4da043..3c50b6f24f5170aaa3093bbe3fc86f6c68feaaa5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.7 $)
+ * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.8 $)
  *
  * Header file for qeth TCP Segmentation Offload support.
  *
@@ -7,7 +7,7 @@
  *
  *    Author(s): Frank Pavlic <fpavlic@de.ibm.com>
  *
- *    $Revision: 1.7 $  $Date: 2005/05/04 20:19:18 $
+ *    $Revision: 1.8 $  $Date: 2005/05/04 20:19:18 $
  *
  */
 #ifndef __QETH_TSO_H__
index c218b5c944a6f1d54f2f89df3bc8994fee3c9a23..5e84c5aa777977fac96b7b86d42be9547b70f779 100644 (file)
@@ -996,6 +996,20 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
        spin_lock_init(&adapter->fsf_req_list_lock);
        INIT_LIST_HEAD(&adapter->fsf_req_list_head);
 
+       /* initialize debug locks */
+
+       spin_lock_init(&adapter->erp_dbf_lock);
+       spin_lock_init(&adapter->hba_dbf_lock);
+       spin_lock_init(&adapter->san_dbf_lock);
+       spin_lock_init(&adapter->scsi_dbf_lock);
+
+       /* initialize error recovery stuff */
+
+       rwlock_init(&adapter->erp_lock);
+       sema_init(&adapter->erp_ready_sem, 0);
+       INIT_LIST_HEAD(&adapter->erp_ready_head);
+       INIT_LIST_HEAD(&adapter->erp_running_head);
+
        /* initialize abort lock */
        rwlock_init(&adapter->abort_lock);
 
index 826fb3b0060564b6af7117ef320f08392f4447f2..95599719f8ab9e02c8294b53e3885c7df7087c6a 100644 (file)
@@ -926,7 +926,6 @@ int zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
        char dbf_name[DEBUG_MAX_NAME_LEN];
 
        /* debug feature area which records recovery activity */
-       spin_lock_init(&adapter->erp_dbf_lock);
        sprintf(dbf_name, "zfcp_%s_erp", zfcp_get_busid_by_adapter(adapter));
        adapter->erp_dbf = debug_register(dbf_name, dbfsize, 2,
                                          sizeof(struct zfcp_erp_dbf_record));
@@ -936,7 +935,6 @@ int zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
        debug_set_level(adapter->erp_dbf, 3);
 
        /* debug feature area which records HBA (FSF and QDIO) conditions */
-       spin_lock_init(&adapter->hba_dbf_lock);
        sprintf(dbf_name, "zfcp_%s_hba", zfcp_get_busid_by_adapter(adapter));
        adapter->hba_dbf = debug_register(dbf_name, dbfsize, 1,
                                          sizeof(struct zfcp_hba_dbf_record));
@@ -947,7 +945,6 @@ int zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
        debug_set_level(adapter->hba_dbf, 3);
 
        /* debug feature area which records SAN command failures and recovery */
-       spin_lock_init(&adapter->san_dbf_lock);
        sprintf(dbf_name, "zfcp_%s_san", zfcp_get_busid_by_adapter(adapter));
        adapter->san_dbf = debug_register(dbf_name, dbfsize, 1,
                                          sizeof(struct zfcp_san_dbf_record));
@@ -958,7 +955,6 @@ int zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
        debug_set_level(adapter->san_dbf, 6);
 
        /* debug feature area which records SCSI command failures and recovery */
-       spin_lock_init(&adapter->scsi_dbf_lock);
        sprintf(dbf_name, "zfcp_%s_scsi", zfcp_get_busid_by_adapter(adapter));
        adapter->scsi_dbf = debug_register(dbf_name, dbfsize, 1,
                                           sizeof(struct zfcp_scsi_dbf_record));
index 023f4e558ae426aa2fd9bc349aaecca53686715d..ee7314d8c2da8bed70dbb84345ca1fab25053d03 100644 (file)
@@ -1071,11 +1071,6 @@ zfcp_erp_thread_setup(struct zfcp_adapter *adapter)
 
        atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
 
-       rwlock_init(&adapter->erp_lock);
-       INIT_LIST_HEAD(&adapter->erp_ready_head);
-       INIT_LIST_HEAD(&adapter->erp_running_head);
-       sema_init(&adapter->erp_ready_sem, 0);
-
        retval = kernel_thread(zfcp_erp_thread, adapter, SIGCHLD);
        if (retval < 0) {
                ZFCP_LOG_NORMAL("error: creation of erp thread failed for "
@@ -2248,29 +2243,26 @@ zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *erp_action)
        return retval;
 }
 
-/*
- * function:    zfcp_fsf_init
- *
- * purpose:    initializes FSF operation for the specified adapter
- *
- * returns:    0 - succesful initialization of FSF operation
- *             !0 - failed to initialize FSF operation
- */
 static int
 zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action)
 {
-       int xconfig, xport;
+       int retval;
 
-       if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
-                            &erp_action->adapter->status)) {
+       if ((atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
+                             &erp_action->adapter->status)) &&
+           (erp_action->adapter->adapter_features &
+            FSF_FEATURE_HBAAPI_MANAGEMENT)) {
                zfcp_erp_adapter_strategy_open_fsf_xport(erp_action);
                atomic_set(&erp_action->adapter->erp_counter, 0);
                return ZFCP_ERP_FAILED;
        }
 
-       xconfig = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action);
-       xport   = zfcp_erp_adapter_strategy_open_fsf_xport(erp_action);
-       if ((xconfig == ZFCP_ERP_FAILED) || (xport == ZFCP_ERP_FAILED))
+       retval = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action);
+       if (retval == ZFCP_ERP_FAILED)
+               return ZFCP_ERP_FAILED;
+
+       retval = zfcp_erp_adapter_strategy_open_fsf_xport(erp_action);
+       if (retval == ZFCP_ERP_FAILED)
                return ZFCP_ERP_FAILED;
 
        return zfcp_erp_adapter_strategy_open_fsf_statusread(erp_action);
@@ -2359,41 +2351,29 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action)
 static int
 zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action)
 {
-       int retval = ZFCP_ERP_SUCCEEDED;
+       int ret;
        int retries;
        int sleep;
        struct zfcp_adapter *adapter = erp_action->adapter;
 
        atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status);
 
-       for (retries = 0; ; retries++) {
-               ZFCP_LOG_DEBUG("Doing exchange port data\n");
+       retries = 0;
+       do {
+               write_lock(&adapter->erp_lock);
                zfcp_erp_action_to_running(erp_action);
+               write_unlock(&adapter->erp_lock);
                zfcp_erp_timeout_init(erp_action);
-               if (zfcp_fsf_exchange_port_data(erp_action, adapter, NULL)) {
-                       retval = ZFCP_ERP_FAILED;
-                       debug_text_event(adapter->erp_dbf, 5, "a_fstx_xf");
-                       ZFCP_LOG_INFO("error: initiation of exchange of "
-                                     "port data failed for adapter %s\n",
-                                     zfcp_get_busid_by_adapter(adapter));
-                       break;
+               ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL);
+               if (ret == -EOPNOTSUPP) {
+                       debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp");
+                       return ZFCP_ERP_SUCCEEDED;
+               } else if (ret) {
+                       debug_text_event(adapter->erp_dbf, 3, "a_xport_failed");
+                       return ZFCP_ERP_FAILED;
                }
-               debug_text_event(adapter->erp_dbf, 6, "a_fstx_xok");
-               ZFCP_LOG_DEBUG("Xchange underway\n");
+               debug_text_event(adapter->erp_dbf, 6, "a_xport_ok");
 
-               /*
-                * Why this works:
-                * Both the normal completion handler as well as the timeout
-                * handler will do an 'up' when the 'exchange port data'
-                * request completes or times out. Thus, the signal to go on
-                * won't be lost utilizing this semaphore.
-                * Furthermore, this 'adapter_reopen' action is
-                * guaranteed to be the only action being there (highest action
-                * which prevents other actions from being created).
-                * Resulting from that, the wake signal recognized here
-                * _must_ be the one belonging to the 'exchange port
-                * data' request.
-                */
                down(&adapter->erp_ready_sem);
                if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
                        ZFCP_LOG_INFO("error: exchange of port data "
@@ -2401,29 +2381,19 @@ zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action)
                                      zfcp_get_busid_by_adapter(adapter));
                        break;
                }
-
                if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
                                      &adapter->status))
                        break;
 
-               ZFCP_LOG_DEBUG("host connection still initialising... "
-                              "waiting and retrying...\n");
-               /* sleep a little bit before retry */
-               sleep = retries < ZFCP_EXCHANGE_PORT_DATA_SHORT_RETRIES ?
-                               ZFCP_EXCHANGE_PORT_DATA_SHORT_SLEEP :
-                               ZFCP_EXCHANGE_PORT_DATA_LONG_SLEEP;
-               msleep(jiffies_to_msecs(sleep));
-       }
-
-       if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
-                            &adapter->status)) {
-               ZFCP_LOG_INFO("error: exchange of port data for "
-                             "adapter %s failed\n",
-                             zfcp_get_busid_by_adapter(adapter));
-               retval = ZFCP_ERP_FAILED;
-       }
+               if (retries < ZFCP_EXCHANGE_PORT_DATA_SHORT_RETRIES) {
+                       sleep = ZFCP_EXCHANGE_PORT_DATA_SHORT_SLEEP;
+                       retries++;
+               } else
+                       sleep = ZFCP_EXCHANGE_PORT_DATA_LONG_SLEEP;
+               schedule_timeout(sleep);
+       } while (1);
 
-       return retval;
+       return ZFCP_ERP_SUCCEEDED;
 }
 
 /*
index 3b0fc1163f5f4fa00e35438434e3e0f8da34300f..59587951c847cae2a6eb48baadaa3d64ba0136b4 100644 (file)
@@ -554,6 +554,17 @@ static void
 zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter,
                             struct fsf_link_down_info *link_down)
 {
+       if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
+                            &adapter->status))
+               return;
+
+       atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
+
+       if (link_down == NULL) {
+               zfcp_erp_adapter_reopen(adapter, 0);
+               return;
+       }
+
        switch (link_down->error_code) {
        case FSF_PSQ_LINK_NO_LIGHT:
                ZFCP_LOG_NORMAL("The local link to adapter %s is down "
@@ -634,20 +645,15 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter,
                                link_down->explanation_code,
                                link_down->vendor_specific_code);
 
-       if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
-                             &adapter->status)) {
-               atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
-                               &adapter->status);
-               switch (link_down->error_code) {
-               case FSF_PSQ_LINK_NO_LIGHT:
-               case FSF_PSQ_LINK_WRAP_PLUG:
-               case FSF_PSQ_LINK_NO_FCP:
-               case FSF_PSQ_LINK_FIRMWARE_UPDATE:
-                       zfcp_erp_adapter_reopen(adapter, 0);
-                       break;
-               default:
-                       zfcp_erp_adapter_failed(adapter);
-               }
+       switch (link_down->error_code) {
+       case FSF_PSQ_LINK_NO_LIGHT:
+       case FSF_PSQ_LINK_WRAP_PLUG:
+       case FSF_PSQ_LINK_NO_FCP:
+       case FSF_PSQ_LINK_FIRMWARE_UPDATE:
+               zfcp_erp_adapter_reopen(adapter, 0);
+               break;
+       default:
+               zfcp_erp_adapter_failed(adapter);
        }
 }
 
@@ -919,30 +925,36 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req)
                case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK:
                        ZFCP_LOG_INFO("Physical link to adapter %s is down\n",
                                      zfcp_get_busid_by_adapter(adapter));
+                       zfcp_fsf_link_down_info_eval(adapter,
+                               (struct fsf_link_down_info *)
+                               &status_buffer->payload);
                        break;
                case FSF_STATUS_READ_SUB_FDISC_FAILED:
                        ZFCP_LOG_INFO("Local link to adapter %s is down "
                                      "due to failed FDISC login\n",
-                             zfcp_get_busid_by_adapter(adapter));
+                                     zfcp_get_busid_by_adapter(adapter));
+                       zfcp_fsf_link_down_info_eval(adapter,
+                               (struct fsf_link_down_info *)
+                               &status_buffer->payload);
                        break;
                case FSF_STATUS_READ_SUB_FIRMWARE_UPDATE:
                        ZFCP_LOG_INFO("Local link to adapter %s is down "
                                      "due to firmware update on adapter\n",
                                      zfcp_get_busid_by_adapter(adapter));
+                       zfcp_fsf_link_down_info_eval(adapter, NULL);
                        break;
                default:
                        ZFCP_LOG_INFO("Local link to adapter %s is down "
                                      "due to unknown reason\n",
                                      zfcp_get_busid_by_adapter(adapter));
+                       zfcp_fsf_link_down_info_eval(adapter, NULL);
                };
-               zfcp_fsf_link_down_info_eval(adapter,
-                       (struct fsf_link_down_info *) &status_buffer->payload);
                break;
 
        case FSF_STATUS_READ_LINK_UP:
                ZFCP_LOG_NORMAL("Local link to adapter %s was replugged. "
-                             "Restarting operations on this adapter\n",
-                             zfcp_get_busid_by_adapter(adapter));
+                               "Restarting operations on this adapter\n",
+                               zfcp_get_busid_by_adapter(adapter));
                /* All ports should be marked as ready to run again */
                zfcp_erp_modify_adapter_status(adapter,
                                               ZFCP_STATUS_COMMON_RUNNING,
@@ -2191,13 +2203,10 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action,
                 return -EOPNOTSUPP;
         }
 
-       timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
-       if (!timer)
-               return -ENOMEM;
-
        /* setup new FSF request */
        retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
-                                     0, 0, &lock_flags, &fsf_req);
+                                    erp_action ? ZFCP_REQ_AUTO_CLEANUP : 0,
+                                    0, &lock_flags, &fsf_req);
        if (retval < 0) {
                ZFCP_LOG_INFO("error: Out of resources. Could not create an "
                               "exchange port data request for"
@@ -2205,25 +2214,33 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action,
                              zfcp_get_busid_by_adapter(adapter));
                write_unlock_irqrestore(&adapter->request_queue.queue_lock,
                                        lock_flags);
-               goto out;
-       }
-
-       if (erp_action) {
-               erp_action->fsf_req = fsf_req;
-               fsf_req->erp_action = erp_action;
+               return retval;
        }
 
        if (data)
-       fsf_req->data = (unsigned long) data;
+               fsf_req->data = (unsigned long) data;
 
        sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0);
         sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
         sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
 
-       init_timer(timer);
-       timer->function = zfcp_fsf_request_timeout_handler;
-       timer->data = (unsigned long) adapter;
-       timer->expires = ZFCP_FSF_REQUEST_TIMEOUT;
+       if (erp_action) {
+               erp_action->fsf_req = fsf_req;
+               fsf_req->erp_action = erp_action;
+               timer = &erp_action->timer;
+       } else {
+               timer = kmalloc(sizeof(struct timer_list), GFP_ATOMIC);
+               if (!timer) {
+                       write_unlock_irqrestore(&adapter->request_queue.queue_lock,
+                                               lock_flags);
+                       zfcp_fsf_req_free(fsf_req);
+                       return -ENOMEM;
+               }
+               init_timer(timer);
+               timer->function = zfcp_fsf_request_timeout_handler;
+               timer->data = (unsigned long) adapter;
+               timer->expires = ZFCP_FSF_REQUEST_TIMEOUT;
+       }
 
        retval = zfcp_fsf_req_send(fsf_req, timer);
        if (retval) {
@@ -2233,23 +2250,22 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action,
                zfcp_fsf_req_free(fsf_req);
                if (erp_action)
                        erp_action->fsf_req = NULL;
+               else
+                       kfree(timer);
                write_unlock_irqrestore(&adapter->request_queue.queue_lock,
                                        lock_flags);
-               goto out;
+               return retval;
        }
 
-       ZFCP_LOG_DEBUG("Exchange Port Data request initiated (adapter %s)\n",
-                      zfcp_get_busid_by_adapter(adapter));
-
-       write_unlock_irqrestore(&adapter->request_queue.queue_lock,
-                               lock_flags);
+       write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
 
-       wait_event(fsf_req->completion_wq,
-                  fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
-       del_timer_sync(timer);
-       zfcp_fsf_req_free(fsf_req);
- out:
-       kfree(timer);
+       if (!erp_action) {
+               wait_event(fsf_req->completion_wq,
+                          fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+               del_timer_sync(timer);
+               zfcp_fsf_req_free(fsf_req);
+               kfree(timer);
+       }
        return retval;
 }
 
index 3dcd1bfba3b4862835bb1eab8d4542dec8a9409a..66608d13a63497b40c4b6002bfad94d30c014728 100644 (file)
@@ -179,7 +179,7 @@ zfcp_scsi_slave_alloc(struct scsi_device *sdp)
        struct zfcp_adapter *adapter;
        struct zfcp_unit *unit;
        unsigned long flags;
-       int retval = -ENODEV;
+       int retval = -ENXIO;
 
        adapter = (struct zfcp_adapter *) sdp->host->hostdata[0];
        if (!adapter)
index 672f9f2b21634e93546592f0ed833706a725d09b..92e6c5639dd3b7ef0793091def7ee6ddcc827619 100644 (file)
@@ -124,25 +124,25 @@ static inline int aurora_paranoia_check(struct Aurora_port const * port,
  */
 
 /* Get board number from pointer */
-extern inline int board_No (struct Aurora_board const * bp)
+static inline int board_No (struct Aurora_board const * bp)
 {
        return bp - aurora_board;
 }
 
 /* Get port number from pointer */
-extern inline int port_No (struct Aurora_port const * port)
+static inline int port_No (struct Aurora_port const * port)
 {
        return AURORA_PORT(port - aurora_port); 
 }
 
 /* Get pointer to board from pointer to port */
-extern inline struct Aurora_board * port_Board(struct Aurora_port const * port)
+static inline struct Aurora_board * port_Board(struct Aurora_port const * port)
 {
        return &aurora_board[AURORA_BOARD(port - aurora_port)];
 }
 
 /* Wait for Channel Command Register ready */
-extern inline void aurora_wait_CCR(struct aurora_reg128 * r)
+static inline void aurora_wait_CCR(struct aurora_reg128 * r)
 {
        unsigned long delay;
 
@@ -161,7 +161,7 @@ printk("aurora_wait_CCR\n");
  */
 
 /* Must be called with enabled interrupts */
-extern inline void aurora_long_delay(unsigned long delay)
+static inline void aurora_long_delay(unsigned long delay)
 {
        unsigned long i;
 
@@ -420,7 +420,7 @@ static void aurora_release_io_range(struct Aurora_board *bp)
        sbus_iounmap((unsigned long)bp->r3, 4);
 }
 
-extern inline void aurora_mark_event(struct Aurora_port * port, int event)
+static inline void aurora_mark_event(struct Aurora_port * port, int event)
 {
 #ifdef AURORA_DEBUG
        printk("aurora_mark_event: start\n");
index c12c5046e2fa1b9db8ba9ced25eaa1e198c674f4..14631ac11bc7744e95b0276eee662671ca5a522a 100644 (file)
@@ -249,11 +249,11 @@ static loff_t jsf_lseek(struct file * file, loff_t offset, int orig)
 /*
  * OS SIMM Cannot be read in other size but a 32bits word.
  */
-static ssize_t jsf_read(struct file * file, char * buf, 
+static ssize_t jsf_read(struct file * file, char __user * buf, 
     size_t togo, loff_t *ppos)
 {
        unsigned long p = *ppos;
-       char *tmp = buf;
+       char __user *tmp = buf;
 
        union byte4 {
                char s[4];
@@ -305,7 +305,7 @@ static ssize_t jsf_read(struct file * file, char * buf,
        return tmp-buf;
 }
 
-static ssize_t jsf_write(struct file * file, const char * buf,
+static ssize_t jsf_write(struct file * file, const char __user * buf,
     size_t count, loff_t *ppos)
 {
        return -ENOSPC;
@@ -356,10 +356,10 @@ static int jsf_ioctl_erase(unsigned long arg)
  * Program a block of flash.
  * Very simple because we can do it byte by byte anyway.
  */
-static int jsf_ioctl_program(unsigned long arg)
+static int jsf_ioctl_program(void __user *arg)
 {
        struct jsflash_program_arg abuf;
-       char *uptr;
+       char __user *uptr;
        unsigned long p;
        unsigned int togo;
        union {
@@ -367,13 +367,13 @@ static int jsf_ioctl_program(unsigned long arg)
                char s[4];
        } b;
 
-       if (copy_from_user(&abuf, (char *)arg, JSFPRGSZ))
+       if (copy_from_user(&abuf, arg, JSFPRGSZ))
                return -EFAULT; 
        p = abuf.off;
        togo = abuf.size;
        if ((togo & 3) || (p & 3)) return -EINVAL;
 
-       uptr = (char *) (unsigned long) abuf.data;
+       uptr = (char __user *) (unsigned long) abuf.data;
        while (togo != 0) {
                togo -= 4;
                if (copy_from_user(&b.s[0], uptr, 4))
@@ -390,19 +390,20 @@ static int jsf_ioctl(struct inode *inode, struct file *f, unsigned int cmd,
     unsigned long arg)
 {
        int error = -ENOTTY;
+       void __user *argp = (void __user *)arg;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
        switch (cmd) {
        case JSFLASH_IDENT:
-               if (copy_to_user((void *)arg, &jsf0.id, JSFIDSZ))
+               if (copy_to_user(argp, &jsf0.id, JSFIDSZ))
                        return -EFAULT;
                break;
        case JSFLASH_ERASE:
                error = jsf_ioctl_erase(arg);
                break;
        case JSFLASH_PROGRAM:
-               error = jsf_ioctl_program(arg);
+               error = jsf_ioctl_program(argp);
                break;
        }
 
index 858cc683f85c768592b7a38e50ea19ec7e83161d..e2d9a7c854270051ceabf7c7b090ce000e4e060c 100644 (file)
@@ -309,7 +309,7 @@ static void uctrl_do_txn(struct uctrl_txn *txn)
        }
 }
 
-void uctrl_get_event_status()
+void uctrl_get_event_status(void)
 {
        struct uctrl_driver *driver = &drv;
        struct uctrl_txn txn;
@@ -318,7 +318,7 @@ void uctrl_get_event_status()
        txn.opcode = READ_EVENT_STATUS;
        txn.inbits = 0;
        txn.outbits = 2;
-       txn.inbuf = 0;
+       txn.inbuf = NULL;
        txn.outbuf = outbits;
 
        uctrl_do_txn(&txn);
@@ -329,7 +329,7 @@ void uctrl_get_event_status()
        dprintk(("ev is %x\n", driver->status.event_status));
 }
 
-void uctrl_get_external_status()
+void uctrl_get_external_status(void)
 {
        struct uctrl_driver *driver = &drv;
        struct uctrl_txn txn;
@@ -339,7 +339,7 @@ void uctrl_get_external_status()
        txn.opcode = READ_EXTERNAL_STATUS;
        txn.inbits = 0;
        txn.outbits = 2;
-       txn.inbuf = 0;
+       txn.inbuf = NULL;
        txn.outbuf = outbits;
 
        uctrl_do_txn(&txn);
@@ -414,7 +414,7 @@ static void __exit ts102_uctrl_cleanup(void)
        if (driver->irq)
                free_irq(driver->irq, driver);
        if (driver->regs)
-               driver->regs = 0;
+               driver->regs = NULL;
 }
 
 module_init(ts102_uctrl_init);
index a7782e7da42ee9ce843a9a3ff79ac1a545569a8c..8045cd5e7cb3389041cdef112aac185f6d90b968 100644 (file)
@@ -125,7 +125,7 @@ struct vfc_regs {
 
 
 struct vfc_dev {
-       volatile struct vfc_regs *regs;
+       volatile struct vfc_regs __iomem *regs;
        struct vfc_regs *phys_regs;
        unsigned int control_reg;
        struct semaphore device_lock_sem;
index 7a103698fa3c3a3ea1e9023cbb55b5d7f4b8e1ab..dfdd6be551f3ecca3a878b159514ccf96c0c5dce 100644 (file)
@@ -149,7 +149,7 @@ int init_vfc_device(struct sbus_dev *sdev,struct vfc_dev *dev, int instance)
        }
        printk("Initializing vfc%d\n",instance);
        dev->regs = NULL;
-       dev->regs = (volatile struct vfc_regs *)
+       dev->regs = (volatile struct vfc_regs __iomem *)
                sbus_ioremap(&sdev->resource[0], 0,
                             sizeof(struct vfc_regs), vfcstr);
        dev->which_io = sdev->reg_addrs[0].which_io;
@@ -319,7 +319,7 @@ int vfc_capture_poll(struct vfc_dev *dev)
        int timeout = 1000;
 
        while (!timeout--) {
-               if (dev->regs->control & VFC_STATUS_CAPTURE)
+               if (sbus_readl(&dev->regs->control) & VFC_STATUS_CAPTURE)
                        break;
                vfc_i2c_delay_no_busy(dev, 100);
        }
@@ -718,7 +718,7 @@ static void deinit_vfc_device(struct vfc_dev *dev)
        if(dev == NULL)
                return;
        devfs_remove("vfc/%d", dev->instance);
-       sbus_iounmap((unsigned long)dev->regs, sizeof(struct vfc_regs));
+       sbus_iounmap(dev->regs, sizeof(struct vfc_regs));
        kfree(dev);
 }
 
index e7ad269041a4bdc36b1c95c8a24996cae519baa6..4ce7438608ecb68a374146276eff3308da099589 100644 (file)
@@ -857,7 +857,7 @@ process_extended_message(struct Scsi_Host *host,
                printk(KERN_INFO "scsi%d (%d:%d): Unexpected message %s: ",
                       host->host_no, pun, lun,
                       NCR_700_phase[(dsps & 0xf00) >> 8]);
-               scsi_print_msg(hostdata->msgin);
+               spi_print_msg(hostdata->msgin);
                printk("\n");
                /* just reject it */
                hostdata->msgout[0] = A_REJECT_MSG;
@@ -887,7 +887,7 @@ process_message(struct Scsi_Host *host,     struct NCR_700_Host_Parameters *hostdata
 #ifdef NCR_700_DEBUG
        printk("scsi%d (%d:%d): message %s: ", host->host_no, pun, lun,
               NCR_700_phase[(dsps & 0xf00) >> 8]);
-       scsi_print_msg(hostdata->msgin);
+       spi_print_msg(hostdata->msgin);
        printk("\n");
 #endif
 
@@ -939,7 +939,7 @@ process_message(struct Scsi_Host *host,     struct NCR_700_Host_Parameters *hostdata
                       host->host_no, pun, lun,
                       NCR_700_phase[(dsps & 0xf00) >> 8]);
 
-               scsi_print_msg(hostdata->msgin);
+               spi_print_msg(hostdata->msgin);
                printk("\n");
                /* just reject it */
                hostdata->msgout[0] = A_REJECT_MSG;
index 362d78483d091b47ccfbc925ca3d8f8dd7eef90c..a8c83bb036303dd44b9eea46857679f512e392be 100644 (file)
@@ -238,21 +238,23 @@ struct NCR_700_Host_Parameters {
 #ifdef CONFIG_53C700_LE_ON_BE
 #define bE     (hostdata->force_le_on_be ? 0 : 3)
 #define        bSWAP   (hostdata->force_le_on_be)
-/* This is terrible, but there's no raw version of ioread32.  That means
- * that on a be board we swap twice (once in ioread32 and once again to 
- * get the value correct) */
-#define bS_to_io(x)    ((hostdata->force_le_on_be) ? (x) : cpu_to_le32(x))
+#define bEBus  (!hostdata->force_le_on_be)
 #elif defined(__BIG_ENDIAN)
 #define bE     3
 #define bSWAP  0
-#define bS_to_io(x)    (x)
 #elif defined(__LITTLE_ENDIAN)
 #define bE     0
 #define bSWAP  0
-#define bS_to_io(x)    (x)
 #else
 #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined, did you include byteorder.h?"
 #endif
+#ifndef bEBus
+#ifdef CONFIG_53C700_BE_BUS
+#define bEBus  1
+#else
+#define bEBus  0
+#endif
+#endif
 #define bS_to_cpu(x)   (bSWAP ? le32_to_cpu(x) : (x))
 #define bS_to_host(x)  (bSWAP ? cpu_to_le32(x) : (x))
 
@@ -466,14 +468,15 @@ NCR_700_readl(struct Scsi_Host *host, __u32 reg)
 {
        const struct NCR_700_Host_Parameters *hostdata
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-       __u32 value = ioread32(hostdata->base + reg);
+       __u32 value = bEBus ? ioread32be(hostdata->base + reg) :
+               ioread32(hostdata->base + reg);
 #if 1
        /* sanity check the register */
        if((reg & 0x3) != 0)
                BUG();
 #endif
 
-       return bS_to_io(value);
+       return value;
 }
 
 static inline void
@@ -497,7 +500,8 @@ NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
                BUG();
 #endif
 
-       iowrite32(bS_to_io(value), hostdata->base + reg);
+       bEBus ? iowrite32be(value, hostdata->base + reg): 
+               iowrite32(value, hostdata->base + reg);
 }
 
 #endif
index 9cb5dd48383fbdde590270a36ac13512dafabb64..7894b8ea84bde7341cc39a6da81c956a6740c1ab 100644 (file)
 #include "scsi.h"
 #include <scsi/scsi_dbg.h>
 #include <scsi/scsi_host.h>
+#include <scsi/scsi_transport_spi.h>
 #include "53c7xx.h"
 #include <linux/stat.h>
 #include <linux/stddef.h>
@@ -1724,7 +1725,7 @@ NCR53c7xx_run_tests (struct Scsi_Host *host) {
                printk ("scsi%d : status ", host->host_no);
                scsi_print_status (status);
                printk ("\nscsi%d : message ", host->host_no);
-               scsi_print_msg (&msg);
+               spi_print_msg(&msg);
                printk ("\n");
            } else if (hostdata->test_completed == 3) {
                printk("scsi%d : test 2 no connection with target %d\n",
@@ -2313,7 +2314,7 @@ NCR53c7x0_dstat_sir_intr (struct Scsi_Host *host, struct
            printk ("scsi%d : received message", host->host_no);
            if (c) 
                printk (" from target %d lun %d ", c->device->id, c->device->lun);
-           scsi_print_msg ((unsigned char *) hostdata->msg_buf);
+           spi_print_msg((unsigned char *) hostdata->msg_buf);
            printk("\n");
        }
        
@@ -5540,7 +5541,7 @@ print_dsa (struct Scsi_Host *host, u32 *dsa, const char *prefix) {
            i > 0 && !check_address ((unsigned long) ptr, 1);
            ptr += len, i -= len) {
            printk("               ");
-           len = scsi_print_msg (ptr);
+           len = spi_print_msg(ptr);
            printk("\n");
            if (!len)
                break;
index 20dd85a77813a03fa9314a7c65f98a4ecd75e7e0..4c42065dea88bbc2623264ada6ff5d0329406c61 100644 (file)
@@ -336,6 +336,7 @@ config SCSI_ACARD
 config SCSI_AHA152X
        tristate "Adaptec AHA152X/2825 support"
        depends on ISA && SCSI && !64BIT
+       select SCSI_SPI_ATTRS
        ---help---
          This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825
          SCSI host adapters. It also works for the AVA-1505, but the IRQ etc.
@@ -623,6 +624,7 @@ config SCSI_OMIT_FLASHPOINT
 config SCSI_DMX3191D
        tristate "DMX3191D SCSI support"
        depends on PCI && SCSI
+       select SCSI_SPI_ATTRS
        help
          This is support for Domex DMX3191D SCSI Host Adapters.
 
@@ -632,6 +634,7 @@ config SCSI_DMX3191D
 config SCSI_DTC3280
        tristate "DTC3180/3280 SCSI support"
        depends on ISA && SCSI
+       select SCSI_SPI_ATTRS
        help
          This is support for DTC 3180/3280 SCSI Host Adapters.  Please read
          the SCSI-HOWTO, available from
@@ -752,6 +755,7 @@ config SCSI_GDTH
 config SCSI_GENERIC_NCR5380
        tristate "Generic NCR5380/53c400 SCSI PIO support"
        depends on ISA && SCSI
+       select SCSI_SPI_ATTRS
        ---help---
          This is a driver for the old NCR 53c80 series of SCSI controllers
          on boards using PIO. Most boards such as the Trantor T130 fit this
@@ -771,6 +775,7 @@ config SCSI_GENERIC_NCR5380
 config SCSI_GENERIC_NCR5380_MMIO
        tristate "Generic NCR5380/53c400 SCSI MMIO support"
        depends on ISA && SCSI
+       select SCSI_SPI_ATTRS
        ---help---
          This is a driver for the old NCR 53c80 series of SCSI controllers
          on boards using memory mapped I/O. 
@@ -1254,6 +1259,7 @@ config SCSI_MCA_53C9X
 config SCSI_PAS16
        tristate "PAS16 SCSI support"
        depends on ISA && SCSI
+       select SCSI_SPI_ATTRS
        ---help---
          This is support for a SCSI host adapter.  It is explained in section
          3.10 of the SCSI-HOWTO, available from
@@ -1423,6 +1429,7 @@ config SCSI_DC390T
 config SCSI_T128
        tristate "Trantor T128/T128F/T228 SCSI support"
        depends on ISA && SCSI
+       select SCSI_SPI_ATTRS
        ---help---
          This is support for a SCSI host adapter. It is explained in section
          3.11 of the SCSI-HOWTO, available from
@@ -1681,6 +1688,7 @@ config OKTAGON_SCSI
 config ATARI_SCSI
        tristate "Atari native SCSI support"
        depends on ATARI && SCSI && BROKEN
+       select SCSI_SPI_ATTRS
        ---help---
          If you have an Atari with built-in NCR5380 SCSI controller (TT,
          Falcon, ...) say Y to get it supported. Of course also, if you have
@@ -1722,6 +1730,7 @@ config TT_DMA_EMUL
 config MAC_SCSI
        bool "Macintosh NCR5380 SCSI"
        depends on MAC && SCSI=y
+       select SCSI_SPI_ATTRS
        help
          This is the NCR 5380 SCSI controller included on most of the 68030
          based Macintoshes.  If you have one of these say Y and read the
@@ -1743,6 +1752,7 @@ config SCSI_MAC_ESP
 config MVME147_SCSI
        bool "WD33C93 SCSI driver for MVME147"
        depends on MVME147 && SCSI=y
+       select SCSI_SPI_ATTRS
        help
          Support for the on-board SCSI controller on the Motorola MVME147
          single-board computer.
@@ -1750,6 +1760,7 @@ config MVME147_SCSI
 config MVME16x_SCSI
        bool "NCR53C710 SCSI driver for MVME16x"
        depends on MVME16x && SCSI && BROKEN
+       select SCSI_SPI_ATTRS
        help
          The Motorola MVME162, 166, 167, 172 and 177 boards use the NCR53C710
          SCSI controller chip.  Almost everyone using one of these boards
@@ -1758,6 +1769,7 @@ config MVME16x_SCSI
 config BVME6000_SCSI
        bool "NCR53C710 SCSI driver for BVME6000"
        depends on BVME6000 && SCSI && BROKEN
+       select SCSI_SPI_ATTRS
        help
          The BVME4000 and BVME6000 boards from BVM Ltd use the NCR53C710
          SCSI controller chip.  Almost everyone using one of these boards
@@ -1774,6 +1786,7 @@ config SCSI_NCR53C7xx_FAST
 config SUN3_SCSI
        tristate "Sun3 NCR5380 SCSI"
        depends on SUN3 && SCSI && BROKEN
+       select SCSI_SPI_ATTRS
        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 cba9655d0f14075af5903b7d0c82ab5b6989f36a..9f0ddbe6dc765ef6decb10dfb30c0693cd92440b 100644 (file)
@@ -87,6 +87,7 @@
  *      the high level code.
  */
 #include <scsi/scsi_dbg.h>
+#include <scsi/scsi_transport_spi.h>
 
 #ifndef NDEBUG
 #define NDEBUG 0
@@ -2377,7 +2378,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
  * 3..length+1  arguments
  *
  * Start the extended message buffer with the EXTENDED_MESSAGE
- * byte, since scsi_print_msg() wants the whole thing.  
+ * byte, since spi_print_msg() wants the whole thing.  
  */
                                        extended_msg[0] = EXTENDED_MESSAGE;
                                        /* Accept first byte by clearing ACK */
@@ -2424,7 +2425,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
                                default:
                                        if (!tmp) {
                                                printk("scsi%d: rejecting message ", instance->host_no);
-                                               scsi_print_msg(extended_msg);
+                                               spi_print_msg(extended_msg);
                                                printk("\n");
                                        } else if (tmp != EXTENDED_MESSAGE)
                                                scmd_printk(KERN_INFO, cmd,
@@ -2560,7 +2561,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
 
        if (!(msg[0] & 0x80)) {
                printk(KERN_ERR "scsi%d : expecting IDENTIFY message, got ", instance->host_no);
-               scsi_print_msg(msg);
+               spi_print_msg(msg);
                abort = 1;
        } else {
                /* Accept message by clearing ACK */
index ab383d1f59e2e29489f48e88064093d51e8773e0..3cb68af904561ddeafac166a2b10fb053b3b8398 100644 (file)
@@ -325,6 +325,8 @@ 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 (!buf)
+               return 0;
        if(*(__le16 *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
                struct partition *first = (struct partition * )buf;
                struct partition *entry = first;
index 9df23b654cec1aa929cb3d7f5eb7ae4b3b089c67..cb2ee25f213f1cc3d2dfd6a1b17ed9ade8c6f276 100644 (file)
 #include "scsi.h"
 #include <scsi/scsi_dbg.h>
 #include <scsi/scsi_host.h>
+#include <scsi/scsi_transport_spi.h>
 #include "aha152x.h"
 
 
@@ -1845,7 +1846,7 @@ static void msgi_run(struct Scsi_Host *shpnt)
 #if defined(AHA152X_DEBUG)
                if (HOSTDATA(shpnt)->debug & debug_msgi) {
                        printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0));
-                       scsi_print_msg(&MSGI(0));
+                       spi_print_msg(&MSGI(0));
                        printk("\n");
                }
 #endif
@@ -1933,7 +1934,7 @@ static void msgi_run(struct Scsi_Host *shpnt)
                                                break;
 
                                        printk(INFO_LEAD, CMDINFO(CURRENT_SC));
-                                       scsi_print_msg(&MSGI(0));
+                                       spi_print_msg(&MSGI(0));
                                        printk("\n");
 
                                        ticks = (MSGI(3) * 4 + 49) / 50;
@@ -2031,7 +2032,7 @@ static void msgo_init(struct Scsi_Host *shpnt)
                int i;
 
                printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC));
-               for (i=0; i<MSGOLEN; i+=scsi_print_msg(&MSGO(i)), printk(" "))
+               for (i=0; i<MSGOLEN; i+=spi_print_msg(&MSGO(i)), printk(" "))
                        ;
                printk(")\n");
        }
index 83467a05dc8e3e31f150ca2e030746a1e854b5a7..887eaa2a3ebf129cd61a5f0ffa401c14c867bd0f 100644 (file)
@@ -243,7 +243,7 @@ static const struct ata_port_operations ahci_ops = {
        .port_stop              = ahci_port_stop,
 };
 
-static struct ata_port_info ahci_port_info[] = {
+static const struct ata_port_info ahci_port_info[] = {
        /* board_ahci */
        {
                .sht            = &ahci_sht,
@@ -643,7 +643,8 @@ static void ahci_eng_timeout(struct ata_port *ap)
                 * not being called from the SCSI EH.
                 */
                qc->scsidone = scsi_finish_command;
-               ata_qc_complete(qc, AC_ERR_OTHER);
+               qc->err_mask |= AC_ERR_OTHER;
+               ata_qc_complete(qc);
        }
 
        spin_unlock_irqrestore(&host_set->lock, flags);
@@ -664,7 +665,8 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
        ci = readl(port_mmio + PORT_CMD_ISSUE);
        if (likely((ci & 0x1) == 0)) {
                if (qc) {
-                       ata_qc_complete(qc, 0);
+                       assert(qc->err_mask == 0);
+                       ata_qc_complete(qc);
                        qc = NULL;
                }
        }
@@ -681,8 +683,10 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
                /* command processing has stopped due to error; restart */
                ahci_restart_port(ap, status);
 
-               if (qc)
-                       ata_qc_complete(qc, err_mask);
+               if (qc) {
+                       qc->err_mask |= AC_ERR_OTHER;
+                       ata_qc_complete(qc);
+               }
        }
 
        return 1;
index 31e9f40e79a2e6d173e3595b909bd85fc9f678f1..1c8f872e2dd41be16151067ebfb9553a6a6c6ab9 100644 (file)
@@ -1064,6 +1064,7 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
        struct  Scsi_Host *host;
        char    *new_name;
        u_long  s;
+       int     retval;
 
        template->name = ahd->description;
        host = scsi_host_alloc(template, sizeof(struct ahd_softc *));
@@ -1096,9 +1097,15 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
 
        host->transportt = ahd_linux_transport_template;
 
-       scsi_add_host(host, &ahd->dev_softc->dev); /* XXX handle failure */
+       retval = scsi_add_host(host, &ahd->dev_softc->dev);
+       if (retval) {
+               printk(KERN_WARNING "aic79xx: scsi_add_host failed\n");
+               scsi_host_put(host);
+               return retval;
+       }
+
        scsi_scan_host(host);
-       return (0);
+       return 0;
 }
 
 uint64_t
@@ -2105,7 +2112,7 @@ ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
                                          scmd_id(cmd),
                                          scmd_channel(cmd) + 'A',
                                          CAM_LUN_WILDCARD,
-                                         SCB_LIST_NULL, ROLE_INITIATOR) == 0)
+                                         SCB_LIST_NULL, ROLE_INITIATOR))
                                break;
                }
        }
index 7fc6454068e47a3d6ff9710d57cb968c9163ff1d..fd389e9f9460a7af31fd9510848f5dd13fac3b96 100644 (file)
@@ -1061,10 +1061,11 @@ uint32_t aic7xxx_verbose;
 int
 ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *template)
 {
-       char     buf[80];
-       struct   Scsi_Host *host;
+       char    buf[80];
+       struct  Scsi_Host *host;
        char    *new_name;
-       u_long   s;
+       u_long  s;
+       int     retval;
 
        template->name = ahc->description;
        host = scsi_host_alloc(template, sizeof(struct ahc_softc *));
@@ -1097,9 +1098,16 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa
 
        host->transportt = ahc_linux_transport_template;
 
-       scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); /* XXX handle failure */
+       retval = scsi_add_host(host,
+                       (ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
+       if (retval) {
+               printk(KERN_WARNING "aic7xxx: scsi_add_host failed\n");
+               scsi_host_put(host);
+               return retval;
+       }
+
        scsi_scan_host(host);
-       return (0);
+       return 0;
 }
 
 /*
@@ -2169,7 +2177,7 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
                        if (ahc_match_scb(ahc, pending_scb, scmd_id(cmd),
                                          scmd_channel(cmd) + 'A',
                                          CAM_LUN_WILDCARD,
-                                         SCB_LIST_NULL, ROLE_INITIATOR) == 0)
+                                         SCB_LIST_NULL, ROLE_INITIATOR))
                                break;
                }
        }
index 13f23043c8a370f507fc5e8599e5735a4c265c6f..06d7601cdf565626c74bf196494b41cbb36809ca 100644 (file)
@@ -4,6 +4,7 @@
 config SCSI_ACORNSCSI_3
        tristate "Acorn SCSI card (aka30) support"
        depends on ARCH_ACORN && SCSI && BROKEN
+       select SCSI_SPI_ATTRS
        help
          This enables support for the Acorn SCSI card (aka30). If you have an
          Acorn system with one of these, say Y. If unsure, say N.
index b7b20c689c245567026bf60b2b2a6913e1a7e703..09ed05727bcbb7f972be03d471e26328fa87d90d 100644 (file)
 #include "../scsi.h"
 #include <scsi/scsi_dbg.h>
 #include <scsi/scsi_host.h>
+#include <scsi/scsi_transport_spi.h>
 #include "acornscsi.h"
 #include "msgqueue.h"
 #include "scsi.h"
@@ -1370,7 +1371,7 @@ void acornscsi_sendmessage(AS_Host *host)
 
        host->scsi.last_message = msg->msg[0];
 #if (DEBUG & DEBUG_MESSAGES)
-       scsi_print_msg(msg->msg);
+       spi_print_msg(msg->msg);
 #endif
        break;
 
@@ -1392,7 +1393,7 @@ void acornscsi_sendmessage(AS_Host *host)
        while ((msg = msgqueue_getmsg(&host->scsi.msgs, msgnr++)) != NULL) {
            unsigned int i;
 #if (DEBUG & DEBUG_MESSAGES)
-           scsi_print_msg(msg);
+           spi_print_msg(msg);
 #endif
            i = 0;
            if (acornscsi_write_pio(host, msg->msg, &i, msg->length, 1000000))
@@ -1488,7 +1489,7 @@ void acornscsi_message(AS_Host *host)
 #if (DEBUG & DEBUG_MESSAGES)
     printk("scsi%d.%c: message in: ",
            host->host->host_no, acornscsi_target(host));
-    scsi_print_msg(message);
+    spi_print_msg(message);
     printk("\n");
 #endif
 
index 333d69dd84ef5ad0febfefeb07a30e7153288a72..0ea27873b9fffaa054ec6b535d60a8afe8a59337 100644 (file)
  *
  *  Hardware documentation available at http://developer.intel.com/
  *
+ * Documentation
+ *     Publically available from Intel web site. Errata documentation
+ * is also publically available. As an aide to anyone hacking on this
+ * driver the list of errata that are relevant is below.going back to
+ * PIIX4. Older device documentation is now a bit tricky to find.
+ *
+ * The chipsets all follow very much the same design. The orginal Triton
+ * series chipsets do _not_ support independant device timings, but this
+ * is fixed in Triton II. With the odd mobile exception the chips then
+ * change little except in gaining more modes until SATA arrives. This
+ * driver supports only the chips with independant timing (that is those
+ * with SITRE and the 0x44 timing register). See pata_oldpiix and pata_mpiix
+ * for the early chip drivers.
+ *
+ * Errata of note:
+ *
+ * Unfixable
+ *     PIIX4    errata #9      - Only on ultra obscure hw
+ *     ICH3     errata #13     - Not observed to affect real hw
+ *                               by Intel
+ *
+ * Things we must deal with
+ *     PIIX4   errata #10      - BM IDE hang with non UDMA
+ *                               (must stop/start dma to recover)
+ *     440MX   errata #15      - As PIIX4 errata #10
+ *     PIIX4   errata #15      - Must not read control registers
+ *                               during a PIO transfer
+ *     440MX   errata #13      - As PIIX4 errata #15
+ *     ICH2    errata #21      - DMA mode 0 doesn't work right
+ *     ICH0/1  errata #55      - As ICH2 errata #21
+ *     ICH2    spec c #9       - Extra operations needed to handle
+ *                               drive hotswap [NOT YET SUPPORTED]
+ *     ICH2    spec c #20      - IDE PRD must not cross a 64K boundary
+ *                               and must be dword aligned
+ *     ICH2    spec c #24      - UDMA mode 4,5 t85/86 should be 6ns not 3.3
+ *
+ * Should have been BIOS fixed:
+ *     450NX:  errata #19      - DMA hangs on old 450NX
+ *     450NX:  errata #20      - DMA hangs on old 450NX
+ *     450NX:  errata #25      - Corruption with DMA on old 450NX
+ *     ICH3    errata #15      - IDE deadlock under high load
+ *                               (BIOS must set dev 31 fn 0 bit 23)
+ *     ICH3    errata #18      - Don't use native mode
  */
 
 #include <linux/kernel.h>
@@ -78,9 +121,7 @@ enum {
        ich5_sata               = 1,
        piix4_pata              = 2,
        ich6_sata               = 3,
-       ich6_sata_rm            = 4,
-       ich7_sata               = 5,
-       esb2_sata               = 6,
+       ich6_sata_ahci          = 4,
 
        PIIX_AHCI_DEVICE        = 6,
 };
@@ -111,11 +152,11 @@ static const struct pci_device_id piix_pci_tbl[] = {
        { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
        { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
        { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
-       { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
-       { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
-       { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
-       { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
-       { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb2_sata },
+       { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
+       { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
+       { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
+       { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
+       { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
 
        { }     /* terminate list */
 };
@@ -258,31 +299,7 @@ static struct ata_port_info piix_port_info[] = {
                .port_ops       = &piix_sata_ops,
        },
 
-       /* ich6_sata_rm */
-       {
-               .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_SRST |
-                                 PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR |
-                                 ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI,
-               .pio_mask       = 0x1f, /* pio0-4 */
-               .mwdma_mask     = 0x07, /* mwdma0-2 */
-               .udma_mask      = 0x7f, /* udma0-6 */
-               .port_ops       = &piix_sata_ops,
-       },
-
-       /* ich7_sata */
-       {
-               .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_SRST |
-                                 PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR |
-                                 ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI,
-               .pio_mask       = 0x1f, /* pio0-4 */
-               .mwdma_mask     = 0x07, /* mwdma0-2 */
-               .udma_mask      = 0x7f, /* udma0-6 */
-               .port_ops       = &piix_sata_ops,
-       },
-
-       /* esb2_sata */
+       /* ich6_sata_ahci */
        {
                .sht            = &piix_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_SRST |
@@ -602,6 +619,40 @@ static int piix_disable_ahci(struct pci_dev *pdev)
        return rc;
 }
 
+/**
+ *     piix_check_450nx_errata -       Check for problem 450NX setup
+ *     
+ *     Check for the present of 450NX errata #19 and errata #25. If
+ *     they are found return an error code so we can turn off DMA
+ */
+
+static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev)
+{
+       struct pci_dev *pdev = NULL;
+       u16 cfg;
+       u8 rev;
+       int no_piix_dma = 0;
+       
+       while((pdev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, pdev)) != NULL)
+       {
+               /* Look for 450NX PXB. Check for problem configurations
+                  A PCI quirk checks bit 6 already */
+               pci_read_config_byte(pdev, PCI_REVISION_ID, &rev);
+               pci_read_config_word(pdev, 0x41, &cfg);
+               /* Only on the original revision: IDE DMA can hang */
+               if(rev == 0x00)
+                       no_piix_dma = 1;
+               /* On all revisions below 5 PXB bus lock must be disabled for IDE */
+               else if(cfg & (1<<14) && rev < 5)
+                       no_piix_dma = 2;
+       }
+       if(no_piix_dma)
+               dev_printk(KERN_WARNING, &ata_dev->dev, "450NX errata present, disabling IDE DMA.\n");
+       if(no_piix_dma == 2)
+               dev_printk(KERN_WARNING, &ata_dev->dev, "A BIOS update may resolve this.\n");
+       return no_piix_dma;
+}              
+
 /**
  *     piix_init_one - Register PIIX ATA PCI device with kernel services
  *     @pdev: PCI device to register
@@ -676,7 +727,15 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                           "combined mode detected (p=%u, s=%u)\n",
                           pata_chan, sata_chan);
        }
-
+       if (piix_check_450nx_errata(pdev)) {
+               /* This writes into the master table but it does not
+                  really matter for this errata as we will apply it to
+                  all the PIIX devices on the board */
+               port_info[0]->mwdma_mask = 0;
+               port_info[0]->udma_mask = 0;
+               port_info[1]->mwdma_mask = 0;
+               port_info[1]->udma_mask = 0;
+       }
        return ata_pci_init_one(pdev, port_info, 2);
 }
 
index 2ae31ceb32a8fc97b11d2d1618ca749a84420d36..57295bcea3e766a4ae87d760ab6bf4cf1be35b32 100644 (file)
@@ -74,6 +74,7 @@
  *     the high level code.
  */
 #include <scsi/scsi_dbg.h>
+#include <scsi/scsi_transport_spi.h>
 
 #if (NDEBUG & NDEBUG_LISTS)
 #define LIST(x,y) \
@@ -2355,7 +2356,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
  * 3..length+1 arguments
  *
  * Start the extended message buffer with the EXTENDED_MESSAGE
- * byte, since scsi_print_msg() wants the whole thing.  
+ * byte, since spi_print_msg() wants the whole thing.  
  */
                    extended_msg[0] = EXTENDED_MESSAGE;
                    /* Accept first byte by clearing ACK */
@@ -2408,7 +2409,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
                default:
                    if (!tmp) {
                        printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO);
-                       scsi_print_msg (extended_msg);
+                       spi_print_msg(extended_msg);
                        printk("\n");
                    } else if (tmp != EXTENDED_MESSAGE)
                        printk(KERN_DEBUG "scsi%d: rejecting unknown "
@@ -2541,7 +2542,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
 
     if (!(msg[0] & 0x80)) {
        printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
-       scsi_print_msg(msg);
+       spi_print_msg(msg);
        do_abort(instance);
        return;
     }
index ccbbae2bf478291ff169d73a24f467f8ff0f7d05..0920220f331394a147337c1a14ba0007535961aa 100644 (file)
@@ -75,7 +75,7 @@ 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] = {
+static const char * vendor_labels[CH_TYPES-4] = {
        "v0", "v1", "v2", "v3"
 };
 // module_param_string_array(vendor_labels, NULL, 0444);
@@ -140,7 +140,7 @@ static struct file_operations changer_fops =
 #endif
 };
 
-static struct {
+static const struct {
        unsigned char  sense;
        unsigned char  asc;
        unsigned char  ascq;
index 09bc81557b6ede1cfa24f5ddae2f20e8365acfaf..30a335349ceeb279109bc8b3d5cb45aaba06b847 100644 (file)
@@ -1065,7 +1065,7 @@ struct error_info2 {
        const char * fmt;
 };
 
-static struct error_info2 additional2[] =
+static const struct error_info2 additional2[] =
 {
        {0x40,0x00,0x7f,"Ram failure (%x)"},
        {0x40,0x80,0xff,"Diagnostic failure on component (%x)"},
@@ -1077,7 +1077,7 @@ static struct error_info2 additional2[] =
 };
 
 /* description of the sense key values */
-static const char *snstext[] = {
+static const char * const snstext[] = {
        "No Sense",         /* 0: There is no sense information */
        "Recovered Error",  /* 1: The last command completed successfully
                                  but used error correction */
@@ -1278,114 +1278,6 @@ void scsi_print_req_sense(const char *devclass, struct scsi_request *sreq)
 }
 EXPORT_SYMBOL(scsi_print_req_sense);
 
-#ifdef CONFIG_SCSI_CONSTANTS
-static const char *one_byte_msgs[] = {
-/* 0x00 */ "Command Complete", NULL, "Save Pointers",
-/* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", 
-/* 0x06 */ "Abort", "Message Reject", "Nop", "Message Parity Error",
-/* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag",
-/* 0x0c */ "Bus device reset", "Abort Tag", "Clear Queue", 
-/* 0x0f */ "Initiate Recovery", "Release Recovery"
-};
-#define NO_ONE_BYTE_MSGS (sizeof(one_byte_msgs)  / sizeof (const char *))
-
-static const char *two_byte_msgs[] = {
-/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag"
-/* 0x23 */ "Ignore Wide Residue"
-};
-#define NO_TWO_BYTE_MSGS (sizeof(two_byte_msgs)  / sizeof (const char *))
-
-static const char *extended_msgs[] = {
-/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request",
-/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request"
-};
-#define NO_EXTENDED_MSGS (sizeof(two_byte_msgs)  / sizeof (const char *))
-
-
-int scsi_print_msg (const unsigned char *msg)
-{
-       int len = 0, i;
-       if (msg[0] == EXTENDED_MESSAGE) {
-               len = 3 + msg[1];
-               if (msg[2] < NO_EXTENDED_MSGS)
-                       printk ("%s ", extended_msgs[msg[2]]); 
-               else 
-                       printk ("Extended Message, reserved code (0x%02x) ",
-                               (int) msg[2]);
-               switch (msg[2]) {
-               case EXTENDED_MODIFY_DATA_POINTER:
-                       printk("pointer = %d", (int) (msg[3] << 24) |
-                               (msg[4] << 16) | (msg[5] << 8) | msg[6]);
-                       break;
-               case EXTENDED_SDTR:
-                       printk("period = %d ns, offset = %d",
-                               (int) msg[3] * 4, (int) msg[4]);
-                       break;
-               case EXTENDED_WDTR:
-                       printk("width = 2^%d bytes", msg[3]);
-                       break;
-               default:
-               for (i = 2; i < len; ++i) 
-                       printk("%02x ", msg[i]);
-               }
-       /* Identify */
-       } else if (msg[0] & 0x80) {
-               printk("Identify disconnect %sallowed %s %d ",
-                       (msg[0] & 0x40) ? "" : "not ",
-                       (msg[0] & 0x20) ? "target routine" : "lun",
-                       msg[0] & 0x7);
-               len = 1;
-       /* Normal One byte */
-       } else if (msg[0] < 0x1f) {
-               if (msg[0] < NO_ONE_BYTE_MSGS)
-                       printk(one_byte_msgs[msg[0]]);
-               else
-                       printk("reserved (%02x) ", msg[0]);
-               len = 1;
-       /* Two byte */
-       } else if (msg[0] <= 0x2f) {
-               if ((msg[0] - 0x20) < NO_TWO_BYTE_MSGS)
-                       printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], 
-                               msg[1]);
-               else 
-                       printk("reserved two byte (%02x %02x) ", 
-                               msg[0], msg[1]);
-               len = 2;
-       } else 
-               printk("reserved");
-       return len;
-}
-EXPORT_SYMBOL(scsi_print_msg);
-
-#else  /* ifndef CONFIG_SCSI_CONSTANTS */
-
-int scsi_print_msg (const unsigned char *msg)
-{
-       int len = 0, i;
-
-       if (msg[0] == EXTENDED_MESSAGE) {
-               len = 3 + msg[1];
-               for (i = 0; i < len; ++i)
-                       printk("%02x ", msg[i]);
-       /* Identify */
-       } else if (msg[0] & 0x80) {
-               printk("%02x ", msg[0]);
-               len = 1;
-       /* Normal One byte */
-       } else if (msg[0] < 0x1f) {
-               printk("%02x ", msg[0]);
-               len = 1;
-       /* Two byte */
-       } else if (msg[0] <= 0x2f) {
-               printk("%02x %02x", msg[0], msg[1]);
-               len = 2;
-       } else 
-               printk("%02x ", msg[0]);
-       return len;
-}
-EXPORT_SYMBOL(scsi_print_msg);
-#endif /* ! CONFIG_SCSI_CONSTANTS */
-
 void scsi_print_command(struct scsi_cmnd *cmd)
 {
        /* Assume appended output (i.e. not at start of line) */
@@ -1397,7 +1289,7 @@ EXPORT_SYMBOL(scsi_print_command);
 
 #ifdef CONFIG_SCSI_CONSTANTS
 
-static const char * hostbyte_table[]={
+static const char * const hostbyte_table[]={
 "DID_OK", "DID_NO_CONNECT", "DID_BUS_BUSY", "DID_TIME_OUT", "DID_BAD_TARGET", 
 "DID_ABORT", "DID_PARITY", "DID_ERROR", "DID_RESET", "DID_BAD_INTR",
 "DID_PASSTHROUGH", "DID_SOFT_ERROR", "DID_IMM_RETRY"};
@@ -1422,12 +1314,12 @@ void scsi_print_hostbyte(int scsiresult)
 
 #ifdef CONFIG_SCSI_CONSTANTS
 
-static const char * driverbyte_table[]={
+static const char * const driverbyte_table[]={
 "DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT",  "DRIVER_MEDIA", "DRIVER_ERROR", 
 "DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD", "DRIVER_SENSE"};
 #define NUM_DRIVERBYTE_STRS (sizeof(driverbyte_table) / sizeof(const char *))
 
-static const char * driversuggest_table[]={"SUGGEST_OK",
+static const char * const driversuggest_table[]={"SUGGEST_OK",
 "SUGGEST_RETRY", "SUGGEST_ABORT", "SUGGEST_REMAP", "SUGGEST_DIE",
 "SUGGEST_5", "SUGGEST_6", "SUGGEST_7", "SUGGEST_SENSE"};
 #define NUM_SUGGEST_STRS (sizeof(driversuggest_table) / sizeof(const char *))
index c28e3aea1c3cef83f28e3b3bccb00dac2e8ada27..6252b9ddc01e3eec6fd72268d6fc764b1d3a8bb7 100644 (file)
@@ -660,7 +660,12 @@ static int adpt_abort(struct scsi_cmnd * cmd)
        msg[2] = 0;
        msg[3]= 0; 
        msg[4] = (u32)cmd;
-       if( (rcode = adpt_i2o_post_wait(pHba, msg, sizeof(msg), FOREVER)) != 0){
+       if (pHba->host)
+               spin_lock_irq(pHba->host->host_lock);
+       rcode = adpt_i2o_post_wait(pHba, msg, sizeof(msg), FOREVER);
+       if (pHba->host)
+               spin_unlock_irq(pHba->host->host_lock);
+       if (rcode != 0) {
                if(rcode == -EOPNOTSUPP ){
                        printk(KERN_INFO"%s: Abort cmd not supported\n",pHba->name);
                        return FAILED;
@@ -697,10 +702,15 @@ static int adpt_device_reset(struct scsi_cmnd* cmd)
        msg[2] = 0;
        msg[3] = 0;
 
+       if (pHba->host)
+               spin_lock_irq(pHba->host->host_lock);
        old_state = d->state;
        d->state |= DPTI_DEV_RESET;
-       if( (rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER)) ){
-               d->state = old_state;
+       rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
+       d->state = old_state;
+       if (pHba->host)
+               spin_unlock_irq(pHba->host->host_lock);
+       if (rcode != 0) {
                if(rcode == -EOPNOTSUPP ){
                        printk(KERN_INFO"%s: Device reset not supported\n",pHba->name);
                        return FAILED;
@@ -708,7 +718,6 @@ static int adpt_device_reset(struct scsi_cmnd* cmd)
                printk(KERN_INFO"%s: Device reset failed\n",pHba->name);
                return FAILED;
        } else {
-               d->state = old_state;
                printk(KERN_INFO"%s: Device reset successful\n",pHba->name);
                return SUCCESS;
        }
@@ -721,6 +730,7 @@ static int adpt_bus_reset(struct scsi_cmnd* cmd)
 {
        adpt_hba* pHba;
        u32 msg[4];
+       u32 rcode;
 
        pHba = (adpt_hba*)cmd->device->host->hostdata[0];
        memset(msg, 0, sizeof(msg));
@@ -729,7 +739,12 @@ 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, msg,sizeof(msg), FOREVER) ){
+       if (pHba->host)
+               spin_lock_irq(pHba->host->host_lock);
+       rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
+       if (pHba->host)
+               spin_unlock_irq(pHba->host->host_lock);
+       if (rcode != 0) {
                printk(KERN_WARNING"%s: Bus reset failed.\n",pHba->name);
                return FAILED;
        } else {
@@ -816,7 +831,7 @@ static int adpt_hba_reset(adpt_hba* pHba)
 static void adpt_i2o_sys_shutdown(void)
 {
        adpt_hba *pHba, *pNext;
-       struct adpt_i2o_post_wait_data *p1, *p2;
+       struct adpt_i2o_post_wait_data *p1, *old;
 
         printk(KERN_INFO"Shutting down Adaptec I2O controllers.\n");
         printk(KERN_INFO"   This could take a few minutes if there are many devices attached\n");
@@ -830,13 +845,14 @@ static void adpt_i2o_sys_shutdown(void)
        }
 
        /* Remove any timedout entries from the wait queue.  */
-       p2 = NULL;
 //     spin_lock_irqsave(&adpt_post_wait_lock, flags);
        /* Nothing should be outstanding at this point so just
         * free them 
         */
-       for(p1 = adpt_post_wait_queue; p1; p2 = p1, p1 = p2->next) {
-               kfree(p1);
+       for(p1 = adpt_post_wait_queue; p1;) {
+               old = p1;
+               p1 = p1->next;
+               kfree(old);
        }
 //     spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
        adpt_post_wait_queue = NULL;
index 8bec0438dc8a9151f3aed2b04a717a0ee6a65be2..5b0edd1f19213e3d97c173c4659659e5c63b6891 100644 (file)
@@ -100,7 +100,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
 void ibmvscsi_release_crq_queue(struct crq_queue *queue,
                                struct ibmvscsi_host_data *hostdata,
                                int max_requests);
-void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
+int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
                              struct ibmvscsi_host_data *hostdata);
 
 void ibmvscsi_handle_crq(struct viosrp_crq *crq,
index 1045872b01752fe93d3976c3b6e77a99086dc696..ce15d9e3962114f5f49d84df48de41814291ce79 100644 (file)
@@ -117,9 +117,10 @@ void ibmvscsi_release_crq_queue(struct crq_queue *queue,
  *
  * no-op for iSeries
  */
-void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
+int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
                              struct ibmvscsi_host_data *hostdata)
 {
+       return 0;
 }
 
 /**
index 8bf5652f106090ab75ec922a747e11bf0d1b2ad0..75db2f5c545e999d2b06b313560bf3610447bdd5 100644 (file)
@@ -230,6 +230,11 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
        rc = plpar_hcall_norets(H_REG_CRQ,
                                vdev->unit_address,
                                queue->msg_token, PAGE_SIZE);
+       if (rc == H_Resource) 
+               /* maybe kexecing and resource is busy. try a reset */
+               rc = ibmvscsi_reset_crq_queue(queue,
+                                             hostdata);
+
        if (rc == 2) {
                /* Adapter is good, but other end is not ready */
                printk(KERN_WARNING "ibmvscsi: Partner adapter not ready\n");
@@ -281,7 +286,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
  * @hostdata:  ibmvscsi_host_data of host
  *
  */
-void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
+int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
                              struct ibmvscsi_host_data *hostdata)
 {
        int rc;
@@ -309,4 +314,5 @@ void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
                printk(KERN_WARNING
                       "ibmvscsi: couldn't register crq--rc 0x%x\n", rc);
        }
+       return rc;
 }
index fa2cb3582cfa5a2c1348d974bcfa3566e5e47d73..b6714da4d6e2185fb5a15acf627a8d528e2628c5 100644 (file)
@@ -5887,7 +5887,12 @@ static int __devinit ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg)
        ENTER;
        spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
        dev_dbg(&ioa_cfg->pdev->dev, "ioa_cfg adx: 0x%p\n", ioa_cfg);
-       _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa, IPR_SHUTDOWN_NONE);
+       if (ioa_cfg->needs_hard_reset) {
+               ioa_cfg->needs_hard_reset = 0;
+               ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
+       } else
+               _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa,
+                                       IPR_SHUTDOWN_NONE);
 
        spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
        wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
@@ -6264,6 +6269,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
        unsigned long ipr_regs_pci;
        void __iomem *ipr_regs;
        u32 rc = PCIBIOS_SUCCESSFUL;
+       volatile u32 mask, uproc;
 
        ENTER;
 
@@ -6356,6 +6362,15 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
                goto cleanup_nomem;
        }
 
+       /*
+        * If HRRQ updated interrupt is not masked, or reset alert is set,
+        * the card is in an unknown state and needs a hard reset
+        */
+       mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
+       uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg);
+       if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT))
+               ioa_cfg->needs_hard_reset = 1;
+
        ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
        rc = request_irq(pdev->irq, ipr_isr, SA_SHIRQ, IPR_NAME, ioa_cfg);
 
index 6bec673c925c20e0efb9d68010e016b91ddbde66..b639332131f1b8cb7dd251cfbdf58af919553a55 100644 (file)
@@ -36,8 +36,8 @@
 /*
  * Literals
  */
-#define IPR_DRIVER_VERSION "2.1.0"
-#define IPR_DRIVER_DATE "(October 31, 2005)"
+#define IPR_DRIVER_VERSION "2.1.1"
+#define IPR_DRIVER_DATE "(November 15, 2005)"
 
 /*
  * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
@@ -922,6 +922,7 @@ struct ipr_ioa_cfg {
        u8 dump_taken:1;
        u8 allow_cmds:1;
        u8 allow_ml_add_del:1;
+       u8 needs_hard_reset:1;
 
        enum ipr_cache_state cache_state;
        u16 type; /* CCIN of the card */
index 4fea3e4edaa7148803fcfa8bbe49c83a538bcb51..10bcf42cb65c0a0eaf021b4052a068019c9658d2 100644 (file)
@@ -49,7 +49,7 @@ MODULE_AUTHOR("Dmitry Yusupov <dmitry_yus@yahoo.com>, "
              "Alex Aizman <itn780@yahoo.com>");
 MODULE_DESCRIPTION("iSCSI/TCP data-path");
 MODULE_LICENSE("GPL");
-MODULE_VERSION("0:4.409");
+MODULE_VERSION("0:4.445");
 /* #define DEBUG_TCP */
 /* #define DEBUG_SCSI */
 #define DEBUG_ASSERT
@@ -581,10 +581,16 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                crypto_digest_digest(conn->rx_tfm, &sg, 1, (u8 *)&cdgst);
                rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) +
                                     conn->in.ahslen);
+               if (cdgst != rdgst) {
+                       printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error "
+                              "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst,
+                              cdgst);
+                       return ISCSI_ERR_HDR_DGST;
+               }
        }
 
        /* save opcode for later */
-       conn->in.opcode = hdr->opcode;
+       conn->in.opcode = hdr->opcode & ISCSI_OPCODE_MASK;
 
        /* verify itt (itt encoding: age+cid+itt) */
        if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) {
@@ -610,13 +616,6 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                  conn->in.ahslen, conn->in.datalen);
 
        if (conn->in.itt < session->cmds_max) {
-               if (conn->hdrdgst_en && cdgst != rdgst) {
-                       printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error "
-                              "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst,
-                              cdgst);
-                       return ISCSI_ERR_HDR_DGST;
-               }
-
                ctask = (struct iscsi_cmd_task *)session->cmds[conn->in.itt];
 
                if (!ctask->sc) {
@@ -642,9 +641,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                switch(conn->in.opcode) {
                case ISCSI_OP_SCSI_CMD_RSP:
                        BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
-                       if (ctask->hdr.flags & ISCSI_FLAG_CMD_WRITE)
-                               rc = iscsi_cmd_rsp(conn, ctask);
-                       else if (!conn->in.datalen)
+                       if (!conn->in.datalen)
                                rc = iscsi_cmd_rsp(conn, ctask);
                        else
                                /*
@@ -666,8 +663,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                        break;
                case ISCSI_OP_R2T:
                        BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
-                       if (ctask->hdr.flags & ISCSI_FLAG_CMD_WRITE &&
-                           ctask->sc->sc_data_direction == DMA_TO_DEVICE)
+                       if (ctask->sc->sc_data_direction == DMA_TO_DEVICE)
                                rc = iscsi_r2t_rsp(conn, ctask);
                        else
                                rc = ISCSI_ERR_PROTO;
@@ -906,11 +902,20 @@ partial_sg_digest_update(struct iscsi_conn *conn, struct scatterlist *sg,
        crypto_digest_update(conn->data_rx_tfm, &temp, 1);
 }
 
+static void
+iscsi_recv_digest_update(struct iscsi_conn *conn, char* buf, int len)
+{
+       struct scatterlist tmp;
+
+       sg_init_one(&tmp, buf, len);
+       crypto_digest_update(conn->data_rx_tfm, &tmp, 1);
+}
+
 static int iscsi_scsi_data_in(struct iscsi_conn *conn)
 {
        struct iscsi_cmd_task *ctask = conn->in.ctask;
        struct scsi_cmnd *sc = ctask->sc;
-       struct scatterlist tmp, *sg;
+       struct scatterlist *sg;
        int i, offset, rc = 0;
 
        BUG_ON((void*)ctask != sc->SCp.ptr);
@@ -924,10 +929,8 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn)
                                      sc->request_bufflen, ctask->data_offset);
                if (rc == -EAGAIN)
                        return rc;
-               if (conn->datadgst_en) {
-                       sg_init_one(&tmp, sc->request_buffer, i);
-                       crypto_digest_update(conn->data_rx_tfm, &tmp, 1);
-               }
+               if (conn->datadgst_en) 
+                       iscsi_recv_digest_update(conn, sc->request_buffer, i);
                rc = 0;
                goto done;
        }
@@ -1021,6 +1024,9 @@ iscsi_data_recv(struct iscsi_conn *conn)
                conn->in.hdr = &conn->hdr;
                conn->senselen = (conn->data[0] << 8) | conn->data[1];
                rc = iscsi_cmd_rsp(conn, conn->in.ctask);
+               if (!rc && conn->datadgst_en) 
+                       iscsi_recv_digest_update(conn, conn->data,
+                                                conn->in.datalen);
        }
        break;
        case ISCSI_OP_TEXT_RSP:
@@ -1045,6 +1051,11 @@ iscsi_data_recv(struct iscsi_conn *conn)
                rc = iscsi_recv_pdu(iscsi_handle(conn), conn->in.hdr,
                                    conn->data, conn->in.datalen);
 
+               if (!rc && conn->datadgst_en && 
+                       conn->in.opcode != ISCSI_OP_LOGIN_RSP)
+                       iscsi_recv_digest_update(conn, conn->data,
+                                               conn->in.datalen);
+
                if (mtask && conn->login_mtask != mtask) {
                        spin_lock(&session->lock);
                        __kfifo_put(session->mgmtpool.queue, (void*)&mtask,
@@ -1053,6 +1064,8 @@ iscsi_data_recv(struct iscsi_conn *conn)
                }
        }
        break;
+       case ISCSI_OP_ASYNC_EVENT:
+       case ISCSI_OP_REJECT:
        default:
                BUG_ON(1);
        }
@@ -1114,8 +1127,7 @@ more:
                 */
                rc = iscsi_hdr_recv(conn);
                if (!rc && conn->in.datalen) {
-                       if (conn->datadgst_en &&
-                           conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) {
+                       if (conn->datadgst_en) {
                                BUG_ON(!conn->data_rx_tfm);
                                crypto_digest_init(conn->data_rx_tfm);
                        }
@@ -1127,26 +1139,24 @@ more:
        }
 
        if (conn->in_progress == IN_PROGRESS_DDIGEST_RECV) {
+               uint32_t recv_digest;
                debug_tcp("extra data_recv offset %d copy %d\n",
                          conn->in.offset, conn->in.copy);
-               if (conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) {
-                       uint32_t recv_digest;
-                       skb_copy_bits(conn->in.skb, conn->in.offset,
-                                     &recv_digest, 4);
-                       conn->in.offset += 4;
-                       conn->in.copy -= 4;
-                       if (recv_digest != conn->in.datadgst) {
-                               debug_tcp("iscsi_tcp: data digest error!"
-                                         "0x%x != 0x%x\n", recv_digest,
-                                         conn->in.datadgst);
-                               iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST);
-                               return 0;
-                       } else {
-                               debug_tcp("iscsi_tcp: data digest match!"
-                                         "0x%x == 0x%x\n", recv_digest,
-                                         conn->in.datadgst);
-                               conn->in_progress = IN_PROGRESS_WAIT_HEADER;
-                       }
+               skb_copy_bits(conn->in.skb, conn->in.offset,
+                               &recv_digest, 4);
+               conn->in.offset += 4;
+               conn->in.copy -= 4;
+               if (recv_digest != conn->in.datadgst) {
+                       debug_tcp("iscsi_tcp: data digest error!"
+                                 "0x%x != 0x%x\n", recv_digest,
+                                 conn->in.datadgst);
+                       iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST);
+                       return 0;
+               } else {
+                       debug_tcp("iscsi_tcp: data digest match!"
+                                 "0x%x == 0x%x\n", recv_digest,
+                                 conn->in.datadgst);
+                       conn->in_progress = IN_PROGRESS_WAIT_HEADER;
                }
        }
 
@@ -1167,8 +1177,7 @@ more:
                }
                conn->in.copy -= conn->in.padding;
                conn->in.offset += conn->in.padding;
-               if (conn->datadgst_en &&
-                   conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) {
+               if (conn->datadgst_en) {
                        if (conn->in.padding) {
                                debug_tcp("padding -> %d\n", conn->in.padding);
                                memset(pad, 0, conn->in.padding);
@@ -1237,8 +1246,9 @@ iscsi_tcp_state_change(struct sock *sk)
        conn = (struct iscsi_conn*)sk->sk_user_data;
        session = conn->session;
 
-       if (sk->sk_state == TCP_CLOSE_WAIT ||
-           sk->sk_state == TCP_CLOSE) {
+       if ((sk->sk_state == TCP_CLOSE_WAIT ||
+            sk->sk_state == TCP_CLOSE) &&
+           !atomic_read(&sk->sk_rmem_alloc)) {
                debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n");
                iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
        }
@@ -2388,6 +2398,15 @@ fault:
        return 0;
 }
 
+static int
+iscsi_change_queue_depth(struct scsi_device *sdev, int depth)
+{
+       if (depth > ISCSI_MAX_CMD_PER_LUN)
+               depth = ISCSI_MAX_CMD_PER_LUN;
+       scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
+       return sdev->queue_depth;
+}
+
 static int
 iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size)
 {
@@ -2853,8 +2872,11 @@ iscsi_conn_stop(iscsi_connh_t connh, int flag)
                 * in hdr_extract() and will be re-negotiated at
                 * set_param() time.
                 */
-               if (flag == STOP_CONN_RECOVER)
+               if (flag == STOP_CONN_RECOVER) {
                        conn->hdr_size = sizeof(struct iscsi_hdr);
+                       conn->hdrdgst_en = 0;
+                       conn->datadgst_en = 0;
+               }
        }
        up(&conn->xmitsema);
 }
@@ -3247,13 +3269,14 @@ iscsi_r2tpool_free(struct iscsi_session *session)
 static struct scsi_host_template iscsi_sht = {
        .name                   = "iSCSI Initiator over TCP/IP, v."
                                  ISCSI_VERSION_STR,
-        .queuecommand           = iscsi_queuecommand,
+       .queuecommand           = iscsi_queuecommand,
+       .change_queue_depth     = iscsi_change_queue_depth,
        .can_queue              = ISCSI_XMIT_CMDS_MAX - 1,
        .sg_tablesize           = ISCSI_SG_TABLESIZE,
-       .cmd_per_lun            = ISCSI_CMD_PER_LUN,
-        .eh_abort_handler       = iscsi_eh_abort,
-        .eh_host_reset_handler = iscsi_eh_host_reset,
-        .use_clustering         = DISABLE_CLUSTERING,
+       .cmd_per_lun            = ISCSI_DEF_CMD_PER_LUN,
+       .eh_abort_handler       = iscsi_eh_abort,
+       .eh_host_reset_handler  = iscsi_eh_host_reset,
+       .use_clustering         = DISABLE_CLUSTERING,
        .proc_name              = "iscsi_tcp",
        .this_id                = -1,
 };
@@ -3368,7 +3391,7 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param,
        switch(param) {
        case ISCSI_PARAM_MAX_RECV_DLENGTH: {
                char *saveptr = conn->data;
-               int flags = GFP_KERNEL;
+               gfp_t flags = GFP_KERNEL;
 
                if (conn->data_size >= value) {
                        conn->max_recv_dlength = value;
index d23ae68fae0d8d6821b8045cfff25eba70a3e356..855f2dfd18afb9612b84754130162c6f8ed559a1 100644 (file)
@@ -71,7 +71,8 @@
 #define ISCSI_MGMT_CMDS_MAX            32      /* must be power of 2 */
 #define ISCSI_MGMT_ITT_OFFSET          0xa00
 #define ISCSI_SG_TABLESIZE             SG_ALL
-#define ISCSI_CMD_PER_LUN              128
+#define ISCSI_DEF_CMD_PER_LUN          32
+#define ISCSI_MAX_CMD_PER_LUN          128
 #define ISCSI_TCP_MAX_CMD_LEN          16
 
 #define ITT_MASK                       (0xfff)
index 665ae79e1fd6739b76fa44e3f4f004587e041e60..9ea1025879147ca524999e9595c53413ea808b1f 100644 (file)
@@ -605,7 +605,7 @@ void ata_rwcmd_protocol(struct ata_queued_cmd *qc)
        tf->command = ata_rw_cmds[index + lba48 + write];
 }
 
-static const char * xfer_mode_str[] = {
+static const char * const xfer_mode_str[] = {
        "UDMA/16",
        "UDMA/25",
        "UDMA/33",
@@ -1046,28 +1046,103 @@ static unsigned int ata_pio_modes(const struct ata_device *adev)
        return modes;
 }
 
-static int ata_qc_wait_err(struct ata_queued_cmd *qc,
-                          struct completion *wait)
+struct ata_exec_internal_arg {
+       unsigned int err_mask;
+       struct ata_taskfile *tf;
+       struct completion *waiting;
+};
+
+int ata_qc_complete_internal(struct ata_queued_cmd *qc)
 {
-       int rc = 0;
+       struct ata_exec_internal_arg *arg = qc->private_data;
+       struct completion *waiting = arg->waiting;
 
-       if (wait_for_completion_timeout(wait, 30 * HZ) < 1) {
-               /* timeout handling */
-               unsigned int err_mask = ac_err_mask(ata_chk_status(qc->ap));
+       if (!(qc->err_mask & ~AC_ERR_DEV))
+               qc->ap->ops->tf_read(qc->ap, arg->tf);
+       arg->err_mask = qc->err_mask;
+       arg->waiting = NULL;
+       complete(waiting);
 
-               if (!err_mask) {
-                       printk(KERN_WARNING "ata%u: slow completion (cmd %x)\n",
-                              qc->ap->id, qc->tf.command);
-               } else {
-                       printk(KERN_WARNING "ata%u: qc timeout (cmd %x)\n",
-                              qc->ap->id, qc->tf.command);
-                       rc = -EIO;
+       return 0;
+}
+
+/**
+ *     ata_exec_internal - execute libata internal command
+ *     @ap: Port to which the command is sent
+ *     @dev: Device to which the command is sent
+ *     @tf: Taskfile registers for the command and the result
+ *     @dma_dir: Data tranfer direction of the command
+ *     @buf: Data buffer of the command
+ *     @buflen: Length of data buffer
+ *
+ *     Executes libata internal command with timeout.  @tf contains
+ *     command on entry and result on return.  Timeout and error
+ *     conditions are reported via return value.  No recovery action
+ *     is taken after a command times out.  It's caller's duty to
+ *     clean up after timeout.
+ *
+ *     LOCKING:
+ *     None.  Should be called with kernel context, might sleep.
+ */
+
+static unsigned
+ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
+                 struct ata_taskfile *tf,
+                 int dma_dir, void *buf, unsigned int buflen)
+{
+       u8 command = tf->command;
+       struct ata_queued_cmd *qc;
+       DECLARE_COMPLETION(wait);
+       unsigned long flags;
+       struct ata_exec_internal_arg arg;
+
+       spin_lock_irqsave(&ap->host_set->lock, flags);
+
+       qc = ata_qc_new_init(ap, dev);
+       BUG_ON(qc == NULL);
+
+       qc->tf = *tf;
+       qc->dma_dir = dma_dir;
+       if (dma_dir != DMA_NONE) {
+               ata_sg_init_one(qc, buf, buflen);
+               qc->nsect = buflen / ATA_SECT_SIZE;
+       }
+
+       arg.waiting = &wait;
+       arg.tf = tf;
+       qc->private_data = &arg;
+       qc->complete_fn = ata_qc_complete_internal;
+
+       if (ata_qc_issue(qc))
+               goto issue_fail;
+
+       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+
+       if (!wait_for_completion_timeout(&wait, ATA_TMOUT_INTERNAL)) {
+               spin_lock_irqsave(&ap->host_set->lock, flags);
+
+               /* We're racing with irq here.  If we lose, the
+                * following test prevents us from completing the qc
+                * again.  If completion irq occurs after here but
+                * before the caller cleans up, it will result in a
+                * spurious interrupt.  We can live with that.
+                */
+               if (arg.waiting) {
+                       qc->err_mask = AC_ERR_OTHER;
+                       ata_qc_complete(qc);
+                       printk(KERN_WARNING "ata%u: qc timeout (cmd 0x%x)\n",
+                              ap->id, command);
                }
 
-               ata_qc_complete(qc, err_mask);
+               spin_unlock_irqrestore(&ap->host_set->lock, flags);
        }
 
-       return rc;
+       return arg.err_mask;
+
+ issue_fail:
+       ata_qc_free(qc);
+       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       return AC_ERR_OTHER;
 }
 
 /**
@@ -1099,9 +1174,8 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
        u16 tmp;
        unsigned long xfer_modes;
        unsigned int using_edd;
-       DECLARE_COMPLETION(wait);
-       struct ata_queued_cmd *qc;
-       unsigned long flags;
+       struct ata_taskfile tf;
+       unsigned int err_mask;
        int rc;
 
        if (!ata_dev_present(dev)) {
@@ -1122,40 +1196,26 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
 
        ata_dev_select(ap, device, 1, 1); /* select device 0/1 */
 
-       qc = ata_qc_new_init(ap, dev);
-       BUG_ON(qc == NULL);
-
-       ata_sg_init_one(qc, dev->id, sizeof(dev->id));
-       qc->dma_dir = DMA_FROM_DEVICE;
-       qc->tf.protocol = ATA_PROT_PIO;
-       qc->nsect = 1;
-
 retry:
+       ata_tf_init(ap, &tf, device);
+
        if (dev->class == ATA_DEV_ATA) {
-               qc->tf.command = ATA_CMD_ID_ATA;
+               tf.command = ATA_CMD_ID_ATA;
                DPRINTK("do ATA identify\n");
        } else {
-               qc->tf.command = ATA_CMD_ID_ATAPI;
+               tf.command = ATA_CMD_ID_ATAPI;
                DPRINTK("do ATAPI identify\n");
        }
 
-       qc->waiting = &wait;
-       qc->complete_fn = ata_qc_complete_noop;
+       tf.protocol = ATA_PROT_PIO;
 
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       rc = ata_qc_issue(qc);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
-
-       if (rc)
-               goto err_out;
-       else
-               ata_qc_wait_err(qc, &wait);
+       err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE,
+                                    dev->id, sizeof(dev->id));
 
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       ap->ops->tf_read(ap, &qc->tf);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       if (err_mask) {
+               if (err_mask & ~AC_ERR_DEV)
+                       goto err_out;
 
-       if (qc->tf.command & ATA_ERR) {
                /*
                 * arg!  EDD works for all test cases, but seems to return
                 * the ATA signature for some ATAPI devices.  Until the
@@ -1168,13 +1228,9 @@ retry:
                 * to have this problem.
                 */
                if ((using_edd) && (dev->class == ATA_DEV_ATA)) {
-                       u8 err = qc->tf.feature;
+                       u8 err = tf.feature;
                        if (err & ATA_ABORTED) {
                                dev->class = ATA_DEV_ATAPI;
-                               qc->cursg = 0;
-                               qc->cursg_ofs = 0;
-                               qc->cursect = 0;
-                               qc->nsect = 1;
                                goto retry;
                        }
                }
@@ -1444,11 +1500,23 @@ void __sata_phy_reset(struct ata_port *ap)
        } while (time_before(jiffies, timeout));
 
        /* TODO: phy layer with polling, timeouts, etc. */
-       if (sata_dev_present(ap))
+       sstatus = scr_read(ap, SCR_STATUS);
+       if (sata_dev_present(ap)) {
+               const char *speed;
+               u32 tmp;
+
+               tmp = (sstatus >> 4) & 0xf;
+               if (tmp & (1 << 0))
+                       speed = "1.5";
+               else if (tmp & (1 << 1))
+                       speed = "3.0";
+               else
+                       speed = "<unknown>";
+               printk(KERN_INFO "ata%u: SATA link up %s Gbps (SStatus %X)\n",
+                      ap->id, speed, sstatus);
                ata_port_probe(ap);
-       else {
-               sstatus = scr_read(ap, SCR_STATUS);
-               printk(KERN_INFO "ata%u: no device found (phy stat %08x)\n",
+       } else {
+               printk(KERN_INFO "ata%u: SATA link down (SStatus %X)\n",
                       ap->id, sstatus);
                ata_port_disable(ap);
        }
@@ -2071,7 +2139,7 @@ static void ata_pr_blacklisted(const struct ata_port *ap,
                ap->id, dev->devno);
 }
 
-static const char * ata_dma_blacklist [] = {
+static const char * const ata_dma_blacklist [] = {
        "WDC AC11000H",
        "WDC AC22100H",
        "WDC AC32500H",
@@ -2266,34 +2334,23 @@ static int ata_choose_xfer_mode(const struct ata_port *ap,
 
 static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev)
 {
-       DECLARE_COMPLETION(wait);
-       struct ata_queued_cmd *qc;
-       int rc;
-       unsigned long flags;
+       struct ata_taskfile tf;
 
        /* set up set-features taskfile */
        DPRINTK("set features - xfer mode\n");
 
-       qc = ata_qc_new_init(ap, dev);
-       BUG_ON(qc == NULL);
-
-       qc->tf.command = ATA_CMD_SET_FEATURES;
-       qc->tf.feature = SETFEATURES_XFER;
-       qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-       qc->tf.protocol = ATA_PROT_NODATA;
-       qc->tf.nsect = dev->xfer_mode;
-
-       qc->waiting = &wait;
-       qc->complete_fn = ata_qc_complete_noop;
-
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       rc = ata_qc_issue(qc);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       ata_tf_init(ap, &tf, dev->devno);
+       tf.command = ATA_CMD_SET_FEATURES;
+       tf.feature = SETFEATURES_XFER;
+       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+       tf.protocol = ATA_PROT_NODATA;
+       tf.nsect = dev->xfer_mode;
 
-       if (rc)
+       if (ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0)) {
+               printk(KERN_ERR "ata%u: failed to set xfermode, disabled\n",
+                      ap->id);
                ata_port_disable(ap);
-       else
-               ata_qc_wait_err(qc, &wait);
+       }
 
        DPRINTK("EXIT\n");
 }
@@ -2308,41 +2365,25 @@ static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev)
 
 static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev)
 {
-       DECLARE_COMPLETION(wait);
-       struct ata_queued_cmd *qc;
-       unsigned long flags;
-       int rc;
-
-       qc = ata_qc_new_init(ap, dev);
-       BUG_ON(qc == NULL);
+       struct ata_taskfile tf;
 
-       ata_sg_init_one(qc, dev->id, sizeof(dev->id));
-       qc->dma_dir = DMA_FROM_DEVICE;
+       ata_tf_init(ap, &tf, dev->devno);
 
        if (dev->class == ATA_DEV_ATA) {
-               qc->tf.command = ATA_CMD_ID_ATA;
+               tf.command = ATA_CMD_ID_ATA;
                DPRINTK("do ATA identify\n");
        } else {
-               qc->tf.command = ATA_CMD_ID_ATAPI;
+               tf.command = ATA_CMD_ID_ATAPI;
                DPRINTK("do ATAPI identify\n");
        }
 
-       qc->tf.flags |= ATA_TFLAG_DEVICE;
-       qc->tf.protocol = ATA_PROT_PIO;
-       qc->nsect = 1;
-
-       qc->waiting = &wait;
-       qc->complete_fn = ata_qc_complete_noop;
-
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       rc = ata_qc_issue(qc);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       tf.flags |= ATA_TFLAG_DEVICE;
+       tf.protocol = ATA_PROT_PIO;
 
-       if (rc)
+       if (ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE,
+                             dev->id, sizeof(dev->id)))
                goto err_out;
 
-       ata_qc_wait_err(qc, &wait);
-
        swap_buf_le16(dev->id, ATA_ID_WORDS);
 
        ata_dump_id(dev);
@@ -2351,6 +2392,7 @@ static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev)
 
        return;
 err_out:
+       printk(KERN_ERR "ata%u: failed to reread ID, disabled\n", ap->id);
        ata_port_disable(ap);
 }
 
@@ -2364,10 +2406,7 @@ err_out:
 
 static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev)
 {
-       DECLARE_COMPLETION(wait);
-       struct ata_queued_cmd *qc;
-       int rc;
-       unsigned long flags;
+       struct ata_taskfile tf;
        u16 sectors = dev->id[6];
        u16 heads   = dev->id[3];
 
@@ -2378,26 +2417,18 @@ static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev)
        /* set up init dev params taskfile */
        DPRINTK("init dev params \n");
 
-       qc = ata_qc_new_init(ap, dev);
-       BUG_ON(qc == NULL);
-
-       qc->tf.command = ATA_CMD_INIT_DEV_PARAMS;
-       qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-       qc->tf.protocol = ATA_PROT_NODATA;
-       qc->tf.nsect = sectors;
-       qc->tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */
-
-       qc->waiting = &wait;
-       qc->complete_fn = ata_qc_complete_noop;
-
-       spin_lock_irqsave(&ap->host_set->lock, flags);
-       rc = ata_qc_issue(qc);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       ata_tf_init(ap, &tf, dev->devno);
+       tf.command = ATA_CMD_INIT_DEV_PARAMS;
+       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+       tf.protocol = ATA_PROT_NODATA;
+       tf.nsect = sectors;
+       tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */
 
-       if (rc)
+       if (ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0)) {
+               printk(KERN_ERR "ata%u: failed to init parameters, disabled\n",
+                      ap->id);
                ata_port_disable(ap);
-       else
-               ata_qc_wait_err(qc, &wait);
+       }
 
        DPRINTK("EXIT\n");
 }
@@ -2443,7 +2474,7 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
                        struct scatterlist *psg = &qc->pad_sgent;
                        void *addr = kmap_atomic(psg->page, KM_IRQ0);
                        memcpy(addr + psg->offset, pad_buf, qc->pad_len);
-                       kunmap_atomic(psg->page, KM_IRQ0);
+                       kunmap_atomic(addr, KM_IRQ0);
                }
        } else {
                if (sg_dma_len(&sg[0]) > 0)
@@ -2717,7 +2748,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
                if (qc->tf.flags & ATA_TFLAG_WRITE) {
                        void *addr = kmap_atomic(psg->page, KM_IRQ0);
                        memcpy(pad_buf, addr + psg->offset, qc->pad_len);
-                       kunmap_atomic(psg->page, KM_IRQ0);
+                       kunmap_atomic(addr, KM_IRQ0);
                }
 
                sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ);
@@ -2765,7 +2796,7 @@ skip_map:
  *     None.  (grabs host lock)
  */
 
-void ata_poll_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
+void ata_poll_qc_complete(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        unsigned long flags;
@@ -2773,7 +2804,7 @@ void ata_poll_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
        spin_lock_irqsave(&ap->host_set->lock, flags);
        ap->flags &= ~ATA_FLAG_NOINTR;
        ata_irq_on(ap);
-       ata_qc_complete(qc, err_mask);
+       ata_qc_complete(qc);
        spin_unlock_irqrestore(&ap->host_set->lock, flags);
 }
 
@@ -2790,10 +2821,14 @@ void ata_poll_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
 
 static unsigned long ata_pio_poll(struct ata_port *ap)
 {
+       struct ata_queued_cmd *qc;
        u8 status;
        unsigned int poll_state = HSM_ST_UNKNOWN;
        unsigned int reg_state = HSM_ST_UNKNOWN;
 
+       qc = ata_qc_from_tag(ap, ap->active_tag);
+       assert(qc != NULL);
+
        switch (ap->hsm_task_state) {
        case HSM_ST:
        case HSM_ST_POLL:
@@ -2813,6 +2848,7 @@ static unsigned long ata_pio_poll(struct ata_port *ap)
        status = ata_chk_status(ap);
        if (status & ATA_BUSY) {
                if (time_after(jiffies, ap->pio_task_timeout)) {
+                       qc->err_mask |= AC_ERR_ATA_BUS;
                        ap->hsm_task_state = HSM_ST_TMOUT;
                        return 0;
                }
@@ -2847,29 +2883,31 @@ static int ata_pio_complete (struct ata_port *ap)
         * msecs, then chk-status again.  If still busy, fall back to
         * HSM_ST_POLL state.
         */
-       drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 10);
-       if (drv_stat & (ATA_BUSY | ATA_DRQ)) {
+       drv_stat = ata_busy_wait(ap, ATA_BUSY, 10);
+       if (drv_stat & ATA_BUSY) {
                msleep(2);
-               drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 10);
-               if (drv_stat & (ATA_BUSY | ATA_DRQ)) {
+               drv_stat = ata_busy_wait(ap, ATA_BUSY, 10);
+               if (drv_stat & ATA_BUSY) {
                        ap->hsm_task_state = HSM_ST_LAST_POLL;
                        ap->pio_task_timeout = jiffies + ATA_TMOUT_PIO;
                        return 0;
                }
        }
 
+       qc = ata_qc_from_tag(ap, ap->active_tag);
+       assert(qc != NULL);
+
        drv_stat = ata_wait_idle(ap);
        if (!ata_ok(drv_stat)) {
+               qc->err_mask |= __ac_err_mask(drv_stat);
                ap->hsm_task_state = HSM_ST_ERR;
                return 0;
        }
 
-       qc = ata_qc_from_tag(ap, ap->active_tag);
-       assert(qc != NULL);
-
        ap->hsm_task_state = HSM_ST_IDLE;
 
-       ata_poll_qc_complete(qc, 0);
+       assert(qc->err_mask == 0);
+       ata_poll_qc_complete(qc);
 
        /* another command may start at this point */
 
@@ -3177,6 +3215,7 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
 err_out:
        printk(KERN_INFO "ata%u: dev %u: ATAPI check failed\n",
              ap->id, dev->devno);
+       qc->err_mask |= AC_ERR_ATA_BUS;
        ap->hsm_task_state = HSM_ST_ERR;
 }
 
@@ -3215,8 +3254,16 @@ static void ata_pio_block(struct ata_port *ap)
        qc = ata_qc_from_tag(ap, ap->active_tag);
        assert(qc != NULL);
 
+       /* check error */
+       if (status & (ATA_ERR | ATA_DF)) {
+               qc->err_mask |= AC_ERR_DEV;
+               ap->hsm_task_state = HSM_ST_ERR;
+               return;
+       }
+
+       /* transfer data if any */
        if (is_atapi_taskfile(&qc->tf)) {
-               /* no more data to transfer or unsupported ATAPI command */
+               /* DRQ=0 means no more data to transfer */
                if ((status & ATA_DRQ) == 0) {
                        ap->hsm_task_state = HSM_ST_LAST;
                        return;
@@ -3226,6 +3273,7 @@ static void ata_pio_block(struct ata_port *ap)
        } else {
                /* handle BSY=0, DRQ=0 as error */
                if ((status & ATA_DRQ) == 0) {
+                       qc->err_mask |= AC_ERR_ATA_BUS;
                        ap->hsm_task_state = HSM_ST_ERR;
                        return;
                }
@@ -3243,9 +3291,14 @@ static void ata_pio_error(struct ata_port *ap)
        qc = ata_qc_from_tag(ap, ap->active_tag);
        assert(qc != NULL);
 
+       /* make sure qc->err_mask is available to 
+        * know what's wrong and recover
+        */
+       assert(qc->err_mask);
+
        ap->hsm_task_state = HSM_ST_IDLE;
 
-       ata_poll_qc_complete(qc, AC_ERR_ATA_BUS);
+       ata_poll_qc_complete(qc);
 }
 
 static void ata_pio_task(void *_data)
@@ -3347,7 +3400,8 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
                       ap->id, qc->tf.command, drv_stat, host_stat);
 
                /* complete taskfile transaction */
-               ata_qc_complete(qc, ac_err_mask(drv_stat));
+               qc->err_mask |= ac_err_mask(drv_stat);
+               ata_qc_complete(qc);
                break;
        }
 
@@ -3446,15 +3500,10 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
        return qc;
 }
 
-int ata_qc_complete_noop(struct ata_queued_cmd *qc, unsigned int err_mask)
-{
-       return 0;
-}
-
 static void __ata_qc_complete(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       unsigned int tag, do_clear = 0;
+       unsigned int tag;
 
        qc->flags = 0;
        tag = qc->tag;
@@ -3462,17 +3511,8 @@ static void __ata_qc_complete(struct ata_queued_cmd *qc)
                if (tag == ap->active_tag)
                        ap->active_tag = ATA_TAG_POISON;
                qc->tag = ATA_TAG_POISON;
-               do_clear = 1;
-       }
-
-       if (qc->waiting) {
-               struct completion *waiting = qc->waiting;
-               qc->waiting = NULL;
-               complete(waiting);
-       }
-
-       if (likely(do_clear))
                clear_bit(tag, &ap->qactive);
+       }
 }
 
 /**
@@ -3488,7 +3528,6 @@ static void __ata_qc_complete(struct ata_queued_cmd *qc)
 void ata_qc_free(struct ata_queued_cmd *qc)
 {
        assert(qc != NULL);     /* ata_qc_from_tag _might_ return NULL */
-       assert(qc->waiting == NULL);    /* nothing should be waiting */
 
        __ata_qc_complete(qc);
 }
@@ -3505,7 +3544,7 @@ void ata_qc_free(struct ata_queued_cmd *qc)
  *     spin_lock_irqsave(host_set lock)
  */
 
-void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
+void ata_qc_complete(struct ata_queued_cmd *qc)
 {
        int rc;
 
@@ -3522,7 +3561,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
        qc->flags &= ~ATA_QCFLAG_ACTIVE;
 
        /* call completion callback */
-       rc = qc->complete_fn(qc, err_mask);
+       rc = qc->complete_fn(qc);
 
        /* if callback indicates not to complete command (non-zero),
         * return immediately
@@ -3960,7 +3999,8 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
                ap->ops->irq_clear(ap);
 
                /* complete taskfile transaction */
-               ata_qc_complete(qc, ac_err_mask(status));
+               qc->err_mask |= ac_err_mask(status);
+               ata_qc_complete(qc);
                break;
 
        default:
@@ -4054,13 +4094,17 @@ static void atapi_packet_task(void *_data)
 
        /* sleep-wait for BSY to clear */
        DPRINTK("busy wait\n");
-       if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB))
-               goto err_out_status;
+       if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) {
+               qc->err_mask |= AC_ERR_ATA_BUS;
+               goto err_out;
+       }
 
        /* make sure DRQ is set */
        status = ata_chk_status(ap);
-       if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ)
+       if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ) {
+               qc->err_mask |= AC_ERR_ATA_BUS;
                goto err_out;
+       }
 
        /* send SCSI cdb */
        DPRINTK("send cdb\n");
@@ -4092,10 +4136,8 @@ static void atapi_packet_task(void *_data)
 
        return;
 
-err_out_status:
-       status = ata_chk_status(ap);
 err_out:
-       ata_poll_qc_complete(qc, __ac_err_mask(status));
+       ata_poll_qc_complete(qc);
 }
 
 
index 3b4ca55a3332eb02c33a6c4afda97bfa7b4f46fc..e0439be4b5731fd2b8390c479f0c756043030af7 100644 (file)
@@ -418,7 +418,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
        int i;
 
        /* Based on the 3ware driver translation table */
-       static unsigned char sense_table[][4] = {
+       static const unsigned char sense_table[][4] = {
                /* BBD|ECC|ID|MAR */
                {0xd1,          ABORTED_COMMAND, 0x00, 0x00},   // Device busy                  Aborted command
                /* BBD|ECC|ID */
@@ -449,7 +449,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
                {0x80,          MEDIUM_ERROR, 0x11, 0x04},      // Block marked bad               Medium error, unrecovered read error
                {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
        };
-       static unsigned char stat_table[][4] = {
+       static const unsigned char stat_table[][4] = {
                /* Must be first because BUSY means no other bits valid */
                {0x80,          ABORTED_COMMAND, 0x47, 0x00},   // Busy, fake parity for now
                {0x20,          HARDWARE_ERROR,  0x00, 0x00},   // Device fault
@@ -1203,12 +1203,11 @@ nothing_to_do:
        return 1;
 }
 
-static int ata_scsi_qc_complete(struct ata_queued_cmd *qc,
-                               unsigned int err_mask)
+static int ata_scsi_qc_complete(struct ata_queued_cmd *qc)
 {
        struct scsi_cmnd *cmd = qc->scsicmd;
        u8 *cdb = cmd->cmnd;
-       int need_sense = (err_mask != 0);
+       int need_sense = (qc->err_mask != 0);
 
        /* For ATA pass thru (SAT) commands, generate a sense block if
         * user mandated it or if there's an error.  Note that if we
@@ -1532,7 +1531,7 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
        return 0;
 }
 
-static const char *inq_83_str = "Linux ATA-SCSI simulator";
+static const char * const inq_83_str = "Linux ATA-SCSI simulator";
 
 /**
  *     ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity
@@ -1955,9 +1954,9 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8
        done(cmd);
 }
 
-static int atapi_sense_complete(struct ata_queued_cmd *qc,unsigned int err_mask)
+static int atapi_sense_complete(struct ata_queued_cmd *qc)
 {
-       if (err_mask && ((err_mask & AC_ERR_DEV) == 0))
+       if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0))
                /* FIXME: not quite right; we don't want the
                 * translation of taskfile registers into
                 * a sense descriptors, since that's only
@@ -2015,15 +2014,18 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
 
        qc->complete_fn = atapi_sense_complete;
 
-       if (ata_qc_issue(qc))
-               ata_qc_complete(qc, AC_ERR_OTHER);
+       if (ata_qc_issue(qc)) {
+               qc->err_mask |= AC_ERR_OTHER;
+               ata_qc_complete(qc);
+       }
 
        DPRINTK("EXIT\n");
 }
 
-static int atapi_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
+static int atapi_qc_complete(struct ata_queued_cmd *qc)
 {
        struct scsi_cmnd *cmd = qc->scsicmd;
+       unsigned int err_mask = qc->err_mask;
 
        VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
 
@@ -2044,7 +2046,7 @@ static int atapi_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
        else {
                u8 *scsicmd = cmd->cmnd;
 
-               if (scsicmd[0] == INQUIRY) {
+               if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
                        u8 *buf = NULL;
                        unsigned int buflen;
 
@@ -2057,9 +2059,6 @@ static int atapi_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
         * to indicate to the Linux scsi midlayer this is a modern
         * device.  2) Ensure response data format / ATAPI information
         * are always correct.
-        */
-       /* FIXME: do we ever override EVPD pages and the like, with
-        * this code?
         */
                        if (buf[2] == 0) {
                                buf[2] = 0x5;
@@ -2173,9 +2172,12 @@ ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
        if (unlikely(!ata_dev_present(dev)))
                return NULL;
 
-       if (!atapi_enabled) {
-               if (unlikely(dev->class == ATA_DEV_ATAPI))
+       if (!atapi_enabled || (ap->flags & ATA_FLAG_NO_ATAPI)) {
+               if (unlikely(dev->class == ATA_DEV_ATAPI)) {
+                       printk(KERN_WARNING "ata%u(%u): WARNING: ATAPI is %s, device ignored.\n",
+                              ap->id, dev->devno, atapi_enabled ? "not supported with this driver" : "disabled");
                        return NULL;
+               }
        }
 
        return dev;
@@ -2239,7 +2241,7 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
        struct scsi_cmnd *cmd = qc->scsicmd;
 
        if ((tf->protocol = ata_scsi_map_proto(scsicmd[1])) == ATA_PROT_UNKNOWN)
-               return 1;
+               goto invalid_fld;
 
        /*
         * 12 and 16 byte CDBs use different offsets to
@@ -2301,7 +2303,7 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
         */
        if ((tf->command == ATA_CMD_SET_FEATURES)
         && (tf->feature == SETFEATURES_XFER))
-               return 1;
+               goto invalid_fld;
 
        /*
         * Set flags so that all registers will be written,
@@ -2322,6 +2324,11 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd)
        qc->nsect = cmd->bufflen / ATA_SECT_SIZE;
 
        return 0;
+
+ invalid_fld:
+       ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x24, 0x00);
+       /* "Invalid field in cdb" */
+       return 1;
 }
 
 /**
index 8ebaa694d18e423ba88545127f806d71b781da34..251e53bdc6e03af366fae3c912047b554a4a30b8 100644 (file)
@@ -39,7 +39,6 @@ struct ata_scsi_args {
 
 /* libata-core.c */
 extern int atapi_enabled;
-extern int ata_qc_complete_noop(struct ata_queued_cmd *qc, unsigned int err_mask);
 extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
                                      struct ata_device *dev);
 extern void ata_rwcmd_protocol(struct ata_queued_cmd *qc);
index 3062b39fbdb97ca7e12e0a66a7af6f43c346cb5b..38ffa8d6e62901ed94231c45c42571750308e107 100644 (file)
@@ -29,9 +29,10 @@ struct lpfc_sli2_slim;
 #define LPFC_LC_HBA_Q_DEPTH    1024    /* max cmds per low cost hba */
 #define LPFC_LP101_HBA_Q_DEPTH 128     /* max cmds per low cost hba */
 
-#define LPFC_CMD_PER_LUN       30      /* max outstanding cmds per lun */
+#define LPFC_CMD_PER_LUN       3       /* max outstanding cmds per lun */
 #define LPFC_SG_SEG_CNT                64      /* sg element count per scsi cmnd */
 #define LPFC_IOCB_LIST_CNT     2250    /* list of IOCBs for fast-path usage. */
+#define LPFC_Q_RAMP_UP_INTERVAL 120     /* lun q_depth ramp up interval */
 
 /* Define macros for 64 bit support */
 #define putPaddrLow(addr)    ((uint32_t) (0xffffffff & (u64)(addr)))
@@ -45,6 +46,11 @@ struct lpfc_sli2_slim;
 
 #define MAX_HBAEVT     32
 
+enum lpfc_polling_flags {
+       ENABLE_FCP_RING_POLLING = 0x1,
+       DISABLE_FCP_RING_INT    = 0x2
+};
+
 /* Provide DMA memory definitions the driver uses per port instance. */
 struct lpfc_dmabuf {
        struct list_head list;
@@ -167,6 +173,7 @@ struct lpfc_hba {
        dma_addr_t slim2p_mapping;
        uint16_t pci_cfg_value;
 
+       struct semaphore hba_can_block;
        uint32_t hba_state;
 
 #define LPFC_INIT_START           1    /* Initial state after board reset */
@@ -286,6 +293,8 @@ struct lpfc_hba {
        uint32_t cfg_fcp_bind_method;
        uint32_t cfg_discovery_threads;
        uint32_t cfg_max_luns;
+       uint32_t cfg_poll;
+       uint32_t cfg_poll_tmo;
        uint32_t cfg_sg_seg_cnt;
        uint32_t cfg_sg_dma_buf_size;
 
@@ -337,7 +346,9 @@ struct lpfc_hba {
 #define VPD_PORT            0x8         /* valid vpd port data */
 #define VPD_MASK            0xf         /* mask for any vpd data */
 
+       struct timer_list fcp_poll_timer;
        struct timer_list els_tmofunc;
+
        /*
         * stat  counters
         */
@@ -348,6 +359,7 @@ struct lpfc_hba {
        struct lpfc_sysfs_mbox sysfs_mbox;
 
        /* fastpath list. */
+       spinlock_t scsi_buf_list_lock;
        struct list_head lpfc_scsi_buf_list;
        uint32_t total_scsi_bufs;
        struct list_head lpfc_iocb_list;
index 89e8222bc7cc4801ec981ee1c13523957744ce97..5625a8c2a8fde79eaf3620d0ef1857fe2511f5f1 100644 (file)
@@ -278,6 +278,71 @@ lpfc_board_online_store(struct class_device *cdev, const char *buf,
                return -EIO;
 }
 
+static ssize_t
+lpfc_poll_show(struct class_device *cdev, char *buf)
+{
+       struct Scsi_Host *host = class_to_shost(cdev);
+       struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
+
+       return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll);
+}
+
+static ssize_t
+lpfc_poll_store(struct class_device *cdev, const char *buf,
+               size_t count)
+{
+       struct Scsi_Host *host = class_to_shost(cdev);
+       struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
+       uint32_t creg_val;
+       uint32_t old_val;
+       int val=0;
+
+       if (!isdigit(buf[0]))
+               return -EINVAL;
+
+       if (sscanf(buf, "%i", &val) != 1)
+               return -EINVAL;
+
+       if ((val & 0x3) != val)
+               return -EINVAL;
+
+       spin_lock_irq(phba->host->host_lock);
+
+       old_val = phba->cfg_poll;
+
+       if (val & ENABLE_FCP_RING_POLLING) {
+               if ((val & DISABLE_FCP_RING_INT) &&
+                   !(old_val & DISABLE_FCP_RING_INT)) {
+                       creg_val = readl(phba->HCregaddr);
+                       creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
+                       writel(creg_val, phba->HCregaddr);
+                       readl(phba->HCregaddr); /* flush */
+
+                       lpfc_poll_start_timer(phba);
+               }
+       } else if (val != 0x0) {
+               spin_unlock_irq(phba->host->host_lock);
+               return -EINVAL;
+       }
+
+       if (!(val & DISABLE_FCP_RING_INT) &&
+           (old_val & DISABLE_FCP_RING_INT))
+       {
+               spin_unlock_irq(phba->host->host_lock);
+               del_timer(&phba->fcp_poll_timer);
+               spin_lock_irq(phba->host->host_lock);
+               creg_val = readl(phba->HCregaddr);
+               creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
+               writel(creg_val, phba->HCregaddr);
+               readl(phba->HCregaddr); /* flush */
+       }
+
+       phba->cfg_poll = val;
+
+       spin_unlock_irq(phba->host->host_lock);
+
+       return strlen(buf);
+}
 
 #define lpfc_param_show(attr)  \
 static ssize_t \
@@ -416,6 +481,15 @@ static CLASS_DEVICE_ATTR(management_version, S_IRUGO, management_version_show,
 static CLASS_DEVICE_ATTR(board_online, S_IRUGO | S_IWUSR,
                         lpfc_board_online_show, lpfc_board_online_store);
 
+static int lpfc_poll = 0;
+module_param(lpfc_poll, int, 0);
+MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:"
+                " 0 - none,"
+                " 1 - poll with interrupts enabled"
+                " 3 - poll and disable FCP ring interrupts");
+
+static CLASS_DEVICE_ATTR(lpfc_poll, S_IRUGO | S_IWUSR,
+                        lpfc_poll_show, lpfc_poll_store);
 
 /*
 # lpfc_log_verbose: Only turn this flag on if you are willing to risk being
@@ -523,10 +597,10 @@ LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
 # is 0. Default value of cr_count is 1. The cr_count feature is disabled if
 # cr_delay is set to 0.
 */
-LPFC_ATTR(cr_delay, 0, 0, 63, "A count of milliseconds after which an"
+LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an"
                "interrupt response is generated");
 
-LPFC_ATTR(cr_count, 1, 1, 255, "A count of I/O completions after which an"
+LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an"
                "interrupt response is generated");
 
 /*
@@ -553,6 +627,13 @@ LPFC_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands"
 LPFC_ATTR_R(max_luns, 256, 1, 32768,
             "Maximum number of LUNs per target driver will support");
 
+/*
+# lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring.
+# Value range is [1,255], default value is 10.
+*/
+LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
+            "Milliseconds driver will wait between polling FCP ring");
+
 struct class_device_attribute *lpfc_host_attrs[] = {
        &class_device_attr_info,
        &class_device_attr_serialnum,
@@ -575,11 +656,15 @@ struct class_device_attribute *lpfc_host_attrs[] = {
        &class_device_attr_lpfc_topology,
        &class_device_attr_lpfc_scan_down,
        &class_device_attr_lpfc_link_speed,
+       &class_device_attr_lpfc_cr_delay,
+       &class_device_attr_lpfc_cr_count,
        &class_device_attr_lpfc_fdmi_on,
        &class_device_attr_lpfc_max_luns,
        &class_device_attr_nport_evt_cnt,
        &class_device_attr_management_version,
        &class_device_attr_board_online,
+       &class_device_attr_lpfc_poll,
+       &class_device_attr_lpfc_poll_tmo,
        NULL,
 };
 
@@ -1292,6 +1377,9 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
        lpfc_fdmi_on_init(phba, lpfc_fdmi_on);
        lpfc_discovery_threads_init(phba, lpfc_discovery_threads);
        lpfc_max_luns_init(phba, lpfc_max_luns);
+       lpfc_poll_tmo_init(phba, lpfc_poll_tmo);
+
+       phba->cfg_poll = lpfc_poll;
 
        /*
         * The total number of segments is the configuration value plus 2
index d527d05a607fb4c4686d4f26a4ba136139eec65d..f1e708946e66d47a753ac5d9f0081f76c908fd56 100644 (file)
@@ -143,6 +143,9 @@ LPFC_MBOXQ_t *lpfc_mbox_get(struct lpfc_hba *);
 int lpfc_mem_alloc(struct lpfc_hba *);
 void lpfc_mem_free(struct lpfc_hba *);
 
+void lpfc_poll_timeout(unsigned long ptr);
+void lpfc_poll_start_timer(struct lpfc_hba * phba);
+void lpfc_sli_poll_fcp_ring(struct lpfc_hba * hba);
 struct lpfc_iocbq * lpfc_sli_get_iocbq(struct lpfc_hba *);
 void lpfc_sli_release_iocbq(struct lpfc_hba * phba, struct lpfc_iocbq * iocb);
 uint16_t lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocb);
index 084e7628ce172dc087a41d35b4d678fd7581f860..ed6c81660e03563f94d7720970086e17dd9af08b 100644 (file)
@@ -73,6 +73,8 @@ struct lpfc_nodelist {
        struct lpfc_hba      *nlp_phba;
        struct lpfc_work_evt nodev_timeout_evt;
        struct lpfc_work_evt els_retry_evt;
+       unsigned long last_ramp_up_time;        /* jiffy of last ramp up */
+       unsigned long last_q_full_time;         /* jiffy of last queue full */
 };
 
 /* Defines for nlp_flag (uint32) */
index bcc29ec126dc1a29761885fe31193f75c1ad29d9..20f1a0713db2dbd7d2210f4f85defa36deadd7c1 100644 (file)
@@ -720,6 +720,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
                if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
                   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
+                  (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
                   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
                        disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
                }
@@ -869,6 +870,7 @@ lpfc_cmpl_els_prli(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
                if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
                   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
+                  (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
                   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
                        goto out;
                }
@@ -1054,6 +1056,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
                if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
                   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
+                  (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
                   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
                        disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
                }
@@ -1205,6 +1208,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
                if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
                   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
+                  (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
                   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
                        goto out;
                }
index 259eeb161b82ce0e3ac55f706150c653f39a5bbe..a1f751e79405fee9fdc32db86bfc47bd7dcdcd31 100644 (file)
@@ -1017,12 +1017,7 @@ lpfc_register_remote_port(struct lpfc_hba * phba,
        rport_ids.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn);
        rport_ids.port_id = ndlp->nlp_DID;
        rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
-       if (ndlp->nlp_type & NLP_FCP_TARGET)
-               rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
-       if (ndlp->nlp_type & NLP_FCP_INITIATOR)
-               rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
 
-       scsi_block_requests(phba->host);
        ndlp->rport = rport = fc_remote_port_add(phba->host, 0, &rport_ids);
        if (!rport) {
                dev_printk(KERN_WARNING, &phba->pcidev->dev,
@@ -1039,7 +1034,16 @@ lpfc_register_remote_port(struct lpfc_hba * phba,
        }
        rdata = rport->dd_data;
        rdata->pnode = ndlp;
-       scsi_unblock_requests(phba->host);
+
+       if (ndlp->nlp_type & NLP_FCP_TARGET)
+               rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
+       if (ndlp->nlp_type & NLP_FCP_INITIATOR)
+               rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
+
+
+       if (rport_ids.roles !=  FC_RPORT_ROLE_UNKNOWN)
+               fc_remote_port_rolechg(rport, rport_ids.roles);
+
 
        return;
 }
@@ -1053,9 +1057,7 @@ lpfc_unregister_remote_port(struct lpfc_hba * phba,
 
        ndlp->rport = NULL;
        rdata->pnode = NULL;
-       scsi_block_requests(phba->host);
        fc_remote_port_delete(rport);
-       scsi_unblock_requests(phba->host);
 
        return;
 }
index 86c41981188b33b5d3c7a204411d79a52d01dce1..1ea565e0561ffe0432fed2e751a59f21e6ea5d8f 100644 (file)
@@ -266,9 +266,11 @@ struct lpfc_name {
                struct {
 #ifdef __BIG_ENDIAN_BITFIELD
                        uint8_t nameType:4;     /* FC Word 0, bit 28:31 */
-                       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
+                       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit
+                                                  8:11 of IEEE ext */
 #else  /*  __LITTLE_ENDIAN_BITFIELD */
-                       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
+                       uint8_t IEEEextMsn:4;   /* FC Word 0, bit 24:27, bit
+                                                  8:11 of IEEE ext */
                        uint8_t nameType:4;     /* FC Word 0, bit 28:31 */
 #endif
 
@@ -278,7 +280,8 @@ struct lpfc_name {
 #define NAME_IP_TYPE        0x4        /* IP address */
 #define NAME_CCITT_TYPE     0xC
 #define NAME_CCITT_GR_TYPE  0xE
-                       uint8_t IEEEextLsb;     /* FC Word 0, bit 16:23, IEEE extended Lsb */
+                       uint8_t IEEEextLsb;     /* FC Word 0, bit 16:23, IEEE
+                                                  extended Lsb */
                        uint8_t IEEE[6];        /* FC IEEE address */
                } s;
                uint8_t wwn[8];
@@ -1024,23 +1027,38 @@ typedef struct {
 /* Start FireFly Register definitions */
 #define PCI_VENDOR_ID_EMULEX        0x10df
 #define PCI_DEVICE_ID_FIREFLY       0x1ae5
-#define PCI_DEVICE_ID_SUPERFLY      0xf700
-#define PCI_DEVICE_ID_DRAGONFLY     0xf800
 #define PCI_DEVICE_ID_RFLY          0xf095
 #define PCI_DEVICE_ID_PFLY          0xf098
+#define PCI_DEVICE_ID_LP101         0xf0a1
 #define PCI_DEVICE_ID_TFLY          0xf0a5
+#define PCI_DEVICE_ID_BSMB          0xf0d1
+#define PCI_DEVICE_ID_BMID          0xf0d5
+#define PCI_DEVICE_ID_ZSMB          0xf0e1
+#define PCI_DEVICE_ID_ZMID          0xf0e5
+#define PCI_DEVICE_ID_NEPTUNE       0xf0f5
+#define PCI_DEVICE_ID_NEPTUNE_SCSP  0xf0f6
+#define PCI_DEVICE_ID_NEPTUNE_DCSP  0xf0f7
+#define PCI_DEVICE_ID_SUPERFLY      0xf700
+#define PCI_DEVICE_ID_DRAGONFLY     0xf800
 #define PCI_DEVICE_ID_CENTAUR       0xf900
 #define PCI_DEVICE_ID_PEGASUS       0xf980
 #define PCI_DEVICE_ID_THOR          0xfa00
 #define PCI_DEVICE_ID_VIPER         0xfb00
+#define PCI_DEVICE_ID_LP10000S      0xfc00
+#define PCI_DEVICE_ID_LP11000S      0xfc10
+#define PCI_DEVICE_ID_LPE11000S     0xfc20
 #define PCI_DEVICE_ID_HELIOS        0xfd00
-#define PCI_DEVICE_ID_BMID          0xf0d5
-#define PCI_DEVICE_ID_BSMB          0xf0d1
+#define PCI_DEVICE_ID_HELIOS_SCSP   0xfd11
+#define PCI_DEVICE_ID_HELIOS_DCSP   0xfd12
 #define PCI_DEVICE_ID_ZEPHYR        0xfe00
-#define PCI_DEVICE_ID_ZMID          0xf0e5
-#define PCI_DEVICE_ID_ZSMB          0xf0e1
-#define PCI_DEVICE_ID_LP101        0xf0a1
-#define PCI_DEVICE_ID_LP10000S     0xfc00
+#define PCI_DEVICE_ID_ZEPHYR_SCSP   0xfe11
+#define PCI_DEVICE_ID_ZEPHYR_DCSP   0xfe12
+
+#define PCI_SUBSYSTEM_ID_LP11000S      0xfc11
+#define PCI_SUBSYSTEM_ID_LP11002S      0xfc12
+#define PCI_SUBSYSTEM_ID_LPE11000S     0xfc21
+#define PCI_SUBSYSTEM_ID_LPE11002S     0xfc22
+#define PCI_SUBSYSTEM_ID_LPE11010S     0xfc2A
 
 #define JEDEC_ID_ADDRESS            0x0080001c
 #define FIREFLY_JEDEC_ID            0x1ACC
index 07498118359de9f7a02beadc177af154ce4acc07..b7a603a45328f2dd95753f7384f56ef2e1ec7c02 100644 (file)
@@ -126,34 +126,26 @@ lpfc_config_port_prep(struct lpfc_hba * phba)
                return -ERESTART;
        }
 
-       /* The HBA's current state is provided by the ProgType and rr fields.
-        * Read and check the value of these fields before continuing to config
-        * this port.
+       /*
+        * The value of rr must be 1 since the driver set the cv field to 1.
+        * This setting requires the FW to set all revision fields.
         */
-       if (mb->un.varRdRev.rr == 0 || mb->un.varRdRev.un.b.ProgType != 2) {
-               /* Old firmware */
+       if (mb->un.varRdRev.rr == 0) {
                vp->rev.rBit = 0;
-               lpfc_printf_log(phba,
-                               KERN_ERR,
-                               LOG_INIT,
-                               "%d:0440 Adapter failed to init, mbxCmd x%x "
-                               "READ_REV detected outdated firmware"
-                               "Data: x%x\n",
-                               phba->brd_no,
-                               mb->mbxCommand, 0);
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+                               "%d:0440 Adapter failed to init, READ_REV has "
+                               "missing revision information.\n",
+                               phba->brd_no);
                mempool_free(pmb, phba->mbox_mem_pool);
                return -ERESTART;
-       } else {
-               vp->rev.rBit = 1;
-               vp->rev.sli1FwRev = mb->un.varRdRev.sli1FwRev;
-               memcpy(vp->rev.sli1FwName,
-                       (char*)mb->un.varRdRev.sli1FwName, 16);
-               vp->rev.sli2FwRev = mb->un.varRdRev.sli2FwRev;
-               memcpy(vp->rev.sli2FwName,
-                                       (char *)mb->un.varRdRev.sli2FwName, 16);
        }
 
        /* Save information as VPD data */
+       vp->rev.rBit = 1;
+       vp->rev.sli1FwRev = mb->un.varRdRev.sli1FwRev;
+       memcpy(vp->rev.sli1FwName, (char*) mb->un.varRdRev.sli1FwName, 16);
+       vp->rev.sli2FwRev = mb->un.varRdRev.sli2FwRev;
+       memcpy(vp->rev.sli2FwName, (char *) mb->un.varRdRev.sli2FwName, 16);
        vp->rev.biuRev = mb->un.varRdRev.biuRev;
        vp->rev.smRev = mb->un.varRdRev.smRev;
        vp->rev.smFwRev = mb->un.varRdRev.un.smFwRev;
@@ -378,6 +370,10 @@ lpfc_config_port_post(struct lpfc_hba * phba)
        if (psli->num_rings > 3)
                status |= HC_R3INT_ENA;
 
+       if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) &&
+           (phba->cfg_poll & DISABLE_FCP_RING_INT))
+               status &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
+
        writel(status, phba->HCregaddr);
        readl(phba->HCregaddr); /* flush */
        spin_unlock_irq(phba->host->host_lock);
@@ -571,6 +567,8 @@ lpfc_handle_latt(struct lpfc_hba * phba)
 
        rc = -EIO;
 
+       /* Cleanup any outstanding ELS commands */
+       lpfc_els_flush_cmd(phba);
 
        psli->slistat.link_event++;
        lpfc_read_la(phba, pmb, mp);
@@ -765,96 +763,139 @@ static void
 lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp)
 {
        lpfc_vpd_t *vp;
-       uint32_t id;
-       uint8_t hdrtype;
-       char str[16];
+       uint16_t dev_id = phba->pcidev->device;
+       uint16_t dev_subid = phba->pcidev->subsystem_device;
+       uint8_t hdrtype = phba->pcidev->hdr_type;
+       char *model_str = "";
 
        vp = &phba->vpd;
-       pci_read_config_dword(phba->pcidev, PCI_VENDOR_ID, &id);
-       pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype);
 
-       switch ((id >> 16) & 0xffff) {
+       switch (dev_id) {
        case PCI_DEVICE_ID_FIREFLY:
-               strcpy(str, "LP6000 1");
+               model_str = "LP6000 1Gb PCI";
                break;
        case PCI_DEVICE_ID_SUPERFLY:
                if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3)
-                       strcpy(str, "LP7000 1");
+                       model_str = "LP7000 1Gb PCI";
                else
-                       strcpy(str, "LP7000E 1");
+                       model_str = "LP7000E 1Gb PCI";
                break;
        case PCI_DEVICE_ID_DRAGONFLY:
-               strcpy(str, "LP8000 1");
+               model_str = "LP8000 1Gb PCI";
                break;
        case PCI_DEVICE_ID_CENTAUR:
                if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID)
-                       strcpy(str, "LP9002 2");
+                       model_str = "LP9002 2Gb PCI";
                else
-                       strcpy(str, "LP9000 1");
+                       model_str = "LP9000 1Gb PCI";
                break;
        case PCI_DEVICE_ID_RFLY:
-               strcpy(str, "LP952 2");
+               model_str = "LP952 2Gb PCI";
                break;
        case PCI_DEVICE_ID_PEGASUS:
-               strcpy(str, "LP9802 2");
+               model_str = "LP9802 2Gb PCI-X";
                break;
        case PCI_DEVICE_ID_THOR:
                if (hdrtype == 0x80)
-                       strcpy(str, "LP10000DC 2");
+                       model_str = "LP10000DC 2Gb 2-port PCI-X";
                else
-                       strcpy(str, "LP10000 2");
+                       model_str = "LP10000 2Gb PCI-X";
                break;
        case PCI_DEVICE_ID_VIPER:
-               strcpy(str, "LPX1000 10");
+               model_str = "LPX1000 10Gb PCI-X";
                break;
        case PCI_DEVICE_ID_PFLY:
-               strcpy(str, "LP982 2");
+               model_str = "LP982 2Gb PCI-X";
                break;
        case PCI_DEVICE_ID_TFLY:
                if (hdrtype == 0x80)
-                       strcpy(str, "LP1050DC 2");
+                       model_str = "LP1050DC 2Gb 2-port PCI-X";
                else
-                       strcpy(str, "LP1050 2");
+                       model_str = "LP1050 2Gb PCI-X";
                break;
        case PCI_DEVICE_ID_HELIOS:
                if (hdrtype == 0x80)
-                       strcpy(str, "LP11002 4");
+                       model_str = "LP11002 4Gb 2-port PCI-X2";
+               else
+                       model_str = "LP11000 4Gb PCI-X2";
+               break;
+       case PCI_DEVICE_ID_HELIOS_SCSP:
+               model_str = "LP11000-SP 4Gb PCI-X2";
+               break;
+       case PCI_DEVICE_ID_HELIOS_DCSP:
+               model_str = "LP11002-SP 4Gb 2-port PCI-X2";
+               break;
+       case PCI_DEVICE_ID_NEPTUNE:
+               if (hdrtype == 0x80)
+                       model_str = "LPe1002 4Gb 2-port";
                else
-                       strcpy(str, "LP11000 4");
+                       model_str = "LPe1000 4Gb PCIe";
+               break;
+       case PCI_DEVICE_ID_NEPTUNE_SCSP:
+               model_str = "LPe1000-SP 4Gb PCIe";
+               break;
+       case PCI_DEVICE_ID_NEPTUNE_DCSP:
+               model_str = "LPe1002-SP 4Gb 2-port PCIe";
                break;
        case PCI_DEVICE_ID_BMID:
-               strcpy(str, "LP1150 4");
+               model_str = "LP1150 4Gb PCI-X2";
                break;
        case PCI_DEVICE_ID_BSMB:
-               strcpy(str, "LP111 4");
+               model_str = "LP111 4Gb PCI-X2";
                break;
        case PCI_DEVICE_ID_ZEPHYR:
                if (hdrtype == 0x80)
-                       strcpy(str, "LPe11002 4");
+                       model_str = "LPe11002 4Gb 2-port PCIe";
                else
-                       strcpy(str, "LPe11000 4");
+                       model_str = "LPe11000 4Gb PCIe";
+               break;
+       case PCI_DEVICE_ID_ZEPHYR_SCSP:
+               model_str = "LPe11000-SP 4Gb PCIe";
+               break;
+       case PCI_DEVICE_ID_ZEPHYR_DCSP:
+               model_str = "LPe11002-SP 4Gb 2-port PCIe";
                break;
        case PCI_DEVICE_ID_ZMID:
-               strcpy(str, "LPe1150 4");
+               model_str = "LPe1150 4Gb PCIe";
                break;
        case PCI_DEVICE_ID_ZSMB:
-               strcpy(str, "LPe111 4");
+               model_str = "LPe111 4Gb PCIe";
                break;
        case PCI_DEVICE_ID_LP101:
-               strcpy(str, "LP101 2");
+               model_str = "LP101 2Gb PCI-X";
                break;
        case PCI_DEVICE_ID_LP10000S:
-               strcpy(str, "LP10000-S 2");
+               model_str = "LP10000-S 2Gb PCI";
+               break;
+       case PCI_DEVICE_ID_LP11000S:
+       case PCI_DEVICE_ID_LPE11000S:
+               switch (dev_subid) {
+               case PCI_SUBSYSTEM_ID_LP11000S:
+                       model_str = "LP11002-S 4Gb PCI-X2";
+                       break;
+               case PCI_SUBSYSTEM_ID_LP11002S:
+                       model_str = "LP11000-S 4Gb 2-port PCI-X2";
+                       break;
+               case PCI_SUBSYSTEM_ID_LPE11000S:
+                       model_str = "LPe11002-S 4Gb PCIe";
+                       break;
+               case PCI_SUBSYSTEM_ID_LPE11002S:
+                       model_str = "LPe11002-S 4Gb 2-port PCIe";
+                       break;
+               case PCI_SUBSYSTEM_ID_LPE11010S:
+                       model_str = "LPe11010-S 4Gb 10-port PCIe";
+                       break;
+               default:
+                       break;
+               }
                break;
        default:
-               memset(str, 0, 16);
                break;
        }
        if (mdp)
-               sscanf(str, "%s", mdp);
+               sscanf(model_str, "%s", mdp);
        if (descp)
-               sprintf(descp, "Emulex LightPulse %s Gigabit PCI Fibre "
-                       "Channel Adapter", str);
+               sprintf(descp, "Emulex %s Fibre Channel Adapter", model_str);
 }
 
 /**************************************************/
@@ -1196,6 +1237,7 @@ lpfc_stop_timer(struct lpfc_hba * phba)
                }
        }
 
+       del_timer_sync(&phba->fcp_poll_timer);
        del_timer_sync(&phba->fc_estabtmo);
        del_timer_sync(&phba->fc_disctmo);
        del_timer_sync(&phba->fc_fdmitmo);
@@ -1351,7 +1393,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
                goto out_put_host;
 
        host->unique_id = phba->brd_no;
-
+       init_MUTEX(&phba->hba_can_block);
        INIT_LIST_HEAD(&phba->ctrspbuflist);
        INIT_LIST_HEAD(&phba->rnidrspbuflist);
        INIT_LIST_HEAD(&phba->freebufList);
@@ -1375,6 +1417,10 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
        psli->mbox_tmo.function = lpfc_mbox_timeout;
        psli->mbox_tmo.data = (unsigned long)phba;
 
+       init_timer(&phba->fcp_poll_timer);
+       phba->fcp_poll_timer.function = lpfc_poll_timeout;
+       phba->fcp_poll_timer.data = (unsigned long)phba;
+
        /*
         * Get all the module params for configuring this host and then
         * establish the host parameters.
@@ -1489,6 +1535,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
        host->max_cmd_len = 16;
 
        /* Initialize the list of scsi buffers used by driver for scsi IO. */
+       spin_lock_init(&phba->scsi_buf_list_lock);
        INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list);
 
        host->transportt = lpfc_transport_template;
@@ -1520,6 +1567,12 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
        if (error)
                goto out_free_irq;
 
+       if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
+               spin_lock_irq(phba->host->host_lock);
+               lpfc_poll_start_timer(phba);
+               spin_unlock_irq(phba->host->host_lock);
+       }
+
        /*
         * set fixed host attributes
         * Must done after lpfc_sli_hba_setup()
@@ -1679,14 +1732,28 @@ static struct pci_device_id lpfc_id_table[] = {
                PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_PFLY,
                PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_NEPTUNE,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_NEPTUNE_SCSP,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_NEPTUNE_DCSP,
+               PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HELIOS,
                PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HELIOS_SCSP,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HELIOS_DCSP,
+               PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_BMID,
                PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_BSMB,
                PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR,
                PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR_SCSP,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR_DCSP,
+               PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZMID,
                PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZSMB,
@@ -1697,6 +1764,10 @@ static struct pci_device_id lpfc_id_table[] = {
                PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_LP10000S,
                PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_LP11000S,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_LPE11000S,
+               PCI_ANY_ID, PCI_ANY_ID, },
        { 0 }
 };
 
index 507a6af56f42d51ad52687a2f15889aca267729a..fbead786031f9ec948df36249d557d6e646a2d17 100644 (file)
@@ -55,55 +55,76 @@ lpfc_check_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
        return (1);
 }
 
-
 int
 lpfc_check_sparm(struct lpfc_hba * phba,
                 struct lpfc_nodelist * ndlp, struct serv_parm * sp,
                 uint32_t class)
 {
        volatile struct serv_parm *hsp = &phba->fc_sparam;
-       /* First check for supported version */
-
-       /* Next check for class validity */
+       uint16_t hsp_value, ssp_value = 0;
+
+       /*
+        * The receive data field size and buffer-to-buffer receive data field
+        * size entries are 16 bits but are represented as two 8-bit fields in
+        * the driver data structure to account for rsvd bits and other control
+        * bits.  Reconstruct and compare the fields as a 16-bit values before
+        * correcting the byte values.
+        */
        if (sp->cls1.classValid) {
-
-               if (sp->cls1.rcvDataSizeMsb > hsp->cls1.rcvDataSizeMsb)
-                       sp->cls1.rcvDataSizeMsb = hsp->cls1.rcvDataSizeMsb;
-               if (sp->cls1.rcvDataSizeLsb > hsp->cls1.rcvDataSizeLsb)
+               hsp_value = (hsp->cls1.rcvDataSizeMsb << 8) |
+                               hsp->cls1.rcvDataSizeLsb;
+               ssp_value = (sp->cls1.rcvDataSizeMsb << 8) |
+                               sp->cls1.rcvDataSizeLsb;
+               if (ssp_value > hsp_value) {
                        sp->cls1.rcvDataSizeLsb = hsp->cls1.rcvDataSizeLsb;
+                       sp->cls1.rcvDataSizeMsb = hsp->cls1.rcvDataSizeMsb;
+               }
        } else if (class == CLASS1) {
-               return (0);
+               return 0;
        }
 
        if (sp->cls2.classValid) {
-
-               if (sp->cls2.rcvDataSizeMsb > hsp->cls2.rcvDataSizeMsb)
-                       sp->cls2.rcvDataSizeMsb = hsp->cls2.rcvDataSizeMsb;
-               if (sp->cls2.rcvDataSizeLsb > hsp->cls2.rcvDataSizeLsb)
+               hsp_value = (hsp->cls2.rcvDataSizeMsb << 8) |
+                               hsp->cls2.rcvDataSizeLsb;
+               ssp_value = (sp->cls2.rcvDataSizeMsb << 8) |
+                               sp->cls2.rcvDataSizeLsb;
+               if (ssp_value > hsp_value) {
                        sp->cls2.rcvDataSizeLsb = hsp->cls2.rcvDataSizeLsb;
+                       sp->cls2.rcvDataSizeMsb = hsp->cls2.rcvDataSizeMsb;
+               }
        } else if (class == CLASS2) {
-               return (0);
+               return 0;
        }
 
        if (sp->cls3.classValid) {
-
-               if (sp->cls3.rcvDataSizeMsb > hsp->cls3.rcvDataSizeMsb)
-                       sp->cls3.rcvDataSizeMsb = hsp->cls3.rcvDataSizeMsb;
-               if (sp->cls3.rcvDataSizeLsb > hsp->cls3.rcvDataSizeLsb)
+               hsp_value = (hsp->cls3.rcvDataSizeMsb << 8) |
+                               hsp->cls3.rcvDataSizeLsb;
+               ssp_value = (sp->cls3.rcvDataSizeMsb << 8) |
+                               sp->cls3.rcvDataSizeLsb;
+               if (ssp_value > hsp_value) {
                        sp->cls3.rcvDataSizeLsb = hsp->cls3.rcvDataSizeLsb;
+                       sp->cls3.rcvDataSizeMsb = hsp->cls3.rcvDataSizeMsb;
+               }
        } else if (class == CLASS3) {
-               return (0);
+               return 0;
        }
 
-       if (sp->cmn.bbRcvSizeMsb > hsp->cmn.bbRcvSizeMsb)
-               sp->cmn.bbRcvSizeMsb = hsp->cmn.bbRcvSizeMsb;
-       if (sp->cmn.bbRcvSizeLsb > hsp->cmn.bbRcvSizeLsb)
+       /*
+        * Preserve the upper four bits of the MSB from the PLOGI response.
+        * These bits contain the Buffer-to-Buffer State Change Number
+        * from the target and need to be passed to the FW.
+        */
+       hsp_value = (hsp->cmn.bbRcvSizeMsb << 8) | hsp->cmn.bbRcvSizeLsb;
+       ssp_value = (sp->cmn.bbRcvSizeMsb << 8) | sp->cmn.bbRcvSizeLsb;
+       if (ssp_value > hsp_value) {
                sp->cmn.bbRcvSizeLsb = hsp->cmn.bbRcvSizeLsb;
+               sp->cmn.bbRcvSizeMsb = (sp->cmn.bbRcvSizeMsb & 0xF0) |
+                                      (hsp->cmn.bbRcvSizeMsb & 0x0F);
+       }
 
-       /* If check is good, copy wwpn wwnn into ndlp */
        memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof (struct lpfc_name));
        memcpy(&ndlp->nlp_portname, &sp->portName, sizeof (struct lpfc_name));
-       return (1);
+       return 1;
 }
 
 static void *
index c63275e66e2e6644c1e187904b4838476eda8e37..9ee8218404c058bc44e40157c891ad6464c2a605 100644 (file)
 #define LPFC_ABORT_WAIT  2
 
 
+static inline void
+lpfc_block_requests(struct lpfc_hba * phba)
+{
+       down(&phba->hba_can_block);
+       scsi_block_requests(phba->host);
+}
+
+static inline void
+lpfc_unblock_requests(struct lpfc_hba * phba)
+{
+       scsi_unblock_requests(phba->host);
+       up(&phba->hba_can_block);
+}
+
 /*
  * This routine allocates a scsi buffer, which contains all the necessary
  * information needed to initiate a SCSI I/O.  The non-DMAable buffer region
@@ -137,18 +151,22 @@ lpfc_new_scsi_buf(struct lpfc_hba * phba)
 }
 
 struct  lpfc_scsi_buf*
-lpfc_sli_get_scsi_buf(struct lpfc_hba * phba)
+lpfc_get_scsi_buf(struct lpfc_hba * phba)
 {
        struct  lpfc_scsi_buf * lpfc_cmd = NULL;
        struct list_head *scsi_buf_list = &phba->lpfc_scsi_buf_list;
+       unsigned long iflag = 0;
 
+       spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag);
        list_remove_head(scsi_buf_list, lpfc_cmd, struct lpfc_scsi_buf, list);
+       spin_unlock_irqrestore(&phba->scsi_buf_list_lock, iflag);
        return  lpfc_cmd;
 }
 
 static void
 lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb)
 {
+       unsigned long iflag = 0;
        /*
         * There are only two special cases to consider.  (1) the scsi command
         * requested scatter-gather usage or (2) the scsi command allocated
@@ -166,8 +184,10 @@ lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb)
                 }
        }
 
+       spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag);
        psb->pCmd = NULL;
        list_add_tail(&psb->list, &phba->lpfc_scsi_buf_list);
+       spin_unlock_irqrestore(&phba->scsi_buf_list_lock, iflag);
 }
 
 static int
@@ -389,7 +409,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
        struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
        struct lpfc_nodelist *pnode = rdata->pnode;
        struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
-       unsigned long iflag;
+       int result;
+       struct scsi_device *sdev, *tmp_sdev;
+       int depth = 0;
 
        lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4];
        lpfc_cmd->status = pIocbOut->iocb.ulpStatus;
@@ -441,11 +463,64 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
                                *lp, *(lp + 3), cmd->retries, cmd->resid);
        }
 
+       result = cmd->result;
+       sdev = cmd->device;
        cmd->scsi_done(cmd);
 
-       spin_lock_irqsave(phba->host->host_lock, iflag);
+       if (!result &&
+          ((jiffies - pnode->last_ramp_up_time) >
+               LPFC_Q_RAMP_UP_INTERVAL * HZ) &&
+          ((jiffies - pnode->last_q_full_time) >
+               LPFC_Q_RAMP_UP_INTERVAL * HZ) &&
+          (phba->cfg_lun_queue_depth > sdev->queue_depth)) {
+               shost_for_each_device(tmp_sdev, sdev->host) {
+                       if (phba->cfg_lun_queue_depth > tmp_sdev->queue_depth) {
+                               if (tmp_sdev->id != sdev->id)
+                                       continue;
+                               if (tmp_sdev->ordered_tags)
+                                       scsi_adjust_queue_depth(tmp_sdev,
+                                               MSG_ORDERED_TAG,
+                                               tmp_sdev->queue_depth+1);
+                               else
+                                       scsi_adjust_queue_depth(tmp_sdev,
+                                               MSG_SIMPLE_TAG,
+                                               tmp_sdev->queue_depth+1);
+
+                               pnode->last_ramp_up_time = jiffies;
+                       }
+               }
+       }
+
+       /*
+        * Check for queue full.  If the lun is reporting queue full, then
+        * back off the lun queue depth to prevent target overloads.
+        */
+       if (result == SAM_STAT_TASK_SET_FULL) {
+               pnode->last_q_full_time = jiffies;
+
+               shost_for_each_device(tmp_sdev, sdev->host) {
+                       if (tmp_sdev->id != sdev->id)
+                               continue;
+                       depth = scsi_track_queue_full(tmp_sdev,
+                                       tmp_sdev->queue_depth - 1);
+               }
+               /*
+                * The queue depth cannot be lowered any more.
+                * Modify the returned error code to store
+                * the final depth value set by
+                * scsi_track_queue_full.
+                */
+               if (depth == -1)
+                       depth = sdev->host->cmd_per_lun;
+
+               if (depth) {
+                       lpfc_printf_log(phba, KERN_WARNING, LOG_FCP,
+                               "%d:0711 detected queue full - lun queue depth "
+                               " adjusted to %d.\n", phba->brd_no, depth);
+               }
+       }
+
        lpfc_release_scsi_buf(phba, lpfc_cmd);
-       spin_unlock_irqrestore(phba->host->host_lock, iflag);
 }
 
 static void
@@ -693,6 +768,37 @@ lpfc_info(struct Scsi_Host *host)
        return lpfcinfobuf;
 }
 
+static __inline__ void lpfc_poll_rearm_timer(struct lpfc_hba * phba)
+{
+       unsigned long  poll_tmo_expires =
+               (jiffies + msecs_to_jiffies(phba->cfg_poll_tmo));
+
+       if (phba->sli.ring[LPFC_FCP_RING].txcmplq_cnt)
+               mod_timer(&phba->fcp_poll_timer,
+                         poll_tmo_expires);
+}
+
+void lpfc_poll_start_timer(struct lpfc_hba * phba)
+{
+       lpfc_poll_rearm_timer(phba);
+}
+
+void lpfc_poll_timeout(unsigned long ptr)
+{
+       struct lpfc_hba *phba = (struct lpfc_hba *)ptr;
+       unsigned long iflag;
+
+       spin_lock_irqsave(phba->host->host_lock, iflag);
+
+       if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
+               lpfc_sli_poll_fcp_ring (phba);
+               if (phba->cfg_poll & DISABLE_FCP_RING_INT)
+                       lpfc_poll_rearm_timer(phba);
+       }
+
+       spin_unlock_irqrestore(phba->host->host_lock, iflag);
+}
+
 static int
 lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
 {
@@ -719,10 +825,11 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
                cmnd->result = ScsiResult(DID_BUS_BUSY, 0);
                goto out_fail_command;
        }
-       lpfc_cmd = lpfc_sli_get_scsi_buf (phba);
+       lpfc_cmd = lpfc_get_scsi_buf (phba);
        if (lpfc_cmd == NULL) {
-               printk(KERN_WARNING "%s: No buffer available - list empty, "
-                      "total count %d\n", __FUNCTION__, phba->total_scsi_bufs);
+               lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
+                               "%d:0707 driver's buffer pool is empty, "
+                               "IO busied\n", phba->brd_no);
                goto out_host_busy;
        }
 
@@ -746,11 +853,17 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
                                &lpfc_cmd->cur_iocbq, SLI_IOCB_RET_IOCB);
        if (err)
                goto out_host_busy_free_buf;
+
+       if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
+               lpfc_sli_poll_fcp_ring(phba);
+               if (phba->cfg_poll & DISABLE_FCP_RING_INT)
+                       lpfc_poll_rearm_timer(phba);
+       }
+
        return 0;
 
  out_host_busy_free_buf:
        lpfc_release_scsi_buf(phba, lpfc_cmd);
-       cmnd->host_scribble = NULL;
  out_host_busy:
        return SCSI_MLQUEUE_HOST_BUSY;
 
@@ -759,11 +872,12 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
        return 0;
 }
 
+
 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];
+       struct Scsi_Host *shost = cmnd->device->host;
+       struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];
        struct lpfc_sli_ring *pring = &phba->sli.ring[phba->sli.fcp_ring];
        struct lpfc_iocbq *iocb;
        struct lpfc_iocbq *abtsiocb;
@@ -772,6 +886,8 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd)
        unsigned int loop_count = 0;
        int ret = SUCCESS;
 
+       lpfc_block_requests(phba);
+       spin_lock_irq(shost->host_lock);
 
        lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble;
        BUG_ON(!lpfc_cmd);
@@ -821,9 +937,15 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd)
                goto out;
        }
 
+       if (phba->cfg_poll & DISABLE_FCP_RING_INT)
+               lpfc_sli_poll_fcp_ring (phba);
+
        /* Wait for abort to complete */
        while (lpfc_cmd->pCmd == cmnd)
        {
+               if (phba->cfg_poll & DISABLE_FCP_RING_INT)
+                       lpfc_sli_poll_fcp_ring (phba);
+
                spin_unlock_irq(phba->host->host_lock);
                        schedule_timeout_uninterruptible(LPFC_ABORT_WAIT*HZ);
                spin_lock_irq(phba->host->host_lock);
@@ -844,26 +966,19 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd)
 
  out:
        lpfc_printf_log(phba, KERN_WARNING, LOG_FCP,
-                       "%d:0749 SCSI layer issued abort device: ret %#x, "
-                       "ID %d, LUN %d, snum %#lx\n",
+                       "%d:0749 SCSI Layer I/O Abort Request "
+                       "Status x%x ID %d LUN %d snum %#lx\n",
                        phba->brd_no, ret, cmnd->device->id,
                        cmnd->device->lun, cmnd->serial_number);
 
-       return ret;
-}
+       spin_unlock_irq(shost->host_lock);
+       lpfc_unblock_requests(phba);
 
-static int
-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;
+       return ret;
 }
 
 static int
-__lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
+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];
@@ -871,9 +986,12 @@ __lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
        struct lpfc_iocbq *iocbq, *iocbqrsp;
        struct lpfc_rport_data *rdata = cmnd->device->hostdata;
        struct lpfc_nodelist *pnode = rdata->pnode;
+       uint32_t cmd_result = 0, cmd_status = 0;
        int ret = FAILED;
        int cnt, loopcnt;
 
+       lpfc_block_requests(phba);
+       spin_lock_irq(shost->host_lock);
        /*
         * If target is not in a MAPPED state, delay the reset until
         * target is rediscovered or nodev timeout expires.
@@ -891,7 +1009,7 @@ __lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
                        break;
        }
 
-       lpfc_cmd = lpfc_sli_get_scsi_buf (phba);
+       lpfc_cmd = lpfc_get_scsi_buf (phba);
        if (lpfc_cmd == NULL)
                goto out;
 
@@ -916,26 +1034,28 @@ __lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
        if (ret == IOCB_SUCCESS)
                ret = SUCCESS;
 
-       lpfc_cmd->result = iocbqrsp->iocb.un.ulpWord[4];
-       lpfc_cmd->status = iocbqrsp->iocb.ulpStatus;
-       if (lpfc_cmd->status == IOSTAT_LOCAL_REJECT)
-               if (lpfc_cmd->result & IOERR_DRVR_MASK)
-                       lpfc_cmd->status = IOSTAT_DRIVER_REJECT;
+
+       cmd_result = iocbqrsp->iocb.un.ulpWord[4];
+       cmd_status = iocbqrsp->iocb.ulpStatus;
+
+       lpfc_sli_release_iocbq(phba, iocbqrsp);
+       lpfc_release_scsi_buf(phba, lpfc_cmd);
 
        /*
-        * All outstanding txcmplq I/Os should have been aborted by the target.
+        * All outstanding txcmplq I/Os should have been aborted by the device.
         * Unfortunately, some targets do not abide by this forcing the driver
         * to double check.
         */
-       lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring],
-                           cmnd->device->id, cmnd->device->lun, 0,
-                           LPFC_CTX_LUN);
-
+       cnt = lpfc_sli_sum_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring],
+                               cmnd->device->id, cmnd->device->lun,
+                               LPFC_CTX_LUN);
+       if (cnt)
+               lpfc_sli_abort_iocb(phba,
+                                   &phba->sli.ring[phba->sli.fcp_ring],
+                                   cmnd->device->id, cmnd->device->lun,
+                                   0, LPFC_CTX_LUN);
        loopcnt = 0;
-       while((cnt = lpfc_sli_sum_iocb(phba,
-                                      &phba->sli.ring[phba->sli.fcp_ring],
-                                      cmnd->device->id, cmnd->device->lun,
-                                      LPFC_CTX_LUN))) {
+       while(cnt) {
                spin_unlock_irq(phba->host->host_lock);
                schedule_timeout_uninterruptible(LPFC_RESET_WAIT*HZ);
                spin_lock_irq(phba->host->host_lock);
@@ -943,6 +1063,11 @@ __lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
                if (++loopcnt
                    > (2 * phba->cfg_nodev_tmo)/LPFC_RESET_WAIT)
                        break;
+
+               cnt = lpfc_sli_sum_iocb(phba,
+                                       &phba->sli.ring[phba->sli.fcp_ring],
+                                       cmnd->device->id, cmnd->device->lun,
+                                       LPFC_CTX_LUN);
        }
 
        if (cnt) {
@@ -952,35 +1077,21 @@ __lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
                ret = FAILED;
        }
 
-       lpfc_sli_release_iocbq(phba, iocbqrsp);
-
 out_free_scsi_buf:
        lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
                        "%d:0713 SCSI layer issued LUN reset (%d, %d) "
                        "Data: x%x x%x x%x\n",
-                       phba->brd_no, lpfc_cmd->pCmd->device->id,
-                       lpfc_cmd->pCmd->device->lun, ret, lpfc_cmd->status,
-                       lpfc_cmd->result);
-       lpfc_release_scsi_buf(phba, lpfc_cmd);
+                       phba->brd_no, cmnd->device->id,cmnd->device->lun,
+                       ret, cmd_status, cmd_result);
+
 out:
+       spin_unlock_irq(shost->host_lock);
+       lpfc_unblock_requests(phba);
        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];
@@ -991,7 +1102,10 @@ __lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
        unsigned int midlayer_id = 0;
        struct lpfc_scsi_buf * lpfc_cmd;
 
-       lpfc_cmd = lpfc_sli_get_scsi_buf (phba);
+       lpfc_block_requests(phba);
+       spin_lock_irq(shost->host_lock);
+
+       lpfc_cmd = lpfc_get_scsi_buf(phba);
        if (lpfc_cmd == NULL)
                goto out;
 
@@ -1022,18 +1136,31 @@ __lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
                lpfc_cmd->pCmd->device->hostdata = ndlp->rport->dd_data;
                ret = lpfc_scsi_tgt_reset(lpfc_cmd, phba);
                if (ret != SUCCESS) {
-                       lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
+                       lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
                                "%d:0713 Bus Reset on target %d failed\n",
                                phba->brd_no, i);
                        err_count++;
                }
        }
 
+       if (err_count == 0)
+               ret = SUCCESS;
+
+       lpfc_release_scsi_buf(phba, lpfc_cmd);
+
+       /*
+        * All outstanding txcmplq I/Os should have been aborted by
+        * the targets.  Unfortunately, some targets do not abide by
+        * this forcing the driver to double check.
+        */
        cmnd->device->id = midlayer_id;
+       cnt = lpfc_sli_sum_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring],
+                               0, 0, LPFC_CTX_HOST);
+       if (cnt)
+               lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring],
+                                   0, 0, 0, LPFC_CTX_HOST);
        loopcnt = 0;
-       while((cnt = lpfc_sli_sum_iocb(phba,
-                               &phba->sli.ring[phba->sli.fcp_ring],
-                               0, 0, LPFC_CTX_HOST))) {
+       while(cnt) {
                spin_unlock_irq(phba->host->host_lock);
                schedule_timeout_uninterruptible(LPFC_RESET_WAIT*HZ);
                spin_lock_irq(phba->host->host_lock);
@@ -1041,44 +1168,30 @@ __lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
                if (++loopcnt
                    > (2 * phba->cfg_nodev_tmo)/LPFC_RESET_WAIT)
                        break;
+
+               cnt = lpfc_sli_sum_iocb(phba,
+                                       &phba->sli.ring[phba->sli.fcp_ring],
+                                       0, 0, LPFC_CTX_HOST);
        }
 
        if (cnt) {
-               /* flush all outstanding commands on the host */
-               i = lpfc_sli_abort_iocb(phba,
-                               &phba->sli.ring[phba->sli.fcp_ring], 0, 0, 0,
-                               LPFC_CTX_HOST);
-
-               lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
+               lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
                   "%d:0715 Bus Reset I/O flush failure: cnt x%x left x%x\n",
                   phba->brd_no, cnt, i);
-       }
-
-       if (cnt == 0)
-               ret = SUCCESS;
-       else
                ret = FAILED;
+       }
 
-       lpfc_release_scsi_buf(phba, lpfc_cmd);
        lpfc_printf_log(phba,
                        KERN_ERR,
                        LOG_FCP,
                        "%d:0714 SCSI layer issued Bus Reset Data: x%x\n",
                        phba->brd_no, ret);
 out:
+       spin_unlock_irq(shost->host_lock);
+       lpfc_unblock_requests(phba);
        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)
 {
@@ -1127,10 +1240,10 @@ lpfc_slave_alloc(struct scsi_device *sdev)
                        break;
                }
 
-               spin_lock_irqsave(phba->host->host_lock, flags);
+               spin_lock_irqsave(&phba->scsi_buf_list_lock, flags);
                phba->total_scsi_bufs++;
                list_add_tail(&scsi_buf->list, &phba->lpfc_scsi_buf_list);
-               spin_unlock_irqrestore(phba->host->host_lock, flags);
+               spin_unlock_irqrestore(&phba->scsi_buf_list_lock, flags);
        }
        return 0;
 }
@@ -1154,6 +1267,12 @@ lpfc_slave_configure(struct scsi_device *sdev)
         */
        rport->dev_loss_tmo = phba->cfg_nodev_tmo + 5;
 
+       if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
+               lpfc_sli_poll_fcp_ring(phba);
+               if (phba->cfg_poll & DISABLE_FCP_RING_INT)
+                       lpfc_poll_rearm_timer(phba);
+       }
+
        return 0;
 }
 
index e2c08c5d83fb3d75b605d2596152951baa6114e0..7b785ade8b072ed414a15fb7112e012b4edc73d5 100644 (file)
@@ -886,6 +886,182 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring,
        return rc;
 }
 
+static void lpfc_sli_rsp_pointers_error(struct lpfc_hba * phba,
+                                       struct lpfc_sli_ring * pring)
+{
+       struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno];
+       /*
+        * Ring <ringno> handler: portRspPut <portRspPut> is bigger then
+        * rsp ring <portRspMax>
+        */
+       lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
+                       "%d:0312 Ring %d handler: portRspPut %d "
+                       "is bigger then rsp ring %d\n",
+                       phba->brd_no, pring->ringno,
+                       le32_to_cpu(pgp->rspPutInx),
+                       pring->numRiocb);
+
+       phba->hba_state = LPFC_HBA_ERROR;
+
+       /*
+        * All error attention handlers are posted to
+        * worker thread
+        */
+       phba->work_ha |= HA_ERATT;
+       phba->work_hs = HS_FFER3;
+       if (phba->work_wait)
+               wake_up(phba->work_wait);
+
+       return;
+}
+
+void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba)
+{
+       struct lpfc_sli      * psli   = &phba->sli;
+       struct lpfc_sli_ring * pring = &psli->ring[LPFC_FCP_RING];
+       IOCB_t *irsp = NULL;
+       IOCB_t *entry = NULL;
+       struct lpfc_iocbq *cmdiocbq = NULL;
+       struct lpfc_iocbq rspiocbq;
+       struct lpfc_pgp *pgp;
+       uint32_t status;
+       uint32_t portRspPut, portRspMax;
+       int type;
+       uint32_t rsp_cmpl = 0;
+       void __iomem *to_slim;
+       uint32_t ha_copy;
+
+       pring->stats.iocb_event++;
+
+       /* The driver assumes SLI-2 mode */
+       pgp =  &phba->slim2p->mbx.us.s2.port[pring->ringno];
+
+       /*
+        * The next available response entry should never exceed the maximum
+        * entries.  If it does, treat it as an adapter hardware error.
+        */
+       portRspMax = pring->numRiocb;
+       portRspPut = le32_to_cpu(pgp->rspPutInx);
+       if (unlikely(portRspPut >= portRspMax)) {
+               lpfc_sli_rsp_pointers_error(phba, pring);
+               return;
+       }
+
+       rmb();
+       while (pring->rspidx != portRspPut) {
+
+               entry = IOCB_ENTRY(pring->rspringaddr, pring->rspidx);
+
+               if (++pring->rspidx >= portRspMax)
+                       pring->rspidx = 0;
+
+               lpfc_sli_pcimem_bcopy((uint32_t *) entry,
+                                     (uint32_t *) &rspiocbq.iocb,
+                                     sizeof (IOCB_t));
+               irsp = &rspiocbq.iocb;
+               type = lpfc_sli_iocb_cmd_type(irsp->ulpCommand & CMD_IOCB_MASK);
+               pring->stats.iocb_rsp++;
+               rsp_cmpl++;
+
+               if (unlikely(irsp->ulpStatus)) {
+                       /* Rsp ring <ringno> error: IOCB */
+                       lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
+                                       "%d:0326 Rsp Ring %d error: IOCB Data: "
+                                       "x%x x%x x%x x%x x%x x%x x%x x%x\n",
+                                       phba->brd_no, pring->ringno,
+                                       irsp->un.ulpWord[0],
+                                       irsp->un.ulpWord[1],
+                                       irsp->un.ulpWord[2],
+                                       irsp->un.ulpWord[3],
+                                       irsp->un.ulpWord[4],
+                                       irsp->un.ulpWord[5],
+                                       *(((uint32_t *) irsp) + 6),
+                                       *(((uint32_t *) irsp) + 7));
+               }
+
+               switch (type) {
+               case LPFC_ABORT_IOCB:
+               case LPFC_SOL_IOCB:
+                       /*
+                        * Idle exchange closed via ABTS from port.  No iocb
+                        * resources need to be recovered.
+                        */
+                       if (unlikely(irsp->ulpCommand == CMD_XRI_ABORTED_CX)) {
+                               printk(KERN_INFO "%s: IOCB cmd 0x%x processed."
+                                      " Skipping completion\n", __FUNCTION__,
+                                      irsp->ulpCommand);
+                               break;
+                       }
+
+                       cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring,
+                                                        &rspiocbq);
+                       if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) {
+                               (cmdiocbq->iocb_cmpl)(phba, cmdiocbq,
+                                                     &rspiocbq);
+                       }
+                       break;
+               default:
+                       if (irsp->ulpCommand == CMD_ADAPTER_MSG) {
+                               char adaptermsg[LPFC_MAX_ADPTMSG];
+                               memset(adaptermsg, 0, LPFC_MAX_ADPTMSG);
+                               memcpy(&adaptermsg[0], (uint8_t *) irsp,
+                                      MAX_MSG_DATA);
+                               dev_warn(&((phba->pcidev)->dev), "lpfc%d: %s",
+                                        phba->brd_no, adaptermsg);
+                       } else {
+                               /* Unknown IOCB command */
+                               lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
+                                               "%d:0321 Unknown IOCB command "
+                                               "Data: x%x, x%x x%x x%x x%x\n",
+                                               phba->brd_no, type,
+                                               irsp->ulpCommand,
+                                               irsp->ulpStatus,
+                                               irsp->ulpIoTag,
+                                               irsp->ulpContext);
+                       }
+                       break;
+               }
+
+               /*
+                * The response IOCB has been processed.  Update the ring
+                * pointer in SLIM.  If the port response put pointer has not
+                * been updated, sync the pgp->rspPutInx and fetch the new port
+                * response put pointer.
+                */
+               to_slim = phba->MBslimaddr +
+                       (SLIMOFF + (pring->ringno * 2) + 1) * 4;
+               writeb(pring->rspidx, to_slim);
+
+               if (pring->rspidx == portRspPut)
+                       portRspPut = le32_to_cpu(pgp->rspPutInx);
+       }
+
+       ha_copy = readl(phba->HAregaddr);
+       ha_copy >>= (LPFC_FCP_RING * 4);
+
+       if ((rsp_cmpl > 0) && (ha_copy & HA_R0RE_REQ)) {
+               pring->stats.iocb_rsp_full++;
+               status = ((CA_R0ATT | CA_R0RE_RSP) << (LPFC_FCP_RING * 4));
+               writel(status, phba->CAregaddr);
+               readl(phba->CAregaddr);
+       }
+       if ((ha_copy & HA_R0CE_RSP) &&
+           (pring->flag & LPFC_CALL_RING_AVAILABLE)) {
+               pring->flag &= ~LPFC_CALL_RING_AVAILABLE;
+               pring->stats.iocb_cmd_empty++;
+
+               /* Force update of the local copy of cmdGetInx */
+               pring->local_getidx = le32_to_cpu(pgp->cmdGetInx);
+               lpfc_sli_resume_iocb(phba, pring);
+
+               if ((pring->lpfc_sli_cmd_available))
+                       (pring->lpfc_sli_cmd_available) (phba, pring);
+
+       }
+
+       return;
+}
+
 /*
  * This routine presumes LPFC_FCP_RING handling and doesn't bother
  * to check it explicitly.
@@ -917,24 +1093,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba,
        portRspMax = pring->numRiocb;
        portRspPut = le32_to_cpu(pgp->rspPutInx);
        if (unlikely(portRspPut >= portRspMax)) {
-               /*
-                * Ring <ringno> handler: portRspPut <portRspPut> is bigger then
-                * rsp ring <portRspMax>
-                */
-               lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
-                               "%d:0312 Ring %d handler: portRspPut %d "
-                               "is bigger then rsp ring %d\n",
-                               phba->brd_no, pring->ringno, portRspPut,
-                               portRspMax);
-
-               phba->hba_state = LPFC_HBA_ERROR;
-
-               /* All error attention handlers are posted to worker thread */
-               phba->work_ha |= HA_ERATT;
-               phba->work_hs = HS_FFER3;
-               if (phba->work_wait)
-                       wake_up(phba->work_wait);
-
+               lpfc_sli_rsp_pointers_error(phba, pring);
                spin_unlock_irqrestore(phba->host->host_lock, iflag);
                return 1;
        }
@@ -947,6 +1106,10 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba,
                 * network byte order and pci byte orders are different.
                 */
                entry = IOCB_ENTRY(pring->rspringaddr, pring->rspidx);
+
+               if (++pring->rspidx >= portRspMax)
+                       pring->rspidx = 0;
+
                lpfc_sli_pcimem_bcopy((uint32_t *) entry,
                                      (uint32_t *) &rspiocbq.iocb,
                                      sizeof (IOCB_t));
@@ -1020,9 +1183,6 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba,
                 * been updated, sync the pgp->rspPutInx and fetch the new port
                 * response put pointer.
                 */
-               if (++pring->rspidx >= portRspMax)
-                       pring->rspidx = 0;
-
                to_slim = phba->MBslimaddr +
                        (SLIMOFF + (pring->ringno * 2) + 1) * 4;
                writel(pring->rspidx, to_slim);
@@ -2615,6 +2775,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba,
        DECLARE_WAIT_QUEUE_HEAD(done_q);
        long timeleft, timeout_req = 0;
        int retval = IOCB_SUCCESS;
+       uint32_t creg_val;
 
        /*
         * If the caller has provided a response iocbq buffer, then context2
@@ -2630,6 +2791,13 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba,
        piocb->context_un.wait_queue = &done_q;
        piocb->iocb_flag &= ~LPFC_IO_WAKE;
 
+       if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
+               creg_val = readl(phba->HCregaddr);
+               creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
+               writel(creg_val, phba->HCregaddr);
+               readl(phba->HCregaddr); /* flush */
+       }
+
        retval = lpfc_sli_issue_iocb(phba, pring, piocb, 0);
        if (retval == IOCB_SUCCESS) {
                timeout_req = timeout * HZ;
@@ -2663,6 +2831,13 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba,
                retval = IOCB_ERROR;
        }
 
+       if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
+               creg_val = readl(phba->HCregaddr);
+               creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
+               writel(creg_val, phba->HCregaddr);
+               readl(phba->HCregaddr); /* flush */
+       }
+
        if (prspiocbq)
                piocb->context2 = NULL;
 
index 4f0466fbd5f277045432f13af2657af224c227e5..fa681a934ffe112e1cf3b600aa506e68261b1959 100644 (file)
@@ -18,7 +18,7 @@
  * included with this package.                                     *
  *******************************************************************/
 
-#define LPFC_DRIVER_VERSION "8.1.0"
+#define LPFC_DRIVER_VERSION "8.1.1"
 
 #define LPFC_DRIVER_NAME "lpfc"
 
index dfea346b00a559975cc83853bafbf4f59dbcebd9..4a6feb1e5e3d1249748cff23b770eb86412bb156 100644 (file)
@@ -2,7 +2,7 @@
  *
  *                     Linux MegaRAID device driver
  *
- * Copyright Â© 2002  LSI Logic Corporation.
+ * Copyright (c) 2002  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
@@ -17,7 +17,8 @@
  * Copyright (c) 2003  Christoph Hellwig  <hch@lst.de>
  *       - new-style, hotplug-aware pci probing and scsi registration
  *
- * Version : v2.00.3 (Feb 19, 2003) - Atul Mukker <Atul.Mukker@lsil.com>
+ * Version : v2.00.4 Mon Nov 14 14:02:43 EST 2005 - Seokmann Ju
+ *                                             <Seokmann.Ju@lsil.com>
  *
  * Description: Linux device driver for LSI Logic MegaRAID controller
  *
 
 #include "megaraid.h"
 
-#define MEGARAID_MODULE_VERSION "2.00.3"
+#define MEGARAID_MODULE_VERSION "2.00.4"
 
-MODULE_AUTHOR ("LSI Logic Corporation");
-MODULE_DESCRIPTION ("LSI Logic MegaRAID driver");
+MODULE_AUTHOR ("sju@lsil.com");
+MODULE_DESCRIPTION ("LSI Logic MegaRAID legacy driver");
 MODULE_LICENSE ("GPL");
 MODULE_VERSION(MEGARAID_MODULE_VERSION);
 
@@ -380,23 +381,23 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
 
        spin_lock_irqsave(&adapter->lock, flags);
        scb = mega_build_cmd(adapter, scmd, &busy);
+       if (!scb)
+               goto out;
 
-       if(scb) {
-               scb->state |= SCB_PENDQ;
-               list_add_tail(&scb->list, &adapter->pending_list);
+       scb->state |= SCB_PENDQ;
+       list_add_tail(&scb->list, &adapter->pending_list);
 
-               /*
-                * Check if the HBA is in quiescent state, e.g., during a
-                * delete logical drive opertion. If it is, don't run
-                * the pending_list.
-                */
-               if(atomic_read(&adapter->quiescent) == 0) {
-                       mega_runpendq(adapter);
-               }
-               return 0;
-       }
-       spin_unlock_irqrestore(&adapter->lock, flags);
+       /*
+        * Check if the HBA is in quiescent state, e.g., during a
+        * delete logical drive opertion. If it is, don't run
+        * the pending_list.
+        */
+       if (atomic_read(&adapter->quiescent) == 0)
+               mega_runpendq(adapter);
 
+       busy = 0;
+ out:
+       spin_unlock_irqrestore(&adapter->lock, flags);
        return busy;
 }
 
@@ -664,7 +665,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
                                        sg->offset;
                        } else
                                buf = cmd->request_buffer;
-                       memset(cmd->request_buffer, 0, cmd->cmnd[4]);
+                       memset(buf, 0, cmd->cmnd[4]);
                        if (cmd->use_sg) {
                                struct scatterlist *sg;
 
@@ -4553,7 +4554,7 @@ mega_internal_done(Scsi_Cmnd *scmd)
 static struct scsi_host_template megaraid_template = {
        .module                         = THIS_MODULE,
        .name                           = "MegaRAID",
-       .proc_name                      = "megaraid",
+       .proc_name                      = "megaraid_legacy",
        .info                           = megaraid_info,
        .queuecommand                   = megaraid_queue,       
        .bios_param                     = megaraid_biosparam,
@@ -4677,7 +4678,6 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        adapter->flag = flag;
        spin_lock_init(&adapter->lock);
-       scsi_assign_lock(host, &adapter->lock);
 
        host->cmd_per_lun = max_cmd_per_lun;
        host->max_sectors = max_sectors_per_io;
@@ -5038,22 +5038,12 @@ megaraid_shutdown(struct pci_dev *pdev)
 }
 
 static struct pci_device_id megaraid_pci_tbl[] = {
-       {PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT},
-       {PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_PERC4_QC_VERDE,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT},
        {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {0,}
 };
 MODULE_DEVICE_TABLE(pci, megaraid_pci_tbl);
@@ -5096,7 +5086,7 @@ static int __init megaraid_init(void)
         * First argument (major) to register_chrdev implies a dynamic
         * major number allocation.
         */
-       major = register_chrdev(0, "megadev", &megadev_fops);
+       major = register_chrdev(0, "megadev_legacy", &megadev_fops);
        if (!major) {
                printk(KERN_WARNING
                                "megaraid: failed to register char device\n");
@@ -5110,7 +5100,7 @@ static void __exit megaraid_exit(void)
        /*
         * Unregister the character device interface to the driver.
         */
-       unregister_chrdev(major, "megadev");
+       unregister_chrdev(major, "megadev_legacy");
 
        pci_unregister_driver(&megaraid_pci_driver);
 
index 7363e12663acab0a92711ec59569b7014b0ba456..17419e30ffc87aeabdaa58981334450b680b3dc6 100644 (file)
@@ -64,7 +64,6 @@ config MEGARAID_MAILBOX
        To compile this driver as a module, choose M here: the
        module will be called megaraid_mbox
 
-if MEGARAID_NEWGEN=n
 config MEGARAID_LEGACY
        tristate "LSI Logic Legacy MegaRAID Driver"
        depends on PCI && SCSI
@@ -75,7 +74,6 @@ config MEGARAID_LEGACY
 
        To compile this driver as a module, choose M here: the
        module will be called megaraid
-endif
 
 config MEGARAID_SAS
        tristate "LSI Logic MegaRAID SAS RAID Module"
index 4b5d420d2f4d36c017e01a3541d7d277c890f67b..d18a4bc2498c5271be970ed2c9d8d77dee0e6a28 100644 (file)
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mbox.c
- * Version     : v2.20.4.6 (Mar 07 2005)
+ * Version     : v2.20.4.7 (Nov 14 2005)
  *
  * Authors:
  *     Atul Mukker             <Atul.Mukker@lsil.com>
  *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsil.com>
  *     Manoj Jose              <Manoj.Jose@lsil.com>
+ *     Seokmann Ju             <Seokmann.Ju@lsil.com>
  *
  * List of supported controllers
  *
@@ -136,7 +137,7 @@ static int wait_till_fw_empty(adapter_t *);
 
 
 
-MODULE_AUTHOR("LSI Logic Corporation");
+MODULE_AUTHOR("sju@lsil.com");
 MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGARAID_VERSION);
@@ -278,68 +279,14 @@ static struct pci_device_id pci_id_table_g[] =  {
        {
                PCI_VENDOR_ID_AMI,
                PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_QC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_DC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_SC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_AMI,
-               PCI_SUBSYS_ID_PERC3_SC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_AMI,
-               PCI_SUBSYS_ID_PERC3_DC,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_0,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_0,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_1,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_1,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_I4_133_RAID,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_I4_133_RAID,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_4,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_4,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_6,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_6,
+               PCI_DEVICE_ID_AMI_MEGARAID3,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
@@ -347,18 +294,6 @@ static struct pci_device_id pci_id_table_g[] =  {
                PCI_ANY_ID,
                PCI_ANY_ID,
        },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCS16,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCS16,
-       },
-       {
-               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,
-       },
        {0}     /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(pci, pci_id_table_g);
@@ -2985,6 +2920,7 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
 
        for (i = 0; i < 0xFFFFF; i++) {
                if (mbox->numstatus != 0xFF) break;
+               rmb();
        }
 
        if (i == 0xFFFFF) {
index 644b91bdb0282cfd0269c569fc3bdeaa04719d2f..882fb1a0b57560ca493fc6cc7e16cb2d4e1a0d66 100644 (file)
@@ -21,8 +21,8 @@
 #include "megaraid_ioctl.h"
 
 
-#define MEGARAID_VERSION       "2.20.4.6"
-#define MEGARAID_EXT_VERSION   "(Release Date: Mon Mar 07 12:27:22 EST 2005)"
+#define MEGARAID_VERSION       "2.20.4.7"
+#define MEGARAID_EXT_VERSION   "(Release Date: Mon Nov 14 12:27:22 EST 2005)"
 
 
 /*
index 243470936fab4e18b1aeab916b023a3040bedb07..32350707b940d93234a2f1f5d337437b40967d3f 100644 (file)
 #define NAME53C                        "ncr53c"
 #define NAME53C8XX             "ncr53c8xx"
 
-#include "sym53c8xx_comm.h"
+
+/*==========================================================
+**
+**     Debugging tags
+**
+**==========================================================
+*/
+
+#define DEBUG_ALLOC    (0x0001)
+#define DEBUG_PHASE    (0x0002)
+#define DEBUG_QUEUE    (0x0008)
+#define DEBUG_RESULT   (0x0010)
+#define DEBUG_POINTER  (0x0020)
+#define DEBUG_SCRIPT   (0x0040)
+#define DEBUG_TINY     (0x0080)
+#define DEBUG_TIMING   (0x0100)
+#define DEBUG_NEGO     (0x0200)
+#define DEBUG_TAGS     (0x0400)
+#define DEBUG_SCATTER  (0x0800)
+#define DEBUG_IC        (0x1000)
+
+/*
+**    Enable/Disable debug messages.
+**    Can be changed at runtime too.
+*/
+
+#ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
+static int ncr_debug = SCSI_NCR_DEBUG_FLAGS;
+       #define DEBUG_FLAGS ncr_debug
+#else
+       #define DEBUG_FLAGS     SCSI_NCR_DEBUG_FLAGS
+#endif
+
+static inline struct list_head *ncr_list_pop(struct list_head *head)
+{
+       if (!list_empty(head)) {
+               struct list_head *elem = head->next;
+
+               list_del(elem);
+               return elem;
+       }
+
+       return NULL;
+}
+
+/*==========================================================
+**
+**     Simple power of two buddy-like allocator.
+**
+**     This simple code is not intended to be fast, but to 
+**     provide power of 2 aligned memory allocations.
+**     Since the SCRIPTS processor only supplies 8 bit 
+**     arithmetic, this allocator allows simple and fast 
+**     address calculations  from the SCRIPTS code.
+**     In addition, cache line alignment is guaranteed for 
+**     power of 2 cache line size.
+**     Enhanced in linux-2.3.44 to provide a memory pool 
+**     per pcidev to support dynamic dma mapping. (I would 
+**     have preferred a real bus astraction, btw).
+**
+**==========================================================
+*/
+
+#define MEMO_SHIFT     4       /* 16 bytes minimum memory chunk */
+#if PAGE_SIZE >= 8192
+#define MEMO_PAGE_ORDER        0       /* 1 PAGE  maximum */
+#else
+#define MEMO_PAGE_ORDER        1       /* 2 PAGES maximum */
+#endif
+#define MEMO_FREE_UNUSED       /* Free unused pages immediately */
+#define MEMO_WARN      1
+#define MEMO_GFP_FLAGS GFP_ATOMIC
+#define MEMO_CLUSTER_SHIFT     (PAGE_SHIFT+MEMO_PAGE_ORDER)
+#define MEMO_CLUSTER_SIZE      (1UL << MEMO_CLUSTER_SHIFT)
+#define MEMO_CLUSTER_MASK      (MEMO_CLUSTER_SIZE-1)
+
+typedef u_long m_addr_t;       /* Enough bits to bit-hack addresses */
+typedef struct device *m_bush_t;       /* Something that addresses DMAable */
+
+typedef struct m_link {                /* Link between free memory chunks */
+       struct m_link *next;
+} m_link_s;
+
+typedef struct m_vtob {                /* Virtual to Bus address translation */
+       struct m_vtob *next;
+       m_addr_t vaddr;
+       m_addr_t baddr;
+} m_vtob_s;
+#define VTOB_HASH_SHIFT                5
+#define VTOB_HASH_SIZE         (1UL << VTOB_HASH_SHIFT)
+#define VTOB_HASH_MASK         (VTOB_HASH_SIZE-1)
+#define VTOB_HASH_CODE(m)      \
+       ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK)
+
+typedef struct m_pool {                /* Memory pool of a given kind */
+       m_bush_t bush;
+       m_addr_t (*getp)(struct m_pool *);
+       void (*freep)(struct m_pool *, m_addr_t);
+       int nump;
+       m_vtob_s *(vtob[VTOB_HASH_SIZE]);
+       struct m_pool *next;
+       struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1];
+} m_pool_s;
+
+static void *___m_alloc(m_pool_s *mp, int size)
+{
+       int i = 0;
+       int s = (1 << MEMO_SHIFT);
+       int j;
+       m_addr_t a;
+       m_link_s *h = mp->h;
+
+       if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
+               return NULL;
+
+       while (size > s) {
+               s <<= 1;
+               ++i;
+       }
+
+       j = i;
+       while (!h[j].next) {
+               if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
+                       h[j].next = (m_link_s *)mp->getp(mp);
+                       if (h[j].next)
+                               h[j].next->next = NULL;
+                       break;
+               }
+               ++j;
+               s <<= 1;
+       }
+       a = (m_addr_t) h[j].next;
+       if (a) {
+               h[j].next = h[j].next->next;
+               while (j > i) {
+                       j -= 1;
+                       s >>= 1;
+                       h[j].next = (m_link_s *) (a+s);
+                       h[j].next->next = NULL;
+               }
+       }
+#ifdef DEBUG
+       printk("___m_alloc(%d) = %p\n", size, (void *) a);
+#endif
+       return (void *) a;
+}
+
+static void ___m_free(m_pool_s *mp, void *ptr, int size)
+{
+       int i = 0;
+       int s = (1 << MEMO_SHIFT);
+       m_link_s *q;
+       m_addr_t a, b;
+       m_link_s *h = mp->h;
+
+#ifdef DEBUG
+       printk("___m_free(%p, %d)\n", ptr, size);
+#endif
+
+       if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
+               return;
+
+       while (size > s) {
+               s <<= 1;
+               ++i;
+       }
+
+       a = (m_addr_t) ptr;
+
+       while (1) {
+#ifdef MEMO_FREE_UNUSED
+               if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
+                       mp->freep(mp, a);
+                       break;
+               }
+#endif
+               b = a ^ s;
+               q = &h[i];
+               while (q->next && q->next != (m_link_s *) b) {
+                       q = q->next;
+               }
+               if (!q->next) {
+                       ((m_link_s *) a)->next = h[i].next;
+                       h[i].next = (m_link_s *) a;
+                       break;
+               }
+               q->next = q->next->next;
+               a = a & b;
+               s <<= 1;
+               ++i;
+       }
+}
+
+static DEFINE_SPINLOCK(ncr53c8xx_lock);
+
+static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags)
+{
+       void *p;
+
+       p = ___m_alloc(mp, size);
+
+       if (DEBUG_FLAGS & DEBUG_ALLOC)
+               printk ("new %-10s[%4d] @%p.\n", name, size, p);
+
+       if (p)
+               memset(p, 0, size);
+       else if (uflags & MEMO_WARN)
+               printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size);
+
+       return p;
+}
+
+#define __m_calloc(mp, s, n)   __m_calloc2(mp, s, n, MEMO_WARN)
+
+static void __m_free(m_pool_s *mp, void *ptr, int size, char *name)
+{
+       if (DEBUG_FLAGS & DEBUG_ALLOC)
+               printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr);
+
+       ___m_free(mp, ptr, size);
+
+}
+
+/*
+ * With pci bus iommu support, we use a default pool of unmapped memory 
+ * for memory we donnot need to DMA from/to and one pool per pcidev for 
+ * memory accessed by the PCI chip. `mp0' is the default not DMAable pool.
+ */
+
+static m_addr_t ___mp0_getp(m_pool_s *mp)
+{
+       m_addr_t m = __get_free_pages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER);
+       if (m)
+               ++mp->nump;
+       return m;
+}
+
+static void ___mp0_freep(m_pool_s *mp, m_addr_t m)
+{
+       free_pages(m, MEMO_PAGE_ORDER);
+       --mp->nump;
+}
+
+static m_pool_s mp0 = {NULL, ___mp0_getp, ___mp0_freep};
+
+/*
+ * DMAable pools.
+ */
+
+/*
+ * With pci bus iommu support, we maintain one pool per pcidev and a 
+ * hashed reverse table for virtual to bus physical address translations.
+ */
+static m_addr_t ___dma_getp(m_pool_s *mp)
+{
+       m_addr_t vp;
+       m_vtob_s *vbp;
+
+       vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB");
+       if (vbp) {
+               dma_addr_t daddr;
+               vp = (m_addr_t) dma_alloc_coherent(mp->bush,
+                                               PAGE_SIZE<<MEMO_PAGE_ORDER,
+                                               &daddr, GFP_ATOMIC);
+               if (vp) {
+                       int hc = VTOB_HASH_CODE(vp);
+                       vbp->vaddr = vp;
+                       vbp->baddr = daddr;
+                       vbp->next = mp->vtob[hc];
+                       mp->vtob[hc] = vbp;
+                       ++mp->nump;
+                       return vp;
+               }
+       }
+       if (vbp)
+               __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
+       return 0;
+}
+
+static void ___dma_freep(m_pool_s *mp, m_addr_t m)
+{
+       m_vtob_s **vbpp, *vbp;
+       int hc = VTOB_HASH_CODE(m);
+
+       vbpp = &mp->vtob[hc];
+       while (*vbpp && (*vbpp)->vaddr != m)
+               vbpp = &(*vbpp)->next;
+       if (*vbpp) {
+               vbp = *vbpp;
+               *vbpp = (*vbpp)->next;
+               dma_free_coherent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER,
+                                 (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
+               __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
+               --mp->nump;
+       }
+}
+
+static inline m_pool_s *___get_dma_pool(m_bush_t bush)
+{
+       m_pool_s *mp;
+       for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next);
+       return mp;
+}
+
+static m_pool_s *___cre_dma_pool(m_bush_t bush)
+{
+       m_pool_s *mp;
+       mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL");
+       if (mp) {
+               memset(mp, 0, sizeof(*mp));
+               mp->bush = bush;
+               mp->getp = ___dma_getp;
+               mp->freep = ___dma_freep;
+               mp->next = mp0.next;
+               mp0.next = mp;
+       }
+       return mp;
+}
+
+static void ___del_dma_pool(m_pool_s *p)
+{
+       struct m_pool **pp = &mp0.next;
+
+       while (*pp && *pp != p)
+               pp = &(*pp)->next;
+       if (*pp) {
+               *pp = (*pp)->next;
+               __m_free(&mp0, p, sizeof(*p), "MPOOL");
+       }
+}
+
+static void *__m_calloc_dma(m_bush_t bush, int size, char *name)
+{
+       u_long flags;
+       struct m_pool *mp;
+       void *m = NULL;
+
+       spin_lock_irqsave(&ncr53c8xx_lock, flags);
+       mp = ___get_dma_pool(bush);
+       if (!mp)
+               mp = ___cre_dma_pool(bush);
+       if (mp)
+               m = __m_calloc(mp, size, name);
+       if (mp && !mp->nump)
+               ___del_dma_pool(mp);
+       spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
+
+       return m;
+}
+
+static void __m_free_dma(m_bush_t bush, void *m, int size, char *name)
+{
+       u_long flags;
+       struct m_pool *mp;
+
+       spin_lock_irqsave(&ncr53c8xx_lock, flags);
+       mp = ___get_dma_pool(bush);
+       if (mp)
+               __m_free(mp, m, size, name);
+       if (mp && !mp->nump)
+               ___del_dma_pool(mp);
+       spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
+}
+
+static m_addr_t __vtobus(m_bush_t bush, void *m)
+{
+       u_long flags;
+       m_pool_s *mp;
+       int hc = VTOB_HASH_CODE(m);
+       m_vtob_s *vp = NULL;
+       m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK;
+
+       spin_lock_irqsave(&ncr53c8xx_lock, flags);
+       mp = ___get_dma_pool(bush);
+       if (mp) {
+               vp = mp->vtob[hc];
+               while (vp && (m_addr_t) vp->vaddr != a)
+                       vp = vp->next;
+       }
+       spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
+       return vp ? vp->baddr + (((m_addr_t) m) - a) : 0;
+}
+
+#define _m_calloc_dma(np, s, n)                __m_calloc_dma(np->dev, s, n)
+#define _m_free_dma(np, p, s, n)       __m_free_dma(np->dev, p, s, n)
+#define m_calloc_dma(s, n)             _m_calloc_dma(np, s, n)
+#define m_free_dma(p, s, n)            _m_free_dma(np, p, s, n)
+#define _vtobus(np, p)                 __vtobus(np->dev, p)
+#define vtobus(p)                      _vtobus(np, p)
+
+/*
+ *  Deal with DMA mapping/unmapping.
+ */
+
+/* To keep track of the dma mapping (sg/single) that has been set */
+#define __data_mapped  SCp.phase
+#define __data_mapping SCp.have_data_in
+
+static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd)
+{
+       switch(cmd->__data_mapped) {
+       case 2:
+               dma_unmap_sg(dev, cmd->buffer, cmd->use_sg,
+                               cmd->sc_data_direction);
+               break;
+       case 1:
+               dma_unmap_single(dev, cmd->__data_mapping,
+                                cmd->request_bufflen,
+                                cmd->sc_data_direction);
+               break;
+       }
+       cmd->__data_mapped = 0;
+}
+
+static u_long __map_scsi_single_data(struct device *dev, struct scsi_cmnd *cmd)
+{
+       dma_addr_t mapping;
+
+       if (cmd->request_bufflen == 0)
+               return 0;
+
+       mapping = dma_map_single(dev, cmd->request_buffer,
+                                cmd->request_bufflen,
+                                cmd->sc_data_direction);
+       cmd->__data_mapped = 1;
+       cmd->__data_mapping = mapping;
+
+       return mapping;
+}
+
+static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd)
+{
+       int use_sg;
+
+       if (cmd->use_sg == 0)
+               return 0;
+
+       use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg,
+                       cmd->sc_data_direction);
+       cmd->__data_mapped = 2;
+       cmd->__data_mapping = use_sg;
+
+       return use_sg;
+}
+
+#define unmap_scsi_data(np, cmd)       __unmap_scsi_data(np->dev, cmd)
+#define map_scsi_single_data(np, cmd)  __map_scsi_single_data(np->dev, cmd)
+#define map_scsi_sg_data(np, cmd)      __map_scsi_sg_data(np->dev, cmd)
+
+/*==========================================================
+**
+**     Driver setup.
+**
+**     This structure is initialized from linux config 
+**     options. It can be overridden at boot-up by the boot 
+**     command line.
+**
+**==========================================================
+*/
+static struct ncr_driver_setup
+       driver_setup                    = SCSI_NCR_DRIVER_SETUP;
+
+#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
+static struct ncr_driver_setup
+       driver_safe_setup __initdata    = SCSI_NCR_DRIVER_SAFE_SETUP;
+#endif
+
+#define initverbose (driver_setup.verbose)
+#define bootverbose (np->verbose)
+
+
+/*===================================================================
+**
+**     Driver setup from the boot command line
+**
+**===================================================================
+*/
+
+#ifdef MODULE
+#define        ARG_SEP ' '
+#else
+#define        ARG_SEP ','
+#endif
+
+#define OPT_TAGS               1
+#define OPT_MASTER_PARITY      2
+#define OPT_SCSI_PARITY                3
+#define OPT_DISCONNECTION      4
+#define OPT_SPECIAL_FEATURES   5
+#define OPT_UNUSED_1           6
+#define OPT_FORCE_SYNC_NEGO    7
+#define OPT_REVERSE_PROBE      8
+#define OPT_DEFAULT_SYNC       9
+#define OPT_VERBOSE            10
+#define OPT_DEBUG              11
+#define OPT_BURST_MAX          12
+#define OPT_LED_PIN            13
+#define OPT_MAX_WIDE           14
+#define OPT_SETTLE_DELAY       15
+#define OPT_DIFF_SUPPORT       16
+#define OPT_IRQM               17
+#define OPT_PCI_FIX_UP         18
+#define OPT_BUS_CHECK          19
+#define OPT_OPTIMIZE           20
+#define OPT_RECOVERY           21
+#define OPT_SAFE_SETUP         22
+#define OPT_USE_NVRAM          23
+#define OPT_EXCLUDE            24
+#define OPT_HOST_ID            25
+
+#ifdef SCSI_NCR_IARB_SUPPORT
+#define OPT_IARB               26
+#endif
+
+static char setup_token[] __initdata = 
+       "tags:"   "mpar:"
+       "spar:"   "disc:"
+       "specf:"  "ultra:"
+       "fsn:"    "revprob:"
+       "sync:"   "verb:"
+       "debug:"  "burst:"
+       "led:"    "wide:"
+       "settle:" "diff:"
+       "irqm:"   "pcifix:"
+       "buschk:" "optim:"
+       "recovery:"
+       "safe:"   "nvram:"
+       "excl:"   "hostid:"
+#ifdef SCSI_NCR_IARB_SUPPORT
+       "iarb:"
+#endif
+       ;       /* DONNOT REMOVE THIS ';' */
+
+#ifdef MODULE
+#define        ARG_SEP ' '
+#else
+#define        ARG_SEP ','
+#endif
+
+static int __init get_setup_token(char *p)
+{
+       char *cur = setup_token;
+       char *pc;
+       int i = 0;
+
+       while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
+               ++pc;
+               ++i;
+               if (!strncmp(p, cur, pc - cur))
+                       return i;
+               cur = pc;
+       }
+       return 0;
+}
+
+
+static int __init sym53c8xx__setup(char *str)
+{
+#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
+       char *cur = str;
+       char *pc, *pv;
+       int i, val, c;
+       int xi = 0;
+
+       while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
+               char *pe;
+
+               val = 0;
+               pv = pc;
+               c = *++pv;
+
+               if      (c == 'n')
+                       val = 0;
+               else if (c == 'y')
+                       val = 1;
+               else
+                       val = (int) simple_strtoul(pv, &pe, 0);
+
+               switch (get_setup_token(cur)) {
+               case OPT_TAGS:
+                       driver_setup.default_tags = val;
+                       if (pe && *pe == '/') {
+                               i = 0;
+                               while (*pe && *pe != ARG_SEP && 
+                                       i < sizeof(driver_setup.tag_ctrl)-1) {
+                                       driver_setup.tag_ctrl[i++] = *pe++;
+                               }
+                               driver_setup.tag_ctrl[i] = '\0';
+                       }
+                       break;
+               case OPT_MASTER_PARITY:
+                       driver_setup.master_parity = val;
+                       break;
+               case OPT_SCSI_PARITY:
+                       driver_setup.scsi_parity = val;
+                       break;
+               case OPT_DISCONNECTION:
+                       driver_setup.disconnection = val;
+                       break;
+               case OPT_SPECIAL_FEATURES:
+                       driver_setup.special_features = val;
+                       break;
+               case OPT_FORCE_SYNC_NEGO:
+                       driver_setup.force_sync_nego = val;
+                       break;
+               case OPT_REVERSE_PROBE:
+                       driver_setup.reverse_probe = val;
+                       break;
+               case OPT_DEFAULT_SYNC:
+                       driver_setup.default_sync = val;
+                       break;
+               case OPT_VERBOSE:
+                       driver_setup.verbose = val;
+                       break;
+               case OPT_DEBUG:
+                       driver_setup.debug = val;
+                       break;
+               case OPT_BURST_MAX:
+                       driver_setup.burst_max = val;
+                       break;
+               case OPT_LED_PIN:
+                       driver_setup.led_pin = val;
+                       break;
+               case OPT_MAX_WIDE:
+                       driver_setup.max_wide = val? 1:0;
+                       break;
+               case OPT_SETTLE_DELAY:
+                       driver_setup.settle_delay = val;
+                       break;
+               case OPT_DIFF_SUPPORT:
+                       driver_setup.diff_support = val;
+                       break;
+               case OPT_IRQM:
+                       driver_setup.irqm = val;
+                       break;
+               case OPT_PCI_FIX_UP:
+                       driver_setup.pci_fix_up = val;
+                       break;
+               case OPT_BUS_CHECK:
+                       driver_setup.bus_check = val;
+                       break;
+               case OPT_OPTIMIZE:
+                       driver_setup.optimize = val;
+                       break;
+               case OPT_RECOVERY:
+                       driver_setup.recovery = val;
+                       break;
+               case OPT_USE_NVRAM:
+                       driver_setup.use_nvram = val;
+                       break;
+               case OPT_SAFE_SETUP:
+                       memcpy(&driver_setup, &driver_safe_setup,
+                               sizeof(driver_setup));
+                       break;
+               case OPT_EXCLUDE:
+                       if (xi < SCSI_NCR_MAX_EXCLUDES)
+                               driver_setup.excludes[xi++] = val;
+                       break;
+               case OPT_HOST_ID:
+                       driver_setup.host_id = val;
+                       break;
+#ifdef SCSI_NCR_IARB_SUPPORT
+               case OPT_IARB:
+                       driver_setup.iarb = val;
+                       break;
+#endif
+               default:
+                       printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
+                       break;
+               }
+
+               if ((cur = strchr(cur, ARG_SEP)) != NULL)
+                       ++cur;
+       }
+#endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */
+       return 1;
+}
+
+/*===================================================================
+**
+**     Get device queue depth from boot command line.
+**
+**===================================================================
+*/
+#define DEF_DEPTH      (driver_setup.default_tags)
+#define ALL_TARGETS    -2
+#define NO_TARGET      -1
+#define ALL_LUNS       -2
+#define NO_LUN         -1
+
+static int device_queue_depth(int unit, int target, int lun)
+{
+       int c, h, t, u, v;
+       char *p = driver_setup.tag_ctrl;
+       char *ep;
+
+       h = -1;
+       t = NO_TARGET;
+       u = NO_LUN;
+       while ((c = *p++) != 0) {
+               v = simple_strtoul(p, &ep, 0);
+               switch(c) {
+               case '/':
+                       ++h;
+                       t = ALL_TARGETS;
+                       u = ALL_LUNS;
+                       break;
+               case 't':
+                       if (t != target)
+                               t = (target == v) ? v : NO_TARGET;
+                       u = ALL_LUNS;
+                       break;
+               case 'u':
+                       if (u != lun)
+                               u = (lun == v) ? v : NO_LUN;
+                       break;
+               case 'q':
+                       if (h == unit &&
+                               (t == ALL_TARGETS || t == target) &&
+                               (u == ALL_LUNS    || u == lun))
+                               return v;
+                       break;
+               case '-':
+                       t = ALL_TARGETS;
+                       u = ALL_LUNS;
+                       break;
+               default:
+                       break;
+               }
+               p = ep;
+       }
+       return DEF_DEPTH;
+}
 
 
 /*==========================================================
@@ -2971,21 +3703,10 @@ struct host_data {
 
 static void ncr_print_msg(struct ccb *cp, char *label, u_char *msg)
 {
-       int i;
        PRINT_ADDR(cp->cmd, "%s: ", label);
 
-       printk ("%x",*msg);
-       if (*msg == M_EXTENDED) {
-               for (i = 1; i < 8; i++) {
-                       if (i - 1 > msg[1])
-                               break;
-                       printk ("-%x",msg[i]);
-               }
-       } else if ((*msg & 0xf0) == 0x20) {
-               printk ("-%x",msg[1]);
-       }
-
-       printk(".\n");
+       spi_print_msg(msg);
+       printk("\n");
 }
 
 /*==========================================================
index 05c7b83cef0944e0a5dd109c45fca8f337180f4a..6a7bef2e6118e6ddbfcb62ff4b3a6b849b8a49e9 100644 (file)
@@ -2,6 +2,7 @@
 **  Device driver for the PCI-SCSI NCR538XX controller family.
 **
 **  Copyright (C) 1994  Wolfgang Stanglmeier
+**  Copyright (C) 1998-2001  Gerard Roudier <groudier@free.fr>
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License as published by
 **  And has been ported to NetBSD by
 **          Charles M. Hannum           <mycroft@gnu.ai.mit.edu>
 **
+**  NVRAM detection and reading.
+**    Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
+**
+**  Added support for MIPS big endian systems.
+**    Carsten Langgaard, carstenl@mips.com
+**    Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
+**
+**  Added support for HP PARISC big endian systems.
+**    Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
+**
 *******************************************************************************
 */
 
 #ifndef NCR53C8XX_H
 #define NCR53C8XX_H
 
+#include <linux/config.h>
 #include <scsi/scsi_host.h>
 
-#include "sym53c8xx_defs.h"
+/*
+**     If you want a driver as small as possible, do not define the 
+**     following options.
+*/
+#define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
+#define SCSI_NCR_DEBUG_INFO_SUPPORT
+
+/*
+**     To disable integrity checking, do not define the 
+**     following option.
+*/
+#ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK
+#      define SCSI_NCR_ENABLE_INTEGRITY_CHECK
+#endif
+
+/* ---------------------------------------------------------------------
+** Take into account kernel configured parameters.
+** Most of these options can be overridden at startup by a command line.
+** ---------------------------------------------------------------------
+*/
+
+/*
+ * For Ultra2 and Ultra3 SCSI support option, use special features. 
+ *
+ * Value (default) means:
+ *     bit 0 : all features enabled, except:
+ *             bit 1 : PCI Write And Invalidate.
+ *             bit 2 : Data Phase Mismatch handling from SCRIPTS.
+ *
+ * Use boot options ncr53c8xx=specf:1 if you want all chip features to be 
+ * enabled by the driver.
+ */
+#define        SCSI_NCR_SETUP_SPECIAL_FEATURES         (3)
+
+#define SCSI_NCR_MAX_SYNC                      (80)
+
+/*
+ * Allow tags from 2 to 256, default 8
+ */
+#ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
+#if    CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
+#define SCSI_NCR_MAX_TAGS      (2)
+#elif  CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256
+#define SCSI_NCR_MAX_TAGS      (256)
+#else
+#define        SCSI_NCR_MAX_TAGS       CONFIG_SCSI_NCR53C8XX_MAX_TAGS
+#endif
+#else
+#define SCSI_NCR_MAX_TAGS      (8)
+#endif
+
+/*
+ * Allow tagged command queuing support if configured with default number 
+ * of tags set to max (see above).
+ */
+#ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
+#define        SCSI_NCR_SETUP_DEFAULT_TAGS     CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
+#elif  defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
+#define        SCSI_NCR_SETUP_DEFAULT_TAGS     SCSI_NCR_MAX_TAGS
+#else
+#define        SCSI_NCR_SETUP_DEFAULT_TAGS     (0)
+#endif
+
+/*
+ * Immediate arbitration
+ */
+#if defined(CONFIG_SCSI_NCR53C8XX_IARB)
+#define SCSI_NCR_IARB_SUPPORT
+#endif
+
+/*
+ * Sync transfer frequency at startup.
+ * Allow from 5Mhz to 80Mhz default 20 Mhz.
+ */
+#ifndef        CONFIG_SCSI_NCR53C8XX_SYNC
+#define        CONFIG_SCSI_NCR53C8XX_SYNC      (20)
+#elif  CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
+#undef CONFIG_SCSI_NCR53C8XX_SYNC
+#define        CONFIG_SCSI_NCR53C8XX_SYNC      SCSI_NCR_MAX_SYNC
+#endif
+
+#if    CONFIG_SCSI_NCR53C8XX_SYNC == 0
+#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (255)
+#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 5
+#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (50)
+#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 20
+#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
+#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 33
+#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (11)
+#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 40
+#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (10)
+#else
+#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (9)
+#endif
+
+/*
+ * Disallow disconnections at boot-up
+ */
+#ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
+#define SCSI_NCR_SETUP_DISCONNECTION   (0)
+#else
+#define SCSI_NCR_SETUP_DISCONNECTION   (1)
+#endif
+
+/*
+ * Force synchronous negotiation for all targets
+ */
+#ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
+#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
+#else
+#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
+#endif
+
+/*
+ * Disable master parity checking (flawed hardwares need that)
+ */
+#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
+#define SCSI_NCR_SETUP_MASTER_PARITY   (0)
+#else
+#define SCSI_NCR_SETUP_MASTER_PARITY   (1)
+#endif
+
+/*
+ * Disable scsi parity checking (flawed devices may need that)
+ */
+#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
+#define SCSI_NCR_SETUP_SCSI_PARITY     (0)
+#else
+#define SCSI_NCR_SETUP_SCSI_PARITY     (1)
+#endif
+
+/*
+ * Settle time after reset at boot-up
+ */
+#define SCSI_NCR_SETUP_SETTLE_TIME     (2)
+
+/*
+**     Bridge quirks work-around option defaulted to 1.
+*/
+#ifndef        SCSI_NCR_PCIQ_WORK_AROUND_OPT
+#define        SCSI_NCR_PCIQ_WORK_AROUND_OPT   1
+#endif
+
+/*
+**     Work-around common bridge misbehaviour.
+**
+**     - Do not flush posted writes in the opposite 
+**       direction on read.
+**     - May reorder DMA writes to memory.
+**
+**     This option should not affect performances 
+**     significantly, so it is the default.
+*/
+#if    SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1
+#define        SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
+#define        SCSI_NCR_PCIQ_MAY_REORDER_WRITES
+#define        SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
+
+/*
+**     Same as option 1, but also deal with 
+**     misconfigured interrupts.
+**
+**     - Edge triggerred instead of level sensitive.
+**     - No interrupt line connected.
+**     - IRQ number misconfigured.
+**     
+**     If no interrupt is delivered, the driver will 
+**     catch the interrupt conditions 10 times per 
+**     second. No need to say that this option is 
+**     not recommended.
+*/
+#elif  SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2
+#define        SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
+#define        SCSI_NCR_PCIQ_MAY_REORDER_WRITES
+#define        SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
+#define        SCSI_NCR_PCIQ_BROKEN_INTR
+
+/*
+**     Some bridge designers decided to flush 
+**     everything prior to deliver the interrupt.
+**     This option tries to deal with such a 
+**     behaviour.
+*/
+#elif  SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3
+#define        SCSI_NCR_PCIQ_SYNC_ON_INTR
+#endif
+
+/*
+**     Other parameters not configurable with "make config"
+**     Avoid to change these constants, unless you know what you are doing.
+*/
+
+#define SCSI_NCR_ALWAYS_SIMPLE_TAG
+#define SCSI_NCR_MAX_SCATTER   (127)
+#define SCSI_NCR_MAX_TARGET    (16)
+
+/*
+**   Compute some desirable value for CAN_QUEUE 
+**   and CMD_PER_LUN.
+**   The driver will use lower values if these 
+**   ones appear to be too large.
+*/
+#define SCSI_NCR_CAN_QUEUE     (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET)
+#define SCSI_NCR_CMD_PER_LUN   (SCSI_NCR_MAX_TAGS)
+
+#define SCSI_NCR_SG_TABLESIZE  (SCSI_NCR_MAX_SCATTER)
+#define SCSI_NCR_TIMER_INTERVAL        (HZ)
+
+#if 1 /* defined CONFIG_SCSI_MULTI_LUN */
+#define SCSI_NCR_MAX_LUN       (16)
+#else
+#define SCSI_NCR_MAX_LUN       (1)
+#endif
+
+/*
+ *  IO functions definition for big/little endian CPU support.
+ *  For now, the NCR is only supported in little endian addressing mode, 
+ */
+
+#ifdef __BIG_ENDIAN
+
+#define        inw_l2b         inw
+#define        inl_l2b         inl
+#define        outw_b2l        outw
+#define        outl_b2l        outl
+
+#define        readb_raw       readb
+#define        writeb_raw      writeb
+
+#if defined(SCSI_NCR_BIG_ENDIAN)
+#define        readw_l2b       __raw_readw
+#define        readl_l2b       __raw_readl
+#define        writew_b2l      __raw_writew
+#define        writel_b2l      __raw_writel
+#define        readw_raw       __raw_readw
+#define        readl_raw       __raw_readl
+#define        writew_raw      __raw_writew
+#define        writel_raw      __raw_writel
+#else  /* Other big-endian */
+#define        readw_l2b       readw
+#define        readl_l2b       readl
+#define        writew_b2l      writew
+#define        writel_b2l      writel
+#define        readw_raw       readw
+#define        readl_raw       readl
+#define        writew_raw      writew
+#define        writel_raw      writel
+#endif
+
+#else  /* little endian */
+
+#define        inw_raw         inw
+#define        inl_raw         inl
+#define        outw_raw        outw
+#define        outl_raw        outl
+
+#define        readb_raw       readb
+#define        readw_raw       readw
+#define        readl_raw       readl
+#define        writeb_raw      writeb
+#define        writew_raw      writew
+#define        writel_raw      writel
+
+#endif
+
+#if !defined(__hppa__) && !defined(__mips__)
+#ifdef SCSI_NCR_BIG_ENDIAN
+#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
+#endif
+#endif
+
+#define MEMORY_BARRIER()       mb()
+
+
+/*
+ *  If the NCR uses big endian addressing mode over the 
+ *  PCI, actual io register addresses for byte and word 
+ *  accesses must be changed according to lane routing.
+ *  Btw, ncr_offb() and ncr_offw() macros only apply to 
+ *  constants and so donnot generate bloated code.
+ */
+
+#if    defined(SCSI_NCR_BIG_ENDIAN)
+
+#define ncr_offb(o)    (((o)&~3)+((~((o)&3))&3))
+#define ncr_offw(o)    (((o)&~3)+((~((o)&3))&2))
+
+#else
+
+#define ncr_offb(o)    (o)
+#define ncr_offw(o)    (o)
+
+#endif
+
+/*
+ *  If the CPU and the NCR use same endian-ness addressing,
+ *  no byte reordering is needed for script patching.
+ *  Macro cpu_to_scr() is to be used for script patching.
+ *  Macro scr_to_cpu() is to be used for getting a DWORD 
+ *  from the script.
+ */
+
+#if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
+
+#define cpu_to_scr(dw) cpu_to_le32(dw)
+#define scr_to_cpu(dw) le32_to_cpu(dw)
+
+#elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
+
+#define cpu_to_scr(dw) cpu_to_be32(dw)
+#define scr_to_cpu(dw) be32_to_cpu(dw)
+
+#else
+
+#define cpu_to_scr(dw) (dw)
+#define scr_to_cpu(dw) (dw)
+
+#endif
+
+/*
+ *  Access to the controller chip.
+ *
+ *  If the CPU and the NCR use same endian-ness addressing,
+ *  no byte reordering is needed for accessing chip io 
+ *  registers. Functions suffixed by '_raw' are assumed 
+ *  to access the chip over the PCI without doing byte 
+ *  reordering. Functions suffixed by '_l2b' are 
+ *  assumed to perform little-endian to big-endian byte 
+ *  reordering, those suffixed by '_b2l' blah, blah,
+ *  blah, ...
+ */
+
+/*
+ *  MEMORY mapped IO input / output
+ */
+
+#define INB_OFF(o)             readb_raw((char __iomem *)np->reg + ncr_offb(o))
+#define OUTB_OFF(o, val)       writeb_raw((val), (char __iomem *)np->reg + ncr_offb(o))
+
+#if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
+
+#define INW_OFF(o)             readw_l2b((char __iomem *)np->reg + ncr_offw(o))
+#define INL_OFF(o)             readl_l2b((char __iomem *)np->reg + (o))
+
+#define OUTW_OFF(o, val)       writew_b2l((val), (char __iomem *)np->reg + ncr_offw(o))
+#define OUTL_OFF(o, val)       writel_b2l((val), (char __iomem *)np->reg + (o))
+
+#elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
+
+#define INW_OFF(o)             readw_b2l((char __iomem *)np->reg + ncr_offw(o))
+#define INL_OFF(o)             readl_b2l((char __iomem *)np->reg + (o))
+
+#define OUTW_OFF(o, val)       writew_l2b((val), (char __iomem *)np->reg + ncr_offw(o))
+#define OUTL_OFF(o, val)       writel_l2b((val), (char __iomem *)np->reg + (o))
+
+#else
+
+#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
+/* Only 8 or 32 bit transfers allowed */
+#define INW_OFF(o)             (readb((char __iomem *)np->reg + ncr_offw(o)) << 8 | readb((char __iomem *)np->reg + ncr_offw(o) + 1))
+#else
+#define INW_OFF(o)             readw_raw((char __iomem *)np->reg + ncr_offw(o))
+#endif
+#define INL_OFF(o)             readl_raw((char __iomem *)np->reg + (o))
+
+#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
+/* Only 8 or 32 bit transfers allowed */
+#define OUTW_OFF(o, val)       do { writeb((char)((val) >> 8), (char __iomem *)np->reg + ncr_offw(o)); writeb((char)(val), (char __iomem *)np->reg + ncr_offw(o) + 1); } while (0)
+#else
+#define OUTW_OFF(o, val)       writew_raw((val), (char __iomem *)np->reg + ncr_offw(o))
+#endif
+#define OUTL_OFF(o, val)       writel_raw((val), (char __iomem *)np->reg + (o))
+
+#endif
+
+#define INB(r)         INB_OFF (offsetof(struct ncr_reg,r))
+#define INW(r)         INW_OFF (offsetof(struct ncr_reg,r))
+#define INL(r)         INL_OFF (offsetof(struct ncr_reg,r))
+
+#define OUTB(r, val)   OUTB_OFF (offsetof(struct ncr_reg,r), (val))
+#define OUTW(r, val)   OUTW_OFF (offsetof(struct ncr_reg,r), (val))
+#define OUTL(r, val)   OUTL_OFF (offsetof(struct ncr_reg,r), (val))
+
+/*
+ *  Set bit field ON, OFF 
+ */
+
+#define OUTONB(r, m)   OUTB(r, INB(r) | (m))
+#define OUTOFFB(r, m)  OUTB(r, INB(r) & ~(m))
+#define OUTONW(r, m)   OUTW(r, INW(r) | (m))
+#define OUTOFFW(r, m)  OUTW(r, INW(r) & ~(m))
+#define OUTONL(r, m)   OUTL(r, INL(r) | (m))
+#define OUTOFFL(r, m)  OUTL(r, INL(r) & ~(m))
+
+/*
+ *  We normally want the chip to have a consistent view
+ *  of driver internal data structures when we restart it.
+ *  Thus these macros.
+ */
+#define OUTL_DSP(v)                            \
+       do {                                    \
+               MEMORY_BARRIER();               \
+               OUTL (nc_dsp, (v));             \
+       } while (0)
+
+#define OUTONB_STD()                           \
+       do {                                    \
+               MEMORY_BARRIER();               \
+               OUTONB (nc_dcntl, (STD|NOCOM)); \
+       } while (0)
+
+
+/*
+**   NCR53C8XX devices features table.
+*/
+struct ncr_chip {
+       unsigned short  revision_id;
+       unsigned char   burst_max;      /* log-base-2 of max burst */
+       unsigned char   offset_max;
+       unsigned char   nr_divisor;
+       unsigned int    features;
+#define FE_LED0                (1<<0)
+#define FE_WIDE                (1<<1)    /* Wide data transfers */
+#define FE_ULTRA       (1<<2)    /* Ultra speed 20Mtrans/sec */
+#define FE_DBLR                (1<<4)    /* Clock doubler present */
+#define FE_QUAD                (1<<5)    /* Clock quadrupler present */
+#define FE_ERL         (1<<6)    /* Enable read line */
+#define FE_CLSE                (1<<7)    /* Cache line size enable */
+#define FE_WRIE                (1<<8)    /* Write & Invalidate enable */
+#define FE_ERMP                (1<<9)    /* Enable read multiple */
+#define FE_BOF         (1<<10)   /* Burst opcode fetch */
+#define FE_DFS         (1<<11)   /* DMA fifo size */
+#define FE_PFEN                (1<<12)   /* Prefetch enable */
+#define FE_LDSTR       (1<<13)   /* Load/Store supported */
+#define FE_RAM         (1<<14)   /* On chip RAM present */
+#define FE_VARCLK      (1<<15)   /* SCSI clock may vary */
+#define FE_RAM8K       (1<<16)   /* On chip RAM sized 8Kb */
+#define FE_64BIT       (1<<17)   /* Have a 64-bit PCI interface */
+#define FE_IO256       (1<<18)   /* Requires full 256 bytes in PCI space */
+#define FE_NOPM                (1<<19)   /* Scripts handles phase mismatch */
+#define FE_LEDC                (1<<20)   /* Hardware control of LED */
+#define FE_DIFF                (1<<21)   /* Support Differential SCSI */
+#define FE_66MHZ       (1<<23)   /* 66MHz PCI Support */
+#define FE_DAC         (1<<24)   /* Support DAC cycles (64 bit addressing) */
+#define FE_ISTAT1      (1<<25)   /* Have ISTAT1, MBOX0, MBOX1 registers */
+#define FE_DAC_IN_USE  (1<<26)   /* Platform does DAC cycles */
+#define FE_EHP         (1<<27)   /* 720: Even host parity */
+#define FE_MUX         (1<<28)   /* 720: Multiplexed bus */
+#define FE_EA          (1<<29)   /* 720: Enable Ack */
+
+#define FE_CACHE_SET   (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
+#define FE_SCSI_SET    (FE_WIDE|FE_ULTRA|FE_DBLR|FE_QUAD|F_CLK80)
+#define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
+};
+
+
+/*
+**     Driver setup structure.
+**
+**     This structure is initialized from linux config options.
+**     It can be overridden at boot-up by the boot command line.
+*/
+#define SCSI_NCR_MAX_EXCLUDES 8
+struct ncr_driver_setup {
+       u8      master_parity;
+       u8      scsi_parity;
+       u8      disconnection;
+       u8      special_features;
+       u8      force_sync_nego;
+       u8      reverse_probe;
+       u8      pci_fix_up;
+       u8      use_nvram;
+       u8      verbose;
+       u8      default_tags;
+       u16     default_sync;
+       u16     debug;
+       u8      burst_max;
+       u8      led_pin;
+       u8      max_wide;
+       u8      settle_delay;
+       u8      diff_support;
+       u8      irqm;
+       u8      bus_check;
+       u8      optimize;
+       u8      recovery;
+       u8      host_id;
+       u16     iarb;
+       u32     excludes[SCSI_NCR_MAX_EXCLUDES];
+       char    tag_ctrl[100];
+};
+
+/*
+**     Initial setup.
+**     Can be overriden at startup by a command line.
+*/
+#define SCSI_NCR_DRIVER_SETUP                  \
+{                                              \
+       SCSI_NCR_SETUP_MASTER_PARITY,           \
+       SCSI_NCR_SETUP_SCSI_PARITY,             \
+       SCSI_NCR_SETUP_DISCONNECTION,           \
+       SCSI_NCR_SETUP_SPECIAL_FEATURES,        \
+       SCSI_NCR_SETUP_FORCE_SYNC_NEGO,         \
+       0,                                      \
+       0,                                      \
+       1,                                      \
+       0,                                      \
+       SCSI_NCR_SETUP_DEFAULT_TAGS,            \
+       SCSI_NCR_SETUP_DEFAULT_SYNC,            \
+       0x00,                                   \
+       7,                                      \
+       0,                                      \
+       1,                                      \
+       SCSI_NCR_SETUP_SETTLE_TIME,             \
+       0,                                      \
+       0,                                      \
+       1,                                      \
+       0,                                      \
+       0,                                      \
+       255,                                    \
+       0x00                                    \
+}
+
+/*
+**     Boot fail safe setup.
+**     Override initial setup from boot command line:
+**     ncr53c8xx=safe:y
+*/
+#define SCSI_NCR_DRIVER_SAFE_SETUP             \
+{                                              \
+       0,                                      \
+       1,                                      \
+       0,                                      \
+       0,                                      \
+       0,                                      \
+       0,                                      \
+       0,                                      \
+       1,                                      \
+       2,                                      \
+       0,                                      \
+       255,                                    \
+       0x00,                                   \
+       255,                                    \
+       0,                                      \
+       0,                                      \
+       10,                                     \
+       1,                                      \
+       1,                                      \
+       1,                                      \
+       0,                                      \
+       0,                                      \
+       255                                     \
+}
+
+/**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/
+
+/*-----------------------------------------------------------------
+**
+**     The ncr 53c810 register structure.
+**
+**-----------------------------------------------------------------
+*/
+
+struct ncr_reg {
+/*00*/  u8     nc_scntl0;    /* full arb., ena parity, par->ATN  */
+
+/*01*/  u8     nc_scntl1;    /* no reset                         */
+        #define   ISCON   0x10  /* connected to scsi               */
+        #define   CRST    0x08  /* force reset                      */
+        #define   IARB    0x02  /* immediate arbitration            */
+
+/*02*/  u8     nc_scntl2;    /* no disconnect expected           */
+       #define   SDU     0x80  /* cmd: disconnect will raise error */
+       #define   CHM     0x40  /* sta: chained mode                */
+       #define   WSS     0x08  /* sta: wide scsi send           [W]*/
+       #define   WSR     0x01  /* sta: wide scsi received       [W]*/
+
+/*03*/  u8     nc_scntl3;    /* cnf system clock dependent       */
+       #define   EWS     0x08  /* cmd: enable wide scsi         [W]*/
+       #define   ULTRA   0x80  /* cmd: ULTRA enable                */
+                               /* bits 0-2, 7 rsvd for C1010       */
+
+/*04*/  u8     nc_scid;        /* cnf host adapter scsi address    */
+       #define   RRE     0x40  /* r/w:e enable response to resel.  */
+       #define   SRE     0x20  /* r/w:e enable response to select  */
+
+/*05*/  u8     nc_sxfer;       /* ### Sync speed and count         */
+                               /* bits 6-7 rsvd for C1010          */
+
+/*06*/  u8     nc_sdid;        /* ### Destination-ID               */
+
+/*07*/  u8     nc_gpreg;       /* ??? IO-Pins                      */
+
+/*08*/  u8     nc_sfbr;        /* ### First byte in phase          */
+
+/*09*/  u8     nc_socl;
+       #define   CREQ    0x80  /* r/w: SCSI-REQ                    */
+       #define   CACK    0x40  /* r/w: SCSI-ACK                    */
+       #define   CBSY    0x20  /* r/w: SCSI-BSY                    */
+       #define   CSEL    0x10  /* r/w: SCSI-SEL                    */
+       #define   CATN    0x08  /* r/w: SCSI-ATN                    */
+       #define   CMSG    0x04  /* r/w: SCSI-MSG                    */
+       #define   CC_D    0x02  /* r/w: SCSI-C_D                    */
+       #define   CI_O    0x01  /* r/w: SCSI-I_O                    */
+
+/*0a*/  u8     nc_ssid;
+
+/*0b*/  u8     nc_sbcl;
+
+/*0c*/  u8     nc_dstat;
+        #define   DFE     0x80  /* sta: dma fifo empty              */
+        #define   MDPE    0x40  /* int: master data parity error    */
+        #define   BF      0x20  /* int: script: bus fault           */
+        #define   ABRT    0x10  /* int: script: command aborted     */
+        #define   SSI     0x08  /* int: script: single step         */
+        #define   SIR     0x04  /* int: script: interrupt instruct. */
+        #define   IID     0x01  /* int: script: illegal instruct.   */
+
+/*0d*/  u8     nc_sstat0;
+        #define   ILF     0x80  /* sta: data in SIDL register lsb   */
+        #define   ORF     0x40  /* sta: data in SODR register lsb   */
+        #define   OLF     0x20  /* sta: data in SODL register lsb   */
+        #define   AIP     0x10  /* sta: arbitration in progress     */
+        #define   LOA     0x08  /* sta: arbitration lost            */
+        #define   WOA     0x04  /* sta: arbitration won             */
+        #define   IRST    0x02  /* sta: scsi reset signal           */
+        #define   SDP     0x01  /* sta: scsi parity signal          */
+
+/*0e*/  u8     nc_sstat1;
+       #define   FF3210  0xf0  /* sta: bytes in the scsi fifo      */
+
+/*0f*/  u8     nc_sstat2;
+        #define   ILF1    0x80  /* sta: data in SIDL register msb[W]*/
+        #define   ORF1    0x40  /* sta: data in SODR register msb[W]*/
+        #define   OLF1    0x20  /* sta: data in SODL register msb[W]*/
+        #define   DM      0x04  /* sta: DIFFSENS mismatch (895/6 only) */
+        #define   LDSC    0x02  /* sta: disconnect & reconnect      */
+
+/*10*/  u8     nc_dsa; /* --> Base page                    */
+/*11*/  u8     nc_dsa1;
+/*12*/  u8     nc_dsa2;
+/*13*/  u8     nc_dsa3;
+
+/*14*/  u8     nc_istat;       /* --> Main Command and status      */
+        #define   CABRT   0x80  /* cmd: abort current operation     */
+        #define   SRST    0x40  /* mod: reset chip                  */
+        #define   SIGP    0x20  /* r/w: message from host to ncr    */
+        #define   SEM     0x10  /* r/w: message between host + ncr  */
+        #define   CON     0x08  /* sta: connected to scsi           */
+        #define   INTF    0x04  /* sta: int on the fly (reset by wr)*/
+        #define   SIP     0x02  /* sta: scsi-interrupt              */
+        #define   DIP     0x01  /* sta: host/script interrupt       */
+
+/*15*/  u8     nc_istat1;      /* 896 and later cores only */
+        #define   FLSH    0x04  /* sta: chip is flushing            */
+        #define   SRUN    0x02  /* sta: scripts are running         */
+        #define   SIRQD   0x01  /* r/w: disable INT pin             */
+
+/*16*/  u8     nc_mbox0;       /* 896 and later cores only */
+/*17*/  u8     nc_mbox1;       /* 896 and later cores only */
+
+/*18*/ u8      nc_ctest0;
+       #define   EHP     0x04  /* 720 even host parity             */
+/*19*/  u8     nc_ctest1;
+
+/*1a*/  u8     nc_ctest2;
+       #define   CSIGP   0x40
+                               /* bits 0-2,7 rsvd for C1010        */
+
+/*1b*/  u8     nc_ctest3;
+       #define   FLF     0x08  /* cmd: flush dma fifo              */
+       #define   CLF     0x04  /* cmd: clear dma fifo              */
+       #define   FM      0x02  /* mod: fetch pin mode              */
+       #define   WRIE    0x01  /* mod: write and invalidate enable */
+                               /* bits 4-7 rsvd for C1010          */
+
+/*1c*/  u32    nc_temp;        /* ### Temporary stack              */
+
+/*20*/ u8      nc_dfifo;
+/*21*/  u8     nc_ctest4;
+       #define   MUX     0x80  /* 720 host bus multiplex mode      */
+       #define   BDIS    0x80  /* mod: burst disable               */
+       #define   MPEE    0x08  /* mod: master parity error enable  */
+
+/*22*/  u8     nc_ctest5;
+       #define   DFS     0x20  /* mod: dma fifo size               */
+                               /* bits 0-1, 3-7 rsvd for C1010          */
+/*23*/  u8     nc_ctest6;
+
+/*24*/  u32    nc_dbc; /* ### Byte count and command       */
+/*28*/  u32    nc_dnad;        /* ### Next command register        */
+/*2c*/  u32    nc_dsp; /* --> Script Pointer               */
+/*30*/  u32    nc_dsps;        /* --> Script pointer save/opcode#2 */
+
+/*34*/  u8     nc_scratcha;  /* Temporary register a            */
+/*35*/  u8     nc_scratcha1;
+/*36*/  u8     nc_scratcha2;
+/*37*/  u8     nc_scratcha3;
+
+/*38*/  u8     nc_dmode;
+       #define   BL_2    0x80  /* mod: burst length shift value +2 */
+       #define   BL_1    0x40  /* mod: burst length shift value +1 */
+       #define   ERL     0x08  /* mod: enable read line            */
+       #define   ERMP    0x04  /* mod: enable read multiple        */
+       #define   BOF     0x02  /* mod: burst op code fetch         */
+
+/*39*/  u8     nc_dien;
+/*3a*/  u8     nc_sbr;
+
+/*3b*/  u8     nc_dcntl;       /* --> Script execution control     */
+       #define   CLSE    0x80  /* mod: cache line size enable      */
+       #define   PFF     0x40  /* cmd: pre-fetch flush             */
+       #define   PFEN    0x20  /* mod: pre-fetch enable            */
+       #define   EA      0x20  /* mod: 720 enable-ack              */
+       #define   SSM     0x10  /* mod: single step mode            */
+       #define   IRQM    0x08  /* mod: irq mode (1 = totem pole !) */
+       #define   STD     0x04  /* cmd: start dma mode              */
+       #define   IRQD    0x02  /* mod: irq disable                 */
+       #define   NOCOM   0x01  /* cmd: protect sfbr while reselect */
+                               /* bits 0-1 rsvd for C1010          */
+
+/*3c*/  u32    nc_adder;
+
+/*40*/  u16    nc_sien;        /* -->: interrupt enable            */
+/*42*/  u16    nc_sist;        /* <--: interrupt status            */
+        #define   SBMC    0x1000/* sta: SCSI Bus Mode Change (895/6 only) */
+        #define   STO     0x0400/* sta: timeout (select)            */
+        #define   GEN     0x0200/* sta: timeout (general)           */
+        #define   HTH     0x0100/* sta: timeout (handshake)         */
+        #define   MA      0x80  /* sta: phase mismatch              */
+        #define   CMP     0x40  /* sta: arbitration complete        */
+        #define   SEL     0x20  /* sta: selected by another device  */
+        #define   RSL     0x10  /* sta: reselected by another device*/
+        #define   SGE     0x08  /* sta: gross error (over/underflow)*/
+        #define   UDC     0x04  /* sta: unexpected disconnect       */
+        #define   RST     0x02  /* sta: scsi bus reset detected     */
+        #define   PAR     0x01  /* sta: scsi parity error           */
+
+/*44*/  u8     nc_slpar;
+/*45*/  u8     nc_swide;
+/*46*/  u8     nc_macntl;
+/*47*/  u8     nc_gpcntl;
+/*48*/  u8     nc_stime0;    /* cmd: timeout for select&handshake*/
+/*49*/  u8     nc_stime1;    /* cmd: timeout user defined        */
+/*4a*/  u16   nc_respid;    /* sta: Reselect-IDs                */
+
+/*4c*/  u8     nc_stest0;
+
+/*4d*/  u8     nc_stest1;
+       #define   SCLK    0x80  /* Use the PCI clock as SCSI clock      */
+       #define   DBLEN   0x08  /* clock doubler running                */
+       #define   DBLSEL  0x04  /* clock doubler selected               */
+  
+
+/*4e*/  u8     nc_stest2;
+       #define   ROF     0x40  /* reset scsi offset (after gross error!) */
+       #define   DIF     0x20  /* 720 SCSI differential mode             */
+       #define   EXT     0x02  /* extended filtering                     */
+
+/*4f*/  u8     nc_stest3;
+       #define   TE     0x80   /* c: tolerAnt enable */
+       #define   HSC    0x20   /* c: Halt SCSI Clock */
+       #define   CSF    0x02   /* c: clear scsi fifo */
+
+/*50*/  u16   nc_sidl; /* Lowlevel: latched from scsi data */
+/*52*/  u8     nc_stest4;
+       #define   SMODE  0xc0   /* SCSI bus mode      (895/6 only) */
+       #define    SMODE_HVD 0x40       /* High Voltage Differential       */
+       #define    SMODE_SE  0x80       /* Single Ended                    */
+       #define    SMODE_LVD 0xc0       /* Low Voltage Differential        */
+       #define   LCKFRQ 0x20   /* Frequency Lock (895/6 only)     */
+                               /* bits 0-5 rsvd for C1010          */
+
+/*53*/  u8     nc_53_;
+/*54*/  u16    nc_sodl;        /* Lowlevel: data out to scsi data  */
+/*56*/ u8      nc_ccntl0;      /* Chip Control 0 (896)             */
+       #define   ENPMJ  0x80   /* Enable Phase Mismatch Jump       */
+       #define   PMJCTL 0x40   /* Phase Mismatch Jump Control      */
+       #define   ENNDJ  0x20   /* Enable Non Data PM Jump          */
+       #define   DISFC  0x10   /* Disable Auto FIFO Clear          */
+       #define   DILS   0x02   /* Disable Internal Load/Store      */
+       #define   DPR    0x01   /* Disable Pipe Req                 */
+
+/*57*/ u8      nc_ccntl1;      /* Chip Control 1 (896)             */
+       #define   ZMOD   0x80   /* High Impedance Mode              */
+       #define   DIC    0x10   /* Disable Internal Cycles          */
+       #define   DDAC   0x08   /* Disable Dual Address Cycle       */
+       #define   XTIMOD 0x04   /* 64-bit Table Ind. Indexing Mode  */
+       #define   EXTIBMV 0x02  /* Enable 64-bit Table Ind. BMOV    */
+       #define   EXDBMV 0x01   /* Enable 64-bit Direct BMOV        */
+
+/*58*/  u16    nc_sbdl;        /* Lowlevel: data from scsi data    */
+/*5a*/  u16    nc_5a_;
+
+/*5c*/  u8     nc_scr0;        /* Working register B               */
+/*5d*/  u8     nc_scr1;        /*                                  */
+/*5e*/  u8     nc_scr2;        /*                                  */
+/*5f*/  u8     nc_scr3;        /*                                  */
+
+/*60*/  u8     nc_scrx[64];    /* Working register C-R             */
+/*a0*/ u32     nc_mmrs;        /* Memory Move Read Selector        */
+/*a4*/ u32     nc_mmws;        /* Memory Move Write Selector       */
+/*a8*/ u32     nc_sfs;         /* Script Fetch Selector            */
+/*ac*/ u32     nc_drs;         /* DSA Relative Selector            */
+/*b0*/ u32     nc_sbms;        /* Static Block Move Selector       */
+/*b4*/ u32     nc_dbms;        /* Dynamic Block Move Selector      */
+/*b8*/ u32     nc_dnad64;      /* DMA Next Address 64              */
+/*bc*/ u16     nc_scntl4;      /* C1010 only                       */
+       #define   U3EN   0x80   /* Enable Ultra 3                   */
+       #define   AIPEN  0x40   /* Allow check upper byte lanes     */
+       #define   XCLKH_DT 0x08 /* Extra clock of data hold on DT
+                                       transfer edge               */
+       #define   XCLKH_ST 0x04 /* Extra clock of data hold on ST
+                                       transfer edge               */
+
+/*be*/  u8     nc_aipcntl0;    /* Epat Control 1 C1010 only        */
+/*bf*/  u8     nc_aipcntl1;    /* AIP Control C1010_66 Only        */
+
+/*c0*/ u32     nc_pmjad1;      /* Phase Mismatch Jump Address 1    */
+/*c4*/ u32     nc_pmjad2;      /* Phase Mismatch Jump Address 2    */
+/*c8*/ u8      nc_rbc;         /* Remaining Byte Count             */
+/*c9*/ u8      nc_rbc1;        /*                                  */
+/*ca*/ u8      nc_rbc2;        /*                                  */
+/*cb*/ u8      nc_rbc3;        /*                                  */
+
+/*cc*/ u8      nc_ua;          /* Updated Address                  */
+/*cd*/ u8      nc_ua1;         /*                                  */
+/*ce*/ u8      nc_ua2;         /*                                  */
+/*cf*/ u8      nc_ua3;         /*                                  */
+/*d0*/ u32     nc_esa;         /* Entry Storage Address            */
+/*d4*/ u8      nc_ia;          /* Instruction Address              */
+/*d5*/ u8      nc_ia1;
+/*d6*/ u8      nc_ia2;
+/*d7*/ u8      nc_ia3;
+/*d8*/ u32     nc_sbc;         /* SCSI Byte Count (3 bytes only)   */
+/*dc*/ u32     nc_csbc;        /* Cumulative SCSI Byte Count       */
+
+                               /* Following for C1010 only         */
+/*e0*/  u16    nc_crcpad;      /* CRC Value                        */
+/*e2*/  u8     nc_crccntl0;    /* CRC control register             */
+       #define   SNDCRC  0x10  /* Send CRC Request                 */
+/*e3*/  u8     nc_crccntl1;    /* CRC control register             */
+/*e4*/  u32    nc_crcdata;     /* CRC data register                */ 
+/*e8*/  u32    nc_e8_;         /* rsvd                             */
+/*ec*/  u32    nc_ec_;         /* rsvd                             */
+/*f0*/  u16    nc_dfbc;        /* DMA FIFO byte count              */ 
+
+};
+
+/*-----------------------------------------------------------
+**
+**     Utility macros for the script.
+**
+**-----------------------------------------------------------
+*/
+
+#define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
+#define REG(r) REGJ (nc_, r)
+
+typedef u32 ncrcmd;
+
+/*-----------------------------------------------------------
+**
+**     SCSI phases
+**
+**     DT phases illegal for ncr driver.
+**
+**-----------------------------------------------------------
+*/
+
+#define        SCR_DATA_OUT    0x00000000
+#define        SCR_DATA_IN     0x01000000
+#define        SCR_COMMAND     0x02000000
+#define        SCR_STATUS      0x03000000
+#define SCR_DT_DATA_OUT        0x04000000
+#define SCR_DT_DATA_IN 0x05000000
+#define SCR_MSG_OUT    0x06000000
+#define SCR_MSG_IN      0x07000000
+
+#define SCR_ILG_OUT    0x04000000
+#define SCR_ILG_IN     0x05000000
+
+/*-----------------------------------------------------------
+**
+**     Data transfer via SCSI.
+**
+**-----------------------------------------------------------
+**
+**     MOVE_ABS (LEN)
+**     <<start address>>
+**
+**     MOVE_IND (LEN)
+**     <<dnad_offset>>
+**
+**     MOVE_TBL
+**     <<dnad_offset>>
+**
+**-----------------------------------------------------------
+*/
+
+#define OPC_MOVE          0x08000000
+
+#define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l))
+#define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l))
+#define SCR_MOVE_TBL     (0x10000000 | OPC_MOVE)
+
+#define SCR_CHMOV_ABS(l) ((0x00000000) | (l))
+#define SCR_CHMOV_IND(l) ((0x20000000) | (l))
+#define SCR_CHMOV_TBL     (0x10000000)
+
+struct scr_tblmove {
+        u32  size;
+        u32  addr;
+};
+
+/*-----------------------------------------------------------
+**
+**     Selection
+**
+**-----------------------------------------------------------
+**
+**     SEL_ABS | SCR_ID (0..15)    [ | REL_JMP]
+**     <<alternate_address>>
+**
+**     SEL_TBL | << dnad_offset>>  [ | REL_JMP]
+**     <<alternate_address>>
+**
+**-----------------------------------------------------------
+*/
+
+#define        SCR_SEL_ABS     0x40000000
+#define        SCR_SEL_ABS_ATN 0x41000000
+#define        SCR_SEL_TBL     0x42000000
+#define        SCR_SEL_TBL_ATN 0x43000000
+
+
+#ifdef SCSI_NCR_BIG_ENDIAN
+struct scr_tblsel {
+        u8     sel_scntl3;
+        u8     sel_id;
+        u8     sel_sxfer;
+        u8     sel_scntl4;     
+};
+#else
+struct scr_tblsel {
+        u8     sel_scntl4;     
+        u8     sel_sxfer;
+        u8     sel_id;
+        u8     sel_scntl3;
+};
+#endif
+
+#define SCR_JMP_REL     0x04000000
+#define SCR_ID(id)     (((u32)(id)) << 16)
+
+/*-----------------------------------------------------------
+**
+**     Waiting for Disconnect or Reselect
+**
+**-----------------------------------------------------------
+**
+**     WAIT_DISC
+**     dummy: <<alternate_address>>
+**
+**     WAIT_RESEL
+**     <<alternate_address>>
+**
+**-----------------------------------------------------------
+*/
+
+#define        SCR_WAIT_DISC   0x48000000
+#define SCR_WAIT_RESEL  0x50000000
+
+/*-----------------------------------------------------------
+**
+**     Bit Set / Reset
+**
+**-----------------------------------------------------------
+**
+**     SET (flags {|.. })
+**
+**     CLR (flags {|.. })
+**
+**-----------------------------------------------------------
+*/
+
+#define SCR_SET(f)     (0x58000000 | (f))
+#define SCR_CLR(f)     (0x60000000 | (f))
+
+#define        SCR_CARRY       0x00000400
+#define        SCR_TRG         0x00000200
+#define        SCR_ACK         0x00000040
+#define        SCR_ATN         0x00000008
+
+
+
+
+/*-----------------------------------------------------------
+**
+**     Memory to memory move
+**
+**-----------------------------------------------------------
+**
+**     COPY (bytecount)
+**     << source_address >>
+**     << destination_address >>
+**
+**     SCR_COPY   sets the NO FLUSH option by default.
+**     SCR_COPY_F does not set this option.
+**
+**     For chips which do not support this option,
+**     ncr_copy_and_bind() will remove this bit.
+**-----------------------------------------------------------
+*/
+
+#define SCR_NO_FLUSH 0x01000000
+
+#define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
+#define SCR_COPY_F(n) (0xc0000000 | (n))
+
+/*-----------------------------------------------------------
+**
+**     Register move and binary operations
+**
+**-----------------------------------------------------------
+**
+**     SFBR_REG (reg, op, data)        reg  = SFBR op data
+**     << 0 >>
+**
+**     REG_SFBR (reg, op, data)        SFBR = reg op data
+**     << 0 >>
+**
+**     REG_REG  (reg, op, data)        reg  = reg op data
+**     << 0 >>
+**
+**-----------------------------------------------------------
+**     On 810A, 860, 825A, 875, 895 and 896 chips the content 
+**     of SFBR register can be used as data (SCR_SFBR_DATA).
+**     The 896 has additionnal IO registers starting at 
+**     offset 0x80. Bit 7 of register offset is stored in 
+**     bit 7 of the SCRIPTS instruction first DWORD.
+**-----------------------------------------------------------
+*/
+
+#define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80)) 
+
+#define SCR_SFBR_REG(reg,op,data) \
+        (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
+
+#define SCR_REG_SFBR(reg,op,data) \
+        (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
+
+#define SCR_REG_REG(reg,op,data) \
+        (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
+
+
+#define      SCR_LOAD   0x00000000
+#define      SCR_SHL    0x01000000
+#define      SCR_OR     0x02000000
+#define      SCR_XOR    0x03000000
+#define      SCR_AND    0x04000000
+#define      SCR_SHR    0x05000000
+#define      SCR_ADD    0x06000000
+#define      SCR_ADDC   0x07000000
+
+#define      SCR_SFBR_DATA   (0x00800000>>8ul) /* Use SFBR as data */
+
+/*-----------------------------------------------------------
+**
+**     FROM_REG (reg)            SFBR = reg
+**     << 0 >>
+**
+**     TO_REG   (reg)            reg  = SFBR
+**     << 0 >>
+**
+**     LOAD_REG (reg, data)      reg  = <data>
+**     << 0 >>
+**
+**     LOAD_SFBR(data)           SFBR = <data>
+**     << 0 >>
+**
+**-----------------------------------------------------------
+*/
+
+#define        SCR_FROM_REG(reg) \
+       SCR_REG_SFBR(reg,SCR_OR,0)
+
+#define        SCR_TO_REG(reg) \
+       SCR_SFBR_REG(reg,SCR_OR,0)
+
+#define        SCR_LOAD_REG(reg,data) \
+       SCR_REG_REG(reg,SCR_LOAD,data)
+
+#define SCR_LOAD_SFBR(data) \
+        (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
+
+/*-----------------------------------------------------------
+**
+**     LOAD  from memory   to register.
+**     STORE from register to memory.
+**
+**     Only supported by 810A, 860, 825A, 875, 895 and 896.
+**
+**-----------------------------------------------------------
+**
+**     LOAD_ABS (LEN)
+**     <<start address>>
+**
+**     LOAD_REL (LEN)        (DSA relative)
+**     <<dsa_offset>>
+**
+**-----------------------------------------------------------
+*/
+
+#define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul)
+#define SCR_NO_FLUSH2  0x02000000
+#define SCR_DSA_REL2   0x10000000
+
+#define SCR_LOAD_R(reg, how, n) \
+        (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
+
+#define SCR_STORE_R(reg, how, n) \
+        (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
+
+#define SCR_LOAD_ABS(reg, n)   SCR_LOAD_R(reg, SCR_NO_FLUSH2, n)
+#define SCR_LOAD_REL(reg, n)   SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n)
+#define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n)
+#define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n)
+
+#define SCR_STORE_ABS(reg, n)  SCR_STORE_R(reg, SCR_NO_FLUSH2, n)
+#define SCR_STORE_REL(reg, n)  SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n)
+#define SCR_STORE_ABS_F(reg, n)        SCR_STORE_R(reg, 0, n)
+#define SCR_STORE_REL_F(reg, n)        SCR_STORE_R(reg, SCR_DSA_REL2, n)
+
+
+/*-----------------------------------------------------------
+**
+**     Waiting for Disconnect or Reselect
+**
+**-----------------------------------------------------------
+**
+**     JUMP            [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<address>>
+**
+**     JUMPR           [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<distance>>
+**
+**     CALL            [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<address>>
+**
+**     CALLR           [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<distance>>
+**
+**     RETURN          [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<dummy>>
+**
+**     INT             [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<ident>>
+**
+**     INT_FLY         [ | IFTRUE/IFFALSE ( ... ) ]
+**     <<ident>>
+**
+**     Conditions:
+**          WHEN (phase)
+**          IF   (phase)
+**          CARRYSET
+**          DATA (data, mask)
+**
+**-----------------------------------------------------------
+*/
+
+#define SCR_NO_OP       0x80000000
+#define SCR_JUMP        0x80080000
+#define SCR_JUMP64      0x80480000
+#define SCR_JUMPR       0x80880000
+#define SCR_CALL        0x88080000
+#define SCR_CALLR       0x88880000
+#define SCR_RETURN      0x90080000
+#define SCR_INT         0x98080000
+#define SCR_INT_FLY     0x98180000
+
+#define IFFALSE(arg)   (0x00080000 | (arg))
+#define IFTRUE(arg)    (0x00000000 | (arg))
+
+#define WHEN(phase)    (0x00030000 | (phase))
+#define IF(phase)      (0x00020000 | (phase))
+
+#define DATA(D)        (0x00040000 | ((D) & 0xff))
+#define MASK(D,M)      (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
+
+#define CARRYSET       (0x00200000)
+
+/*-----------------------------------------------------------
+**
+**     SCSI  constants.
+**
+**-----------------------------------------------------------
+*/
+
+/*
+**     Messages
+*/
+
+#define        M_COMPLETE      COMMAND_COMPLETE
+#define        M_EXTENDED      EXTENDED_MESSAGE
+#define        M_SAVE_DP       SAVE_POINTERS
+#define        M_RESTORE_DP    RESTORE_POINTERS
+#define        M_DISCONNECT    DISCONNECT
+#define        M_ID_ERROR      INITIATOR_ERROR
+#define        M_ABORT         ABORT_TASK_SET
+#define        M_REJECT        MESSAGE_REJECT
+#define        M_NOOP          NOP
+#define        M_PARITY        MSG_PARITY_ERROR
+#define        M_LCOMPLETE     LINKED_CMD_COMPLETE
+#define        M_FCOMPLETE     LINKED_FLG_CMD_COMPLETE
+#define        M_RESET         TARGET_RESET
+#define        M_ABORT_TAG     ABORT_TASK
+#define        M_CLEAR_QUEUE   CLEAR_TASK_SET
+#define        M_INIT_REC      INITIATE_RECOVERY
+#define        M_REL_REC       RELEASE_RECOVERY
+#define        M_TERMINATE     (0x11)
+#define        M_SIMPLE_TAG    SIMPLE_QUEUE_TAG
+#define        M_HEAD_TAG      HEAD_OF_QUEUE_TAG
+#define        M_ORDERED_TAG   ORDERED_QUEUE_TAG
+#define        M_IGN_RESIDUE   IGNORE_WIDE_RESIDUE
+#define        M_IDENTIFY      (0x80)
+
+#define        M_X_MODIFY_DP   EXTENDED_MODIFY_DATA_POINTER
+#define        M_X_SYNC_REQ    EXTENDED_SDTR
+#define        M_X_WIDE_REQ    EXTENDED_WDTR
+#define        M_X_PPR_REQ     EXTENDED_PPR
+
+/*
+**     Status
+*/
+
+#define        S_GOOD          (0x00)
+#define        S_CHECK_COND    (0x02)
+#define        S_COND_MET      (0x04)
+#define        S_BUSY          (0x08)
+#define        S_INT           (0x10)
+#define        S_INT_COND_MET  (0x14)
+#define        S_CONFLICT      (0x18)
+#define        S_TERMINATED    (0x20)
+#define        S_QUEUE_FULL    (0x28)
+#define        S_ILLEGAL       (0xff)
+#define        S_SENSE         (0x80)
+
+/*
+ * End of ncrreg from FreeBSD
+ */
 
 /*
        Build a scatter/gather entry.
index f557f17ca00ce76fba678a9ba7028310a31edfa9..e8df0c9ec1e646992c5e3354d04868da4dba2d3f 100644 (file)
@@ -464,14 +464,12 @@ static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set)
                        continue;
                qc = ata_qc_from_tag(ap, ap->active_tag);
                if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
-                       unsigned int err_mask = 0;
-
                        if ((status & (aPERR | aPSD | aUIRQ)))
-                               err_mask = AC_ERR_OTHER;
+                               qc->err_mask |= AC_ERR_OTHER;
                        else if (pp->pkt[0] != cDONE)
-                               err_mask = AC_ERR_OTHER;
+                               qc->err_mask |= AC_ERR_OTHER;
 
-                       ata_qc_complete(qc, err_mask);
+                       ata_qc_complete(qc);
                }
        }
        return handled;
@@ -501,7 +499,8 @@ static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set)
                
                                /* complete taskfile transaction */
                                pp->state = adma_state_idle;
-                               ata_qc_complete(qc, ac_err_mask(status));
+                               qc->err_mask |= ac_err_mask(status);
+                               ata_qc_complete(qc);
                                handled = 1;
                        }
                }
index c1c1c687bcbd2cbf37f60b933c364c0910c688ec..5205c4e7d6fffb84c5608b2d687c195831322694 100644 (file)
@@ -1,55 +1,70 @@
 config SCSI_QLA2XXX
-       tristate
-       default (SCSI && PCI)
-       depends on SCSI && PCI
+       tristate "QLogic QLA2XXX Fibre Channel Support"
+       depends on PCI && SCSI
+       select SCSI_FC_ATTRS
+       select FW_LOADER
+       ---help---
+       This qla2xxx driver supports all QLogic Fibre Channel
+       PCI and PCIe host adapters.
 
-config SCSI_QLA21XX
-       tristate "QLogic ISP2100 host adapter family support"
+       By default, firmware for the ISP parts will be loaded
+       via the Firmware Loader interface.
+
+       ISP             Firmware Filename
+       ----------      -----------------
+       21xx            ql2100_fw.bin
+       22xx            ql2200_fw.bin
+       2300, 2312      ql2300_fw.bin
+       2322            ql2322_fw.bin
+       6312, 6322      ql6312_fw.bin
+       24xx            ql2400_fw.bin
+
+       Upon request, the driver caches the firmware image until
+       the driver is unloaded.
+
+       NOTE: The original method of building firmware-loader
+       modules has been deprecated as the firmware-images will
+       be removed from the kernel sources.
+
+config SCSI_QLA2XXX_EMBEDDED_FIRMWARE
+       bool "  Use firmware-loader modules (DEPRECATED)"
        depends on SCSI_QLA2XXX
-        select SCSI_FC_ATTRS
-       select FW_LOADER
+
+config SCSI_QLA21XX
+       tristate "  Build QLogic ISP2100 firmware-module"
+       depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE
        ---help---
        This driver supports the QLogic 21xx (ISP2100) host adapter family.
 
 config SCSI_QLA22XX
-       tristate "QLogic ISP2200 host adapter family support"
-       depends on SCSI_QLA2XXX
-        select SCSI_FC_ATTRS
-       select FW_LOADER
+       tristate "  Build QLogic ISP2200 firmware-module"
+       depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE
        ---help---
        This driver supports the QLogic 22xx (ISP2200) host adapter family.
 
 config SCSI_QLA2300
-       tristate "QLogic ISP2300 host adapter family support"
-       depends on SCSI_QLA2XXX
-        select SCSI_FC_ATTRS
-       select FW_LOADER
+       tristate "  Build QLogic ISP2300 firmware-module"
+       depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE
        ---help---
        This driver supports the QLogic 2300 (ISP2300 and ISP2312) host
        adapter family.
 
 config SCSI_QLA2322
-       tristate "QLogic ISP2322 host adapter family support"
-       depends on SCSI_QLA2XXX
-        select SCSI_FC_ATTRS
-       select FW_LOADER
+       tristate "  Build QLogic ISP2322 firmware-module"
+       depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE
        ---help---
        This driver supports the QLogic 2322 (ISP2322) host adapter family.
 
 config SCSI_QLA6312
-       tristate "QLogic ISP63xx host adapter family support"
-       depends on SCSI_QLA2XXX
-        select SCSI_FC_ATTRS
-       select FW_LOADER
+       tristate "  Build QLogic ISP63xx firmware-module"
+       depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE
        ---help---
        This driver supports the QLogic 63xx (ISP6312 and ISP6322) host
        adapter family.
 
 config SCSI_QLA24XX
-       tristate "QLogic ISP24xx host adapter family support"
-       depends on SCSI_QLA2XXX
-       select SCSI_FC_ATTRS
-       select FW_LOADER
+       tristate "  Build QLogic ISP24xx firmware-module"
+       depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE
        ---help---
        This driver supports the QLogic 24xx (ISP2422 and ISP2432) host
        adapter family.
index b169687d08ff4d01145a4879f3fdb5f5eb41f18e..40c0de1258897966413cad237debe24377769aa7 100644 (file)
@@ -3,15 +3,18 @@ EXTRA_CFLAGS += -DUNIQUE_FW_NAME
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
                qla_dbg.o qla_sup.o qla_rscn.o qla_attr.o
 
+obj-$(CONFIG_SCSI_QLA2XXX) += qla2xxx.o
+
 qla2100-y := ql2100.o ql2100_fw.o
 qla2200-y := ql2200.o ql2200_fw.o
 qla2300-y := ql2300.o ql2300_fw.o
 qla2322-y := ql2322.o ql2322_fw.o
 qla6312-y := ql6312.o ql6312_fw.o
+qla2400-y := ql2400.o ql2400_fw.o
 
 obj-$(CONFIG_SCSI_QLA21XX) += qla2xxx.o qla2100.o
 obj-$(CONFIG_SCSI_QLA22XX) += qla2xxx.o qla2200.o
 obj-$(CONFIG_SCSI_QLA2300) += qla2xxx.o qla2300.o
 obj-$(CONFIG_SCSI_QLA2322) += qla2xxx.o qla2322.o
 obj-$(CONFIG_SCSI_QLA6312) += qla2xxx.o qla6312.o
-obj-$(CONFIG_SCSI_QLA24XX) += qla2xxx.o
+obj-$(CONFIG_SCSI_QLA24XX) += qla2xxx.o qla2400.o
diff --git a/drivers/scsi/qla2xxx/ql2400.c b/drivers/scsi/qla2xxx/ql2400.c
new file mode 100644 (file)
index 0000000..6c7165f
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2005 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+
+#include "qla_def.h"
+
+static char qla_driver_name[] = "qla2400";
+
+extern uint32_t fw2400_version_str[];
+extern uint32_t fw2400_addr01;
+extern uint32_t fw2400_code01[];
+extern uint32_t fw2400_length01;
+extern uint32_t fw2400_addr02;
+extern uint32_t fw2400_code02[];
+extern uint32_t fw2400_length02;
+
+static struct qla_fw_info qla_fw_tbl[] = {
+       {
+               .addressing     = FW_INFO_ADDR_EXTENDED,
+               .fwcode         = (unsigned short *)&fw2400_code01[0],
+               .fwlen          = (unsigned short *)&fw2400_length01,
+               .lfwstart       = (unsigned long *)&fw2400_addr01,
+       },
+       {
+               .addressing     = FW_INFO_ADDR_EXTENDED,
+               .fwcode         = (unsigned short *)&fw2400_code02[0],
+               .fwlen          = (unsigned short *)&fw2400_length02,
+               .lfwstart       = (unsigned long *)&fw2400_addr02,
+       },
+       { FW_INFO_ADDR_NOMORE, },
+};
+
+static struct qla_board_info qla_board_tbl[] = {
+       {
+               .drv_name       = qla_driver_name,
+               .isp_name       = "ISP2422",
+               .fw_info        = qla_fw_tbl,
+               .fw_fname       = "ql2400_fw.bin",
+       },
+       {
+               .drv_name       = qla_driver_name,
+               .isp_name       = "ISP2432",
+               .fw_info        = qla_fw_tbl,
+               .fw_fname       = "ql2400_fw.bin",
+       },
+};
+
+static struct pci_device_id qla24xx_pci_tbl[] = {
+       {
+               .vendor         = PCI_VENDOR_ID_QLOGIC,
+               .device         = PCI_DEVICE_ID_QLOGIC_ISP2422,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .driver_data    = (unsigned long)&qla_board_tbl[0],
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_QLOGIC,
+               .device         = PCI_DEVICE_ID_QLOGIC_ISP2432,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .driver_data    = (unsigned long)&qla_board_tbl[1],
+       },
+       {0, 0},
+};
+MODULE_DEVICE_TABLE(pci, qla24xx_pci_tbl);
+
+static int __devinit
+qla24xx_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       return qla2x00_probe_one(pdev,
+           (struct qla_board_info *)id->driver_data);
+}
+
+static void __devexit
+qla24xx_remove_one(struct pci_dev *pdev)
+{
+       qla2x00_remove_one(pdev);
+}
+
+static struct pci_driver qla24xx_pci_driver = {
+       .name           = "qla2400",
+       .id_table       = qla24xx_pci_tbl,
+       .probe          = qla24xx_probe_one,
+       .remove         = __devexit_p(qla24xx_remove_one),
+};
+
+static int __init
+qla24xx_init(void)
+{
+       return pci_module_init(&qla24xx_pci_driver);
+}
+
+static void __exit
+qla24xx_exit(void)
+{
+       pci_unregister_driver(&qla24xx_pci_driver);
+}
+
+module_init(qla24xx_init);
+module_exit(qla24xx_exit);
+
+MODULE_AUTHOR("QLogic Corporation");
+MODULE_DESCRIPTION("QLogic ISP24xx FC-SCSI Host Bus Adapter driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(QLA2XXX_VERSION);
diff --git a/drivers/scsi/qla2xxx/ql2400_fw.c b/drivers/scsi/qla2xxx/ql2400_fw.c
new file mode 100644 (file)
index 0000000..5977795
--- /dev/null
@@ -0,0 +1,12376 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2005 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+#include <linux/types.h>
+
+/*
+ *     Firmware Version 4.00.16 (08:09 Oct 26, 2005)
+ */
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_version = 4*1024+0;
+#else
+uint32_t risc_code_version = 4*1024+0;
+#endif
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_version_str[] = {4, 0,16};
+#else
+uint32_t firmware_version[] = {4, 0,16};
+#endif
+
+#ifdef UNIQUE_FW_NAME
+#define fw2400_VERSION_STRING "4.00.16"
+#else
+#define FW_VERSION_STRING "4.00.16"
+#endif
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_addr01 = 0x00100000 ;
+#else
+uint32_t risc_code_addr01 = 0x00100000 ;
+#endif
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_code01[] = {
+#else
+uint32_t risc_code01[] = {
+#endif
+       0x0401f17c, 0x0010e000, 0x00100000, 0x0000ab4a,
+       0x00000004, 0x00000000, 0x00000010, 0x00000002,
+       0x00000003, 0x00000000, 0x20434f50, 0x59524947,
+       0x48542032, 0x30303520, 0x514c4f47, 0x49432043,
+       0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350,
+       0x32347878, 0x20466972, 0x6d776172, 0x65202020,
+       0x56657273, 0x696f6e20, 0x342e302e, 0x31362020,
+       0x20202024, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x42001800, 0x0010014f, 0x42002000, 0x0010b8fe,
+       0x500c0800, 0x800c1800, 0x500c1000, 0x800c1800,
+       0x54042000, 0x80102000, 0x80040800, 0x80081040,
+       0x040207fc, 0x500c0800, 0x800409c0, 0x040207f6,
+       0x44002000, 0x80102000, 0x40100000, 0x44040000,
+       0x80000000, 0x44080000, 0x80000000, 0x440c0000,
+       0x80000000, 0x44100000, 0x80000000, 0x44140000,
+       0x80000000, 0x44180000, 0x80000000, 0x441c0000,
+       0x80000000, 0x44200000, 0x80000000, 0x44240000,
+       0x80000000, 0x44280000, 0x80000000, 0x442c0000,
+       0x80000000, 0x44300000, 0x80000000, 0x44340000,
+       0x80000000, 0x44380000, 0x80000000, 0x443c0000,
+       0x80000000, 0x44400000, 0x80000000, 0x44440000,
+       0x80000000, 0x44480000, 0x80000000, 0x444c0000,
+       0x80000000, 0x44500000, 0x80000000, 0x44540000,
+       0x80000000, 0x44580000, 0x80000000, 0x445c0000,
+       0x80000000, 0x44600000, 0x80000000, 0x44640000,
+       0x80000000, 0x44680000, 0x80000000, 0x446c0000,
+       0x80000000, 0x44700000, 0x80000000, 0x44740000,
+       0x80000000, 0x44780000, 0x80000000, 0x447c0000,
+       0x80000000, 0x44800000, 0x80000000, 0x44840000,
+       0x80000000, 0x44880000, 0x80000000, 0x448c0000,
+       0x80000000, 0x44900000, 0x80000000, 0x44940000,
+       0x80000000, 0x44980000, 0x80000000, 0x449c0000,
+       0x80000000, 0x44a00000, 0x80000000, 0x44a40000,
+       0x80000000, 0x44a80000, 0x80000000, 0x44ac0000,
+       0x80000000, 0x44b00000, 0x80000000, 0x44b40000,
+       0x80000000, 0x44b80000, 0x80000000, 0x44bc0000,
+       0x80000000, 0x44c00000, 0x80000000, 0x44c40000,
+       0x80000000, 0x44c80000, 0x80000000, 0x44cc0000,
+       0x80000000, 0x44d00000, 0x80000000, 0x44d80000,
+       0x80000000, 0x44d40000, 0x80000000, 0x44dc0000,
+       0x80000000, 0x44e00000, 0x80000000, 0x44e40000,
+       0x80000000, 0x44e80000, 0x80000000, 0x44ec0000,
+       0x80000000, 0x44f00000, 0x80000000, 0x44f40000,
+       0x80000000, 0x44f80000, 0x80000000, 0x44fc0000,
+       0x80000000, 0x45000000, 0x80000000, 0x45040000,
+       0x80000000, 0x45080000, 0x80000000, 0x450c0000,
+       0x80000000, 0x45100000, 0x80000000, 0x45140000,
+       0x80000000, 0x45180000, 0x80000000, 0x451c0000,
+       0x80000000, 0x45200000, 0x80000000, 0x45240000,
+       0x80000000, 0x45280000, 0x80000000, 0x452c0000,
+       0x80000000, 0x45300000, 0x80000000, 0x45340000,
+       0x80000000, 0x45380000, 0x80000000, 0x453c0000,
+       0x80000000, 0x45400000, 0x80000000, 0x45440000,
+       0x80000000, 0x45480000, 0x80000000, 0x454c0000,
+       0x80000000, 0x45500000, 0x80000000, 0x45540000,
+       0x80000000, 0x45580000, 0x80000000, 0x455c0000,
+       0x80000000, 0x45600000, 0x80000000, 0x45640000,
+       0x80000000, 0x45680000, 0x80000000, 0x456c0000,
+       0x80000000, 0x45700000, 0x80000000, 0x45740000,
+       0x80000000, 0x45780000, 0x80000000, 0x457c0000,
+       0x80000000, 0x45800000, 0x80000000, 0x45840000,
+       0x80000000, 0x45880000, 0x80000000, 0x458c0000,
+       0x80000000, 0x45900000, 0x80000000, 0x45940000,
+       0x80000000, 0x45980000, 0x80000000, 0x459c0000,
+       0x80000000, 0x45a00000, 0x80000000, 0x45a40000,
+       0x80000000, 0x45a80000, 0x80000000, 0x45ac0000,
+       0x80000000, 0x45b00000, 0x80000000, 0x45b40000,
+       0x80000000, 0x45b80000, 0x80000000, 0x45bc0000,
+       0x80000000, 0x45c00000, 0x80000000, 0x45c40000,
+       0x80000000, 0x45c80000, 0x80000000, 0x45cc0000,
+       0x80000000, 0x45d00000, 0x80000000, 0x45d40000,
+       0x80000000, 0x45d80000, 0x80000000, 0x45dc0000,
+       0x80000000, 0x45e00000, 0x80000000, 0x45e40000,
+       0x80000000, 0x45e80000, 0x80000000, 0x45ec0000,
+       0x80000000, 0x45f00000, 0x80000000, 0x45f40000,
+       0x80000000, 0x45f80000, 0x80000000, 0x45fc0000,
+       0x4a03c020, 0x00004000, 0x4a03c011, 0x40000010,
+       0x04006000, 0x4203e000, 0x40000000, 0x59e00017,
+       0x8c000508, 0x04000003, 0x4a03c017, 0x00000000,
+       0x4203e000, 0x30000001, 0x0401f000, 0x0000bf00,
+       0x00000080, 0x0000bfe0, 0x00000020, 0x0000ff00,
+       0x00000080, 0x0000ffd0, 0x00000030, 0x00007100,
+       0x00000010, 0x00007200, 0x00000008, 0x00007209,
+       0x00000007, 0x00007300, 0x00000008, 0x00007309,
+       0x00000007, 0x00007400, 0x00000008, 0x00007409,
+       0x00000007, 0x00007600, 0x000000b0, 0x00007700,
+       0x00000040, 0x00003000, 0x00000070, 0x00004000,
+       0x000000c0, 0x00006000, 0x00000050, 0x00006100,
+       0x00000010, 0x00006130, 0x00000010, 0x00006150,
+       0x00000010, 0x00006170, 0x00000010, 0x00006190,
+       0x00000010, 0x000061b0, 0x00000010, 0x00000000,
+       0x42000000, 0x00000100, 0x4202f000, 0x00000000,
+       0x42000800, 0x00021f00, 0x45780800, 0x80040800,
+       0x80000040, 0x040207fd, 0x4203f000, 0x00021fff,
+       0x40000000, 0x4203e000, 0x90000100, 0x40000000,
+       0x0201f800, 0x001006fd, 0x42000000, 0x00001000,
+       0x50000000, 0x82000480, 0x24320002, 0x04020015,
+       0x42000800, 0x00000064, 0x80040840, 0x04000007,
+       0x4a030000, 0x00000001, 0x40000000, 0x59800000,
+       0x8c000500, 0x040007f9, 0x04000008, 0x42000800,
+       0x00007a17, 0x50040000, 0x8c00050e, 0x04020003,
+       0x8400054e, 0x44000800, 0x4a030000, 0x00000000,
+       0x4a03c020, 0x00000004, 0x4203e000, 0x6000000f,
+       0x59e00023, 0x8c000500, 0x04020039, 0x42000000,
+       0x00100001, 0x50000800, 0x82040c00, 0x00000004,
+       0x58042003, 0x42001000, 0xffffffff, 0x0201f800,
+       0x001006f4, 0x0402004e, 0x58042003, 0x42001000,
+       0xffffffff, 0x0201f800, 0x001006f4, 0x04020048,
+       0x58042003, 0x42001000, 0x00ffffff, 0x0201f800,
+       0x001006f4, 0x04020042, 0x58042003, 0x42001000,
+       0x00ffffff, 0x0201f800, 0x001006f4, 0x0402003c,
+       0x42000000, 0x00100001, 0x5000a000, 0x8250a400,
+       0x00000004, 0x4200a800, 0x00020000, 0x5850b003,
+       0x0201f800, 0x0010ab17, 0x8250a400, 0x00000005,
+       0x4a0370e8, 0x00000003, 0x4200a800, 0x0000c000,
+       0x5850b003, 0x0201f800, 0x0010ab17, 0x4a0378e8,
+       0x00000003, 0x4200a800, 0x00008000, 0x5850b003,
+       0x0201f800, 0x0010ab17, 0x0401f02b, 0x42000800,
+       0x00020000, 0x58042003, 0x42001000, 0xffffffff,
+       0x0201f800, 0x001006f4, 0x04020019, 0x4a0370e8,
+       0x00000003, 0x42000800, 0x0000c000, 0x58042003,
+       0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff,
+       0x0201f800, 0x001006f4, 0x0402000d, 0x4a0378e8,
+       0x00000003, 0x42000800, 0x00008000, 0x58042003,
+       0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff,
+       0x0201f800, 0x001006f4, 0x0400000b, 0x4a03c020,
+       0x00004010, 0x4a03c011, 0x40100011, 0x04006000,
+       0x4203e000, 0x40000000, 0x4203e000, 0x30000001,
+       0x0401f000, 0x0201f800, 0x00100791, 0x42001000,
+       0x0010ab4a, 0x40080000, 0x80140480, 0x82001d00,
+       0xffffff00, 0x04020003, 0x40001800, 0x0401f003,
+       0x42001800, 0x000000ff, 0x480bc840, 0x480fc842,
+       0x04011000, 0x400c0000, 0x80081400, 0x40140000,
+       0x80080580, 0x040207f0, 0x4817500d, 0x45782800,
+       0x59c40000, 0x82000500, 0xffff0000, 0x80000120,
+       0x82000580, 0x00002422, 0x04020005, 0x59a80005,
+       0x8400054e, 0x48035005, 0x0401f008, 0x59e00003,
+       0x82000500, 0x00030000, 0x04000004, 0x59a80005,
+       0x84000554, 0x48035005, 0x42000800, 0x00000040,
+       0x59a80005, 0x8c000514, 0x0402000e, 0x42000800,
+       0x00001000, 0x82141480, 0x0017ffff, 0x04021009,
+       0x80040902, 0x82141480, 0x0013ffff, 0x04021005,
+       0x80040902, 0x82141480, 0x0011ffff, 0x04001b8d,
+       0x4807500e, 0x42001000, 0x00000024, 0x0201f800,
+       0x00106681, 0x82040c00, 0x0010d1c0, 0x4807500b,
+       0x4a03c810, 0x00100000, 0x4a03c811, 0x0010ab4a,
+       0x4a03c829, 0x00000004, 0x59e40001, 0x82000540,
+       0x0003001d, 0x4803c801, 0x4a03c014, 0x001c001c,
+       0x42001000, 0x0000001c, 0x0201f800, 0x001006e2,
+       0x4202c000, 0x0010d1c0, 0x59aab00b, 0x59aaa00b,
+       0x59aaa80b, 0x59aac80e, 0x49675069, 0x59a8000b,
+       0x4803500c, 0x0401fbf5, 0x0201f800, 0x00107903,
+       0x0201f800, 0x001007be, 0x0201f800, 0x00100807,
+       0x0201f800, 0x00101a05, 0x0201f800, 0x00101354,
+       0x0201f800, 0x00100969, 0x0201f800, 0x00101354,
+       0x0201f800, 0x00100f4c, 0x0201f800, 0x001066c1,
+       0x0401fb1a, 0x0201f800, 0x0010220e, 0x0201f800,
+       0x001053bb, 0x0201f800, 0x00104c90, 0x0201f800,
+       0x00106194, 0x0201f800, 0x00105f28, 0x0201f800,
+       0x001013ed, 0x0201f800, 0x0010126f, 0x4203e000,
+       0xf0000001, 0x42000000, 0x00001000, 0x50000000,
+       0x82000480, 0x24220001, 0x04000016, 0x59e00002,
+       0x8c00051e, 0x42000000, 0x7ffe00fe, 0x04020003,
+       0x42000000, 0x7ffe01fe, 0x50000800, 0x48075058,
+       0x80040920, 0x82040580, 0x0000013a, 0x04000004,
+       0x82040580, 0x0000013b, 0x04020006, 0x59a80005,
+       0x84000552, 0x48035005, 0x4a0378e4, 0x000c0000,
+       0x4a03c018, 0x0000000f, 0x4203e000, 0x20000511,
+       0x4203e000, 0x50010000, 0x4a03c020, 0x00000000,
+       0x04027013, 0x59e00020, 0x82000580, 0x00000002,
+       0x0402000f, 0x4a03c020, 0x00004000, 0x4a03c011,
+       0x40000010, 0x04006000, 0x4203e000, 0x40000000,
+       0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017,
+       0x00000000, 0x4203e000, 0x30000001, 0x4202d800,
+       0x00000000, 0x4203e000, 0xb0600000, 0x59a80005,
+       0x42000800, 0x00000002, 0x8c000512, 0x04020007,
+       0x42000800, 0x0000000f, 0x8c000514, 0x04020003,
+       0x42000800, 0x00000001, 0x4007f800, 0x59a80005,
+       0x8c000514, 0x02020000, 0x00020004, 0x59e00003,
+       0x82000500, 0x00030000, 0x82000580, 0x00000000,
+       0x04020af8, 0x0201f000, 0x00020004, 0x4df00000,
+       0x4203e000, 0x50000000, 0x416c0000, 0x82000c80,
+       0x00000008, 0x04021aef, 0x0c01f804, 0x5c03e000,
+       0x0201f000, 0x00020008, 0x001002f7, 0x0010030a,
+       0x001003d7, 0x001002f6, 0x00100452, 0x001002f6,
+       0x001002f6, 0x00100593, 0x0401fae2, 0x42000800,
+       0x0010b4a4, 0x5804001d, 0x4803c857, 0x8c000500,
+       0x0400000d, 0x84000500, 0x4800081d, 0x4202d800,
+       0x00000004, 0x0401fbd3, 0x49f3c857, 0x5c000800,
+       0x5c000000, 0x82000540, 0x00003e00, 0x4c000000,
+       0x4c040000, 0x1c01f000, 0x0401fbbd, 0x0201f800,
+       0x0010513b, 0x04000009, 0x0201f800, 0x00105151,
+       0x0402002e, 0x59c40006, 0x82000540, 0x000000c0,
+       0x48038806, 0x0401f029, 0x0201f800, 0x001050a2,
+       0x836c0580, 0x00000001, 0x040200bc, 0x59a80017,
+       0x82000580, 0x00000009, 0x040200b8, 0x497b5010,
+       0x4a038893, 0x00000001, 0x42001000, 0x000000f0,
+       0x0201f800, 0x0010193d, 0x0201f800, 0x00105149,
+       0x59c41006, 0x04020006, 0x82081540, 0x000000f1,
+       0x82081500, 0xbbffffff, 0x0401f003, 0x82081540,
+       0x440000f1, 0x480b8806, 0x0201f800, 0x0010609e,
+       0x4a0378e4, 0x00002000, 0x42000000, 0x0010b83a,
+       0x0201f800, 0x0010aa47, 0x42001000, 0x00008030,
+       0x497b5013, 0x0401f035, 0x0201f800, 0x00103b38,
+       0x59c400a4, 0x82000500, 0x0000000f, 0x82000480,
+       0x00000007, 0x04021091, 0x0201f800, 0x0010609e,
+       0x59c400a3, 0x82000500, 0xffefffff, 0x480388a3,
+       0x59a8004b, 0x800001c0, 0x04020004, 0x0201f800,
+       0x00104139, 0x0401f085, 0x59a80015, 0x84000546,
+       0x48035015, 0x0201f800, 0x00105141, 0x59c41006,
+       0x04020006, 0x82081540, 0x44000001, 0x82081500,
+       0xffffff0f, 0x0401f003, 0x82081540, 0x440000f1,
+       0x480b8806, 0x497b9005, 0x4a038802, 0x0000ffff,
+       0x4a0378e4, 0x00003000, 0x42000000, 0x0010b80c,
+       0x0201f800, 0x0010aa47, 0x59a81010, 0x42000800,
+       0x00000003, 0x0201f800, 0x00106c78, 0x42001000,
+       0x00008010, 0x59a8180a, 0x0201f800, 0x00103a3e,
+       0x0201f800, 0x00101815, 0x59a80805, 0x82040d00,
+       0xffffffdf, 0x48075005, 0x0201f800, 0x0010483d,
+       0x0201f800, 0x0010513b, 0x0400000a, 0x0201f800,
+       0x0010413e, 0x04000007, 0x4a035013, 0x00000001,
+       0x497b5021, 0x0201f800, 0x00103c80, 0x0401f04f,
+       0x0201f800, 0x001048ec, 0x04000005, 0x59c41002,
+       0x8408150c, 0x480b8802, 0x0401f012, 0x0201f800,
+       0x0010513b, 0x04020006, 0x59a8001d, 0x80000540,
+       0x02000800, 0x0010930f, 0x0401f00a, 0x0201f800,
+       0x0010930f, 0x59a80026, 0x8c000506, 0x04020005,
+       0x59a8001d, 0x80000540, 0x02020800, 0x00104245,
+       0x497b5028, 0x497b5027, 0x497b5018, 0x0201f800,
+       0x0010513b, 0x59a81026, 0x0402000a, 0x0201f800,
+       0x0010162a, 0x80001580, 0x59a8002a, 0x82000500,
+       0xffff0000, 0x80040d40, 0x4807502a, 0x0401f005,
+       0x59a8002a, 0x82000500, 0xffff0000, 0x4803502a,
+       0x599c0017, 0x8c00050a, 0x04000002, 0x84081544,
+       0x480b5026, 0x0201f800, 0x0010513b, 0x04000004,
+       0x0201f800, 0x0010162a, 0x48078880, 0x42001000,
+       0x00000005, 0x0201f800, 0x001070b0, 0x497b5028,
+       0x497b501b, 0x4a03501c, 0x0000ffff, 0x4a0378e4,
+       0x000000c0, 0x4202d800, 0x00000002, 0x0201f800,
+       0x0010513b, 0x04000007, 0x59a80026, 0x82000500,
+       0x0000000c, 0x82000580, 0x00000004, 0x04000003,
+       0x0201f800, 0x00101e45, 0x1c01f000, 0x59a8001c,
+       0x82000580, 0x0000ffff, 0x04000004, 0x0201f800,
+       0x00101e45, 0x0401f074, 0x59a80026, 0x8c00050a,
+       0x04020003, 0x8c000506, 0x0400001c, 0x8c000500,
+       0x0400001a, 0x4a038802, 0x0000ffbf, 0x8c000502,
+       0x04000016, 0x599c0018, 0x8c000516, 0x04020010,
+       0x59a80027, 0x82000580, 0x0000ffff, 0x0400000c,
+       0x0201f800, 0x00101f9a, 0x59a80026, 0x8c000504,
+       0x0402005d, 0x42001000, 0x00000003, 0x417a5800,
+       0x0201f800, 0x00101fbf, 0x0401f057, 0x59a80028,
+       0x80000540, 0x04020054, 0x59a80026, 0x8c000508,
+       0x04020005, 0x59a8001b, 0x80000540, 0x0402004e,
+       0x0401f003, 0x8c000516, 0x0400004b, 0x0201f800,
+       0x001048ec, 0x04020048, 0x599c0018, 0x8c000516,
+       0x04020004, 0x0201f800, 0x00104c51, 0x04020042,
+       0x599c0017, 0x8c00050a, 0x0400000d, 0x4200b000,
+       0x000007f0, 0x417a8800, 0x0201f800, 0x00020245,
+       0x04020004, 0x59340200, 0x8c00051a, 0x04020036,
+       0x81468800, 0x8058b040, 0x040207f8, 0x4a038802,
+       0x0000ffff, 0x42001800, 0x0010b4eb, 0x0401fb8c,
+       0x42001800, 0x0010b4f8, 0x0401fb89, 0x59a80005,
+       0x84000502, 0x48035005, 0x4a0378e4, 0x00000080,
+       0x4202d800, 0x00000003, 0x4a03501c, 0x0000ffff,
+       0x0401fa7f, 0x80000580, 0x0201f800, 0x00101590,
+       0x599c0018, 0x8c000516, 0x04000004, 0x0201f800,
+       0x00103b10, 0x0401f009, 0x42001800, 0x0000ffff,
+       0x42002000, 0x00000006, 0x42003000, 0x00000000,
+       0x0201f800, 0x00103aae, 0x0201f800, 0x00105151,
+       0x0400000b, 0x59c40006, 0x0201f800, 0x0010513b,
+       0x04000004, 0x82000500, 0xffffff0f, 0x0401f003,
+       0x82000500, 0xfbffffff, 0x48038806, 0x0201f800,
+       0x00106f36, 0x1c01f000, 0x4c040000, 0x4c080000,
+       0x4c100000, 0x59a8003e, 0x82000c80, 0x00000004,
+       0x04021980, 0x0c01f805, 0x5c002000, 0x5c001000,
+       0x5c000800, 0x1c01f000, 0x00100462, 0x001004ea,
+       0x00100516, 0x00100577, 0x42000000, 0x00000001,
+       0x0201f800, 0x00101590, 0x0201f800, 0x0010609e,
+       0x59c408a3, 0x82040d00, 0xfffffff7, 0x480788a3,
+       0x0201f800, 0x00105141, 0x0400000e, 0x0201f800,
+       0x00105151, 0x0400000b, 0x0201f800, 0x00105149,
+       0x04020964, 0x59c400a3, 0x84000532, 0x84000570,
+       0x480388a3, 0x4a038808, 0x00000008, 0x0401f010,
+       0x59c400a3, 0x84000530, 0x82000500, 0xbf7fffff,
+       0x480388a3, 0x42000800, 0x000000f8, 0x0201f800,
+       0x00104200, 0x59c400a3, 0x82000540, 0x00018000,
+       0x8400051c, 0x480388a3, 0x497b8808, 0x59c40006,
+       0x82000500, 0xfbffff0e, 0x48038806, 0x497b2822,
+       0x497b2823, 0x42000800, 0x000001f4, 0x42001000,
+       0x00100591, 0x0201f800, 0x00105f83, 0x59c40805,
+       0x42001000, 0x00000001, 0x0201f800, 0x0010193d,
+       0x0201f800, 0x0010163b, 0x0402000a, 0x42000000,
+       0x00000001, 0x0201f800, 0x0010188c, 0x42000000,
+       0x00000001, 0x0201f800, 0x00101821, 0x0401f022,
+       0x0201f800, 0x00101642, 0x04020008, 0x41780000,
+       0x0201f800, 0x0010188c, 0x41780000, 0x0201f800,
+       0x00101821, 0x0401f018, 0x0201f800, 0x00101649,
+       0x0402000a, 0x42000000, 0x00000002, 0x0201f800,
+       0x0010188c, 0x42000000, 0x00000002, 0x0201f800,
+       0x00101821, 0x0401f00c, 0x0201f800, 0x00101650,
+       0x04020918, 0x59a80049, 0x800001c0, 0x04000006,
+       0x0201f800, 0x00101656, 0x4a03503e, 0x00000001,
+       0x0401f021, 0x0201f800, 0x00101927, 0x4a03503e,
+       0x00000001, 0x0201f800, 0x00105141, 0x0400000c,
+       0x0201f800, 0x00105151, 0x04000009, 0x0201f800,
+       0x00105149, 0x04020903, 0x4a035033, 0x00000001,
+       0x0201f800, 0x001050a2, 0x0401f00f, 0x59c400a4,
+       0x82000500, 0x0000000f, 0x82000580, 0x00000008,
+       0x04000003, 0x4a038805, 0x04000000, 0x59c400a3,
+       0x82000540, 0x0001c000, 0x480388a3, 0x84000520,
+       0x480388a3, 0x1c01f000, 0x0401f8a3, 0x04020004,
+       0x4a03503e, 0x00000003, 0x0401f027, 0x0201f800,
+       0x00101650, 0x04020011, 0x59a80049, 0x800001c0,
+       0x0400000e, 0x0201f800, 0x00101656, 0x59a80048,
+       0x8c00051e, 0x0400001c, 0x0201f800, 0x00105149,
+       0x04020009, 0x4a035033, 0x00000001, 0x0201f800,
+       0x001050a2, 0x0401f004, 0x0201f800, 0x001018d3,
+       0x04020011, 0x0201f800, 0x00101815, 0x4a03503e,
+       0x00000002, 0x497b5049, 0x59c400a3, 0x84000520,
+       0x480388a3, 0x497b2822, 0x497b2823, 0x42000800,
+       0x0000002d, 0x42001000, 0x00100591, 0x0201f800,
+       0x00105f83, 0x1c01f000, 0x0401f877, 0x04020004,
+       0x4a03503e, 0x00000003, 0x0401f05b, 0x4a038805,
+       0x000000f0, 0x0201f800, 0x001018d3, 0x04020050,
+       0x0201f800, 0x00105149, 0x04000044, 0x59c400a4,
+       0x82000500, 0x0000000f, 0x82000580, 0x00000008,
+       0x04000020, 0x59c40005, 0x8c000534, 0x0402001d,
+       0x59940022, 0x82000580, 0x00000001, 0x04020046,
+       0x0201f800, 0x00105151, 0x04020043, 0x4a038805,
+       0x000000f0, 0x0201f800, 0x00105196, 0x4a035032,
+       0x0000aaaa, 0x4a035033, 0x00000000, 0x59c408a3,
+       0x82040d40, 0x00000008, 0x480788a3, 0x4202d800,
+       0x00000001, 0x4a03503e, 0x00000000, 0x4a038805,
+       0x00000001, 0x497b2822, 0x497b2823, 0x0401f01f,
+       0x0201f800, 0x00105151, 0x04020007, 0x59a80032,
+       0x82000580, 0x0000aaaa, 0x04020003, 0x4a035010,
+       0x00ffffff, 0x497b5032, 0x59c40006, 0x82000540,
+       0x04000001, 0x48038806, 0x59a80805, 0x8c040d06,
+       0x04020005, 0x59c408a3, 0x82040d40, 0x00000008,
+       0x480788a3, 0x4202d800, 0x00000001, 0x4a03503e,
+       0x00000000, 0x4a038805, 0x00000001, 0x497b2822,
+       0x497b2823, 0x0401f010, 0x59c40005, 0x82000500,
+       0x000000c0, 0x0400000c, 0x59c40006, 0x82000540,
+       0x000000f1, 0x48038806, 0x0401f7ef, 0x0201f800,
+       0x00101650, 0x04020004, 0x59a80049, 0x800001c0,
+       0x040207a4, 0x497b8885, 0x1c01f000, 0x4803c856,
+       0x42000000, 0x00000001, 0x0201f800, 0x00101590,
+       0x4a03503e, 0x00000000, 0x0201f800, 0x00101650,
+       0x0402000b, 0x59a80052, 0x800001c0, 0x04000004,
+       0x80000040, 0x48035052, 0x04020005, 0x4a035052,
+       0x0000000a, 0x4a035049, 0x00000001, 0x497b8885,
+       0x0401f0ed, 0x59940022, 0x59940823, 0x80040540,
+       0x1c01f000, 0x497b2823, 0x1c01f000, 0x4c080000,
+       0x42001000, 0x000000f0, 0x0201f800, 0x0010193d,
+       0x5c001000, 0x1c01f000, 0x4a03505c, 0x00000004,
+       0x4a03505d, 0x00000000, 0x4a03505e, 0x00000010,
+       0x4a03505f, 0x00000002, 0x4a035010, 0x00ffffff,
+       0x0201f800, 0x0010930f, 0x4a03502a, 0x20200000,
+       0x4a03502b, 0x88000200, 0x4a03502c, 0x00ff001f,
+       0x4a03502d, 0x000007d0, 0x4a03502e, 0x80000000,
+       0x4a03502f, 0x00000200, 0x4a035030, 0x00ff0000,
+       0x4a035031, 0x00010000, 0x4a03503a, 0x514c4f47,
+       0x4a03503b, 0x49432020, 0x1c01f000, 0x4d440000,
+       0x417a8800, 0x41780800, 0x0201f800, 0x00020245,
+       0x04020005, 0x0201f800, 0x001049e7, 0x04020002,
+       0x80040800, 0x81468800, 0x83440580, 0x000007f0,
+       0x040207f6, 0x5c028800, 0x1c01f000, 0x4803c857,
+       0x5c000000, 0x4c000000, 0x4803c857, 0x0401f809,
+       0x485fc857, 0x4203e000, 0x50000000, 0x5c000000,
+       0x4d780000, 0x4200b800, 0x00008002, 0x0401f006,
+       0x485fc857, 0x4203e000, 0x50000000, 0x4200b800,
+       0x00008002, 0x04006000, 0x4c000000, 0x4c040000,
+       0x59bc00ea, 0x82000500, 0x00000007, 0x82000580,
+       0x00000001, 0x04020005, 0x42000800, 0x00000000,
+       0x0201f800, 0x00106c6c, 0x5c000800, 0x4807c025,
+       0x80040920, 0x4807c026, 0x5c000000, 0x4803c023,
+       0x80000120, 0x4803c024, 0x5c000000, 0x4803c857,
+       0x4803c021, 0x80000120, 0x4803c022, 0x41f80000,
+       0x4803c027, 0x80000120, 0x4803c028, 0x42000000,
+       0x00001000, 0x50000000, 0x82000480, 0x24320001,
+       0x4803c857, 0x0400104f, 0x42000800, 0x00000064,
+       0x80040840, 0x04000007, 0x4a030000, 0x00000001,
+       0x40000000, 0x59800000, 0x8c000500, 0x040007f9,
+       0x04000042, 0x42000800, 0x0010c1a3, 0x46000800,
+       0xfaceface, 0x80040800, 0x42001000, 0x00007a00,
+       0x58080013, 0x44000800, 0x80040800, 0x58080019,
+       0x44000800, 0x80040800, 0x5808001a, 0x44000800,
+       0x80040800, 0x5808001b, 0x44000800, 0x80040800,
+       0x5808001c, 0x44000800, 0x80040800, 0x5808001f,
+       0x44000800, 0x80040800, 0x42001000, 0x00007a40,
+       0x42001800, 0x0000000b, 0x50080000, 0x44000800,
+       0x80081000, 0x80040800, 0x800c1840, 0x040207fb,
+       0x42001800, 0x00000003, 0x42001000, 0x00007b00,
+       0x480c1003, 0x58080005, 0x44000800, 0x80040800,
+       0x800c1840, 0x040217fb, 0x42001000, 0x00007c00,
+       0x58080002, 0x44000800, 0x80040800, 0x58080003,
+       0x44000800, 0x80040800, 0x58080020, 0x44000800,
+       0x80040800, 0x58080021, 0x44000800, 0x80040800,
+       0x58080022, 0x44000800, 0x80040800, 0x58080023,
+       0x44000800, 0x80040800, 0x4a030000, 0x00000000,
+       0x485fc020, 0x905cb9c0, 0x825cbd40, 0x00000012,
+       0x485fc011, 0x4203e000, 0x40000000, 0x4202d800,
+       0x00000005, 0x59e00017, 0x8c000508, 0x04000003,
+       0x4a03c017, 0x00000002, 0x4203e000, 0x30000001,
+       0x0401f81a, 0x0401f7ff, 0x4a03c850, 0x0010c1bf,
+       0x4a03c851, 0x0010d1be, 0x4a03c853, 0x00000800,
+       0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540,
+       0x00003f00, 0x4803c801, 0x4a03b104, 0x70000002,
+       0x4a03a804, 0x70000002, 0x4a03b004, 0x70000002,
+       0x42000000, 0x0010b8ec, 0x49780001, 0x49780002,
+       0x1c01f000, 0x1c01f000, 0x59a8006b, 0x8c000530,
+       0x040207fe, 0x4c080000, 0x42001000, 0x00000004,
+       0x0401f862, 0x5c001000, 0x4201d000, 0x00028b0a,
+       0x0201f800, 0x0010608e, 0x4c080000, 0x42001000,
+       0x00000008, 0x0401f859, 0x5c001000, 0x4201d000,
+       0x00028b0a, 0x0201f800, 0x0010608e, 0x4c080000,
+       0x42001000, 0x00000010, 0x0401f850, 0x5c001000,
+       0x4201d000, 0x00028b0a, 0x0201f800, 0x0010608e,
+       0x0401f7e2, 0x8c00050c, 0x59a8086b, 0x04020003,
+       0x84040d30, 0x0401f006, 0x84040d70, 0x4807506b,
+       0x42001000, 0x00000000, 0x0401f040, 0x4807506b,
+       0x836c0500, 0x00000007, 0x0c01f001, 0x001006e1,
+       0x001006c7, 0x001006c7, 0x001006af, 0x001006d4,
+       0x001006c7, 0x001006c7, 0x001006d4, 0x59a80005,
+       0x8c000514, 0x04020013, 0x59c40801, 0x82040d00,
+       0x00018000, 0x82040580, 0x00010000, 0x0400000a,
+       0x82040580, 0x00008000, 0x04000004, 0x42001000,
+       0x42004000, 0x0401f006, 0x42001000, 0x22002000,
+       0x0401f003, 0x42001000, 0x12001000, 0x0401f025,
+       0x42001000, 0x00001004, 0x0401f022, 0x59a80005,
+       0x8c000514, 0x04020008, 0x59a8006b, 0x8c000534,
+       0x04020004, 0x42001000, 0x74057005, 0x0401f819,
+       0x1c01f000, 0x42001000, 0x00002008, 0x0401f7fc,
+       0x59a8006b, 0x8c000534, 0x0402000a, 0x59a80005,
+       0x8c000514, 0x04000004, 0x42001000, 0x24052005,
+       0x0401f00c, 0x42001000, 0x74057005, 0x0401f009,
+       0x1c01f000, 0x1c01f000, 0x82081500, 0x0000001c,
+       0x82081540, 0x001c0000, 0x480bc013, 0x1c01f000,
+       0x59a8006b, 0x8c000530, 0x04000002, 0x84081570,
+       0x480b506b, 0x8c000530, 0x04020005, 0x82081500,
+       0x00007000, 0x80081114, 0x0401fff0, 0x1c01f000,
+       0x41780000, 0x50041800, 0x800c0400, 0x80040800,
+       0x80102040, 0x040207fc, 0x80080500, 0x80000540,
+       0x1c01f000, 0x4202f000, 0x00000000, 0x41780000,
+       0x41780800, 0x41781000, 0x41781800, 0x41782000,
+       0x41782800, 0x41783000, 0x41783800, 0x41784000,
+       0x41784800, 0x41785000, 0x41785800, 0x41786000,
+       0x41786800, 0x41787000, 0x41787800, 0x41788000,
+       0x41788800, 0x41789000, 0x41789800, 0x4178a000,
+       0x4178a800, 0x4178b000, 0x4178b800, 0x4178c000,
+       0x4178c800, 0x4178d000, 0x4178d800, 0x4178e000,
+       0x4178e800, 0x4178f000, 0x4178f800, 0x41790000,
+       0x41790800, 0x41791000, 0x41791800, 0x41792000,
+       0x41792800, 0x41793000, 0x41793800, 0x41794000,
+       0x41794800, 0x41795000, 0x41795800, 0x41796000,
+       0x41796800, 0x41797000, 0x41797800, 0x41798000,
+       0x41798800, 0x42019000, 0x0010b537, 0x42019800,
+       0x0010b50e, 0x4179a000, 0x4179b000, 0x4179a800,
+       0x4179b800, 0x4179c800, 0x4179c000, 0x4179d000,
+       0x4179d800, 0x4179e000, 0x4179e800, 0x4179f000,
+       0x4179f800, 0x417a0000, 0x417a0800, 0x417a1000,
+       0x417a1800, 0x417a2000, 0x42022800, 0x00006100,
+       0x417a3000, 0x417a3800, 0x417a4000, 0x417a4800,
+       0x417a5000, 0x417a5800, 0x417a6000, 0x417a6800,
+       0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800,
+       0x417a9000, 0x417a9800, 0x417ae800, 0x417af800,
+       0x42030000, 0x00007c00, 0x42031000, 0x0010b806,
+       0x42031800, 0x0000bf1d, 0x42032000, 0x0000bf32,
+       0x42032800, 0x0010b7ce, 0x42033000, 0x0010b46e,
+       0x42034000, 0x0010b4a4, 0x42033800, 0x0010b4c3,
+       0x42034800, 0x0010b544, 0x42035000, 0x0010b400,
+       0x42035800, 0x0010ac00, 0x42030800, 0x0010b505,
+       0x417b6000, 0x42036800, 0x00006f00, 0x4203c800,
+       0x00003000, 0x42037000, 0x0000ff00, 0x42037800,
+       0x0000bf00, 0x42038000, 0x00007700, 0x42038800,
+       0x00004000, 0x42039000, 0x00006000, 0x42039800,
+       0x0010bedb, 0x4203a000, 0x00007600, 0x4203a800,
+       0x00007400, 0x4203b000, 0x00007200, 0x4203b800,
+       0x00007100, 0x4203c000, 0x00007000, 0x4203d000,
+       0x00000000, 0x4203e800, 0x00101b95, 0x417bd800,
+       0x1c01f000, 0x42000800, 0x00100000, 0x50040000,
+       0x4c000000, 0x42000000, 0x0000aaaa, 0x44000800,
+       0x42001800, 0x00005555, 0x41782000, 0x82102400,
+       0x00010000, 0x40100000, 0x80042c00, 0x440c2800,
+       0x42003000, 0x0000000a, 0x80183040, 0x040207ff,
+       0x50140000, 0x800c0580, 0x04020004, 0x50040000,
+       0x800c0580, 0x040207f2, 0x5c000000, 0x44000800,
+       0x80142840, 0x4817c861, 0x1c01f000, 0x59a8081f,
+       0x800409c0, 0x04020009, 0x49781c0c, 0x4a001a0c,
+       0x00000200, 0x4a001804, 0x07000000, 0x59a80010,
+       0x9c0001c0, 0x48001805, 0x0401fe01, 0x9c0409c0,
+       0x48041806, 0x1c01f000, 0x59a8080c, 0x4006d000,
+       0x4202b800, 0x00000001, 0x59a8180d, 0x480fc857,
+       0x82041400, 0x00000014, 0x82082400, 0x00000014,
+       0x40100000, 0x800c0480, 0x04001006, 0x44080800,
+       0x40080800, 0x40101000, 0x815eb800, 0x0401f7f7,
+       0x45780800, 0x495f5020, 0x1c01f000, 0x835c0480,
+       0x00000020, 0x04001009, 0x496bc857, 0x815eb840,
+       0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801,
+       0x812e59c0, 0x1c01f000, 0x42000000, 0x0010b853,
+       0x0201f800, 0x0010aa47, 0x417a5800, 0x0401f7f9,
+       0x815eb840, 0x04001008, 0x416a5800, 0x492fc857,
+       0x592ed000, 0x497a5800, 0x497a5801, 0x812e59c0,
+       0x1c01f000, 0x42000000, 0x0010b853, 0x0201f800,
+       0x0010aa47, 0x417ab800, 0x417a5800, 0x0401f7f8,
+       0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800,
+       0x59c80000, 0x82000540, 0x00001200, 0x48039000,
+       0x1c01f000, 0x492fc857, 0x812e59c0, 0x04000007,
+       0x592c0001, 0x497a5801, 0x4c000000, 0x0401fff1,
+       0x5c025800, 0x0401f7f9, 0x1c01f000, 0x4807c856,
+       0x42007000, 0x0010b7f8, 0x4a007001, 0x00000000,
+       0x59e00003, 0x82000540, 0x00008080, 0x4803c003,
+       0x4a03b805, 0x90000001, 0x59dc0006, 0x4a03b805,
+       0x70000000, 0x59dc0006, 0x4a03b805, 0x30000000,
+       0x4200b000, 0x00000020, 0x497bb807, 0x8058b040,
+       0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006,
+       0x4a03b805, 0x60000001, 0x59dc0006, 0x4a03b805,
+       0x70000001, 0x59dc0006, 0x4a03b805, 0x30000002,
+       0x4200b000, 0x00000020, 0x497bb807, 0x8058b040,
+       0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006,
+       0x4a03b805, 0x60000001, 0x0401ffa1, 0x04000da5,
+       0x42001000, 0x0010b7f6, 0x452c1000, 0x4a025801,
+       0x00000001, 0x4a025802, 0x00000100, 0x4a025809,
+       0x00107149, 0x497a580a, 0x497a580b, 0x497a580c,
+       0x0401ff93, 0x04000d97, 0x42001000, 0x0010b7f7,
+       0x452c1000, 0x4a025801, 0x00000000, 0x4a025802,
+       0x00000100, 0x4a025809, 0x001011bc, 0x497a5803,
+       0x497a5807, 0x497a5808, 0x497a580a, 0x59a80005,
+       0x8c00050e, 0x04000006, 0x4a03b805, 0xe0000001,
+       0x59dc0006, 0x8c000522, 0x040007fc, 0x1c01f000,
+       0x4df00000, 0x4203e000, 0x50000000, 0x4c380000,
+       0x40087000, 0x480bc857, 0x4a007002, 0x00000000,
+       0x42007000, 0x0010b7f8, 0x82080400, 0x00000000,
+       0x45780000, 0x58380005, 0x48087005, 0x80000540,
+       0x04000005, 0x82000400, 0x00000000, 0x44080000,
+       0x0401f003, 0x480bc857, 0x48087006, 0x58380001,
+       0x80000540, 0x0400080c, 0x5c007000, 0x5c03e000,
+       0x1c01f000, 0x4c380000, 0x42007000, 0x0010b7f8,
+       0x58380001, 0x80000540, 0x04000803, 0x5c007000,
+       0x1c01f000, 0x42007000, 0x0010b7f8, 0x58380001,
+       0x82000580, 0x00000000, 0x04020012, 0x58380000,
+       0x0c01f001, 0x0010088e, 0x0010088d, 0x0010088d,
+       0x0010088d, 0x0010088d, 0x0010088d, 0x0010088d,
+       0x0010088d, 0x0401fd4b, 0x58380808, 0x800409c0,
+       0x04020024, 0x58380006, 0x80000540, 0x04020002,
+       0x1c01f000, 0x4803c857, 0x48007002, 0x40006800,
+       0x58340000, 0x80000540, 0x04020002, 0x48007005,
+       0x48007006, 0x4a03b805, 0x20000000, 0x59dc0006,
+       0x4a03b805, 0x30000000, 0x58340007, 0x4803b800,
+       0x58340008, 0x4803b801, 0x58340004, 0x48007003,
+       0x58340003, 0x48007004, 0x4803b803, 0x58340001,
+       0x8c000500, 0x04000004, 0x4a007001, 0x00000001,
+       0x0401f028, 0x4a007001, 0x00000002, 0x0401f03d,
+       0x0201f800, 0x001093ea, 0x0201f800, 0x0010a69d,
+       0x04000017, 0x4a03b805, 0x20000000, 0x59dc0006,
+       0x4a03b805, 0x30000000, 0x4807b800, 0x480bb801,
+       0x4a007003, 0x00000010, 0x480c7009, 0x42001000,
+       0x00100875, 0x0201f800, 0x00105f9a, 0x58380008,
+       0x82000400, 0x00000004, 0x48007004, 0x4803b803,
+       0x4a007001, 0x00000007, 0x0401f022, 0x0201f800,
+       0x00109402, 0x42000800, 0x00000001, 0x42001000,
+       0x00100875, 0x0201f800, 0x00105f76, 0x0401f7ba,
+       0x4c040000, 0x4c080000, 0x58380803, 0x42001000,
+       0x00003fff, 0x82040480, 0x00003fff, 0x04021003,
+       0x40041000, 0x80000580, 0x48007003, 0x800800c4,
+       0x4803b802, 0x4a03b805, 0x30000002, 0x59dc0006,
+       0x4a03b805, 0x70000001, 0x59dc0006, 0x4a03b805,
+       0x10000000, 0x5c001000, 0x5c000800, 0x1c01f000,
+       0x483bc857, 0x4c040000, 0x4c080000, 0x58380803,
+       0x42001000, 0x00003fff, 0x82040480, 0x00003fff,
+       0x04021003, 0x40041000, 0x80000580, 0x48007003,
+       0x800800c4, 0x4803b802, 0x4a03b805, 0x10000002,
+       0x5c001000, 0x5c000800, 0x1c01f000, 0x4c040000,
+       0x4c380000, 0x42007000, 0x0010b7f8, 0x59dc0806,
+       0x4807c857, 0x4a03b805, 0x20000000, 0x8c040d3e,
+       0x04000007, 0x8c040d08, 0x04020cca, 0x58380001,
+       0x82000500, 0x00000007, 0x0c01f804, 0x5c007000,
+       0x5c000800, 0x1c01f000, 0x0010087d, 0x0010091e,
+       0x0010092e, 0x001005d8, 0x001005d8, 0x001005d8,
+       0x001005d8, 0x001011ea, 0x4807c856, 0x82040d00,
+       0x43000f80, 0x04020009, 0x58380003, 0x80000540,
+       0x0400001c, 0x59dc0000, 0x4803b800, 0x59dc0001,
+       0x4803b801, 0x0401f7af, 0x58380802, 0x4a000802,
+       0x00000200, 0x0401f01e, 0x4807c856, 0x82040d00,
+       0x43000f80, 0x04020009, 0x58380003, 0x80000540,
+       0x0400000c, 0x59dc0000, 0x4803b800, 0x59dc0001,
+       0x4803b801, 0x0401f7b7, 0x58380002, 0x82000400,
+       0x00000002, 0x46000000, 0x00000200, 0x0401f00c,
+       0x4c340000, 0x58386802, 0x59dc0000, 0x4803c857,
+       0x48006807, 0x59dc0001, 0x4803c857, 0x48006808,
+       0x4a006802, 0x00000100, 0x5c006800, 0x4a007001,
+       0x00000000, 0x4c300000, 0x58386002, 0x0401f80c,
+       0x04000009, 0x58300009, 0x82000c80, 0x0010ab4a,
+       0x04021c84, 0x82000c80, 0x00020000, 0x04001c81,
+       0x0801f800, 0x5c006000, 0x0401f723, 0x4833c857,
+       0x803061c0, 0x04000009, 0x59a8000c, 0x80300480,
+       0x04001007, 0x59a8000d, 0x80300480, 0x04021004,
+       0x82000540, 0x00000001, 0x1c01f000, 0x80000580,
+       0x1c01f000, 0x4803c856, 0x4dc00000, 0x42007000,
+       0x0010b803, 0x4a007400, 0x00000000, 0x49787001,
+       0x42038000, 0x00007720, 0x4a038006, 0x60000001,
+       0x4a038009, 0xf4f60000, 0x42038000, 0x00007700,
+       0x4a038006, 0x60000001, 0x4a038009, 0xf4f60000,
+       0x4a03c822, 0x00000010, 0x4a0370e8, 0x00000000,
+       0x0401f809, 0x4a0370e9, 0x00003a0f, 0x4a0370e8,
+       0x00000000, 0x4a0370e8, 0x00000001, 0x5c038000,
+       0x1c01f000, 0x4c5c0000, 0x4178b800, 0x0401f80a,
+       0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000,
+       0x825cbd40, 0x00000001, 0x0401f803, 0x5c00b800,
+       0x1c01f000, 0x4803c856, 0x4dc00000, 0x4c500000,
+       0x4c580000, 0x4c540000, 0x4a0370e8, 0x00000000,
+       0x805cb9c0, 0x04000009, 0x4a038807, 0x00000004,
+       0x59b800ea, 0x8c000510, 0x04000004, 0x59b800e0,
+       0x0401f87b, 0x0401f7fb, 0x42038000, 0x00007720,
+       0x0201f800, 0x00100ec1, 0x59c00007, 0x4a038006,
+       0x20000000, 0x59c00007, 0x4a038006, 0x8000000a,
+       0x59c00007, 0x4a038006, 0x8000000b, 0x59c00007,
+       0x4a038006, 0x40000001, 0x83c00580, 0x00007700,
+       0x04000004, 0x42038000, 0x00007700, 0x0401f7ed,
+       0x42038000, 0x00007720, 0x42000800, 0x00000800,
+       0x59c00007, 0x8c00051e, 0x04000006, 0x4a038006,
+       0x90000001, 0x80040840, 0x040207fa, 0x0401fc11,
+       0x83c00580, 0x00007700, 0x04000004, 0x42038000,
+       0x00007700, 0x0401f7f1, 0x805cb9c0, 0x0402001d,
+       0x4200b000, 0x00000020, 0x83b8ac00, 0x00000020,
+       0x0201f800, 0x0010ab20, 0x4a0370fb, 0x00000001,
+       0x4a037020, 0x001010bd, 0x59a80039, 0x82000500,
+       0x0000ffff, 0x48037021, 0x4a037035, 0x0010bddb,
+       0x4a037030, 0x0010b410, 0x4a037031, 0x0010ac00,
+       0x4a037032, 0x0010b519, 0x4a037036, 0x0010b524,
+       0x59840002, 0x48037034, 0x4a037038, 0x001010b4,
+       0x4a0370fb, 0x00000001, 0x4178a000, 0x4200b000,
+       0x00000020, 0x83b8ac00, 0x00000000, 0x0201f800,
+       0x0010ab20, 0x4200b000, 0x00000040, 0x83b8ac00,
+       0x00000040, 0x0201f800, 0x0010ab20, 0x805cb9c0,
+       0x04020004, 0x4a0370e4, 0xaaaaaaaa, 0x0401f003,
+       0x4a0370e4, 0xa2aaaa82, 0x4a0370e5, 0xaaaaaaaa,
+       0x4a0370e6, 0xaaaaaaaa, 0x4a0370fb, 0x00000000,
+       0x4a0370e6, 0xaaaaaaaa, 0x42038000, 0x00007720,
+       0x4a038006, 0x90000000, 0x59c00007, 0x8c00051e,
+       0x02020800, 0x001005d8, 0x42038000, 0x00007700,
+       0x4a038006, 0x90000000, 0x59c00007, 0x8c00051e,
+       0x02020800, 0x001005d8, 0x5c00a800, 0x5c00b000,
+       0x5c00a000, 0x5c038000, 0x1c01f000, 0x4d300000,
+       0x4d380000, 0x40026000, 0x82000500, 0x7f000000,
+       0x82000580, 0x00000003, 0x0402000f, 0x83326500,
+       0x00ffffff, 0x59300203, 0x82000580, 0x00000004,
+       0x04020009, 0x59300c06, 0x82040580, 0x00000009,
+       0x04020005, 0x42027000, 0x00000047, 0x0201f800,
+       0x000207a1, 0x5c027000, 0x5c026000, 0x1c01f000,
+       0x4d300000, 0x4d2c0000, 0x4d340000, 0x4d400000,
+       0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000,
+       0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000,
+       0x4c640000, 0x4cc80000, 0x4ccc0000, 0x4cf00000,
+       0x4cf40000, 0x4cf80000, 0x4cfc0000, 0x4d000000,
+       0x4d040000, 0x0201f800, 0x00020015, 0x5c020800,
+       0x5c020000, 0x5c01f800, 0x5c01f000, 0x5c01e800,
+       0x5c01e000, 0x5c019800, 0x5c019000, 0x5c00c800,
+       0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800,
+       0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800,
+       0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000,
+       0x1c01f000, 0x493bc857, 0x0201f000, 0x00020044,
+       0x83300500, 0x1f000000, 0x04000008, 0x81326580,
+       0x80000130, 0x82000c80, 0x00000014, 0x02021800,
+       0x001005d8, 0x0c01f013, 0x83300500, 0x000000ff,
+       0x82000c80, 0x00000007, 0x02021800, 0x001005d8,
+       0x0c01f025, 0x1c01f000, 0x82000d00, 0xc0000038,
+       0x02020800, 0x001005d0, 0x0201f800, 0x001005d8,
+       0x00000000, 0x00000048, 0x00000054, 0x00000053,
+       0x00100a9b, 0x00100abf, 0x00100aba, 0x00100adf,
+       0x00100aa6, 0x00100ab2, 0x00100a9b, 0x00100ada,
+       0x00100b1a, 0x00100a9b, 0x00100a9b, 0x00100a9b,
+       0x00100a9b, 0x00100b1d, 0x00100b23, 0x00100b34,
+       0x00100b45, 0x00100a9b, 0x00100b4e, 0x00100b5a,
+       0x00100a9b, 0x00100a9b, 0x00100a9b, 0x0201f800,
+       0x001005d8, 0x00100aa4, 0x00100bff, 0x00100aec,
+       0x00100b0f, 0x00100aa4, 0x00100aa4, 0x00100aa4,
+       0x0201f800, 0x001005d8, 0x4803c856, 0x59300004,
+       0x8c00053e, 0x04020005, 0x42027000, 0x00000055,
+       0x0201f000, 0x000207a1, 0x0201f800, 0x00106f60,
+       0x040007fa, 0x1c01f000, 0x4803c856, 0x0401f8a9,
+       0x40002800, 0x41782000, 0x42027000, 0x00000056,
+       0x0201f000, 0x000207a1, 0x4803c856, 0x42027000,
+       0x00000057, 0x0201f000, 0x000207a1, 0x4803c856,
+       0x59300007, 0x8c00051a, 0x04020010, 0x59325808,
+       0x812e59c0, 0x04000014, 0x592c0408, 0x8c00051c,
+       0x04020003, 0x4a026011, 0xffffffff, 0x59300004,
+       0x8c00053e, 0x04020009, 0x42027000, 0x00000048,
+       0x0201f000, 0x000207a1, 0x59325808, 0x4a025a06,
+       0x00000007, 0x0401f7f4, 0x0201f800, 0x00106f60,
+       0x040007f6, 0x1c01f000, 0x4803c856, 0x83300500,
+       0x00ffffff, 0x0201f000, 0x001064d7, 0x1c01f000,
+       0x4c040000, 0x59b808ea, 0x82040d00, 0x00000007,
+       0x82040580, 0x00000003, 0x04000004, 0x42000000,
+       0x60000000, 0x0401f8ab, 0x5c000800, 0x1c01f000,
+       0x0401f8f9, 0x59325808, 0x812e59c0, 0x04000018,
+       0x592c0204, 0x82000500, 0x000000ff, 0x82000d80,
+       0x00000029, 0x04020012, 0x59300203, 0x82000580,
+       0x00000003, 0x0400000b, 0x59300807, 0x84040d26,
+       0x48066007, 0x0201f800, 0x00020086, 0x4a03900d,
+       0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000,
+       0x0201f800, 0x00106f60, 0x040007f4, 0x59880052,
+       0x80000000, 0x48031052, 0x4a03900d, 0x00000040,
+       0x42000000, 0xc0000000, 0x0401f05a, 0x42007800,
+       0x0010bde2, 0x42002000, 0x00003000, 0x42003000,
+       0x00000105, 0x0201f800, 0x00105e04, 0x4a0370e4,
+       0x02000000, 0x1c01f000, 0x4933c857, 0x0201f000,
+       0x0002077d, 0x41300800, 0x800409c0, 0x02020800,
+       0x001005d8, 0x0201f800, 0x001005d0, 0x4933c857,
+       0x813261c0, 0x02000800, 0x001005d8, 0x0401f835,
+       0x40002800, 0x0201f800, 0x0010a99c, 0x0401f8ae,
+       0x04000007, 0x59326809, 0x59340200, 0x8c00050e,
+       0x59300414, 0x02020800, 0x001092ce, 0x1c01f000,
+       0x4933c857, 0x813261c0, 0x02000800, 0x001005d8,
+       0x0401f8a1, 0x0400000b, 0x59325808, 0x0201f800,
+       0x00109037, 0x04000007, 0x592c0208, 0x8400054e,
+       0x48025a08, 0x417a7800, 0x0201f800, 0x00108be3,
+       0x1c01f000, 0x485fc857, 0x5c000000, 0x4d780000,
+       0x4203e000, 0x50000000, 0x4200b800, 0x00008005,
+       0x0201f000, 0x001005dd, 0x4933c857, 0x83300480,
+       0x00000020, 0x02021800, 0x001005d8, 0x83300c00,
+       0x0010b8cc, 0x50040000, 0x80000000, 0x04001002,
+       0x44000800, 0x1c01f000, 0x4933c857, 0x0401f7f4,
+       0x4807c856, 0x59b800ea, 0x8c000510, 0x040007fd,
+       0x59b800e0, 0x4803c857, 0x1c01f000, 0x4803c856,
+       0x42000000, 0x10000000, 0x41300800, 0x0401f02d,
+       0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff,
+       0x80040d40, 0x4807c857, 0x59b800ea, 0x8c000516,
+       0x04020003, 0x480770e1, 0x1c01f000, 0x8c000510,
+       0x040007fa, 0x4c040000, 0x0401f809, 0x5c000800,
+       0x82100480, 0x00000008, 0x040017f4, 0x4c040000,
+       0x0401febc, 0x5c000800, 0x0401f7f0, 0x59b800e2,
+       0x59b820e2, 0x80100580, 0x040207fd, 0x80102114,
+       0x0401f006, 0x59b800e2, 0x59b820e2, 0x80100580,
+       0x040207fd, 0x0401f001, 0x40101800, 0x800c190a,
+       0x82100500, 0x0000001f, 0x820c1d00, 0x0000001f,
+       0x800c2480, 0x82102500, 0x0000001f, 0x1c01f000,
+       0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff,
+       0x80040d40, 0x4807c857, 0x42001000, 0x0010b804,
+       0x50080000, 0x80000540, 0x04020005, 0x4a0370e5,
+       0x00000003, 0x4a0370e4, 0x00000300, 0x80000000,
+       0x44001000, 0x42001000, 0x00000400, 0x59b800ea,
+       0x8c000510, 0x0400000c, 0x0401ffd5, 0x82100480,
+       0x00000008, 0x04001007, 0x4c040000, 0x4c080000,
+       0x0401fe88, 0x5c001000, 0x5c000800, 0x0401f020,
+       0x59b800ea, 0x8c000516, 0x0402001d, 0x4a0370e4,
+       0x00300000, 0x480770e1, 0x42001000, 0x0000ff00,
+       0x80081040, 0x04000012, 0x59b808e4, 0x8c040d28,
+       0x040207fc, 0x42001000, 0x0010b804, 0x50080000,
+       0x80000040, 0x04020005, 0x4a0370e5, 0x00000002,
+       0x4a0370e4, 0x00000200, 0x02001800, 0x001005d8,
+       0x44001000, 0x8c040d2c, 0x1c01f000, 0x41f80000,
+       0x50000000, 0x0201f800, 0x001005d8, 0x80081040,
+       0x040207d3, 0x41f80000, 0x50000000, 0x0201f800,
+       0x001005d8, 0x4d380000, 0x59300c06, 0x82040580,
+       0x00000009, 0x04020006, 0x42027000, 0x00000047,
+       0x0201f800, 0x000207a1, 0x80000580, 0x5c027000,
+       0x1c01f000, 0x4c500000, 0x4a03900d, 0x00000001,
+       0x59c8a020, 0x4a03900d, 0x00000002, 0x59c80820,
+       0x8c50a52e, 0x04000002, 0x900409c0, 0x82040d00,
+       0x0000ffff, 0x0201f800, 0x00105dd7, 0x02000800,
+       0x001005d8, 0x4933c857, 0x8250a500, 0xff000000,
+       0x82500580, 0x05000000, 0x04000003, 0x82000540,
+       0x00000001, 0x5c00a000, 0x1c01f000, 0x0401ffe6,
+       0x4933c857, 0x59300406, 0x82000580, 0x00000000,
+       0x04000040, 0x59c82021, 0x4a03900d, 0x00000001,
+       0x59c82821, 0x82142d00, 0x0000ffff, 0x59325808,
+       0x812e59c0, 0x04000037, 0x59326809, 0x0201f800,
+       0x001048d9, 0x02020800, 0x001092b6, 0x599c0019,
+       0x8c00050c, 0x04020018, 0x0201f800, 0x001048d9,
+       0x04020015, 0x59300811, 0x4807c857, 0x592c0408,
+       0x8c00051c, 0x0402000e, 0x8400055c, 0x48025c08,
+       0x592c0a04, 0x82040d00, 0x000000ff, 0x82040580,
+       0x00000048, 0x04000004, 0x82040580, 0x00000018,
+       0x04020003, 0x59300811, 0x48065803, 0x4a026011,
+       0x7fffffff, 0x48166013, 0x0201f800, 0x001010dd,
+       0x04020014, 0x0401f9fd, 0x40280000, 0x4802600d,
+       0x04000005, 0x4832600b, 0x50200000, 0x4802600a,
+       0x4822600c, 0x59300414, 0x8c00051c, 0x04020004,
+       0x599c0019, 0x8c00050c, 0x0402086e, 0x4a03900d,
+       0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000,
+       0x59880052, 0x80000000, 0x48031052, 0x4a03900d,
+       0x00000040, 0x42000000, 0xc0000000, 0x0401f71d,
+       0x4cf80000, 0x58f40000, 0x8001f540, 0x0401f820,
+       0x41781800, 0x0401f8e4, 0x04020014, 0x44140800,
+       0x0401f82a, 0x04000011, 0x40043800, 0x42001800,
+       0x00000001, 0x40142000, 0x0401f8db, 0x0402000b,
+       0x801c3800, 0x501c0000, 0x44000800, 0x0401f810,
+       0x801c0580, 0x04000004, 0x44103800, 0x801c3840,
+       0x44143800, 0x0401f819, 0x5c01f000, 0x1c01f000,
+       0x80f9f1c0, 0x04020003, 0x58f41202, 0x0401f003,
+       0x42001000, 0x00000007, 0x1c01f000, 0x80f9f1c0,
+       0x04020006, 0x58f40401, 0x82000480, 0x00000002,
+       0x80f40400, 0x0401f005, 0x58f80401, 0x82000480,
+       0x00000002, 0x80f80400, 0x50002800, 0x80000000,
+       0x50002000, 0x1c01f000, 0x80f9f1c0, 0x04020008,
+       0x58f40401, 0x82000480, 0x00000002, 0x02001800,
+       0x001005d8, 0x4801ec01, 0x0401f00b, 0x58f80401,
+       0x82000480, 0x00000002, 0x02001800, 0x001005d8,
+       0x4801f401, 0x82000580, 0x00000002, 0x04020002,
+       0x0401f809, 0x58f40202, 0x80000040, 0x4801ea02,
+       0x02000800, 0x001005d8, 0x82000580, 0x00000001,
+       0x1c01f000, 0x4d2c0000, 0x40fa5800, 0x0201f800,
+       0x001007f4, 0x4979e800, 0x4179f000, 0x5c025800,
+       0x1c01f000, 0x80f5e9c0, 0x04000009, 0x80f9f1c0,
+       0x04020ff5, 0x4d2c0000, 0x40f65800, 0x0201f800,
+       0x001007f4, 0x4179e800, 0x5c025800, 0x1c01f000,
+       0x4cf40000, 0x59300807, 0x82040500, 0x00003100,
+       0x04020032, 0x8c040d22, 0x04000032, 0x5930001f,
+       0x8001ed40, 0x02000800, 0x001005d8, 0x82000580,
+       0xffffffff, 0x04000029, 0x58f40201, 0x82000580,
+       0x0000dcb3, 0x02020800, 0x001005d8, 0x58f40a02,
+       0x82040500, 0x0000fffe, 0x04000003, 0x0401ff89,
+       0x58f40a02, 0x82040480, 0x0000000f, 0x04021059,
+       0x80040800, 0x4805ea02, 0x82040580, 0x00000008,
+       0x0400005d, 0x82040480, 0x00000008, 0x0400100a,
+       0x58f40000, 0x8001ed40, 0x02000800, 0x001005d8,
+       0x58f40201, 0x82000580, 0x0000ddb9, 0x02020800,
+       0x001005d8, 0x58f40401, 0x82000c00, 0x00000002,
+       0x4805ec01, 0x80f40400, 0x59300812, 0x44040000,
+       0x80000000, 0x45780000, 0x5c01e800, 0x1c01f000,
+       0x42001000, 0x00000400, 0x59b800e4, 0x8c000524,
+       0x04020023, 0x4a0370e4, 0x00030000, 0x40000000,
+       0x59b800e4, 0x8c000524, 0x0402001b, 0x59300807,
+       0x84040d62, 0x48066007, 0x4a0370e4, 0x00020000,
+       0x4d2c0000, 0x0201f800, 0x001007d3, 0x04000025,
+       0x492e601f, 0x4a025a01, 0x0000dcb3, 0x59300008,
+       0x80001d40, 0x02000800, 0x001005d8, 0x580c080f,
+       0x48065803, 0x59301811, 0x40040000, 0x800c0580,
+       0x0402000d, 0x497a5a02, 0x4a025c01, 0x00000004,
+       0x0401f011, 0x4a0370e4, 0x00020000, 0x40000000,
+       0x40000000, 0x80081040, 0x02000800, 0x001005d8,
+       0x0401f7d6, 0x4a025a02, 0x00000001, 0x4a025c01,
+       0x00000006, 0x497a5804, 0x400c0000, 0x80040480,
+       0x48025805, 0x412de800, 0x5c025800, 0x0401f7a9,
+       0x5c025800, 0x4a02601f, 0xffffffff, 0x0401f7c3,
+       0x4d2c0000, 0x58f65800, 0x0201f800, 0x001007f4,
+       0x40f65800, 0x0201f800, 0x001007f4, 0x5c025800,
+       0x0401f7f5, 0x4d2c0000, 0x0201f800, 0x001007d3,
+       0x040007f8, 0x4a025a01, 0x0000ddb9, 0x4a025c01,
+       0x00000002, 0x492de800, 0x412de800, 0x5c025800,
+       0x0401f7a5, 0x0401ff33, 0x82f40400, 0x00000004,
+       0x800c0400, 0x40000800, 0x50040000, 0x80100580,
+       0x04000016, 0x82040c00, 0x00000002, 0x80081040,
+       0x040207fa, 0x80f9f1c0, 0x04000011, 0x58f41202,
+       0x82081480, 0x00000007, 0x82f80400, 0x00000002,
+       0x800c0400, 0x40000800, 0x50040000, 0x80100580,
+       0x04000006, 0x82040c00, 0x00000002, 0x80081040,
+       0x040207fa, 0x0401f002, 0x1c01f000, 0x82000540,
+       0x00000001, 0x0401f7fd, 0x4cf40000, 0x4cf80000,
+       0x4001e800, 0x592c0a06, 0x800409c0, 0x0402001d,
+       0x82f40580, 0xffffffff, 0x04000017, 0x58f40201,
+       0x82000580, 0x0000dcb3, 0x02020800, 0x001005d8,
+       0x58f40000, 0x8001f540, 0x04000006, 0x58f80201,
+       0x82000580, 0x0000ddb9, 0x02020800, 0x001005d8,
+       0x41783800, 0x0401f839, 0x04020006, 0x0401ff32,
+       0x497a601f, 0x5c01f000, 0x5c01e800, 0x1c01f000,
+       0x0401ff2d, 0x4a025a06, 0x00000011, 0x0401f7f9,
+       0x82f40580, 0xffffffff, 0x04020f27, 0x0401f7f5,
+       0x4cf40000, 0x4cf80000, 0x4001e800, 0x82040580,
+       0x00000001, 0x0402001f, 0x82f40580, 0xffffffff,
+       0x04000019, 0x58f40201, 0x82000580, 0x0000dcb3,
+       0x02020800, 0x001005d8, 0x58f40000, 0x8001f540,
+       0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9,
+       0x02020800, 0x001005d8, 0x41783800, 0x0401f813,
+       0x04020008, 0x0401ff0c, 0x42000800, 0x00000001,
+       0x497a601f, 0x5c01f000, 0x5c01e800, 0x1c01f000,
+       0x0401ff05, 0x42000800, 0x00000011, 0x0401f7f9,
+       0x4c040000, 0x82f40580, 0xffffffff, 0x04020efe,
+       0x5c000800, 0x0401f7f3, 0x4803c856, 0x401c2000,
+       0x41781800, 0x0401ff8c, 0x0402002c, 0x58f42003,
+       0x42001800, 0x00000001, 0x0401ff87, 0x04020027,
+       0x0401feb8, 0x40082800, 0x82f40400, 0x00000004,
+       0x40003000, 0x50182000, 0x40100000, 0x801c0580,
+       0x04000005, 0x42001800, 0x00000001, 0x0401ff7a,
+       0x0402001a, 0x82183400, 0x00000002, 0x80142840,
+       0x040207f5, 0x80f9f1c0, 0x04000013, 0x58f42a02,
+       0x82142c80, 0x00000007, 0x82f80400, 0x00000003,
+       0x40003000, 0x50182000, 0x40100000, 0x801c0580,
+       0x04000005, 0x42001800, 0x00000001, 0x0401ff66,
+       0x04020006, 0x82183400, 0x00000002, 0x80142840,
+       0x040207f5, 0x1c01f000, 0x82000540, 0x00000001,
+       0x0401f7fd, 0x0201f800, 0x001005d8, 0x58380207,
+       0x8c000502, 0x040007fc, 0x50200000, 0x80387c00,
+       0x583c2800, 0x583c2001, 0x58380404, 0x80001540,
+       0x04020002, 0x58381407, 0x58c83401, 0x58380c08,
+       0x59303807, 0x497a6012, 0x497a6013, 0x0201f000,
+       0x000200be, 0x592c0408, 0x8c000502, 0x040007ea,
+       0x592c0409, 0x80000540, 0x040007e7, 0x82000c80,
+       0x00000002, 0x04001011, 0x58380001, 0x80007540,
+       0x02000800, 0x001005d8, 0x58380204, 0x82000500,
+       0x0000000f, 0x82000400, 0x001010bd, 0x50004000,
+       0x40040000, 0x800409c0, 0x04000005, 0x82040c80,
+       0x00000005, 0x040217f1, 0x80204400, 0x50200000,
+       0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002,
+       0x592c0a07, 0x592c4c08, 0x592c300d, 0x59303807,
+       0x497a6012, 0x497a6013, 0x4816600e, 0x4812600f,
+       0x480a6010, 0x481a6011, 0x80040840, 0x4806600d,
+       0x02000000, 0x000200c6, 0x80204000, 0x50201800,
+       0x800c19c0, 0x0402000c, 0x58380001, 0x80007540,
+       0x02000800, 0x001005d8, 0x58380204, 0x82000500,
+       0x0000000f, 0x82000400, 0x001010bd, 0x50004000,
+       0x50201800, 0x483a600b, 0x480e600a, 0x4822600c,
+       0x0201f000, 0x000200c6, 0x4803c856, 0x592c0208,
+       0x8c00051e, 0x04020017, 0x50200000, 0x80306c00,
+       0x40240000, 0x0c01f001, 0x00100e46, 0x00100e46,
+       0x00100e4f, 0x00100e46, 0x00100e46, 0x00100e46,
+       0x00100e46, 0x00100e46, 0x00100e4f, 0x00100e46,
+       0x00100e4f, 0x00100e46, 0x00100e46, 0x00100e4f,
+       0x00100e46, 0x00100e46, 0x0201f800, 0x001005d8,
+       0x8400051e, 0x48025a08, 0x50200000, 0x80306c00,
+       0x58343801, 0x481e600f, 0x0401f007, 0x58341802,
+       0x58342800, 0x58343801, 0x480e6010, 0x4816600e,
+       0x481e600f, 0x0401f246, 0x4933c857, 0x5931f808,
+       0x59300a06, 0x800409c0, 0x04000005, 0x80040906,
+       0x04020002, 0x80040800, 0x4805fc06, 0x4a026206,
+       0x00000002, 0x592c0409, 0x82000500, 0x00000008,
+       0x0400000b, 0x0401f834, 0x59300203, 0x82000580,
+       0x00000004, 0x04020005, 0x42027000, 0x00000048,
+       0x0201f800, 0x000207a1, 0x1c01f000, 0x4cfc0000,
+       0x58fc0204, 0x82000500, 0x000000ff, 0x82000580,
+       0x00000048, 0x0402000c, 0x58fc000b, 0x800001c0,
+       0x04000009, 0x58fc0407, 0x800001c0, 0x04000006,
+       0x58fc080b, 0x8c040d16, 0x04000017, 0x58fc0007,
+       0x0401f00a, 0x58fc0408, 0x8c000512, 0x04020014,
+       0x58fc0c09, 0x8c040d16, 0x04020003, 0x5c01f800,
+       0x1c01f000, 0x58fc000a, 0x59300811, 0x80040580,
+       0x04020009, 0x59300007, 0x84000500, 0x48026007,
+       0x42027000, 0x00000048, 0x5c01f800, 0x0201f000,
+       0x000207a1, 0x5c01f800, 0x1c01f000, 0x58fdf809,
+       0x0401f7ec, 0x4933c857, 0x59b808ea, 0x82040d00,
+       0x00000007, 0x82040580, 0x00000000, 0x0400001e,
+       0x82040580, 0x00000003, 0x0400001b, 0x59300406,
+       0x4c000000, 0x4a026406, 0x00000000, 0x42003000,
+       0x00000041, 0x42000000, 0x50000000, 0x41300800,
+       0x4c180000, 0x0401fce7, 0x5c003000, 0x0400000b,
+       0x42000000, 0x0000001e, 0x80000040, 0x040207ff,
+       0x80183040, 0x040207f4, 0x42000000, 0x40000000,
+       0x41300800, 0x0401fcdb, 0x5c000000, 0x48026406,
+       0x1c01f000, 0x59300007, 0x84000500, 0x48026007,
+       0x0401f7fc, 0x59c00007, 0x4a038006, 0x30000000,
+       0x40000000, 0x59c00007, 0x8c00050a, 0x040207fe,
+       0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857,
+       0x4dc00000, 0x4a0370e8, 0x00000000, 0x42038000,
+       0x00007720, 0x0401fff0, 0x42038000, 0x00007700,
+       0x0401ffed, 0x0201f800, 0x0010513b, 0x04020013,
+       0x4a038891, 0x0000ffff, 0x497b8880, 0x497b8892,
+       0x42001000, 0x00000190, 0x40000000, 0x40000000,
+       0x80081040, 0x040207fd, 0x42000000, 0x0010b8a6,
+       0x0201f800, 0x0010aa47, 0x0401f80e, 0x5c038000,
+       0x0201f000, 0x00105258, 0x0401f82d, 0x42000000,
+       0x0010b8a7, 0x0201f800, 0x0010aa47, 0x0401f805,
+       0x48178892, 0x480b8880, 0x5c038000, 0x1c01f000,
+       0x496fc857, 0x836c0580, 0x00000003, 0x0402000b,
+       0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048,
+       0x42001800, 0x0000ffff, 0x0201f800, 0x00103a3e,
+       0x5c001800, 0x5c001000, 0x42000800, 0x0000003c,
+       0x0201f800, 0x00101345, 0x59a8006c, 0x80000540,
+       0x04000006, 0x59a8106d, 0x800811c0, 0x04000003,
+       0x0201f800, 0x00101aaf, 0x4a038891, 0x0000ffff,
+       0x4a03900d, 0x00000040, 0x0201f800, 0x0010098e,
+       0x4a0370e8, 0x00000001, 0x1c01f000, 0x5c000000,
+       0x4c000000, 0x4803c857, 0x59c41080, 0x497b8880,
+       0x59c42892, 0x497b8892, 0x0201f800, 0x0010513b,
+       0x04020002, 0x1c01f000, 0x42002000, 0x00000260,
+       0x59c418a4, 0x820c1d00, 0x0000000f, 0x820c0580,
+       0x00000000, 0x04000010, 0x59c41805, 0x820c1d00,
+       0x00000001, 0x0402000e, 0x59c418a4, 0x820c1d00,
+       0x0000000f, 0x820c0480, 0x00000007, 0x04001004,
+       0x820c0480, 0x0000000c, 0x04001003, 0x80102040,
+       0x040207ec, 0x497b8891, 0x1c01f000, 0x4c100000,
+       0x42002000, 0x00000019, 0x46000000, 0x00000001,
+       0x0201f800, 0x00101937, 0x50001800, 0x820c1d00,
+       0x00000001, 0x04000005, 0x80102040, 0x040207f7,
+       0x5c002000, 0x0401f7f0, 0x5c002000, 0x0401f7ec,
+       0x4803c856, 0x1c01f000, 0x4d2c0000, 0x59325808,
+       0x592c0a04, 0x4807c857, 0x82040d00, 0x000000ff,
+       0x82040500, 0x0000000f, 0x0c01f001, 0x00100f67,
+       0x00100f67, 0x00100f67, 0x00100f7f, 0x00100f67,
+       0x00100f67, 0x00100f67, 0x00100f67, 0x00100f67,
+       0x00100f7f, 0x00100f67, 0x00100f69, 0x00100f67,
+       0x00100f67, 0x00100f67, 0x00100f67, 0x0201f800,
+       0x001005d8, 0x82040580, 0x0000003b, 0x02020800,
+       0x001005d8, 0x592c020a, 0x8c000500, 0x0400005f,
+       0x592c1a07, 0x82040500, 0x0000000f, 0x82000400,
+       0x001010bd, 0x50001000, 0x50080000, 0x59302013,
+       0x4802600a, 0x492e600b, 0x480a600c, 0x480e600d,
+       0x48126012, 0x5c025800, 0x1c01f000, 0x82040500,
+       0x0000000f, 0x82000400, 0x001010bd, 0x50001000,
+       0x50080000, 0x592c1a07, 0x4802600a, 0x492e600b,
+       0x480a600c, 0x480e600d, 0x497a6012, 0x0401f7f2,
+       0x8c040d00, 0x04020041, 0x82040d00, 0x00000080,
+       0x0400003e, 0x0201f000, 0x000200cf, 0x59300013,
+       0x59301012, 0x80080580, 0x0402000c, 0x42007800,
+       0x80000005, 0x592c1208, 0x82080500, 0xffff7fff,
+       0x48025a08, 0x8c08151e, 0x0402002d, 0x823c7d40,
+       0x00000020, 0x0401f02a, 0x480bc857, 0x42000000,
+       0x0010b851, 0x0201f800, 0x0010aa47, 0x59300414,
+       0x4803c857, 0x8c000514, 0x04020007, 0x599c1819,
+       0x8c0c1d12, 0x04020004, 0x820c1d40, 0x00000001,
+       0x0401f01d, 0x59302013, 0x0401f92b, 0x0402001a,
+       0x42007800, 0x80000005, 0x5930500d, 0x592c0208,
+       0x4803c857, 0x8c00051e, 0x04020005, 0x823c7d40,
+       0x00000020, 0x5930400c, 0x0401f004, 0x8400051e,
+       0x48025a08, 0x0401f8da, 0x50201800, 0x480e600a,
+       0x4832600b, 0x4822600c, 0x482a600d, 0x480fc857,
+       0x4833c857, 0x4823c857, 0x482bc857, 0x80000580,
+       0x483e6004, 0x1c01f000, 0x0201f800, 0x001005d8,
+       0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580,
+       0x02020800, 0x001005d8, 0x0201f800, 0x00109037,
+       0x02000800, 0x001005d8, 0x59325808, 0x4d3c0000,
+       0x4d400000, 0x59300004, 0x4803c857, 0x4c000000,
+       0x0201f800, 0x00106dc3, 0x0201f800, 0x00106b8a,
+       0x5c000000, 0x8c000516, 0x04000010, 0x592c000f,
+       0x4803c857, 0x48025807, 0x41780800, 0x42028000,
+       0x00000002, 0x0201f800, 0x00104e70, 0x4a025c06,
+       0x0000ffff, 0x0201f800, 0x000202da, 0x0201f800,
+       0x00107911, 0x0401f015, 0x4a026203, 0x00000002,
+       0x592c0208, 0x8400054e, 0x48025a08, 0x59300406,
+       0x82000580, 0x00000006, 0x04020009, 0x811800ca,
+       0x81c80c00, 0x58040939, 0x592c000d, 0x80040480,
+       0x592c080f, 0x80040480, 0x4802580b, 0x417a7800,
+       0x0201f800, 0x00108be3, 0x5c028000, 0x5c027800,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000,
+       0x59900004, 0x81300580, 0x02020800, 0x001005d8,
+       0x0201f800, 0x00109037, 0x02000800, 0x001005d8,
+       0x59325808, 0x592c0208, 0x84000540, 0x48025a08,
+       0x0401f7bf, 0x491bc857, 0x49d3c857, 0x4dd00000,
+       0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600,
+       0x4a03a005, 0x80000002, 0x42000000, 0x00001000,
+       0x50000000, 0x82000480, 0x24220001, 0x04020029,
+       0x59d01006, 0x82080500, 0x00006000, 0x82000580,
+       0x00006000, 0x0400002f, 0x82080500, 0x40008000,
+       0x040007f8, 0x800409c0, 0x0402002a, 0x811a31c0,
+       0x04000028, 0x42000000, 0x00001002, 0x50001000,
+       0x46000000, 0x00000512, 0x42001800, 0x0000000a,
+       0x59e00000, 0x8c00051a, 0x040207fc, 0x800c1840,
+       0x040207fc, 0x42000000, 0x00001002, 0x46000000,
+       0x00000514, 0x42001800, 0x0000000a, 0x59e00000,
+       0x8c00053a, 0x040207fc, 0x800c1840, 0x040207fc,
+       0x42000000, 0x00001002, 0x44080000, 0x0401f00d,
+       0x59d01006, 0x82080500, 0x00006000, 0x82000580,
+       0x00006000, 0x04000007, 0x8c08151e, 0x040007f9,
+       0x59d01006, 0x82080500, 0x00006000, 0x040207f5,
+       0x83d3a400, 0x00000020, 0x80040800, 0x82040480,
+       0x00000005, 0x040017bf, 0x5c03a000, 0x1c01f000,
+       0x491bc857, 0x49d3c857, 0x4dd00000, 0x41780800,
+       0x8007a0ca, 0x83d3a400, 0x00007600, 0x4a03a005,
+       0x80000001, 0x59d00006, 0x83d3a400, 0x00000020,
+       0x80040800, 0x82040480, 0x00000005, 0x040017f8,
+       0x5c03a000, 0x1c01f000, 0x59d00006, 0x8c00053e,
+       0x0400001e, 0x59902804, 0x4817c857, 0x801429c0,
+       0x04000013, 0x5990000a, 0x5990080b, 0x5990100c,
+       0x5990180d, 0x4800280a, 0x4804280b, 0x4808280c,
+       0x480c280d, 0x59d00000, 0x59d00801, 0x59d01002,
+       0x59d01803, 0x59d02004, 0x4800280e, 0x4804280f,
+       0x48082810, 0x480c2811, 0x48102812, 0x59900006,
+       0x82000500, 0xffff0000, 0x48032006, 0x4a03a005,
+       0x30000000, 0x59d00006, 0x1c01f000, 0x4803c856,
+       0x80204000, 0x50200000, 0x80000540, 0x04000003,
+       0x80285040, 0x1c01f000, 0x58300001, 0x80000540,
+       0x0400000e, 0x4802600b, 0x40006000, 0x58300204,
+       0x82000500, 0x0000000f, 0x82000400, 0x001010bd,
+       0x50004000, 0x802041c0, 0x02000800, 0x001005d8,
+       0x80285040, 0x1c01f000, 0x40005000, 0x1c01f000,
+       0x00000005, 0x00000008, 0x0000000b, 0x0000000e,
+       0x00000011, 0x00000000, 0x00000000, 0x0000000b,
+       0x00000000, 0x00000000, 0x00000000, 0x001010b8,
+       0x001010b7, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x001010b8, 0x001010b7, 0x001010b4,
+       0x001010b8, 0x001010b7, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x001010b8,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x001010b8, 0x001010b8, 0x001010b8,
+       0x00000000, 0x001010b8, 0x00000000, 0x00000000,
+       0x00000000, 0x4813c857, 0x492fc857, 0x4933c857,
+       0x48126012, 0x592c5207, 0x802851c0, 0x0400004a,
+       0x412c6000, 0x0401f84b, 0x04000009, 0x82240580,
+       0x00000002, 0x04020003, 0x5830000d, 0x80102480,
+       0x50200000, 0x80004540, 0x0400003f, 0x50200000,
+       0x80000540, 0x0400000b, 0x80301400, 0x58080002,
+       0x80102480, 0x0400101e, 0x801021c0, 0x04000009,
+       0x80285040, 0x04000034, 0x80204000, 0x0401f7f4,
+       0x58300001, 0x80006540, 0x0400002f, 0x0401f7e6,
+       0x80285040, 0x0400002c, 0x80204000, 0x50200000,
+       0x80000540, 0x0402000a, 0x58300001, 0x80006540,
+       0x04000025, 0x58300204, 0x82004d00, 0x0000000f,
+       0x82244400, 0x001010bd, 0x50204000, 0x592c0208,
+       0x8400051e, 0x48025a08, 0x0401f013, 0x80102080,
+       0x80102000, 0x48126010, 0x4813c857, 0x58080802,
+       0x40100000, 0x80042480, 0x02001800, 0x001005d8,
+       0x58080000, 0x58081801, 0x80102400, 0x4812600e,
+       0x480e600f, 0x4813c857, 0x592c0208, 0x8400055e,
+       0x48025a08, 0x4833c857, 0x4823c857, 0x482bc857,
+       0x4832600b, 0x4822600c, 0x482a600d, 0x80000580,
+       0x0401f003, 0x82000540, 0x00000001, 0x1c01f000,
+       0x58300204, 0x82004d00, 0x0000000f, 0x82244400,
+       0x001010bd, 0x82000500, 0x000000ff, 0x82000580,
+       0x00000029, 0x0402001b, 0x50204000, 0x592c0409,
+       0x80000540, 0x02000800, 0x001005d8, 0x82000c80,
+       0x00000002, 0x04001011, 0x58300001, 0x80006540,
+       0x02000800, 0x001005d8, 0x58300204, 0x82000500,
+       0x0000000f, 0x82000400, 0x001010bd, 0x50004000,
+       0x40040000, 0x800409c0, 0x04000006, 0x82040c80,
+       0x00000005, 0x040217f1, 0x80204400, 0x80000580,
+       0x1c01f000, 0x59e00004, 0x8c00050e, 0x02020000,
+       0x00100903, 0x1c01f000, 0x4c5c0000, 0x59e4b800,
+       0x485fc857, 0x825c0500, 0x0000001f, 0x04000004,
+       0x59e40862, 0x0201f800, 0x001005d8, 0x825c0500,
+       0x000000e0, 0x02000800, 0x001005d8, 0x8c5cbd0e,
+       0x04020807, 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a,
+       0x04020878, 0x5c00b800, 0x1c01f000, 0x4803c856,
+       0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000,
+       0x42007800, 0x0010b8ec, 0x583c0001, 0x583c0802,
+       0x80040540, 0x0400003f, 0x42000800, 0x0010b7f7,
+       0x50065800, 0x592c0002, 0x82000580, 0x00000000,
+       0x0400000e, 0x59e40850, 0x59e41853, 0x400c0000,
+       0x80040400, 0x59e40852, 0x4807c857, 0x80041480,
+       0x04021008, 0x40001000, 0x480bc857, 0x4a007800,
+       0x00000001, 0x0401f006, 0x4803c857, 0x0401f029,
+       0x59e41050, 0x480bc857, 0x49787800, 0x480bc857,
+       0x480fc857, 0x592c0003, 0x80000540, 0x04000006,
+       0x80080580, 0x04020004, 0x592c0003, 0x4803c857,
+       0x480bc857, 0x480a5803, 0x592c0007, 0x800001c0,
+       0x04000007, 0x592c1007, 0x480bc857, 0x583c0003,
+       0x4803c857, 0x80080480, 0x04001003, 0x583c1001,
+       0x480bc857, 0x583c0802, 0x480bc857, 0x4807c857,
+       0x4a025801, 0x00000000, 0x4a025809, 0x001011bc,
+       0x480a5807, 0x48065808, 0x59e40053, 0x48025804,
+       0x412c1000, 0x492fc857, 0x0201f800, 0x00100858,
+       0x5c025800, 0x4a03c800, 0x00000040, 0x1c01f000,
+       0x42007800, 0x0010b7f7, 0x503c7800, 0x4a007802,
+       0x00000100, 0x42007800, 0x0010b8ec, 0x583c0000,
+       0x4803c857, 0x82000d80, 0x00000001, 0x04000004,
+       0x80000000, 0x48007800, 0x0401f019, 0x49787800,
+       0x583c1806, 0x583c0005, 0x800c1800, 0x480c7806,
+       0x800c0580, 0x04020002, 0x49787806, 0x583c0807,
+       0x800409c0, 0x0400000e, 0x583c0008, 0x80000000,
+       0x48007808, 0x80040580, 0x04020009, 0x49787808,
+       0x583c2006, 0x42001800, 0x00000001, 0x42001000,
+       0x00008028, 0x0201f800, 0x00103a3e, 0x1c01f000,
+       0x4a03c800, 0x00000020, 0x0201f800, 0x0010aa40,
+       0x59e40000, 0x1c01f000, 0x4d2c0000, 0x4a007001,
+       0x00000000, 0x82040d00, 0x43000f80, 0x02020800,
+       0x001005d8, 0x58380009, 0x4803c00f, 0x0201f800,
+       0x00109402, 0x583a5808, 0x592c0000, 0x48007008,
+       0x800001c0, 0x04020002, 0x49787007, 0x0201f800,
+       0x001007f4, 0x5c025800, 0x0201f000, 0x0010087d,
+       0x4803c856, 0x4c3c0000, 0x4d2c0000, 0x4d300000,
+       0x5830000a, 0x80025d40, 0x02000800, 0x001005d8,
+       0x592e6008, 0x4c300000, 0x0201f800, 0x0010941a,
+       0x5c006000, 0x02000800, 0x001005d8, 0x58300002,
+       0x82000580, 0x00000100, 0x04020010, 0x5930780b,
+       0x583c0001, 0x80000540, 0x0400000e, 0x4802600b,
+       0x40007800, 0x82000400, 0x00000002, 0x48006003,
+       0x583c0000, 0x48006004, 0x40301000, 0x0201f800,
+       0x00100858, 0x0401f00c, 0x4a025a06, 0x00000002,
+       0x4c300000, 0x0201f800, 0x000202da, 0x5c006000,
+       0x40325800, 0x0201f800, 0x001007f4, 0x0201f800,
+       0x0002077d, 0x5c026000, 0x5c025800, 0x5c007800,
+       0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000,
+       0x42007000, 0x0010b7f8, 0x58380801, 0x82040580,
+       0x00000002, 0x04020011, 0x58386002, 0x5830000a,
+       0x812c0580, 0x0402000d, 0x59e00004, 0x8c00050e,
+       0x040007fe, 0x59dc0006, 0x4803c857, 0x4a03b805,
+       0x20000000, 0x8c00053e, 0x040007f8, 0x4a007001,
+       0x00000000, 0x0401f019, 0x58386006, 0x40305000,
+       0x803061c0, 0x02000800, 0x001005d8, 0x5830000a,
+       0x812c0580, 0x04000004, 0x40305000, 0x58306000,
+       0x0401f7f8, 0x40280000, 0x80300580, 0x58300000,
+       0x04000006, 0x48005000, 0x800001c0, 0x04020007,
+       0x48287005, 0x0401f005, 0x800001c0, 0x04020002,
+       0x48007005, 0x48007006, 0x40325800, 0x0201f800,
+       0x001007f4, 0x42007000, 0x0010b7f8, 0x58380001,
+       0x82000580, 0x00000000, 0x02000800, 0x0010087d,
+       0x5c026000, 0x5c025800, 0x1c01f000, 0x4803c856,
+       0x42000800, 0x0000003c, 0x48079000, 0x59c80000,
+       0x80040500, 0x040207fe, 0x497b9005, 0x4a039035,
+       0x00880200, 0x59a8000e, 0x800000e0, 0x4803900e,
+       0x4a039011, 0x00000024, 0x4a03900f, 0x0010d1c0,
+       0x4a039010, 0x0010d1c0, 0x4a039015, 0x0000007f,
+       0x4a03900d, 0x00000040, 0x4a039000, 0x00001600,
+       0x1c01f000, 0x59c80007, 0x8c000508, 0x040208b7,
+       0x59c80800, 0x8c040d16, 0x04020004, 0x82000500,
+       0x00000006, 0x0c01f005, 0x4807c857, 0x82000500,
+       0x0000000e, 0x0c01f001, 0x001012a8, 0x001012a6,
+       0x00105999, 0x001012a6, 0x001012aa, 0x001012a6,
+       0x001012aa, 0x001012aa, 0x001012a6, 0x001012a6,
+       0x001012a6, 0x001012a6, 0x001012aa, 0x001012a6,
+       0x001012aa, 0x001012a6, 0x0201f800, 0x001005d8,
+       0x4803c857, 0x1c01f000, 0x59c8080c, 0x4807c857,
+       0x82040500, 0x00006000, 0x04000004, 0x0201f800,
+       0x0010aa03, 0x0401f006, 0x82040500, 0x007f0000,
+       0x04000006, 0x0201f800, 0x0010a9d5, 0x0201f800,
+       0x00106eb3, 0x0401f02b, 0x82040500, 0x00000014,
+       0x04000014, 0x0201f800, 0x0010aa32, 0x836c0580,
+       0x00000003, 0x0400000d, 0x0201f800, 0x0010513b,
+       0x04000004, 0x0201f800, 0x0010411d, 0x0401f007,
+       0x4a035033, 0x00000001, 0x4202d800, 0x00000001,
+       0x0201f800, 0x001050a2, 0x0401f817, 0x0401f015,
+       0x82040500, 0x00001c00, 0x04000005, 0x0201f800,
+       0x0010aa11, 0x0401f810, 0x0401f00e, 0x82040500,
+       0x00000140, 0x04000005, 0x0201f800, 0x0010aa24,
+       0x0401f809, 0x0401f007, 0x82040500, 0x00008000,
+       0x04000004, 0x0201f800, 0x0010a9fc, 0x0401f802,
+       0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000,
+       0x0201f800, 0x00100ec9, 0x5c002800, 0x5c002000,
+       0x5c001800, 0x1c01f000, 0x4803c856, 0x59a80804,
+       0x59a8002b, 0x82000500, 0xfffff000, 0x80040540,
+       0x4803502b, 0x59a8002f, 0x82000500, 0xfffff000,
+       0x80040540, 0x4803502f, 0x48078882, 0x82041c00,
+       0x0000000f, 0x800c1908, 0x820c1c00, 0x00000004,
+       0x400c2000, 0x901029c0, 0x82040480, 0x000001e4,
+       0x04021005, 0x42001000, 0x00000008, 0x801020c6,
+       0x0401f031, 0x82040480, 0x00000230, 0x04021009,
+       0x42001000, 0x00000007, 0x801000c2, 0x800000c2,
+       0x80100400, 0x80100400, 0x80102400, 0x0401f026,
+       0x82040480, 0x00000298, 0x04021008, 0x42001000,
+       0x00000006, 0x801000c2, 0x800000c2, 0x80100400,
+       0x80102400, 0x0401f01c, 0x82040480, 0x00000328,
+       0x04021007, 0x42001000, 0x00000005, 0x801000c2,
+       0x800000c2, 0x80102400, 0x0401f013, 0x82040480,
+       0x00000404, 0x04021005, 0x42001000, 0x00000004,
+       0x801020c4, 0x0401f00c, 0x82040480, 0x0000056c,
+       0x04021006, 0x42001000, 0x00000003, 0x801000c2,
+       0x80102400, 0x0401f004, 0x42001000, 0x00000002,
+       0x801020c2, 0x82100480, 0x00000110, 0x80000080,
+       0x80002000, 0x800800d0, 0x80140540, 0x80100540,
+       0x48039035, 0x1c01f000, 0x59c80815, 0x0201f800,
+       0x001005d0, 0x82040d00, 0x0000007c, 0x48079000,
+       0x59c80000, 0x80040500, 0x040207fe, 0x8c040d04,
+       0x04000003, 0x59c80035, 0x48039035, 0x59c80000,
+       0x82000540, 0x00001200, 0x48039000, 0x1c01f000,
+       0x4803c856, 0x497b88a9, 0x4a038807, 0x00000001,
+       0x497b8807, 0x59c40005, 0x48038805, 0x0201f800,
+       0x00101815, 0x4201d000, 0x000001f4, 0x0201f800,
+       0x0010608e, 0x497b880e, 0x4200b000, 0x000001f4,
+       0x42000000, 0x00000001, 0x42000800, 0x00000014,
+       0x0201f800, 0x00101944, 0x42000800, 0x00000014,
+       0x0201f800, 0x0010193f, 0x8c040d00, 0x04000005,
+       0x8058b040, 0x040207f3, 0x0201f800, 0x001005d8,
+       0x4200b000, 0x00000032, 0x42000000, 0x00000001,
+       0x42000800, 0x000000b4, 0x0201f800, 0x00101944,
+       0x42000800, 0x000000b4, 0x0201f800, 0x0010193f,
+       0x8c040d00, 0x04000005, 0x8058b040, 0x040207f3,
+       0x0201f800, 0x001005d8, 0x59c40005, 0x48038805,
+       0x42000000, 0x00000089, 0x800008d0, 0x48075054,
+       0x48075055, 0x48075056, 0x42000800, 0x000000e0,
+       0x0201f800, 0x00101944, 0x42000800, 0x000000f4,
+       0x0201f800, 0x0010193f, 0x82040500, 0xffffffd1,
+       0x82000540, 0x00000002, 0x42000800, 0x000000f4,
+       0x0201f800, 0x00101944, 0x42000800, 0x000000a0,
+       0x0201f800, 0x0010193f, 0x82040540, 0x00000001,
+       0x42000800, 0x000000a0, 0x0201f800, 0x00101944,
+       0x42000800, 0x00000000, 0x0201f800, 0x0010193f,
+       0x82040540, 0x00000001, 0x42000800, 0x00000000,
+       0x0201f800, 0x00101944, 0x4201d000, 0x0001d4c0,
+       0x0201f800, 0x0010608e, 0x0401fa2b, 0x4a0388a7,
+       0x0000f7f7, 0x4a0388a3, 0x8000403c, 0x4a0388ae,
+       0x000061a8, 0x4a038801, 0x00032063, 0x4a038810,
+       0x00410108, 0x4a038811, 0x00520608, 0x4a038812,
+       0x00450320, 0x4a038813, 0x00440405, 0x4a03881c,
+       0x004132e1, 0x4a038850, 0x80000108, 0x4a038860,
+       0x00000008, 0x4a038870, 0x00000008, 0x4a038851,
+       0x80000508, 0x4a038861, 0x00800000, 0x4a038871,
+       0x00800000, 0x4a038852, 0x80000708, 0x4a038862,
+       0x00800000, 0x4a038872, 0x00800000, 0x4a038853,
+       0x80000608, 0x497b8863, 0x4a038873, 0x00800000,
+       0x4a038882, 0x00000840, 0x4a0388a5, 0x0000001e,
+       0x4a0388a6, 0x0000001e, 0x4a0388b0, 0x00007530,
+       0x4a038802, 0x0000ffff, 0x4a038806, 0xc0e00800,
+       0x1c01f000, 0x497b5022, 0x4a035021, 0x00000001,
+       0x42000800, 0x00000040, 0x0201f800, 0x0010193f,
+       0x82040500, 0xffffffaf, 0x82000540, 0x00000000,
+       0x42000800, 0x00000040, 0x0201f800, 0x00101944,
+       0x42000800, 0x000000f4, 0x0201f800, 0x0010193f,
+       0x4c040000, 0x40040000, 0x84000548, 0x42000800,
+       0x000000f4, 0x0201f800, 0x00101944, 0x42000800,
+       0x00000000, 0x0201f800, 0x0010193f, 0x82040500,
+       0xffffffc1, 0x82000540, 0x00000038, 0x42000800,
+       0x00000000, 0x0201f800, 0x00101944, 0x5c000000,
+       0x42000800, 0x000000f4, 0x0201f000, 0x00101944,
+       0x59c40805, 0x4807c857, 0x59c40006, 0x80040d00,
+       0x02000800, 0x001005d8, 0x82040500, 0x00e00800,
+       0x04020004, 0x8c040d3e, 0x040208c4, 0x0401f007,
+       0x82040500, 0x00800800, 0x02020800, 0x001005d0,
+       0x0201f800, 0x001005d8, 0x4c5c0000, 0x4c600000,
+       0x59c4b805, 0x485fc857, 0x59c40006, 0x8c000500,
+       0x04000003, 0x8c5cbd00, 0x04020079, 0x0201f800,
+       0x0010513b, 0x04000014, 0x59c40005, 0x82000500,
+       0x000000c0, 0x04000036, 0x0201f800, 0x00105151,
+       0x04020033, 0x4a038805, 0x04000000, 0x59c400a3,
+       0x82000500, 0xbf203fff, 0x480388a3, 0x497b5049,
+       0x4a038805, 0x000000c0, 0x0201f800, 0x00105065,
+       0x0401f063, 0x8c5cbd34, 0x04020025, 0x59c40005,
+       0x8c00050c, 0x04020012, 0x8c00050e, 0x04020013,
+       0x8c00050a, 0x04020014, 0x8c000508, 0x0400000b,
+       0x59a80017, 0x82000580, 0x00000009, 0x04020007,
+       0x42000000, 0x0010b844, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00105318, 0x0401f04b, 0x4a035033,
+       0x00000000, 0x0401f00b, 0x4a035033, 0x00000002,
+       0x0401f008, 0x42000000, 0x0010b846, 0x0201f800,
+       0x0010aa47, 0x0201f800, 0x001052c2, 0x0401f03e,
+       0x0201f800, 0x00105378, 0x0401f03b, 0x8c5cbd34,
+       0x04000037, 0x59c40005, 0x8c00053a, 0x04020005,
+       0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47,
+       0x4a038805, 0x02000000, 0x0201f800, 0x0010513b,
+       0x04020010, 0x4a038805, 0x04000000, 0x0201f800,
+       0x00105149, 0x04020008, 0x4a035033, 0x00000001,
+       0x4202d800, 0x00000001, 0x0201f800, 0x001050a2,
+       0x0401f05b, 0x41780000, 0x0201f800, 0x00105113,
+       0x0201f800, 0x001019fe, 0x4000c000, 0x0201f800,
+       0x00101963, 0x836c1580, 0x00000004, 0x0402000d,
+       0x8c5cbd00, 0x04020012, 0x59a81005, 0x8c081506,
+       0x04020005, 0x59c410a3, 0x82081540, 0x00000008,
+       0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806,
+       0x4a038805, 0x04000000, 0x4202d800, 0x00000001,
+       0x497b5014, 0x0201f800, 0x00103b38, 0x8c5cbd3c,
+       0x04020858, 0x8c5cbd00, 0x04000036, 0x42000000,
+       0x0010b8ca, 0x0201f800, 0x0010aa47, 0x4a038805,
+       0x00000001, 0x4200b000, 0x000003e8, 0x4201d000,
+       0x00000064, 0x4c580000, 0x0201f800, 0x0010608e,
+       0x0201f800, 0x001018d3, 0x5c00b000, 0x04000004,
+       0x8058b040, 0x040207f6, 0x0401f004, 0x4a038805,
+       0x00000001, 0x0401f01f, 0x59c40006, 0x84000500,
+       0x48038806, 0x0201f800, 0x00106ede, 0x497b8880,
+       0x0201f800, 0x0010a9c0, 0x59c4000d, 0x8c000500,
+       0x02020800, 0x0010a9ce, 0x59c400a3, 0x82000500,
+       0xfcf8ffff, 0x480388a3, 0x4a03504c, 0x00000002,
+       0x4202d800, 0x00000004, 0x4a038805, 0x00000001,
+       0x0201f800, 0x001006d4, 0x0401fb3b, 0x497b5052,
+       0x4a035049, 0x00000001, 0x0201f800, 0x00100452,
+       0x825cbd00, 0xbbfffffe, 0x485f8805, 0x5c00c000,
+       0x5c00b800, 0x1c01f000, 0x59c41004, 0x480bc857,
+       0x8c081500, 0x04000006, 0x4803c856, 0x497b2807,
+       0x0201f800, 0x00106fa4, 0x0401f00a, 0x82080500,
+       0x000001f0, 0x04000007, 0x4803c856, 0x417a3000,
+       0x0201f800, 0x00106062, 0x0201f800, 0x00106fc6,
+       0x4a038805, 0x80000000, 0x1c01f000, 0x59c408a3,
+       0x4807c857, 0x84040d40, 0x480788a3, 0x1c01f000,
+       0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000,
+       0x4a038805, 0x40000000, 0x42000000, 0x0010b8c6,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x00106c55,
+       0x59c41004, 0x8c081500, 0x04000054, 0x598e600d,
+       0x497b2807, 0x813261c0, 0x04000032, 0x59300403,
+       0x82000580, 0x00000032, 0x0402002e, 0x5930001c,
+       0x48038833, 0x4a038807, 0x00018000, 0x4201d000,
+       0x00000002, 0x0201f800, 0x0010608e, 0x497b8807,
+       0x4201d000, 0x00000002, 0x0201f800, 0x0010608e,
+       0x0201f800, 0x00106e21, 0x4201d000, 0x00007530,
+       0x0201f800, 0x0010608e, 0x59c408a4, 0x82040d00,
+       0x0000000f, 0x82040d80, 0x00000000, 0x04000005,
+       0x42000000, 0x00200000, 0x0201f800, 0x00101949,
+       0x0201f800, 0x00106bbf, 0x59300008, 0x80000540,
+       0x02000800, 0x001005d8, 0x40025800, 0x4a025a04,
+       0x00000103, 0x5931d821, 0x58ef400b, 0x58ec0009,
+       0x0801f800, 0x0201f800, 0x0002077d, 0x0401f047,
+       0x598c000f, 0x82001c80, 0x000000c8, 0x0402100f,
+       0x80000000, 0x4803180f, 0x59c400a4, 0x82000500,
+       0x0000000f, 0x82000580, 0x00000002, 0x04020004,
+       0x42000000, 0x00200000, 0x0401fbf7, 0x0201f800,
+       0x0010604d, 0x0401f035, 0x4933c857, 0x0201f800,
+       0x00106e21, 0x813261c0, 0x04000030, 0x4a026203,
+       0x00000001, 0x42027000, 0x00000027, 0x0201f800,
+       0x000207a1, 0x0401f029, 0x8c081508, 0x04000027,
+       0x417a3000, 0x0201f800, 0x001070d8, 0x42032000,
+       0x0000bf32, 0x0201f800, 0x00106062, 0x59926004,
+       0x813261c0, 0x04000012, 0x42001800, 0x000000c8,
+       0x0201f800, 0x001070a4, 0x0402000d, 0x59c400a4,
+       0x82000500, 0x0000000f, 0x82000580, 0x00000002,
+       0x04020004, 0x42000000, 0x00200000, 0x0401fbce,
+       0x0201f800, 0x00106052, 0x0401f00c, 0x4933c857,
+       0x0201f800, 0x00106dc3, 0x813261c0, 0x04000007,
+       0x42027000, 0x0000004f, 0x4a026203, 0x00000003,
+       0x0201f800, 0x000207a1, 0x5c022800, 0x5c034800,
+       0x5c03a000, 0x5c032000, 0x0201f000, 0x00106c4b,
+       0x4803c857, 0x59a80821, 0x48035021, 0x80041580,
+       0x04000045, 0x800409c0, 0x04000023, 0x497b504c,
+       0x42000000, 0x0010b80d, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x0010aaf9, 0x42001000, 0x00008011,
+       0x59c40001, 0x82000500, 0x00018000, 0x82001d80,
+       0x00000000, 0x04000009, 0x82001d80, 0x00008000,
+       0x04000009, 0x82001d80, 0x00010000, 0x04000009,
+       0x0201f800, 0x001005d8, 0x42001800, 0x00000000,
+       0x0401f006, 0x42001800, 0x00000001, 0x0401f003,
+       0x42001800, 0x00000003, 0x0201f800, 0x00103a3e,
+       0x0401f021, 0x59a8084c, 0x800409c0, 0x04020007,
+       0x59c4000d, 0x8c000520, 0x04000004, 0x42001800,
+       0x00000003, 0x0401f002, 0x40041800, 0x0201f800,
+       0x0010aadd, 0x42001000, 0x00008012, 0x0201f800,
+       0x00103a3e, 0x0201f800, 0x001006d4, 0x0201f800,
+       0x0010ab33, 0x0402000c, 0x0401f853, 0x4d400000,
+       0x4d3c0000, 0x42028000, 0x00000028, 0x42027800,
+       0x00000408, 0x0201f800, 0x00101fe5, 0x5c027800,
+       0x5c028000, 0x1c01f000, 0x4803c857, 0x82000400,
+       0x0010210e, 0x50000800, 0x82040d00, 0x000000ff,
+       0x1c01f000, 0x4803c856, 0x4c580000, 0x4200b000,
+       0x00000010, 0x497b88ac, 0x497b88ad, 0x8058b040,
+       0x040207fe, 0x5c00b000, 0x1c01f000, 0x4807c857,
+       0x48075010, 0x80041108, 0x4200b000, 0x00000010,
+       0x497b88ac, 0x80000580, 0x800811c0, 0x04020006,
+       0x82040500, 0x0000000f, 0x82000400, 0x0010ab38,
+       0x50000000, 0x480388ad, 0x80081040, 0x8058b040,
+       0x040207f5, 0x1c01f000, 0x59a80005, 0x04000003,
+       0x84000546, 0x0401f002, 0x84000506, 0x48035005,
+       0x4803c857, 0x1c01f000, 0x4803c857, 0x4c080000,
+       0x4c040000, 0x4c000000, 0x59c40892, 0x4807c857,
+       0x80041580, 0x04000010, 0x80041480, 0x04021007,
+       0x80081080, 0x80081000, 0x4008b000, 0x42000000,
+       0x00000201, 0x0401f004, 0x4008b000, 0x42000000,
+       0x00000210, 0x48038886, 0x8058b040, 0x040207fe,
+       0x497b8886, 0x5c000000, 0x5c000800, 0x5c001000,
+       0x1c01f000, 0x4803c856, 0x0201f800, 0x00103b25,
+       0x04000005, 0x42028000, 0x0000002e, 0x0201f000,
+       0x0010a449, 0x1c01f000, 0x42000800, 0x00000002,
+       0x59a80005, 0x8c000514, 0x0402000b, 0x59c80835,
+       0x82040d00, 0x00001f00, 0x80040910, 0x80040800,
+       0x59a8006c, 0x80000540, 0x04000003, 0x42000800,
+       0x0000025a, 0x4807c857, 0x1c01f000, 0x4c000000,
+       0x59a80053, 0x4803c857, 0x82000580, 0x00000000,
+       0x5c000000, 0x1c01f000, 0x4c000000, 0x59a80053,
+       0x4803c857, 0x82000580, 0x00000001, 0x5c000000,
+       0x1c01f000, 0x4c000000, 0x59a80053, 0x4803c857,
+       0x82000580, 0x00000003, 0x5c000000, 0x1c01f000,
+       0x4c000000, 0x59a80053, 0x82000580, 0x00000002,
+       0x5c000000, 0x1c01f000, 0x4c000000, 0x4c040000,
+       0x4c080000, 0x4c380000, 0x59a80040, 0x82000c80,
+       0x00000007, 0x02021800, 0x001005d8, 0x0c01f806,
+       0x5c007000, 0x5c001000, 0x5c000800, 0x5c000000,
+       0x1c01f000, 0x0010166c, 0x0010167f, 0x00101693,
+       0x00101695, 0x001016bc, 0x001016be, 0x001016c0,
+       0x4803c856, 0x4a035042, 0x00000000, 0x42000000,
+       0x00000002, 0x0401fa1b, 0x42000000, 0x00000002,
+       0x0401f9ad, 0x0401fab2, 0x4803c856, 0x4a035040,
+       0x00000006, 0x42000800, 0x0000001e, 0x42001000,
+       0x001016c1, 0x0201f000, 0x0010606e, 0x497b5045,
+       0x4a035050, 0x00000036, 0x4a03504f, 0x0000002a,
+       0x4803c856, 0x4a035042, 0x00000001, 0x42000000,
+       0x00000002, 0x0401f998, 0x4803c856, 0x4a035040,
+       0x00000006, 0x42000800, 0x0000001e, 0x42001000,
+       0x001016c1, 0x0201f000, 0x0010606e, 0x0201f800,
+       0x001005d8, 0x4a035050, 0x00000036, 0x4803c856,
+       0x4a035042, 0x00000003, 0x42000800, 0x00000000,
+       0x0401faa3, 0x82040d00, 0x00000090, 0x82040580,
+       0x00000090, 0x04000009, 0x82040580, 0x00000010,
+       0x04000009, 0x82040580, 0x00000000, 0x04000008,
+       0x0201f800, 0x001005d8, 0x42000000, 0x00000001,
+       0x0401f005, 0x41780000, 0x0401f003, 0x42000000,
+       0x00000002, 0x0401f970, 0x497b5046, 0x4803c856,
+       0x4a035040, 0x00000006, 0x42000800, 0x0000001e,
+       0x42001000, 0x001016c1, 0x0201f000, 0x0010606e,
+       0x0201f800, 0x001005d8, 0x0201f800, 0x001005d8,
+       0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000,
+       0x4c380000, 0x59a80042, 0x82000c80, 0x00000007,
+       0x02021800, 0x001005d8, 0x0c01f806, 0x5c007000,
+       0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000,
+       0x001016d7, 0x001016f6, 0x0010174a, 0x00101761,
+       0x00101778, 0x00101781, 0x00101783, 0x0401f9fc,
+       0x0402001b, 0x59a81048, 0x42000800, 0x00000000,
+       0x0401fa63, 0x82040d00, 0x00000090, 0x82040580,
+       0x00000090, 0x04000009, 0x82040580, 0x00000010,
+       0x04000008, 0x82040580, 0x00000000, 0x04000007,
+       0x0201f800, 0x001005d8, 0x84081540, 0x0401f004,
+       0x84081542, 0x0401f002, 0x84081544, 0x480b5048,
+       0x4a035040, 0x00000001, 0x0401f003, 0x0401f8cb,
+       0x0401ff82, 0x1c01f000, 0x0401f88f, 0x04000052,
+       0x0401f9db, 0x0402002a, 0x42000800, 0x00000000,
+       0x0401fa43, 0x82040d00, 0x00000090, 0x82040580,
+       0x00000000, 0x04000044, 0x82040580, 0x00000010,
+       0x04000006, 0x82040580, 0x00000090, 0x04000009,
+       0x0201f800, 0x001005d8, 0x59c40801, 0x82040d00,
+       0x00018000, 0x82040580, 0x00000000, 0x04000036,
+       0x42000800, 0x00000000, 0x0401fa2d, 0x82040d00,
+       0x00000090, 0x82040580, 0x00000010, 0x04000006,
+       0x82040580, 0x00000090, 0x04000006, 0x02020800,
+       0x001005d8, 0x59a80048, 0x84000542, 0x0401f003,
+       0x59a80048, 0x84000540, 0x48035048, 0x59a80045,
+       0x80000000, 0x48035045, 0x82000580, 0x00000005,
+       0x04000003, 0x0401f861, 0x0401f01e, 0x497b5045,
+       0x59c40801, 0x82040d00, 0x00018000, 0x82040580,
+       0x00000000, 0x04000009, 0x82040580, 0x00008000,
+       0x04000009, 0x82040580, 0x00010000, 0x04000008,
+       0x0201f800, 0x001005d8, 0x42000000, 0x00000001,
+       0x0401f005, 0x41780000, 0x0401f003, 0x42000000,
+       0x00000002, 0x0401f94b, 0x4a035042, 0x00000002,
+       0x0401f004, 0x4a035040, 0x00000003, 0x0401f002,
+       0x0401ff42, 0x1c01f000, 0x0401f83b, 0x04000015,
+       0x59a8004f, 0x80000040, 0x4803504f, 0x0401f984,
+       0x04020005, 0x4a035040, 0x00000003, 0x497b5041,
+       0x0401f00c, 0x59a8004f, 0x80000540, 0x04020003,
+       0x0401f89e, 0x0401f002, 0x0401f84b, 0x0401f82f,
+       0x497b5045, 0x4a035042, 0x00000001, 0x0401ff2b,
+       0x1c01f000, 0x0401f824, 0x04000015, 0x0401f970,
+       0x0402000f, 0x59a80046, 0x80000000, 0x48035046,
+       0x82000580, 0x00000007, 0x0402000c, 0x4a035052,
+       0x0000000a, 0x497b5049, 0x59a80048, 0x8400055e,
+       0x48035048, 0x4803c857, 0x0401f005, 0x0401f817,
+       0x4a035042, 0x00000004, 0x0401ff3d, 0x1c01f000,
+       0x0401f80d, 0x04000007, 0x0401f959, 0x04020003,
+       0x0401ff1b, 0x0401f003, 0x0401f80c, 0x0401ff34,
+       0x1c01f000, 0x0201f800, 0x001005d8, 0x0201f800,
+       0x001005d8, 0x59a80050, 0x80000040, 0x48035050,
+       0x0400088d, 0x1c01f000, 0x4c040000, 0x42000800,
+       0x00000000, 0x0401f9b2, 0x82040d00, 0x00000090,
+       0x82040580, 0x00000090, 0x04000009, 0x82040580,
+       0x00000010, 0x04000009, 0x82040580, 0x00000000,
+       0x04000009, 0x0201f800, 0x001005d8, 0x42000000,
+       0x00000002, 0x0401f005, 0x42000000, 0x00000001,
+       0x0401f002, 0x41780000, 0x0401f8ea, 0x5c000800,
+       0x1c01f000, 0x4c040000, 0x59c40801, 0x82040d00,
+       0x00018000, 0x82040580, 0x00000000, 0x04000009,
+       0x82040580, 0x00008000, 0x04000009, 0x82040580,
+       0x00010000, 0x04000009, 0x0201f800, 0x001005d8,
+       0x42000000, 0x00000002, 0x0401f005, 0x42000000,
+       0x00000001, 0x0401f002, 0x41780000, 0x0401f866,
+       0x5c000800, 0x1c01f000, 0x4c040000, 0x59a80045,
+       0x80000000, 0x48035045, 0x82000580, 0x00000005,
+       0x04020018, 0x497b5045, 0x59c40801, 0x82040d00,
+       0x00018000, 0x82040580, 0x00000000, 0x04000009,
+       0x82040580, 0x00008000, 0x04000009, 0x82040580,
+       0x00010000, 0x04000009, 0x0201f800, 0x001005d8,
+       0x42000000, 0x00000002, 0x0401f005, 0x42000000,
+       0x00000001, 0x0401f002, 0x41780000, 0x0401f846,
+       0x42000800, 0x00000000, 0x0401f961, 0x82040d00,
+       0x00000090, 0x82040580, 0x00000090, 0x04000009,
+       0x82040580, 0x00000010, 0x04000009, 0x82040580,
+       0x00000000, 0x04000009, 0x0201f800, 0x001005d8,
+       0x42000000, 0x00000002, 0x0401f005, 0x42000000,
+       0x00000001, 0x0401f002, 0x41780000, 0x0401f899,
+       0x5c000800, 0x1c01f000, 0x4c200000, 0x59a80048,
+       0x82000500, 0x00007fff, 0x02000800, 0x001005d8,
+       0x59a84047, 0x80204102, 0x02001800, 0x001005d8,
+       0x48235047, 0x80204500, 0x040007fa, 0x8c000504,
+       0x04020007, 0x8c000502, 0x04020008, 0x8c000500,
+       0x04020008, 0x0201f800, 0x001005d8, 0x42000000,
+       0x00000002, 0x0401f005, 0x41780000, 0x0401f003,
+       0x42000000, 0x00000001, 0x0401f80f, 0x5c004000,
+       0x1c01f000, 0x04011000, 0x4a03c840, 0x0010b440,
+       0x4a03c842, 0x00000009, 0x40000000, 0x040117ff,
+       0x4a035047, 0x00000004, 0x4a03503e, 0x00000000,
+       0x1c01f000, 0x59a80858, 0x82040d80, 0x01391077,
+       0x04020008, 0x59e00813, 0x8c040d00, 0x04000005,
+       0x82000d80, 0x00000002, 0x04020002, 0x41780000,
+       0x4c000000, 0x0401f9b1, 0x5c000000, 0x800001c0,
+       0x04000040, 0x82000d80, 0x00000001, 0x0402001d,
+       0x42000800, 0x000000a0, 0x0401f909, 0x82040540,
+       0x00000004, 0x42000800, 0x000000a0, 0x0401f909,
+       0x42000800, 0x000000c0, 0x0401f901, 0x82040540,
+       0x00000020, 0x42000800, 0x000000c0, 0x0401f901,
+       0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540,
+       0x00000000, 0x48038801, 0x59a80054, 0x80000110,
+       0x42000800, 0x000000e0, 0x0401f8f6, 0x0401f03c,
+       0x82000d80, 0x00000002, 0x02020800, 0x001005d8,
+       0x42000800, 0x000000a0, 0x0401f8e9, 0x82040500,
+       0xfffffffb, 0x42000800, 0x000000a0, 0x0401f8e9,
+       0x42000800, 0x000000c0, 0x0401f8e1, 0x82040500,
+       0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8e1,
+       0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540,
+       0x00010000, 0x48038801, 0x59a80056, 0x80000110,
+       0x42000800, 0x000000e0, 0x0401f8d6, 0x0401f01c,
+       0x42000800, 0x000000a0, 0x0401f8cd, 0x82040540,
+       0x00000004, 0x42000800, 0x000000a0, 0x0401f8cd,
+       0x42000800, 0x000000c0, 0x0401f8c5, 0x82040500,
+       0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8c5,
+       0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540,
+       0x00008000, 0x48038801, 0x59a80055, 0x80000110,
+       0x42000800, 0x000000e0, 0x0401f8ba, 0x0401f163,
+       0x4803c857, 0x59a80858, 0x82040d80, 0x01391077,
+       0x04020008, 0x59e00813, 0x8c040d00, 0x04000005,
+       0x82000d80, 0x00000002, 0x04020002, 0x41780000,
+       0x4c000000, 0x0401f94d, 0x5c000000, 0x800001c0,
+       0x04000026, 0x82000d80, 0x00000001, 0x04020010,
+       0x59a8006c, 0x80000540, 0x04000004, 0x42001000,
+       0x00000000, 0x0401fa0a, 0x42000800, 0x00000000,
+       0x0401f897, 0x82040540, 0x00000090, 0x42000800,
+       0x00000000, 0x0401f897, 0x0401f024, 0x82000d80,
+       0x00000002, 0x02020800, 0x001005d8, 0x59a8006c,
+       0x80000540, 0x04000004, 0x42001000, 0x00010000,
+       0x0401f9f7, 0x42000800, 0x00000000, 0x0401f884,
+       0x82040500, 0xffffff6f, 0x42000800, 0x00000000,
+       0x0401f884, 0x0401f011, 0x59a8006c, 0x80000540,
+       0x04000004, 0x42001000, 0x00008000, 0x0401f9e8,
+       0x42000800, 0x00000000, 0x0401f875, 0x82040500,
+       0xffffff6f, 0x82000540, 0x00000010, 0x42000800,
+       0x00000000, 0x0401f873, 0x0401f124, 0x4c580000,
+       0x4200b000, 0x00000014, 0x8058b040, 0x04000043,
+       0x59c4000d, 0x8c000520, 0x040207fc, 0x0401f85c,
+       0x59c4000d, 0x8c000520, 0x040207f8, 0x59c40808,
+       0x84040d50, 0x48078808, 0x4200b000, 0x000000c8,
+       0x8058b040, 0x040207ff, 0x4200b000, 0x00000014,
+       0x8058b040, 0x04000031, 0x59c4000d, 0x8c000520,
+       0x0402002e, 0x42000800, 0x00001000, 0x50040800,
+       0x82040c80, 0x24220001, 0x04020003, 0x8c000504,
+       0x040007f4, 0x0401f842, 0x59c4000d, 0x8c000520,
+       0x04020022, 0x42000800, 0x00001000, 0x50040800,
+       0x82040c80, 0x24220001, 0x04020003, 0x8c000504,
+       0x040007e8, 0x4200b000, 0x0000000a, 0x8058b040,
+       0x04000003, 0x0401f832, 0x0401f7fd, 0x4200b000,
+       0x00000064, 0x59c4000d, 0x8c00051e, 0x0400000f,
+       0x8058b040, 0x040207fc, 0x42000000, 0x00001000,
+       0x50000000, 0x82000480, 0x24220001, 0x04020004,
+       0x59c40808, 0x84040d10, 0x48078808, 0x80000580,
+       0x4803c857, 0x0401f00c, 0x42000000, 0x00001000,
+       0x50000000, 0x82000480, 0x24220001, 0x04020004,
+       0x59c40808, 0x84040d10, 0x48078808, 0x82000540,
+       0x00000001, 0x5c00b000, 0x1c01f000, 0x42000800,
+       0x000000a0, 0x0401f816, 0x82040500, 0xfffffffe,
+       0x42000800, 0x000000a0, 0x0401f816, 0x42000800,
+       0x00000000, 0x0401f80e, 0x82040500, 0xfffffffe,
+       0x42000800, 0x00000000, 0x0401f00e, 0x40000000,
+       0x40000000, 0x40000000, 0x40000000, 0x40000000,
+       0x1c01f000, 0x480b8805, 0x1c01f000, 0x4807880e,
+       0x59c4080f, 0x82040d00, 0x000000ff, 0x1c01f000,
+       0x900001c0, 0x80040d40, 0x84040d40, 0x4807880e,
+       0x1c01f000, 0x82000d80, 0x00200000, 0x04000009,
+       0x82000d80, 0x02000000, 0x04000006, 0x82000d80,
+       0x01000000, 0x04000006, 0x59c408a3, 0x0401f006,
+       0x59c408a3, 0x84040d30, 0x0401f003, 0x59c408a3,
+       0x84040d32, 0x80040540, 0x480388a3, 0x480788a3,
+       0x1c01f000, 0x59c400a3, 0x84000556, 0x480388a3,
+       0x84000516, 0x480388a3, 0x1c01f000, 0x485fc857,
+       0x4863c857, 0x4c640000, 0x4d3c0000, 0x4d400000,
+       0x0201f800, 0x00106ede, 0x4863500a, 0x0201f800,
+       0x0010ab33, 0x0402006c, 0x82600d00, 0x0000ff00,
+       0x800409c0, 0x0400000c, 0x4200c800, 0x00000001,
+       0x59a80010, 0x82000500, 0x000000ff, 0x80041110,
+       0x80081580, 0x04000021, 0x82041580, 0x0000ff00,
+       0x0400000a, 0x59c410a3, 0x82081500, 0x00008000,
+       0x04000009, 0x59c410a7, 0x82081500, 0x0000ff00,
+       0x82081580, 0x0000ff00, 0x4200c800, 0x00000000,
+       0x04000012, 0x59a80005, 0x8c000502, 0x04020008,
+       0x8c000500, 0x0402000d, 0x599c1017, 0x8c08151a,
+       0x0400003e, 0x84000542, 0x48035005, 0x4200c800,
+       0x00000002, 0x42028000, 0x00000004, 0x42027800,
+       0x00000008, 0x0401f008, 0x59a80805, 0x84040d40,
+       0x48075005, 0x42028000, 0x00000004, 0x42027800,
+       0x00000400, 0x59a80006, 0x8c000502, 0x04020006,
+       0x59a80805, 0x8c040d0a, 0x04020033, 0x84040d4a,
+       0x48075005, 0x42000000, 0x0010b812, 0x0201f800,
+       0x0010aa47, 0x59a8180a, 0x42001000, 0x00008013,
+       0x0201f800, 0x00103a3e, 0x0201f800, 0x00103b25,
+       0x04000015, 0x4d400000, 0x82600500, 0x000000ff,
+       0x42028800, 0x0000ffff, 0x40643000, 0x42028000,
+       0x0000000e, 0x0201f800, 0x0010a446, 0x42000800,
+       0x00000001, 0x42001000, 0x00000100, 0x0201f800,
+       0x0010618b, 0x5c028000, 0x599c0817, 0x8c040d0a,
+       0x04020011, 0x493fc857, 0x4943c857, 0x0201f800,
+       0x00101fe5, 0x0401f00c, 0x0201f800, 0x00103b25,
+       0x04000009, 0x42028000, 0x0000000f, 0x42028800,
+       0x0000ffff, 0x42003000, 0x00000000, 0x0201f800,
+       0x0010a449, 0x497b8880, 0x5c028000, 0x5c027800,
+       0x5c00c800, 0x1c01f000, 0x42000800, 0x000000a0,
+       0x0401ff5f, 0x82040540, 0x00000002, 0x42000800,
+       0x000000a0, 0x0401f75f, 0x42000800, 0x00000000,
+       0x0401ff57, 0x82040540, 0x00000002, 0x42000800,
+       0x00000000, 0x0401f757, 0x42000800, 0x000000a0,
+       0x0401ff4f, 0x82040500, 0xfffffffd, 0x42000800,
+       0x000000a0, 0x0401f74f, 0x42000800, 0x00000000,
+       0x0401ff47, 0x82040500, 0xfffffffd, 0x42000800,
+       0x00000000, 0x0401f747, 0x59c408a8, 0x0401ff38,
+       0x0401ff37, 0x59c400a8, 0x80040d80, 0x040207fb,
+       0x1c01f000, 0x4803c856, 0x4a038807, 0x00000001,
+       0x497b8807, 0x59c40005, 0x48038805, 0x497b506c,
+       0x497b506d, 0x41785800, 0x42006000, 0x00000001,
+       0x42006800, 0x00000003, 0x0401f824, 0x0401f82f,
+       0x40400000, 0x4803c857, 0x82408580, 0x00000000,
+       0x0402001d, 0x41785800, 0x42006000, 0x0000001e,
+       0x42006800, 0x00000014, 0x0401f818, 0x0401f823,
+       0x40400000, 0x4803c857, 0x82408580, 0x00000800,
+       0x04020011, 0x42005800, 0x00000001, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000014, 0x0401f80b,
+       0x0401f816, 0x40400000, 0x4803c857, 0x82408580,
+       0x0000ffff, 0x04020004, 0x4a03506c, 0x00000001,
+       0x4803c856, 0x1c01f000, 0x41785000, 0x0401f812,
+       0x0401f838, 0x40347000, 0x40340800, 0x0401f03d,
+       0x42005000, 0x00000001, 0x0401f80b, 0x0401f831,
+       0x40340800, 0x0401f037, 0x42005000, 0x00000002,
+       0x0401f805, 0x0401f81d, 0x0401f835, 0x40048000,
+       0x1c01f000, 0x0401f808, 0x0401f814, 0x40280800,
+       0x0401f826, 0x402c0800, 0x0401f827, 0x40300800,
+       0x0401f025, 0x42000800, 0x0000ffff, 0x42001000,
+       0x00000001, 0x0401f829, 0x42001000, 0x00000010,
+       0x0401f826, 0x42000800, 0x0000ffff, 0x42001000,
+       0x00000010, 0x0401f021, 0x41780800, 0x42001000,
+       0x00000002, 0x0401f01d, 0x0401f92e, 0x4a03d000,
+       0x00050004, 0x0401f92b, 0x4a03d000, 0x00050005,
+       0x0401f928, 0x4a03d000, 0x00050004, 0x42000800,
+       0x00000001, 0x42001000, 0x00000001, 0x0401f00f,
+       0x42000800, 0x00000002, 0x42001000, 0x00000002,
+       0x0401f00a, 0x42001000, 0x00000005, 0x0401f007,
+       0x42001000, 0x00000010, 0x0401f004, 0x42001000,
+       0x00000010, 0x0401f01b, 0x0401f912, 0x82082c00,
+       0x0010ab38, 0x50142800, 0x82081500, 0xffffffff,
+       0x04000013, 0x0401f90b, 0x80081040, 0x80142902,
+       0x40040000, 0x80140500, 0x04000007, 0x4a03d000,
+       0x00070006, 0x0401f903, 0x4a03d000, 0x00070007,
+       0x0401f006, 0x4a03d000, 0x00070004, 0x0401f8fd,
+       0x4a03d000, 0x00070005, 0x0401f7ec, 0x1c01f000,
+       0x41780800, 0x82082c00, 0x0010ab38, 0x50142800,
+       0x82081500, 0xffffffff, 0x04000010, 0x0401f8f1,
+       0x4a03d000, 0x00050001, 0x0401f8ee, 0x59e81800,
+       0x80081040, 0x80142902, 0x8c0c1d06, 0x04000004,
+       0x40140000, 0x80040d40, 0x0401f8e6, 0x4a03d000,
+       0x00070000, 0x0401f7ef, 0x1c01f000, 0x480bc857,
+       0x480b506d, 0x59c40001, 0x82000500, 0xffffefff,
+       0x48038801, 0x41781800, 0x0401f8c4, 0x41785800,
+       0x42006000, 0x0000001e, 0x42006800, 0x00000004,
+       0x0401ff7a, 0x42006800, 0x0000003c, 0x0401ff7d,
+       0x41785800, 0x42006000, 0x0000001e, 0x42006800,
+       0x00000004, 0x0401ff71, 0x41786800, 0x0401ff75,
+       0x41785800, 0x42006000, 0x0000001e, 0x41786800,
+       0x0401ff6a, 0x42006800, 0x00000002, 0x0401ff6d,
+       0x42006800, 0x00000001, 0x0401ff64, 0x42006800,
+       0x000000f5, 0x0401ff67, 0x41785800, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000004, 0x0401ff5b,
+       0x42006800, 0x00000020, 0x0401ff5e, 0x59a8106d,
+       0x0401f865, 0x42001800, 0x000200f5, 0x0401f897,
+       0x59a8106d, 0x0401f879, 0x41785800, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000004, 0x0401ff4b,
+       0x41786800, 0x0401ff4f, 0x59c40001, 0x82000540,
+       0x00001000, 0x48038801, 0x41785800, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000015, 0x0401ff3f,
+       0x0401ff4a, 0x40400000, 0x82000540, 0x00000002,
+       0x4c000000, 0x41785800, 0x42006000, 0x0000001e,
+       0x42006800, 0x00000015, 0x0401ff34, 0x5c000000,
+       0x40006800, 0x0401ff37, 0x41785800, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000015, 0x0401ff2b,
+       0x0401ff36, 0x40400000, 0x82000500, 0x0000fffd,
+       0x4c000000, 0x41785800, 0x42006000, 0x0000001e,
+       0x42006800, 0x00000015, 0x0401ff20, 0x5c000000,
+       0x40006800, 0x0401ff23, 0x41785800, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000014, 0x0401ff17,
+       0x0401ff22, 0x40400000, 0x82000540, 0x00000040,
+       0x4c000000, 0x41785800, 0x42006000, 0x0000001e,
+       0x42006800, 0x00000014, 0x0401ff0c, 0x5c000000,
+       0x40006800, 0x0401ff0f, 0x41785800, 0x42006000,
+       0x0000001e, 0x42006800, 0x00000014, 0x0401ff03,
+       0x0401ff0e, 0x40400000, 0x82000500, 0x0000ffbf,
+       0x4c000000, 0x41785800, 0x42006000, 0x0000001e,
+       0x42006800, 0x00000014, 0x0401fef8, 0x5c000000,
+       0x40006800, 0x0401fefb, 0x4a038886, 0x00002020,
+       0x0401f04c, 0x480bc857, 0x82080580, 0x00010000,
+       0x04020007, 0x82040d40, 0x00010000, 0x42001800,
+       0x00000001, 0x0401f82d, 0x0401f00f, 0x82080580,
+       0x00008000, 0x04000007, 0x82040d40, 0x00000000,
+       0x42001800, 0x00900001, 0x0401f824, 0x0401f006,
+       0x82040d40, 0x00008000, 0x42001800, 0x00100001,
+       0x0401f81e, 0x1c01f000, 0x480bc857, 0x82080580,
+       0x00010000, 0x04020008, 0x42001800, 0x000000a1,
+       0x0401f816, 0x42001800, 0x000000c1, 0x0401f813,
+       0x0401f011, 0x82080580, 0x00008000, 0x04000008,
+       0x42001800, 0x000400a1, 0x0401f80c, 0x42001800,
+       0x002000c1, 0x0401f809, 0x0401f007, 0x42001800,
+       0x000400a1, 0x0401f805, 0x42001800, 0x000000c1,
+       0x0401f802, 0x1c01f000, 0x480fc857, 0x41785800,
+       0x42006000, 0x0000001e, 0x41786800, 0x0401feb7,
+       0x400c6800, 0x80346960, 0x0401feba, 0x42006800,
+       0x00000001, 0x0401feb1, 0x400c6800, 0x0401feb5,
+       0x42006800, 0x00000003, 0x0401feac, 0x0401feb7,
+       0x40400000, 0x8c000504, 0x040207fc, 0x1c01f000,
+       0x42000000, 0x00000064, 0x80000040, 0x040207ff,
+       0x1c01f000, 0x00020103, 0x00101bd5, 0x00101bdb,
+       0x00101be1, 0x00101be9, 0x00101bef, 0x00101bf7,
+       0x00101bff, 0x00101c09, 0x00101c0f, 0x00101c17,
+       0x00101c1f, 0x00101c29, 0x00101c31, 0x00101c3b,
+       0x00101c45, 0x000200f8, 0x00101c51, 0x00101c59,
+       0x00101c61, 0x00101c6b, 0x00101c73, 0x00101c7d,
+       0x00101c87, 0x00101c93, 0x00101c9b, 0x00101ca5,
+       0x00101caf, 0x00101cbb, 0x00101cc5, 0x00101cd1,
+       0x00101cdd, 0x000200fd, 0x00101ceb, 0x00101cf3,
+       0x00101cfb, 0x00101d05, 0x00101d0d, 0x00101d17,
+       0x00101d21, 0x00101d2d, 0x00101d35, 0x00101d3f,
+       0x00101d49, 0x00101d55, 0x00101d5f, 0x00101d6b,
+       0x00101d77, 0x00101d85, 0x00101d8d, 0x00101d97,
+       0x00101da1, 0x00101dad, 0x00101db7, 0x00101dc3,
+       0x00101dcf, 0x00101ddd, 0x00101de7, 0x00101df3,
+       0x00101dff, 0x00101e0d, 0x00101e19, 0x00101e27,
+       0x00101e35, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00101418, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101289, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00101289, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020729, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020729, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00101289, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00101289, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020015, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020015, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020015, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00101155, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00101155, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101155, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101155, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101289, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101289, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f800,
+       0x00020104, 0x0201f000, 0x00020101, 0x4c000000,
+       0x4df00000, 0x0201f800, 0x00101155, 0x0201f800,
+       0x00101418, 0x0201f800, 0x00020729, 0x0201f800,
+       0x00020015, 0x0201f800, 0x00101289, 0x0201f000,
+       0x00020101, 0x4c000000, 0x4df00000, 0x0201f800,
+       0x00101155, 0x0201f800, 0x00101418, 0x0201f800,
+       0x00020729, 0x0201f800, 0x00020015, 0x0201f800,
+       0x00101289, 0x0201f800, 0x00020104, 0x0201f000,
+       0x00020101, 0x4c5c0000, 0x4c600000, 0x4178b800,
+       0x0201f800, 0x001048ec, 0x040200fd, 0x59a8c026,
+       0x0201f800, 0x0010513b, 0x04000003, 0x8c60c506,
+       0x0400000e, 0x8c60c500, 0x04020004, 0x8c60c50e,
+       0x040008f6, 0x0401f0f2, 0x0401fab4, 0x040200f0,
+       0x0201f800, 0x0010513b, 0x04020004, 0x4a03501c,
+       0x0000ffff, 0x0401f0ea, 0x8c60c504, 0x04000004,
+       0x4a03501c, 0x0000ffff, 0x0401f0e5, 0x59a8c010,
+       0x8260c500, 0x000000ff, 0x59a81013, 0x8c081500,
+       0x0400005d, 0x8c081502, 0x0402005b, 0x59a8b81c,
+       0x825c0d80, 0x0000ffff, 0x04020003, 0x4200b800,
+       0x00000001, 0x805c1104, 0x82086400, 0x0010be21,
+       0x50300800, 0x825c0500, 0x00000003, 0x0c01f001,
+       0x00101e81, 0x00101e7c, 0x00101e80, 0x00101e7e,
+       0x80040910, 0x0401f004, 0x80040930, 0x0401f002,
+       0x80040920, 0x82040500, 0x000000ff, 0x82000d80,
+       0x000000ff, 0x0400000f, 0x4c000000, 0x82000400,
+       0x0010210e, 0x50000800, 0x80040910, 0x82040580,
+       0x00000080, 0x5c000000, 0x04000030, 0x80600d80,
+       0x0400002e, 0x80000540, 0x0400002c, 0x0401f00b,
+       0x59a81005, 0x82081500, 0x00000003, 0x0402002b,
+       0x59a81013, 0x84081542, 0x480b5013, 0x4a03501c,
+       0x0000ffff, 0x0401f028, 0x4c000000, 0x59a80005,
+       0x8c000514, 0x42001000, 0x00000010, 0x02020800,
+       0x00104c6d, 0x5c000000, 0x0402001c, 0x417a8800,
+       0x0201f800, 0x00105c9a, 0x04020016, 0x0201f800,
+       0x001045e5, 0x04000006, 0x0201f800, 0x00104c62,
+       0x0401f8b1, 0x0400000f, 0x0401f00c, 0x599c0019,
+       0x8c00050e, 0x04020009, 0x0201f800, 0x001045a6,
+       0x04020008, 0x0201f800, 0x00104c62, 0x0401f9e1,
+       0x0401f8be, 0x04000003, 0x805cb800, 0x0401f7b2,
+       0x485f501c, 0x0401f086, 0x4a03501c, 0x0000ffff,
+       0x0401f083, 0x42003000, 0x0000007e, 0x59a8001c,
+       0x82001580, 0x0000ffff, 0x04020005, 0x80000d80,
+       0x4018b000, 0x4803c856, 0x0401f009, 0x8018b480,
+       0x04001004, 0x40000800, 0x4803c856, 0x0401f004,
+       0x4a03501c, 0x0000ffff, 0x0401f071, 0x4c040000,
+       0x4c580000, 0x82040400, 0x0010210e, 0x50000000,
+       0x82000500, 0x000000ff, 0x80604580, 0x0400005c,
+       0x0201f800, 0x00105c9b, 0x04020061, 0x59a80005,
+       0x8c000514, 0x42001000, 0x00000010, 0x02020800,
+       0x00104c6d, 0x5c00b000, 0x5c000800, 0x040207d7,
+       0x4c040000, 0x4c580000, 0x845cbd00, 0x0201f800,
+       0x00020245, 0x04000008, 0x599c0019, 0x8c00050e,
+       0x04020047, 0x0201f800, 0x001045ab, 0x0402004c,
+       0x0401f002, 0x845cbd40, 0x0201f800, 0x00104c62,
+       0x0201f800, 0x001049e7, 0x04020007, 0x59a80005,
+       0x8c000502, 0x04000033, 0x59340200, 0x8c00050e,
+       0x04020030, 0x59a81013, 0x8c081502, 0x04000025,
+       0x0201f800, 0x00104a09, 0x04000031, 0x8c5cbd00,
+       0x04020004, 0x0201f800, 0x001045ff, 0x0401f02c,
+       0x0401f9cd, 0x0400002a, 0x42026000, 0x0010bde9,
+       0x49366009, 0x497a6008, 0x417a7800, 0x0401f925,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00103b25, 0x0400001d, 0x41782800,
+       0x42003000, 0x00000008, 0x4d400000, 0x4d440000,
+       0x59368c03, 0x42028000, 0x00000029, 0x0201f800,
+       0x0010a446, 0x5c028800, 0x5c028000, 0x0401f010,
+       0x4937c857, 0x599c0019, 0x8c00050e, 0x0402000c,
+       0x0401f96c, 0x0401f849, 0x04000011, 0x0401f008,
+       0x59a80013, 0x8c000500, 0x04000003, 0x0401f9a6,
+       0x04000003, 0x0401f828, 0x04000009, 0x5c00b000,
+       0x5c000800, 0x80040800, 0x8058b040, 0x04020798,
+       0x4a03501c, 0x0000ffff, 0x0401f005, 0x4937c857,
+       0x5c00b000, 0x5c000800, 0x4807501c, 0x5c00c000,
+       0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03501c,
+       0x00000001, 0x42028800, 0x000007fe, 0x42003000,
+       0x00fffffe, 0x0201f800, 0x001045a6, 0x0402000c,
+       0x0401f948, 0x0401f825, 0x04000009, 0x59a80026,
+       0x8400054e, 0x48035026, 0x0201f800, 0x0010930f,
+       0x82000540, 0x00000001, 0x1c01f000, 0x80000580,
+       0x0401f7fe, 0x4937c857, 0x0201f800, 0x00107942,
+       0x04000015, 0x49366009, 0x4a026406, 0x00000001,
+       0x417a7800, 0x0201f800, 0x00104567, 0x59a8001b,
+       0x80000000, 0x4803501b, 0x42027000, 0x00000004,
+       0x599c0019, 0x8c00050e, 0x04000003, 0x42027000,
+       0x00000000, 0x0201f800, 0x000207a1, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4937c857, 0x0201f800,
+       0x00107942, 0x0400001c, 0x49366009, 0x59340403,
+       0x82000580, 0x000007fe, 0x04000005, 0x4d3c0000,
+       0x417a7800, 0x0401f8b7, 0x5c027800, 0x4a026406,
+       0x00000001, 0x417a7800, 0x0201f800, 0x00104567,
+       0x42000800, 0x00000003, 0x0201f800, 0x00104571,
+       0x59a8001b, 0x80000000, 0x4803501b, 0x42027000,
+       0x00000002, 0x0201f800, 0x000207a1, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4803c856, 0x42028800,
+       0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800,
+       0x001045a6, 0x04020005, 0x0401f805, 0x04000003,
+       0x4a035027, 0x0000ffff, 0x1c01f000, 0x4937c857,
+       0x0201f800, 0x00107942, 0x04000014, 0x49366009,
+       0x4a026406, 0x00000001, 0x417a7800, 0x0201f800,
+       0x00104567, 0x42000800, 0x00000003, 0x0201f800,
+       0x00104571, 0x59a80028, 0x80000000, 0x48035028,
+       0x42027000, 0x00000002, 0x0201f800, 0x000207a1,
+       0x82000540, 0x00000001, 0x1c01f000, 0x480bc857,
+       0x492fc857, 0x4c5c0000, 0x4008b800, 0x42028800,
+       0x000007fd, 0x42003000, 0x00fffffd, 0x0201f800,
+       0x001045a6, 0x0402001a, 0x0201f800, 0x0002075a,
+       0x04000017, 0x49366009, 0x5934000a, 0x84000544,
+       0x4802680a, 0x812e59c0, 0x04000005, 0x592c0404,
+       0x8c00051e, 0x04000002, 0x48ee6021, 0x492e6008,
+       0x4a026406, 0x00000001, 0x485e601c, 0x42027000,
+       0x00000022, 0x0201f800, 0x000207a1, 0x82000540,
+       0x00000001, 0x5c00b800, 0x1c01f000, 0x80000580,
+       0x0401f7fd, 0x5c000000, 0x4c000000, 0x4803c857,
+       0x4943c857, 0x493fc857, 0x4d340000, 0x4d440000,
+       0x4c580000, 0x4d2c0000, 0x4c5c0000, 0x0201f800,
+       0x00106c55, 0x4df00000, 0x0201f800, 0x001069f1,
+       0x0201f800, 0x00106aac, 0x0201f800, 0x00106737,
+       0x0201f800, 0x0010848a, 0x5c03e000, 0x02000800,
+       0x00106c4b, 0x4200b000, 0x000007f0, 0x417a8800,
+       0x0201f800, 0x00020245, 0x0402001f, 0x8d3e7d14,
+       0x04000005, 0x59340212, 0x82000500, 0x0000ff00,
+       0x04000019, 0x8d3e7d06, 0x04000004, 0x59340200,
+       0x8c00050e, 0x04020014, 0x8d3e7d18, 0x0400000f,
+       0x5934b80f, 0x805cb9c0, 0x04000009, 0x49425a06,
+       0x592cb800, 0x0201f800, 0x000202ce, 0x805cb9c0,
+       0x040207fb, 0x497a680f, 0x497a6810, 0x4a026c00,
+       0x00000707, 0x0401f004, 0x4937c857, 0x0201f800,
+       0x001042b4, 0x81468800, 0x8058b040, 0x040207dd,
+       0x8d3e7d02, 0x04000011, 0x497b501d, 0x42028800,
+       0x000007f0, 0x4200b000, 0x00000010, 0x0201f800,
+       0x00020245, 0x04020006, 0x4937c857, 0x4a026c00,
+       0x00000707, 0x0201f800, 0x001042b4, 0x81468800,
+       0x8058b040, 0x040207f6, 0x5c00b800, 0x5c025800,
+       0x5c00b000, 0x5c028800, 0x5c026800, 0x1c01f000,
+       0x5c000000, 0x4c000000, 0x4803c857, 0x4933c857,
+       0x493fc857, 0x4d340000, 0x4d400000, 0x4d440000,
+       0x4d2c0000, 0x4c5c0000, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x59326809, 0x813669c0, 0x04000020,
+       0x59368c03, 0x42028000, 0x00000029, 0x0201f800,
+       0x00106a50, 0x0201f800, 0x00106ab4, 0x0201f800,
+       0x001067fd, 0x0201f800, 0x0010a2ff, 0x4937c857,
+       0x8d3e7d18, 0x04000010, 0x5934b80f, 0x805cb9c0,
+       0x0400000a, 0x405e5800, 0x49425a06, 0x592cb800,
+       0x0201f800, 0x000202ce, 0x805cb9c0, 0x040207fa,
+       0x497a680f, 0x497a6810, 0x4a026c00, 0x00000707,
+       0x0401f003, 0x0201f800, 0x001042b4, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x5c00b800, 0x5c025800,
+       0x5c028800, 0x5c028000, 0x5c026800, 0x1c01f000,
+       0x4933c857, 0x59a80026, 0x8c000508, 0x04020012,
+       0x59305009, 0x482bc857, 0x836c0580, 0x00000002,
+       0x0402000d, 0x0401f813, 0x0402000b, 0x58280403,
+       0x82000580, 0x000007fc, 0x04000008, 0x59a8001b,
+       0x80000040, 0x4803c857, 0x02001800, 0x001005d8,
+       0x4803501b, 0x1c01f000, 0x59a80028, 0x80000040,
+       0x4803c857, 0x040017fc, 0x48035028, 0x1c01f000,
+       0x59300008, 0x800001c0, 0x04020009, 0x59300403,
+       0x82000580, 0x00000001, 0x04020004, 0x82000540,
+       0x00000001, 0x0401f002, 0x80000580, 0x1c01f000,
+       0x4937c857, 0x59340200, 0x84000502, 0x48026a00,
+       0x1c01f000, 0x4933c857, 0x493fc857, 0x4947c857,
+       0x4d3c0000, 0x4d400000, 0x4d340000, 0x4d440000,
+       0x4c580000, 0x0201f800, 0x00106c55, 0x4df00000,
+       0x813e79c0, 0x04020004, 0x4200b000, 0x00000001,
+       0x0401f004, 0x4200b000, 0x000007f0, 0x417a8800,
+       0x41440000, 0x81ac0400, 0x50000000, 0x80026d40,
+       0x04000019, 0x42027800, 0x00000001, 0x0201f800,
+       0x001048f6, 0x42028000, 0x00000029, 0x417a7800,
+       0x0201f800, 0x00106a50, 0x0201f800, 0x00106ab4,
+       0x0201f800, 0x001067fd, 0x0201f800, 0x001049e7,
+       0x04020005, 0x4937c857, 0x4a026c00, 0x00000404,
+       0x0401f003, 0x0201f800, 0x00104a14, 0x0201f800,
+       0x0010a2ff, 0x81468800, 0x8058b040, 0x040207e1,
+       0x5c03e000, 0x02000800, 0x00106c4b, 0x5c00b000,
+       0x5c028800, 0x5c026800, 0x5c028000, 0x5c027800,
+       0x1c01f000, 0x4937c857, 0x4947c857, 0x4c5c0000,
+       0x4c600000, 0x4c640000, 0x59a80013, 0x8c000500,
+       0x0400001f, 0x599c0017, 0x8c00050a, 0x0402001c,
+       0x5934ba02, 0x825cbd00, 0x000000ff, 0x485fc857,
+       0x4178c000, 0x4178c800, 0x82600400, 0x0010be21,
+       0x50002000, 0x8060c1c0, 0x04000008, 0x82100500,
+       0x000000ff, 0x82002d80, 0x000000ff, 0x0400000c,
+       0x805c0580, 0x0400000d, 0x80102110, 0x8064c800,
+       0x82640580, 0x00000004, 0x040207f5, 0x8060c000,
+       0x82600580, 0x00000020, 0x040207eb, 0x4813c857,
+       0x82000540, 0x00000001, 0x5c00c800, 0x5c00c000,
+       0x5c00b800, 0x1c01f000, 0x59a80026, 0x4803c857,
+       0x8c000512, 0x1c01f000, 0x00007eef, 0x00007de8,
+       0x00007ce4, 0x000080e2, 0x00007be1, 0x000080e0,
+       0x000080dc, 0x000080da, 0x00007ad9, 0x000080d6,
+       0x000080d5, 0x000080d4, 0x000080d3, 0x000080d2,
+       0x000080d1, 0x000079ce, 0x000078cd, 0x000080cc,
+       0x000080cb, 0x000080ca, 0x000080c9, 0x000080c7,
+       0x000080c6, 0x000077c5, 0x000076c3, 0x000080bc,
+       0x000080ba, 0x000075b9, 0x000080b6, 0x000074b5,
+       0x000073b4, 0x000072b3, 0x000080b2, 0x000080b1,
+       0x000080ae, 0x000071ad, 0x000080ac, 0x000070ab,
+       0x00006faa, 0x00006ea9, 0x000080a7, 0x00006da6,
+       0x00006ca5, 0x00006ba3, 0x00006a9f, 0x0000699e,
+       0x0000689d, 0x0000809b, 0x00008098, 0x00006797,
+       0x00006690, 0x0000658f, 0x00006488, 0x00006384,
+       0x00006282, 0x00008081, 0x00008080, 0x0000617c,
+       0x0000607a, 0x00008079, 0x00005f76, 0x00008075,
+       0x00008074, 0x00008073, 0x00008072, 0x00008071,
+       0x0000806e, 0x00005e6d, 0x0000806c, 0x00005d6b,
+       0x00005c6a, 0x00005b69, 0x00008067, 0x00005a66,
+       0x00005965, 0x00005863, 0x0000575c, 0x0000565a,
+       0x00005559, 0x00008056, 0x00008055, 0x00005454,
+       0x00005353, 0x00005252, 0x00005151, 0x0000504e,
+       0x00004f4d, 0x0000804c, 0x0000804b, 0x00004e4a,
+       0x00004d49, 0x00008047, 0x00004c46, 0x00008045,
+       0x00008043, 0x0000803c, 0x0000803a, 0x00008039,
+       0x00008036, 0x00004b35, 0x00008034, 0x00004a33,
+       0x00004932, 0x00004831, 0x0000802e, 0x0000472d,
+       0x0000462c, 0x0000452b, 0x0000442a, 0x00004329,
+       0x00004227, 0x00008026, 0x00008025, 0x00004123,
+       0x0000401f, 0x00003f1e, 0x00003e1d, 0x00003d1b,
+       0x00003c18, 0x00008017, 0x00008010, 0x00003b0f,
+       0x00003a08, 0x00008004, 0x00003902, 0x00008001,
+       0x00008000, 0x00008000, 0x00003800, 0x00003700,
+       0x00003600, 0x00008000, 0x00003500, 0x00008000,
+       0x00008000, 0x00008000, 0x00003400, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00003300, 0x00003200, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00003100, 0x00003000, 0x00008000,
+       0x00008000, 0x00002f00, 0x00008000, 0x00002e00,
+       0x00002d00, 0x00002c00, 0x00008000, 0x00008000,
+       0x00008000, 0x00002b00, 0x00008000, 0x00002a00,
+       0x00002900, 0x00002800, 0x00008000, 0x00002700,
+       0x00002600, 0x00002500, 0x00002400, 0x00002300,
+       0x00002200, 0x00008000, 0x00008000, 0x00002100,
+       0x00002000, 0x00001f00, 0x00001e00, 0x00001d00,
+       0x00001c00, 0x00008000, 0x00008000, 0x00001b00,
+       0x00001a00, 0x00008000, 0x00001900, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00001800, 0x00008000, 0x00001700,
+       0x00001600, 0x00001500, 0x00008000, 0x00001400,
+       0x00001300, 0x00001200, 0x00001100, 0x00001000,
+       0x00000f00, 0x00008000, 0x00008000, 0x00000e00,
+       0x00000d00, 0x00000c00, 0x00000b00, 0x00000a00,
+       0x00000900, 0x00008000, 0x00008000, 0x00000800,
+       0x00000700, 0x00008000, 0x00000600, 0x00008000,
+       0x00008000, 0x00008000, 0x00000500, 0x00000400,
+       0x00000300, 0x00008000, 0x00000200, 0x00008000,
+       0x00008000, 0x00008000, 0x00000100, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00000000, 0x00008000, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00008000, 0x00008000, 0x00008000,
+       0x00008000, 0x00008000, 0x0201f800, 0x001007d3,
+       0x02000800, 0x001005d8, 0x492f4016, 0x1c01f000,
+       0x83a0ac00, 0x00000006, 0x83a00580, 0x0010b4a4,
+       0x0400000c, 0x492fc857, 0x812e59c0, 0x02000800,
+       0x001005d8, 0x832ca400, 0x00000006, 0x4200b000,
+       0x0000000d, 0x0201f800, 0x0010ab17, 0x0401f00f,
+       0x4200b000, 0x00000010, 0x83e0a400, 0x00000020,
+       0x50500000, 0x8050a000, 0x50500800, 0x900409c0,
+       0x80040540, 0x4400a800, 0x8050a000, 0x8054a800,
+       0x8058b040, 0x040207f7, 0x1c01f000, 0x59a00206,
+       0x4803c857, 0x82000c80, 0x0000007f, 0x040210c9,
+       0x59a80821, 0x0c01f001, 0x001022c0, 0x00102300,
+       0x00102300, 0x0010234b, 0x0010236d, 0x00102300,
+       0x001022c0, 0x0010238f, 0x001023a0, 0x00102300,
+       0x00102300, 0x001023ad, 0x001023c5, 0x001023dd,
+       0x00102300, 0x001023e7, 0x001023f4, 0x00102300,
+       0x0010241d, 0x00102300, 0x0010247a, 0x00102300,
+       0x00102300, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102491, 0x00102300,
+       0x001024e3, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x001024e8, 0x00102560, 0x00102300,
+       0x00102567, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102569, 0x001025ea,
+       0x00102727, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102736, 0x00102300,
+       0x00102300, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102753, 0x001027a6,
+       0x00102802, 0x00102816, 0x00102835, 0x00102a70,
+       0x00102dff, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102300, 0x00102300, 0x00102300,
+       0x00102300, 0x00102fb4, 0x00103028, 0x00102300,
+       0x00102300, 0x00103094, 0x00102300, 0x00103126,
+       0x001031d8, 0x00102300, 0x00102300, 0x0010320f,
+       0x0010326b, 0x00102300, 0x001032bd, 0x00103419,
+       0x00102300, 0x0010342d, 0x001034b8, 0x00102300,
+       0x00102300, 0x00102300, 0x00102300, 0x00103522,
+       0x00103526, 0x00103545, 0x00102300, 0x001035e7,
+       0x00102300, 0x00102300, 0x00103615, 0x00102300,
+       0x00103643, 0x00102300, 0x00102300, 0x001036aa,
+       0x001037b7, 0x00103814, 0x00102300, 0x0010387a,
+       0x00102300, 0x00102300, 0x001038d3, 0x00103936,
+       0x00102300, 0x48efc857, 0x4031d800, 0x58ef400b,
+       0x58ec0002, 0x82000580, 0x00000200, 0x04000045,
+       0x48efc857, 0x4a034206, 0x00004000, 0x0201f800,
+       0x00103a15, 0x83a00580, 0x0010b4a4, 0x0400000d,
+       0x58ee580a, 0x4d2c0000, 0x0401f856, 0x41a25800,
+       0x0201f800, 0x001007f4, 0x40ee5800, 0x0201f800,
+       0x001007f4, 0x5c025800, 0x0201f000, 0x000202da,
+       0x04026007, 0x59a0001d, 0x84000542, 0x4803401d,
+       0x4a01d809, 0x001022d4, 0x1c01f000, 0x59a00206,
+       0x82000d80, 0x00004000, 0x04000006, 0x900001c0,
+       0x82000540, 0x00000011, 0x4803c011, 0x0401f005,
+       0x900001c0, 0x82000540, 0x00000010, 0x4803c011,
+       0x0401f845, 0x59e00017, 0x8c000508, 0x0402000c,
+       0x4203e000, 0x30000001, 0x4203e000, 0x40000000,
+       0x40ee5800, 0x0201f800, 0x001007f4, 0x59a0001d,
+       0x84000504, 0x4803401d, 0x1c01f000, 0x4a03c017,
+       0x00000000, 0x59a00206, 0x82000d80, 0x00004000,
+       0x040007f0, 0x4a03c017, 0x00000001, 0x0401f7ed,
+       0x4803c856, 0x4a034206, 0x00004001, 0x0401f7c0,
+       0x4803c856, 0x4a034206, 0x00004002, 0x0401f7bc,
+       0x4803c856, 0x4a034206, 0x00004003, 0x0401f7b8,
+       0x4803c856, 0x4a034206, 0x00004005, 0x0401f7b4,
+       0x4803c856, 0x4a034206, 0x00004006, 0x0401f7b0,
+       0x4803c856, 0x4a034206, 0x0000400b, 0x0401f7ac,
+       0x4803c856, 0x4a034206, 0x0000400c, 0x0401f7a8,
+       0x4803c856, 0x4a034206, 0x0000400c, 0x0401f7a4,
+       0x48efc857, 0x58eca80a, 0x8054a9c0, 0x02000800,
+       0x001005d8, 0x83a0a400, 0x00000006, 0x8254ac00,
+       0x00000006, 0x4200b000, 0x0000000d, 0x0201f000,
+       0x0010ab17, 0x59a00206, 0x4803c857, 0x59a00406,
+       0x4803c857, 0x59a00207, 0x4803c857, 0x59a00407,
+       0x4803c857, 0x59a00208, 0x4803c857, 0x59a00408,
+       0x4803c857, 0x59a00209, 0x4803c857, 0x83e0ac00,
+       0x00000020, 0x83a0a400, 0x00000006, 0x4200b000,
+       0x00000010, 0x50500000, 0x4400a800, 0x8054a800,
+       0x900001c0, 0x4400a800, 0x8054a800, 0x8050a000,
+       0x8058b040, 0x040207f8, 0x1c01f000, 0x59a00406,
+       0x800000c2, 0x59a00a07, 0x900409c0, 0x80040540,
+       0x84000540, 0x59a00c07, 0x8c040d00, 0x04000018,
+       0x59a80805, 0x8c040d0e, 0x040207ba, 0x42000800,
+       0x00000064, 0x80040840, 0x04000007, 0x4a030000,
+       0x00000001, 0x40000000, 0x59801000, 0x8c081500,
+       0x040007f9, 0x04000005, 0x48030004, 0x4a030000,
+       0x00000000, 0x0401f75b, 0x4a030000, 0x00000000,
+       0x4a034406, 0x00000004, 0x040007a2, 0x4803880e,
+       0x0401f754, 0x59a00406, 0x800000c2, 0x59a00c07,
+       0x8c040d00, 0x0400001a, 0x59a80805, 0x8c040d0e,
+       0x0402079c, 0x42000800, 0x00000064, 0x80040840,
+       0x04000007, 0x4a030000, 0x00000001, 0x40000000,
+       0x59801000, 0x8c081500, 0x040007f9, 0x04000007,
+       0x48030004, 0x59800805, 0x48074406, 0x4a030000,
+       0x00000000, 0x0401f73b, 0x4a030000, 0x00000000,
+       0x4a034406, 0x00000004, 0x04000782, 0x4803880e,
+       0x59c4080f, 0x48074406, 0x0401f732, 0x59a01c06,
+       0x59a00207, 0x900c19c0, 0x800c1d40, 0x580c0803,
+       0x80000580, 0x500c1000, 0x80080400, 0x800c1800,
+       0x80040840, 0x040207fc, 0x48034406, 0x900001c0,
+       0x48034207, 0x800001c0, 0x04000722, 0x0401f769,
+       0x4a034406, 0x00000004, 0x4a034207, 0x00000000,
+       0x4a034407, 0x00000010, 0x59a8000d, 0x48034208,
+       0x900001c0, 0x48034408, 0x4a034209, 0x00000002,
+       0x0401f714, 0x59a00407, 0x59a01207, 0x900811c0,
+       0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0,
+       0x800c1d40, 0x59a00a08, 0x59a00408, 0x900409c0,
+       0x80040d40, 0x59a0020a, 0x82002480, 0x00000010,
+       0x04001754, 0x59a02406, 0x900001c0, 0x80100540,
+       0x59a8280d, 0x80142480, 0x0400174e, 0x0201f000,
+       0x00103a25, 0x59a00407, 0x59a01207, 0x900811c0,
+       0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0,
+       0x800c1d40, 0x59a00a08, 0x59a00408, 0x900409c0,
+       0x80040d40, 0x59a0020a, 0x82002480, 0x00000010,
+       0x0400173c, 0x59a02406, 0x900001c0, 0x80100540,
+       0x59a8280d, 0x80142480, 0x04001736, 0x0201f000,
+       0x00103a28, 0x59a00a0a, 0x59a00406, 0x900409c0,
+       0x80040d40, 0x59a01407, 0x59a00207, 0x900811c0,
+       0x80081540, 0x44080800, 0x0401f6da, 0x59a00a0a,
+       0x59a00406, 0x900409c0, 0x80040d40, 0x50040000,
+       0x82000d00, 0x0000ffff, 0x48074207, 0x82000d00,
+       0xffff0000, 0x900409c0, 0x48074407, 0x0401f6cd,
+       0x59a00406, 0x8c000500, 0x04000020, 0x59a01207,
+       0x59a01c07, 0x59a02208, 0x480b5054, 0x480f5055,
+       0x48135056, 0x59c40801, 0x82040d00, 0x00018000,
+       0x82040580, 0x00000000, 0x04000009, 0x82040580,
+       0x00008000, 0x04000008, 0x82040580, 0x00010000,
+       0x04000007, 0x0201f800, 0x001005d8, 0x40080000,
+       0x0401f004, 0x400c0000, 0x0401f002, 0x40100000,
+       0x80000110, 0x42000800, 0x000000e0, 0x0201f800,
+       0x00101944, 0x0401f007, 0x59a81054, 0x59a81855,
+       0x59a82056, 0x480b4207, 0x480f4407, 0x48134208,
+       0x0401f6a4, 0x4d2c0000, 0x4d340000, 0x4d300000,
+       0x4d440000, 0x59a28c06, 0x0201f800, 0x00020245,
+       0x04000006, 0x5c028800, 0x5c026000, 0x5c026800,
+       0x5c025800, 0x0401f6e7, 0x59a04407, 0x59a00207,
+       0x900001c0, 0x80204540, 0x0401f81e, 0x04000009,
+       0x4a034208, 0x00000001, 0x4a034406, 0x0000ffff,
+       0x4a034207, 0x0000ffff, 0x497b4407, 0x0401f00b,
+       0x0401f822, 0x0400000e, 0x4a034208, 0x00000002,
+       0x59300402, 0x48034406, 0x59300202, 0x48034207,
+       0x59300206, 0x48034407, 0x5c028800, 0x5c026000,
+       0x5c026800, 0x5c025800, 0x0401f67a, 0x5c028800,
+       0x5c026000, 0x5c026800, 0x5c025800, 0x0401f6c1,
+       0x4937c856, 0x4823c856, 0x4d2c0000, 0x5934000f,
+       0x80025d40, 0x04000007, 0x592c0005, 0x80200580,
+       0x592c0000, 0x040207fb, 0x82000540, 0x00000001,
+       0x5c025800, 0x1c01f000, 0x4823c857, 0x4d2c0000,
+       0x4d300000, 0x42026000, 0x0010d1c0, 0x59300406,
+       0x82000d80, 0x00000003, 0x04000004, 0x82000d80,
+       0x00000006, 0x04020007, 0x59325808, 0x812e59c0,
+       0x04000004, 0x592c0005, 0x80200580, 0x0400000a,
+       0x83326400, 0x00000024, 0x41580000, 0x81300480,
+       0x040017ef, 0x80000580, 0x5c026000, 0x5c025800,
+       0x1c01f000, 0x82000540, 0x00000001, 0x5c026000,
+       0x5c025800, 0x1c01f000, 0x83a00580, 0x0010b4a4,
+       0x04020684, 0x59a80005, 0x8c00050e, 0x04020003,
+       0x4a030000, 0x00000000, 0x4a034206, 0x00004000,
+       0x4a03c011, 0x40000010, 0x0401fea7, 0x59e00017,
+       0x8c000508, 0x04000003, 0x4a03c017, 0x00000000,
+       0x4203e000, 0x30000001, 0x4203e000, 0x40000000,
+       0x0401f000, 0x800409c0, 0x04000004, 0x4a034406,
+       0x00000001, 0x0401f677, 0x836c0580, 0x00000003,
+       0x04020010, 0x59a80010, 0x497b4406, 0x0201f800,
+       0x0010513b, 0x0400000f, 0x82000d00, 0x00ffff00,
+       0x0402000c, 0x82000c00, 0x0010210e, 0x50040800,
+       0x80040910, 0x82041580, 0x00000080, 0x04020004,
+       0x4a034406, 0x00000007, 0x0401f662, 0x48074406,
+       0x82000d00, 0x0000ffff, 0x48074207, 0x80000120,
+       0x48034407, 0x59a80026, 0x82001500, 0x00000100,
+       0x480b4409, 0x8c000502, 0x0400001f, 0x8c000506,
+       0x04000009, 0x82000d00, 0x0000000a, 0x82040d80,
+       0x0000000a, 0x04020004, 0x4a034209, 0x00000001,
+       0x0401f022, 0x8c00050a, 0x04000009, 0x82000d00,
+       0x00000022, 0x82040d80, 0x00000022, 0x04020004,
+       0x4a034209, 0x00000003, 0x0401f018, 0x8c000508,
+       0x04000009, 0x82000d00, 0x00000012, 0x82040d80,
+       0x00000012, 0x04020004, 0x4a034209, 0x00000002,
+       0x0401f00e, 0x0201f800, 0x0010513b, 0x04020004,
+       0x4a034209, 0x00000004, 0x0401f5e6, 0x8c000506,
+       0x04000004, 0x4a034406, 0x00000005, 0x0401f62d,
+       0x4a034209, 0x00000000, 0x0401f5de, 0x59a80037,
+       0x48034407, 0x59a80038, 0x48034209, 0x0401f5d9,
+       0x42007800, 0x0010b8ec, 0x59a00406, 0x4803c857,
+       0x82000c80, 0x00000006, 0x04021622, 0x0c01f001,
+       0x001024f6, 0x001024f7, 0x00102505, 0x00102518,
+       0x00102539, 0x001024f6, 0x0401f61a, 0x836c0580,
+       0x00000000, 0x04000613, 0x59a00a07, 0x59a00407,
+       0x900001c0, 0x80040d40, 0x4807c857, 0x59a00a08,
+       0x59a00408, 0x900001c0, 0x80040d40, 0x4807c857,
+       0x0401f056, 0x836c0580, 0x00000000, 0x04000605,
+       0x59a00407, 0x59a01207, 0x900001c0, 0x80081540,
+       0x59a00408, 0x59a01a08, 0x900001c0, 0x800c1d40,
+       0x42000000, 0x0010c1bf, 0x480fc857, 0x480bc857,
+       0x42000800, 0x00001000, 0x0201f000, 0x00103a28,
+       0x59a00a07, 0x59a00407, 0x900001c0, 0x80041d40,
+       0x820c0c80, 0x0010ab4a, 0x040215f2, 0x820c0c80,
+       0x00100000, 0x040015ef, 0x480fc857, 0x823c7c00,
+       0x00000009, 0x503c0800, 0x800409c0, 0x04000006,
+       0x823c0580, 0x0000000d, 0x040005e6, 0x803c7800,
+       0x0401f7f9, 0x59e41001, 0x82080d00, 0xfffeffcf,
+       0x4807c801, 0x440c7800, 0x46001800, 0x0201f800,
+       0x800c1800, 0x46001800, 0x001005cb, 0x480bc801,
+       0x0401f022, 0x59a01a07, 0x59a00407, 0x900001c0,
+       0x800c1d40, 0x480c7801, 0x59a02208, 0x59a00408,
+       0x900001c0, 0x80102540, 0x48107802, 0x59a00209,
+       0x80000040, 0x040015cb, 0x48007806, 0x80000000,
+       0x48007805, 0x42000800, 0x00004000, 0x40001000,
+       0x0201f800, 0x00106681, 0x80000540, 0x04000003,
+       0x49787801, 0x0401f5bf, 0x40040000, 0x800c1c00,
+       0x040015bc, 0x480c7803, 0x48107804, 0x49787808,
+       0x59a00409, 0x48007807, 0x59e40001, 0x4803c857,
+       0x82000540, 0x00040000, 0x4803c801, 0x0401f561,
+       0x59a80006, 0x48034406, 0x59a80007, 0x48034207,
+       0x59a80008, 0x48034407, 0x0401f55a, 0x0201f800,
+       0x001005d8, 0x4803c856, 0x4a03c013, 0x03800300,
+       0x4a03c014, 0x03800380, 0x59a00c06, 0x82040580,
+       0x000000a0, 0x04000004, 0x82040580, 0x000000a2,
+       0x0402002b, 0x59a0140a, 0x82080480, 0x00000100,
+       0x04021027, 0x59a0020b, 0x8c000500, 0x0402002e,
+       0x59a00a0a, 0x800409c0, 0x04000021, 0x82040480,
+       0x00000041, 0x0402101e, 0x82040c00, 0x00000003,
+       0x82040d00, 0x000000fc, 0x80040904, 0x59a00407,
+       0x59a01207, 0x900811c0, 0x80081540, 0x59a00409,
+       0x59a01a09, 0x900c19c0, 0x800c1d40, 0x0201f800,
+       0x00103a00, 0x04020006, 0x4a034406, 0x00000002,
+       0x4a03c014, 0x03800000, 0x0401f576, 0x832e5c00,
+       0x00000004, 0x412c0000, 0x0201f800, 0x00103a25,
+       0x4a01d809, 0x001025a2, 0x1c01f000, 0x4a03c014,
+       0x03800000, 0x0401f56f, 0x4031d800, 0x58ef400b,
+       0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200,
+       0x0400055c, 0x59a00c06, 0x59a0140a, 0x59a0020b,
+       0x8c000500, 0x04020031, 0x832e5c00, 0x00000004,
+       0x41783800, 0x59a04a0a, 0x401c0000, 0x812c0400,
+       0x50004000, 0x82201d00, 0x000000ff, 0x4c040000,
+       0x0401f8ac, 0x5c000800, 0x0400002d, 0x80244840,
+       0x04000028, 0x80081000, 0x82201d00, 0x0000ff00,
+       0x800c1910, 0x4c040000, 0x0401f8a2, 0x5c000800,
+       0x04000023, 0x80244840, 0x0400001e, 0x80081000,
+       0x82201d00, 0x00ff0000, 0x800c1920, 0x4c040000,
+       0x0401f898, 0x5c000800, 0x04000019, 0x80244840,
+       0x04000014, 0x80081000, 0x82201d00, 0xff000000,
+       0x800c1930, 0x4c040000, 0x0401f88e, 0x5c000800,
+       0x0400000f, 0x80244840, 0x0400000a, 0x80081000,
+       0x801c3800, 0x0401f7d5, 0x59a0020a, 0x82000500,
+       0x000000ff, 0x40001800, 0x0401f882, 0x04000004,
+       0x4a03c014, 0x03800000, 0x0401f4da, 0x4a03c014,
+       0x03800000, 0x0401f523, 0x4803c856, 0x4a03c013,
+       0x03800300, 0x4a03c014, 0x03800380, 0x59a00c06,
+       0x82040580, 0x000000a0, 0x04000004, 0x82040580,
+       0x000000a2, 0x0402006c, 0x59a0140a, 0x82080480,
+       0x00000100, 0x04021068, 0x59a0020b, 0x8c000500,
+       0x0402005c, 0x59a01a0a, 0x800c19c0, 0x04000062,
+       0x820c0480, 0x00000041, 0x0402105f, 0x0201f800,
+       0x00103a00, 0x04020006, 0x4a034406, 0x00000002,
+       0x4a03c014, 0x03800000, 0x0401f502, 0x832e5c00,
+       0x00000004, 0x41783800, 0x59a04a0a, 0x401c0000,
+       0x812c0400, 0x40004000, 0x4c040000, 0x4c080000,
+       0x0401f874, 0x5c001000, 0x5c000800, 0x04000047,
+       0x44144000, 0x80244840, 0x0400002b, 0x80081000,
+       0x4c040000, 0x4c080000, 0x0401f86a, 0x5c001000,
+       0x5c000800, 0x0400003d, 0x50200000, 0x801428d0,
+       0x80140540, 0x44004000, 0x80244840, 0x0400001e,
+       0x80081000, 0x4c040000, 0x4c080000, 0x0401f85d,
+       0x5c001000, 0x5c000800, 0x04000030, 0x50200000,
+       0x801428e0, 0x80140540, 0x44004000, 0x80244840,
+       0x04000011, 0x80081000, 0x4c040000, 0x4c080000,
+       0x0401f850, 0x5c001000, 0x5c000800, 0x04000023,
+       0x50200000, 0x801428f0, 0x80140540, 0x44004000,
+       0x80244840, 0x04000004, 0x80081000, 0x801c3800,
+       0x0401f7cb, 0x59a00a0a, 0x82040c00, 0x00000003,
+       0x82040d00, 0x000000fc, 0x80040904, 0x59a00407,
+       0x59a01207, 0x900811c0, 0x80081540, 0x59a00409,
+       0x59a01a09, 0x900c19c0, 0x800c1d40, 0x4a03c014,
+       0x03800000, 0x412c0000, 0x0201f000, 0x00103a28,
+       0x0401f830, 0x04000005, 0x48174406, 0x4a03c014,
+       0x03800000, 0x0401f463, 0x4a03c014, 0x03800000,
+       0x0401f4ac, 0x4a03c014, 0x03800000, 0x0401f4ad,
+       0x0401f836, 0x04000010, 0x0401f862, 0x0402000f,
+       0x40080800, 0x0401f85f, 0x0402000c, 0x400c0800,
+       0x0401f85c, 0x04020009, 0x0401f84b, 0x42000000,
+       0x00030d40, 0x80000040, 0x040207ff, 0x82000540,
+       0x00000001, 0x1c01f000, 0x0401f843, 0x80000580,
+       0x0401f7fd, 0x0401f821, 0x0400000a, 0x82040d40,
+       0x00000001, 0x0401f84b, 0x04020007, 0x0401f87e,
+       0x0401f898, 0x0401f838, 0x82000540, 0x00000001,
+       0x1c01f000, 0x0401f834, 0x80000580, 0x0401f7fd,
+       0x40041800, 0x0401f811, 0x0400000c, 0x0401f83d,
+       0x0402000b, 0x40080800, 0x0401f83a, 0x04020008,
+       0x400c0800, 0x0401ffe8, 0x04000004, 0x0401f826,
+       0x82000540, 0x00000001, 0x1c01f000, 0x0401f822,
+       0x80000580, 0x0401f7fd, 0x4c040000, 0x42000800,
+       0x00000064, 0x4a03c013, 0x03800300, 0x80040840,
+       0x04000016, 0x59e00013, 0x82000500, 0x00000300,
+       0x82000580, 0x00000300, 0x040207f7, 0x42000000,
+       0x00000064, 0x80000040, 0x040207ff, 0x4a03c013,
+       0x01000000, 0x42000000, 0x00000064, 0x80000040,
+       0x040207ff, 0x4a03c013, 0x02000000, 0x82000540,
+       0x00000001, 0x0401f002, 0x80000580, 0x5c000800,
+       0x1c01f000, 0x4a03c013, 0x01000000, 0x42000000,
+       0x00000064, 0x80000040, 0x040207ff, 0x4a03c013,
+       0x02000200, 0x42000000, 0x00000064, 0x80000040,
+       0x040207ff, 0x4a03c013, 0x01000100, 0x1c01f000,
+       0x42002000, 0x00000008, 0x82040500, 0x00000080,
+       0x800000c2, 0x82000540, 0x01000000, 0x4803c013,
+       0x42000000, 0x00000064, 0x80000040, 0x040207ff,
+       0x4a03c013, 0x02000200, 0x42000000, 0x00000064,
+       0x80000040, 0x040207ff, 0x4a03c013, 0x02000000,
+       0x800408c2, 0x80102040, 0x040207ec, 0x4a03c013,
+       0x01000100, 0x42000000, 0x00000064, 0x80000040,
+       0x040207ff, 0x4a03c013, 0x02000200, 0x42000000,
+       0x00000064, 0x80000040, 0x040207ff, 0x59e00013,
+       0x82000500, 0x00000100, 0x4a03c013, 0x02000000,
+       0x4c040000, 0x42000800, 0x00000064, 0x59e00013,
+       0x82000500, 0x00000100, 0x80040840, 0x04000003,
+       0x80000540, 0x040207fa, 0x80000540, 0x5c000800,
+       0x1c01f000, 0x4a03c013, 0x01000100, 0x42001000,
+       0x00000008, 0x80000d80, 0x42000000, 0x00000064,
+       0x80000040, 0x040207ff, 0x4a03c013, 0x02000200,
+       0x42000000, 0x00000064, 0x80000040, 0x040207ff,
+       0x59e00013, 0x82000500, 0x00000100, 0x80000110,
+       0x800408c2, 0x80040d40, 0x4a03c013, 0x02000000,
+       0x80081040, 0x040207ed, 0x40042800, 0x1c01f000,
+       0x4a03c013, 0x01000100, 0x42000000, 0x00000064,
+       0x80000040, 0x040207ff, 0x4a03c013, 0x02000200,
+       0x42000000, 0x00000064, 0x80000040, 0x040207ff,
+       0x4a03c013, 0x02000000, 0x1c01f000, 0x59a00407,
+       0x59a80837, 0x48035037, 0x48074407, 0x59a00a09,
+       0x82040480, 0x00000014, 0x04021003, 0x42000800,
+       0x000007d0, 0x59a80038, 0x48075038, 0x48034209,
+       0x0201f000, 0x001022c0, 0x836c0580, 0x00000000,
+       0x0400000e, 0x59a80006, 0x59a00c06, 0x80041580,
+       0x82081500, 0x00000040, 0x02000000, 0x001022c0,
+       0x80080580, 0x48035006, 0x0201f800, 0x00100699,
+       0x0201f000, 0x001022c0, 0x59a00406, 0x59a80806,
+       0x48035006, 0x80040d80, 0x8c040d0c, 0x02020800,
+       0x00100699, 0x59a00207, 0x48035007, 0x59a00407,
+       0x48035008, 0x0201f000, 0x001022c0, 0x800409c0,
+       0x04000005, 0x4a034406, 0x00000001, 0x0201f000,
+       0x0010230c, 0x0201f800, 0x0010513b, 0x04020005,
+       0x4a034406, 0x00000016, 0x0201f000, 0x0010230c,
+       0x836c0580, 0x00000003, 0x04000005, 0x4a034406,
+       0x00000007, 0x0201f000, 0x0010230c, 0x59a00c06,
+       0x82040500, 0xffffff00, 0x02020000, 0x00102310,
+       0x82041580, 0x000000ff, 0x04020007, 0x59a80010,
+       0x82000500, 0x000000ff, 0x82001540, 0x0000ff00,
+       0x0401f011, 0x82040400, 0x0010210e, 0x50000000,
+       0x80000110, 0x82000580, 0x00000080, 0x02000000,
+       0x00102310, 0x59a80010, 0x82000500, 0x000000ff,
+       0x80041580, 0x02000000, 0x00102310, 0x840409c0,
+       0x80041540, 0x0201f800, 0x0002075a, 0x04020005,
+       0x4a034406, 0x00000003, 0x0201f000, 0x0010230c,
+       0x48ee6021, 0x480a621c, 0x4a02641c, 0x0000bc09,
+       0x4a026406, 0x00000001, 0x0201f800, 0x00103a00,
+       0x04020007, 0x0201f800, 0x0002077d, 0x4a034406,
+       0x00000002, 0x0201f000, 0x0010230c, 0x497a5a04,
+       0x497a5805, 0x4a025c04, 0x00008000, 0x4a01d809,
+       0x001027f9, 0x492e6008, 0x42027000, 0x00000032,
+       0x0201f000, 0x000207a1, 0x800409c0, 0x04000005,
+       0x4a034406, 0x00000001, 0x0201f000, 0x0010230c,
+       0x0201f800, 0x0010513b, 0x04020005, 0x4a034406,
+       0x00000016, 0x0201f000, 0x0010230c, 0x836c0580,
+       0x00000003, 0x04000005, 0x4a034406, 0x00000007,
+       0x0201f000, 0x0010230c, 0x59a00c06, 0x82040500,
+       0xffffff00, 0x02020000, 0x00102310, 0x82041580,
+       0x000000ff, 0x04020007, 0x59a80010, 0x82000500,
+       0x000000ff, 0x82001540, 0x0000ff00, 0x0401f011,
+       0x82040400, 0x0010210e, 0x50000000, 0x80000110,
+       0x82000580, 0x00000080, 0x02000000, 0x00102310,
+       0x59a80010, 0x82000500, 0x000000ff, 0x80041580,
+       0x02000000, 0x00102310, 0x840409c0, 0x80041540,
+       0x0201f800, 0x0002075a, 0x04020005, 0x4a034406,
+       0x00000003, 0x0201f000, 0x0010230c, 0x48ee6021,
+       0x480a621c, 0x4a02641c, 0x0000bc05, 0x4a026406,
+       0x00000001, 0x0201f800, 0x00103a00, 0x04020007,
+       0x0201f800, 0x0002077d, 0x4a034406, 0x00000002,
+       0x0201f000, 0x0010230c, 0x497a5a04, 0x497a5805,
+       0x4a025c04, 0x00008000, 0x4a01d809, 0x001027f9,
+       0x492e6008, 0x42027000, 0x00000032, 0x0201f000,
+       0x000207a1, 0x592c0005, 0x82000580, 0x01000000,
+       0x02020000, 0x001022c0, 0x4a034406, 0x00000004,
+       0x0201f000, 0x0010230c, 0x497b4406, 0x497b4207,
+       0x0201f800, 0x00103b25, 0x04000008, 0x59a80066,
+       0x59a8086a, 0x80040480, 0x59a80867, 0x48074406,
+       0x80041480, 0x480b4207, 0x49674407, 0x59a8000e,
+       0x48034209, 0x495f4409, 0x59a80020, 0x4803420b,
+       0x0201f000, 0x001022c0, 0x800409c0, 0x04000005,
+       0x4a034406, 0x00000001, 0x0201f000, 0x0010230c,
+       0x59a00406, 0x8c000500, 0x0402000f, 0x59a80069,
+       0x81640480, 0x04001008, 0x59a8000b, 0x81500580,
+       0x04000009, 0x59a8006a, 0x59a81066, 0x80080580,
+       0x04000005, 0x4a034406, 0x00000018, 0x0201f000,
+       0x0010230c, 0x82000540, 0x00000001, 0x0201f800,
+       0x001015fe, 0x0201f800, 0x00103c80, 0x0201f000,
+       0x001022c0, 0x4803c856, 0x800409c0, 0x02020000,
+       0x00102314, 0x59a00406, 0x8c00051e, 0x04000008,
+       0x4803c856, 0x59a0020b, 0x82000480, 0x00000800,
+       0x04001015, 0x0201f000, 0x00102310, 0x4803c856,
+       0x59a0020b, 0x599c0a01, 0x80040480, 0x04021003,
+       0x0201f000, 0x00102310, 0x59a8000e, 0x81640580,
+       0x04000009, 0x4a034406, 0x00000018, 0x0201f000,
+       0x0010230c, 0x4a034406, 0x00000005, 0x0201f000,
+       0x0010230c, 0x59a80026, 0x8c00050a, 0x040007fa,
+       0x59a00406, 0x8c00051e, 0x04000036, 0x0201f800,
+       0x0002075a, 0x040007f4, 0x0201f800, 0x00103a00,
+       0x040007f1, 0x497a5a04, 0x59a00406, 0x4802620a,
+       0x59a00209, 0x4802640a, 0x59a00409, 0x4802620b,
+       0x59a0020d, 0x4802620c, 0x59a0040d, 0x4802640c,
+       0x59a0020e, 0x4802620d, 0x59a0040e, 0x4802640d,
+       0x59a00210, 0x4802620e, 0x59a00410, 0x4802640e,
+       0x59a0020b, 0x82000500, 0x0000fffc, 0x80000104,
+       0x4802640b, 0x0401f9d9, 0x040007d7, 0x48ee6021,
+       0x58ee580d, 0x5930020e, 0x59301c0e, 0x900c19c0,
+       0x800c1d40, 0x5930020c, 0x5930140c, 0x900811c0,
+       0x80081540, 0x592c0a05, 0x832c0400, 0x00000006,
+       0x0201f800, 0x00103a25, 0x4a01d809, 0x001029e5,
+       0x4a034000, 0x00000001, 0x49334001, 0x1c01f000,
+       0x0201f800, 0x00106c55, 0x0201f800, 0x00100ae0,
+       0x0401f86d, 0x497b5057, 0x4201d000, 0x00002710,
+       0x0201f800, 0x001060c6, 0x59c40880, 0x4c040000,
+       0x59c408a3, 0x4c040000, 0x497b4002, 0x0401f876,
+       0x0401f893, 0x4a03a005, 0x10000000, 0x0401f8b4,
+       0x0401f901, 0x04000048, 0x59c80001, 0x800001c0,
+       0x040007fc, 0x59c80018, 0x82000500, 0xf0000000,
+       0x59c00808, 0x82040d00, 0x0fffffff, 0x80040540,
+       0x48038008, 0x0201f800, 0x00100ec1, 0x59c00006,
+       0x4a038006, 0x10000000, 0x59c00009, 0x82000d00,
+       0x00e00000, 0x04020024, 0x4a03900d, 0x00000000,
+       0x59c80020, 0x82000500, 0xff000000, 0x82000580,
+       0x32000000, 0x0402001c, 0x4a03900d, 0x00000001,
+       0x59c80020, 0x82000500, 0xff000000, 0x82000580,
+       0xe1000000, 0x04020014, 0x4a03900d, 0x00000000,
+       0x59c80020, 0x82000500, 0x00ffffff, 0x4a03900d,
+       0x00000000, 0x59c80821, 0x82040d00, 0x00ffffff,
+       0x80040580, 0x04020008, 0x59a80010, 0x80040580,
+       0x04020005, 0x59c40005, 0x82000500, 0x000000f0,
+       0x04000006, 0x4803c856, 0x0401f8d7, 0x4a035057,
+       0x00000001, 0x0401f002, 0x0401f8e1, 0x42000000,
+       0x00000064, 0x80000040, 0x02000800, 0x001005d8,
+       0x59c00807, 0x82040d00, 0x0000000c, 0x040007fa,
+       0x0401f003, 0x4a035057, 0x00000001, 0x0401f8da,
+       0x0201f800, 0x00106f36, 0x0401f818, 0x4201d000,
+       0x000186a0, 0x0201f800, 0x001060c6, 0x5c000800,
+       0x480788a3, 0x5c000800, 0x48078880, 0x59a80057,
+       0x800001c0, 0x02000000, 0x001022c0, 0x0201f000,
+       0x00102318, 0x599c0201, 0x48035059, 0x41780800,
+       0x42001000, 0x00003b10, 0x0201f800, 0x001066a0,
+       0x480b505a, 0x1c01f000, 0x0201f800, 0x00106c4b,
+       0x59b800ea, 0x82000500, 0x00000007, 0x82000580,
+       0x00000003, 0x04020003, 0x4a0370e8, 0x00000001,
+       0x1c01f000, 0x42038000, 0x00007700, 0x4a038006,
+       0x30000000, 0x59c00007, 0x8c00050a, 0x040207fe,
+       0x59c00006, 0x59a00209, 0x59a00c09, 0x900409c0,
+       0x80040d40, 0x48078001, 0x59a0020e, 0x59a00c0e,
+       0x900409c0, 0x80040d40, 0x48078000, 0x59a0020b,
+       0x82000500, 0x0000fffc, 0x48038002, 0x48038003,
+       0x48038005, 0x497b9009, 0x59e00003, 0x82000540,
+       0x00008060, 0x4803c003, 0x1c01f000, 0x41780800,
+       0x8007a0ca, 0x83d3a400, 0x00007600, 0x42000800,
+       0x00000040, 0x0201f800, 0x00101345, 0x4a03a00a,
+       0x00000001, 0x4a03a005, 0x20000000, 0x59d00006,
+       0x4a03a005, 0x30000000, 0x59d00006, 0x8c00050a,
+       0x040207fe, 0x59d00005, 0x59a00210, 0x59a00c10,
+       0x900409c0, 0x80040d40, 0x4807a001, 0x59a0020d,
+       0x59a00c0d, 0x900409c0, 0x80040d40, 0x4807a000,
+       0x59a0020b, 0x82000500, 0x0000fffc, 0x4803a003,
+       0x4803a002, 0x4803a008, 0x1c01f000, 0x59a00002,
+       0x4803c857, 0x800001c0, 0x0402004a, 0x59a8005a,
+       0x48038880, 0x59c400a3, 0x82000540, 0x00002008,
+       0x8400053a, 0x480388a3, 0x59c40008, 0x8400054e,
+       0x82000500, 0xffffffe1, 0x48038808, 0x59c80040,
+       0x84000534, 0x48039040, 0x0401f902, 0x04020013,
+       0x59a80010, 0x800000d0, 0x82000540, 0x00000011,
+       0x48039120, 0x59a80010, 0x82000500, 0x00ffffff,
+       0x82000540, 0x32000000, 0x48039121, 0x4a039123,
+       0xe1290008, 0x59a80010, 0x82000500, 0x00ffffff,
+       0x48039122, 0x0401f016, 0x59a80010, 0x82000500,
+       0x000000ff, 0x900009c0, 0x840001c0, 0x80040540,
+       0x82000540, 0x00000000, 0x48039120, 0x59a80010,
+       0x82000500, 0x000000ff, 0x82000540, 0x01000000,
+       0x48039121, 0x4a039123, 0x08210008, 0x59a80010,
+       0x82000500, 0x000000ff, 0x48039122, 0x497b9124,
+       0x59a80c5b, 0x80040800, 0x4807545b, 0x900409c0,
+       0x82040540, 0x0000aaaa, 0x48039125, 0x497b9126,
+       0x497b9127, 0x0401f8cf, 0x04020004, 0x4a039100,
+       0x0000e980, 0x0401f003, 0x4a039100, 0x0000e9a0,
+       0x1c01f000, 0x82000540, 0x00000001, 0x0402500d,
+       0x4203e000, 0x80000000, 0x40e81000, 0x41780800,
+       0x42000000, 0x00000064, 0x0201f800, 0x001066a0,
+       0x59940024, 0x80080400, 0x48032824, 0x80000580,
+       0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000,
+       0x4d140000, 0x417a3000, 0x0201f800, 0x001070d8,
+       0x0201f800, 0x00106dc3, 0x5c022800, 0x5c034800,
+       0x5c03a000, 0x5c032000, 0x1c01f000, 0x59c80007,
+       0x8c000500, 0x04000003, 0x4a03900d, 0x00000030,
+       0x1c01f000, 0x4a038805, 0x00020000, 0x42000800,
+       0x0000003c, 0x0201f800, 0x00101345, 0x4a038891,
+       0x0000ffff, 0x59c80035, 0x48039035, 0x4a03900d,
+       0x00000040, 0x42038000, 0x00007700, 0x0201f800,
+       0x00100ec1, 0x42038000, 0x00007720, 0x0201f800,
+       0x00100ec1, 0x4a03a005, 0x20000000, 0x4a03a005,
+       0x30000000, 0x59d00806, 0x8c040d0a, 0x040207fe,
+       0x1c01f000, 0x4d300000, 0x4031d800, 0x58ef400b,
+       0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200,
+       0x5c026000, 0x02000000, 0x00102304, 0x4d300000,
+       0x59a26001, 0x59a00000, 0x4000b000, 0x80000000,
+       0x48034000, 0x592c0001, 0x80000540, 0x0400001e,
+       0x40025800, 0x8058b040, 0x040207fb, 0x58ec1007,
+       0x58ec1808, 0x592c0a05, 0x4d2c0000, 0x58ec000d,
+       0x40025800, 0x592c0204, 0x5c025800, 0x82000580,
+       0x00000103, 0x04000008, 0x832c0400, 0x00000006,
+       0x0201f800, 0x00103a25, 0x4a01d809, 0x001029e5,
+       0x0401f007, 0x832c0400, 0x00000006, 0x0201f800,
+       0x00103a28, 0x4a01d809, 0x001029e5, 0x5c026000,
+       0x1c01f000, 0x58ec000d, 0x40025800, 0x592c0204,
+       0x82000580, 0x00000103, 0x04020006, 0x0201f800,
+       0x0002077d, 0x5c026000, 0x0201f000, 0x001022c0,
+       0x58ec000d, 0x40025800, 0x592c0404, 0x8400055e,
+       0x48025c04, 0x42028800, 0x000007fd, 0x42003000,
+       0x00fffffd, 0x0201f800, 0x001045a6, 0x04000003,
+       0x80000580, 0x0401f004, 0x59a26001, 0x0201f800,
+       0x0010937d, 0x5c026000, 0x02000000, 0x0010230c,
+       0x4d300000, 0x4a01d809, 0x00102a38, 0x0401f7dc,
+       0x592c0005, 0x82000580, 0x01000000, 0x02000000,
+       0x00102318, 0x4d300000, 0x59a26001, 0x5930020b,
+       0x59301c0a, 0x900001c0, 0x800c1d40, 0x5930040d,
+       0x5930120d, 0x900001c0, 0x80081540, 0x592c0a05,
+       0x832c0400, 0x00000006, 0x0201f800, 0x00103a28,
+       0x4a01d809, 0x001029e5, 0x4a034000, 0x00000001,
+       0x5c026000, 0x1c01f000, 0x4933c857, 0x4c300000,
+       0x5930040b, 0x82000c80, 0x0000000e, 0x04001004,
+       0x4a025a05, 0x0000000e, 0x0401f003, 0x48025a05,
+       0x0401f00c, 0x800409c0, 0x0400000a, 0x4c040000,
+       0x0201f800, 0x00103a00, 0x5c000800, 0x04000003,
+       0x40040000, 0x0401f7f0, 0x80000580, 0x0401f003,
+       0x82000540, 0x00000001, 0x5c006000, 0x1c01f000,
+       0x59a00206, 0x82000580, 0x00000044, 0x1c01f000,
+       0x4807c857, 0x800409c0, 0x0400000c, 0x0201f800,
+       0x00101650, 0x04020009, 0x42000000, 0x00000002,
+       0x0201f800, 0x0010188c, 0x42000000, 0x00000002,
+       0x0201f800, 0x00101821, 0x59a00406, 0x82000500,
+       0x00000007, 0x0c01f001, 0x00102a8c, 0x00102aa1,
+       0x00102ab7, 0x00102a8a, 0x00102a8a, 0x00102a8a,
+       0x00102a8a, 0x00102a8a, 0x0201f000, 0x00102310,
+       0x42000800, 0x000000c0, 0x0201f800, 0x0010193f,
+       0x82040540, 0x00000002, 0x42000800, 0x000000c0,
+       0x0201f800, 0x00101944, 0x42000800, 0x00000000,
+       0x0201f800, 0x0010193f, 0x82040540, 0x00000008,
+       0x42000800, 0x00000000, 0x0201f800, 0x00101944,
+       0x0401f00b, 0x42000800, 0x000000c0, 0x0201f800,
+       0x0010193f, 0x82040540, 0x00000001, 0x42000800,
+       0x000000c0, 0x0201f800, 0x00101944, 0x59c80040,
+       0x4c000000, 0x59a80010, 0x4c000000, 0x59c400a3,
+       0x4c000000, 0x59c40008, 0x4c000000, 0x0401f911,
+       0x04000021, 0x0201f800, 0x001005d8, 0x59a80821,
+       0x800409c0, 0x02020000, 0x00102314, 0x0201f800,
+       0x0010513b, 0x04020005, 0x4a034406, 0x00000016,
+       0x0201f000, 0x0010230c, 0x836c0580, 0x00000003,
+       0x02020000, 0x00102314, 0x59c408a4, 0x82040d00,
+       0x0000000f, 0x82040580, 0x00000000, 0x02020000,
+       0x00102314, 0x59c80040, 0x4c000000, 0x59a80010,
+       0x4c000000, 0x59c400a3, 0x4c000000, 0x59c40008,
+       0x4c000000, 0x59c40080, 0x4c000000, 0x59a0020f,
+       0x59a0bc0f, 0x905cb9c0, 0x805cbd40, 0x41784800,
+       0x41785000, 0x41785800, 0x41789000, 0x41789800,
+       0x0401fe21, 0x0201f800, 0x00106c55, 0x0201f800,
+       0x00100ae0, 0x4178c000, 0x497b4002, 0x0401f95c,
+       0x0401f9aa, 0x59a0020c, 0x59a00c0c, 0x80040d40,
+       0x04000002, 0x0401f9fb, 0x0401f9fa, 0x0401fe68,
+       0x8060c1c0, 0x04020014, 0x0401fa98, 0x0401feb2,
+       0x0402000e, 0x0201f800, 0x001018d3, 0x04020008,
+       0x4a034406, 0x00000017, 0x0201f800, 0x0010230c,
+       0x4203e000, 0x50000000, 0x0401f000, 0x42005800,
+       0x0000aaaa, 0x0401f058, 0x59c80001, 0x800001c0,
+       0x040007ee, 0x59c80801, 0x800409c0, 0x04000006,
+       0x0401fa70, 0x40240000, 0x80280540, 0x802c0540,
+       0x0402004d, 0x59a00002, 0x82000580, 0xfeedbeef,
+       0x04000004, 0x42008800, 0x10000000, 0x0401f003,
+       0x42008800, 0x10000004, 0x0401fa19, 0x4a034002,
+       0xfeedbeef, 0x0401fa71, 0x0401fa97, 0x0401fea8,
+       0x59c40005, 0x8c000534, 0x04000004, 0x42005800,
+       0x0000bbbb, 0x0401f038, 0x0401fe83, 0x04020007,
+       0x42005800, 0x0000cccc, 0x485f420f, 0x905cb9c0,
+       0x485f440f, 0x0401f030, 0x59a0040c, 0x800001c0,
+       0x0400000e, 0x59a26000, 0x5930000d, 0x800001c0,
+       0x040207be, 0x59a26001, 0x5930080d, 0x800409c0,
+       0x040207ba, 0x804891c0, 0x040207b8, 0x804c99c0,
+       0x040207b6, 0x0401f87a, 0x805cb840, 0x04000005,
+       0x40240000, 0x80280540, 0x802c0540, 0x0402001a,
+       0x42000000, 0x00030d40, 0x80000040, 0x04020012,
+       0x59c00007, 0x82000500, 0x000501c0, 0x0402000b,
+       0x0201f800, 0x001018d3, 0x04020008, 0x4a034406,
+       0x00000017, 0x0201f800, 0x0010230c, 0x4203e000,
+       0x50000000, 0x0401f000, 0x42005800, 0x0000dddd,
+       0x0401f005, 0x59c00807, 0x82040d00, 0x0000000c,
+       0x040007ea, 0x0401fe5c, 0x59a0040c, 0x800001c0,
+       0x04000002, 0x0401f856, 0x0401fe6b, 0x40240000,
+       0x80280540, 0x802c0540, 0x04020003, 0x805cb9c0,
+       0x04020781, 0x0201f800, 0x00106f36, 0x0401fda3,
+       0x4201d000, 0x000186a0, 0x0201f800, 0x001060c6,
+       0x5c000800, 0x48078880, 0x5c000800, 0x48078808,
+       0x5c000800, 0x480788a3, 0x5c000800, 0x48075010,
+       0x5c000800, 0x48079040, 0x0201f800, 0x00100969,
+       0x59a00406, 0x82000500, 0x00000003, 0x82000580,
+       0x00000002, 0x0400002c, 0x42000800, 0x000000c0,
+       0x0201f800, 0x0010193f, 0x82040500, 0xfffffffc,
+       0x42000800, 0x000000c0, 0x0201f800, 0x00101944,
+       0x42000800, 0x00000000, 0x0201f800, 0x0010193f,
+       0x82040500, 0xfffffff7, 0x42000800, 0x00000000,
+       0x0201f800, 0x00101944, 0x42000800, 0x00000000,
+       0x0201f800, 0x0010193f, 0x82040500, 0xfffffffb,
+       0x42000800, 0x00000000, 0x0201f800, 0x00101944,
+       0x4a0388a7, 0x0000f7f7, 0x42006000, 0xbeffffff,
+       0x42006800, 0x80018000, 0x0201f800, 0x0010427d,
+       0x42006000, 0xfffeffff, 0x41786800, 0x0201f800,
+       0x0010427d, 0x402c0000, 0x80280540, 0x80240540,
+       0x02000000, 0x001022c0, 0x48274406, 0x482b4207,
+       0x482f4407, 0x0201f000, 0x0010231c, 0x59a26000,
+       0x813261c0, 0x0400000e, 0x59325808, 0x812e59c0,
+       0x0400000b, 0x0201f800, 0x0002077d, 0x0201f800,
+       0x001007fd, 0x59a26001, 0x59325808, 0x0201f800,
+       0x0002077d, 0x0201f800, 0x001007fd, 0x1c01f000,
+       0x42000800, 0x000000ef, 0x0201f800, 0x001015eb,
+       0x59c400a3, 0x8400055a, 0x8400053a, 0x480388a3,
+       0x0201f800, 0x0010163b, 0x0402000a, 0x42000000,
+       0x00000001, 0x0201f800, 0x0010188c, 0x42000000,
+       0x00000001, 0x0201f800, 0x00101821, 0x0401f013,
+       0x0201f800, 0x00101642, 0x04020008, 0x41780000,
+       0x0201f800, 0x0010188c, 0x41780000, 0x0201f800,
+       0x00101821, 0x0401f009, 0x42000000, 0x00000002,
+       0x0201f800, 0x0010188c, 0x42000000, 0x00000002,
+       0x0201f800, 0x00101821, 0x42000800, 0x00000000,
+       0x0201f800, 0x0010193f, 0x82040540, 0x00000004,
+       0x42000800, 0x00000000, 0x0201f800, 0x00101944,
+       0x4201d000, 0x00000014, 0x0201f800, 0x0010608e,
+       0x59c40008, 0x8400054e, 0x82000500, 0xffffffe1,
+       0x48038808, 0x4a0388a7, 0x0000f7f7, 0x42001000,
+       0x04000001, 0x0201f800, 0x0010193d, 0x42006000,
+       0xbe20bfff, 0x42006800, 0x80018000, 0x0201f800,
+       0x0010427d, 0x42006000, 0xfffeffff, 0x41786800,
+       0x0201f800, 0x0010427d, 0x4200b000, 0x00001388,
+       0x4201d000, 0x00000014, 0x4c580000, 0x0201f800,
+       0x0010608e, 0x0201f800, 0x001018d3, 0x5c00b000,
+       0x04000004, 0x8058b040, 0x040207f6, 0x0401f025,
+       0x59c40005, 0x8c000534, 0x04020007, 0x59c400a4,
+       0x82000500, 0x0000000f, 0x82000580, 0x00000008,
+       0x0402001c, 0x42006000, 0x00020000, 0x0201f800,
+       0x00104282, 0x4201d000, 0x00000064, 0x0201f800,
+       0x0010608e, 0x42006000, 0xfeffffff, 0x42006800,
+       0x02000000, 0x0201f800, 0x0010427d, 0x42006000,
+       0xfdffffff, 0x41786800, 0x0201f800, 0x0010427d,
+       0x4a038805, 0x04000001, 0x59c400a4, 0x82000500,
+       0x0000000f, 0x82000580, 0x00000000, 0x04000003,
+       0x82000540, 0x00000001, 0x1c01f000, 0x4803c856,
+       0x42038000, 0x00007700, 0x0201f800, 0x00100ec1,
+       0x59c00006, 0x59a0040c, 0x800001c0, 0x0400003f,
+       0x59a03c0c, 0x59a00209, 0x59a01c09, 0x900c19c0,
+       0x800c1d40, 0x59a0020e, 0x59a0240e, 0x901021c0,
+       0x80102540, 0x59a0020b, 0x82000500, 0x0000fffc,
+       0x59a0140b, 0x900811c0, 0x80081540, 0x480b8003,
+       0x0201f800, 0x0002075a, 0x02000800, 0x001005d8,
+       0x49334000, 0x0201f800, 0x001007e4, 0x4a025a04,
+       0x00000018, 0x4a025805, 0x00abcdef, 0x492e6008,
+       0x492e600b, 0x481e600d, 0x4a02600c, 0x00000004,
+       0x832c0400, 0x00000011, 0x4802600a, 0x42001000,
+       0x0000000c, 0x821c0d80, 0x00000001, 0x04000004,
+       0x801c3840, 0x0401f963, 0x0401f004, 0x41783800,
+       0x0401f960, 0x0401f011, 0x821c0c80, 0x00000005,
+       0x04001005, 0x40043800, 0x42001000, 0x0000003c,
+       0x0401f006, 0x80001580, 0x82081400, 0x0000000c,
+       0x801c3840, 0x040207fd, 0x832c0400, 0x00000005,
+       0x0401f950, 0x040207f1, 0x497b9009, 0x59e00003,
+       0x82000540, 0x00008060, 0x4803c003, 0x4a038009,
+       0x00e00000, 0x1c01f000, 0x4803c856, 0x41780800,
+       0x8007a0ca, 0x83d3a400, 0x00007600, 0x42000800,
+       0x00000040, 0x0201f800, 0x00101345, 0x4a03a00a,
+       0x00000001, 0x4a03a005, 0x20000000, 0x59d00006,
+       0x4a03a005, 0x30000000, 0x59d00006, 0x8c00050a,
+       0x040207fe, 0x59d00005, 0x59a0020c, 0x800001c0,
+       0x0400003f, 0x59a03a0c, 0x59a00210, 0x59a01c10,
+       0x900c19c0, 0x800c1d40, 0x59a0020d, 0x59a0240d,
+       0x901021c0, 0x80102540, 0x59a0120b, 0x82081500,
+       0x0000fffc, 0x59a0040b, 0x900001c0, 0x80081540,
+       0x480ba003, 0x0201f800, 0x0002075a, 0x02000800,
+       0x001005d8, 0x49334001, 0x0201f800, 0x001007e4,
+       0x4a025a04, 0x00000018, 0x4a025805, 0x00abcdef,
+       0x492e6008, 0x492e600b, 0x481e600d, 0x4a02600c,
+       0x00000004, 0x832c0400, 0x00000011, 0x4802600a,
+       0x42001000, 0x0000000c, 0x821c0d80, 0x00000001,
+       0x04000004, 0x801c3840, 0x0401f906, 0x0401f004,
+       0x41783800, 0x0401f903, 0x0401f011, 0x821c0c80,
+       0x00000005, 0x04001005, 0x40043800, 0x42001000,
+       0x0000003c, 0x0401f006, 0x80001580, 0x82081400,
+       0x0000000c, 0x801c3840, 0x040207fd, 0x832c0400,
+       0x00000005, 0x0401f8f3, 0x040207f1, 0x1c01f000,
+       0x4803c856, 0x59a0020c, 0x800001c0, 0x04000024,
+       0x824c0580, 0x00000002, 0x04000040, 0x59a26001,
+       0x5930380d, 0x801c39c0, 0x0400003c, 0x801c3840,
+       0x481e600d, 0x5932580b, 0x5930080a, 0x50042000,
+       0x58041801, 0x58041002, 0x82081500, 0xfffffffc,
+       0x5930000c, 0x80000000, 0x82000d80, 0x00000005,
+       0x04020009, 0x497a600c, 0x592e5801, 0x812e59c0,
+       0x0400001a, 0x492e600b, 0x832c0c00, 0x00000005,
+       0x0401f005, 0x4802600c, 0x5930080a, 0x82040c00,
+       0x00000003, 0x4806600a, 0x0401f010, 0x59a0120b,
+       0x82081500, 0x0000fffc, 0x59a0040b, 0x900001c0,
+       0x80081540, 0x480ba003, 0x59a0020d, 0x59a0240d,
+       0x901021c0, 0x80102540, 0x59a00210, 0x59a01c10,
+       0x900c19c0, 0x800c1d40, 0x4201d000, 0x00003a98,
+       0x0201f800, 0x001060c6, 0x480ba002, 0x59a80059,
+       0x4803a008, 0x4813a000, 0x480fa001, 0x4a03a005,
+       0x10000000, 0x02005800, 0x001005d8, 0x804c9800,
+       0x82000540, 0x00000001, 0x1c01f000, 0x4847c857,
+       0x59a0040c, 0x800001c0, 0x04000024, 0x82480580,
+       0x00000002, 0x04000042, 0x59a26000, 0x5930380d,
+       0x801c39c0, 0x0400003e, 0x801c3840, 0x481e600d,
+       0x5932580b, 0x5930080a, 0x50042000, 0x58041801,
+       0x58041002, 0x82081500, 0xfffffffc, 0x5930000c,
+       0x80000000, 0x82000d80, 0x00000005, 0x04020009,
+       0x497a600c, 0x592e5801, 0x812e59c0, 0x0400001d,
+       0x492e600b, 0x832c0c00, 0x00000005, 0x0401f005,
+       0x4802600c, 0x5930080a, 0x82040c00, 0x00000003,
+       0x4806600a, 0x0401f013, 0x82440580, 0x10000000,
+       0x0402001f, 0x59a0020e, 0x59a0240e, 0x901021c0,
+       0x80102540, 0x59a00209, 0x59a01c09, 0x900c19c0,
+       0x800c1d40, 0x59a0020b, 0x82000500, 0x0000fffc,
+       0x59a0140b, 0x900811c0, 0x80081540, 0x480b8003,
+       0x48138000, 0x480f8001, 0x480b8002, 0x59c80018,
+       0x82000500, 0xf0000000, 0x59c02008, 0x82102500,
+       0x0fffffff, 0x80100540, 0x48038008, 0x48478006,
+       0x80489000, 0x8260c540, 0x00000001, 0x1c01f000,
+       0x59c00009, 0x4803c857, 0x82000d00, 0x00e00000,
+       0x0400000d, 0x485f420f, 0x905cb9c0, 0x485f440f,
+       0x8c00052e, 0x04000002, 0x80285000, 0x8c00052c,
+       0x04000002, 0x80244800, 0x8c00052a, 0x04000002,
+       0x802c5800, 0x1c01f000, 0x59a0020c, 0x800001c0,
+       0x04000024, 0x59d00806, 0x4807c857, 0x8c040d3e,
+       0x04000020, 0x4a03a005, 0x20000000, 0x4a03a005,
+       0x30000000, 0x59d00806, 0x8c040d0a, 0x040207fe,
+       0x824c0480, 0x00000003, 0x02021800, 0x001005d8,
+       0x404c0000, 0x0c01f001, 0x00102da1, 0x00102da3,
+       0x00102da9, 0x0201f800, 0x001005d8, 0x80000040,
+       0x40009800, 0x0401ff43, 0x0400000a, 0x0401ff41,
+       0x0401f008, 0x80000040, 0x40009800, 0x59d00806,
+       0x4807c857, 0x8c040d3e, 0x040207e3, 0x0401ff39,
+       0x1c01f000, 0x59a0040c, 0x800001c0, 0x04000024,
+       0x59c00807, 0x4807c857, 0x8c040d3e, 0x04000020,
+       0x59c00807, 0x4a038006, 0x20000000, 0x82480480,
+       0x00000003, 0x02021800, 0x001005d8, 0x40480000,
+       0x0c01f001, 0x00102dc4, 0x00102dc6, 0x00102dce,
+       0x0201f800, 0x001005d8, 0x80000040, 0x40009000,
+       0x42008800, 0x10000004, 0x0401ff65, 0x0400000c,
+       0x0401ff63, 0x0401f00a, 0x80000040, 0x40009000,
+       0x59c00807, 0x4807c857, 0x8c040d3e, 0x040207e5,
+       0x42008800, 0x10000004, 0x0401ff59, 0x1c01f000,
+       0x492fc857, 0x4000a800, 0x4a03b805, 0x20000000,
+       0x59dc0006, 0x4a03b805, 0x30000000, 0x4813b800,
+       0x480fb801, 0x480bb802, 0x4857b803, 0x4a03b805,
+       0x30000002, 0x59dc0006, 0x4a03b805, 0x70000001,
+       0x59dc0006, 0x4a03b805, 0x10000000, 0x59dc0006,
+       0x8c00053e, 0x040007fe, 0x4a03b805, 0x20000000,
+       0x59dc0006, 0x59dc2000, 0x59dc1801, 0x801c39c0,
+       0x0400000a, 0x4d2c0000, 0x0201f800, 0x001007e4,
+       0x5c000800, 0x02000800, 0x001005d8, 0x4a025a04,
+       0x0000000a, 0x492c0801, 0x1c01f000, 0x42006000,
+       0x00102fb2, 0x0201f800, 0x00101345, 0x4a03902c,
+       0x00200000, 0x4200b000, 0x000001f4, 0x59c8002c,
+       0x8c00052c, 0x04000007, 0x8058b040, 0x040207fc,
+       0x42000000, 0x00004003, 0x41781000, 0x0401f196,
+       0x50301000, 0x41784800, 0x4a03902d, 0x00008000,
+       0x4200b000, 0x000001f4, 0x59c8002c, 0x8c000534,
+       0x04000007, 0x8058b040, 0x040207fc, 0x42000000,
+       0x00004003, 0x41781000, 0x0401f187, 0x0401f8f8,
+       0x80244800, 0x40240000, 0x82000580, 0x000003b1,
+       0x040207fb, 0x0401f988, 0x41784800, 0x0401f920,
+       0x80244800, 0x40240000, 0x82000580, 0x000003b1,
+       0x040207fb, 0x80306000, 0x82300580, 0x00102fb4,
+       0x040207e0, 0x59a80863, 0x800409c0, 0x04000007,
+       0x42000000, 0x00004004, 0x42001000, 0x00000002,
+       0x59a81862, 0x0401f16c, 0x42006000, 0x00102fb2,
+       0x4a035064, 0x00000004, 0x50301000, 0x41784800,
+       0x4a03902d, 0x00004000, 0x4200b000, 0x000001f4,
+       0x59c8002c, 0x8c000532, 0x04000007, 0x8058b040,
+       0x040207fc, 0x42000000, 0x00004003, 0x41781000,
+       0x0401f159, 0x0401f8ca, 0x80244800, 0x40240000,
+       0x82000580, 0x00000154, 0x040207fb, 0x0401f95a,
+       0x41784800, 0x0401f8f2, 0x80244800, 0x40240000,
+       0x82000580, 0x00000154, 0x040207fb, 0x80306000,
+       0x82300580, 0x00102fb4, 0x040207e0, 0x59a80863,
+       0x800409c0, 0x04000007, 0x42000000, 0x00004004,
+       0x42001000, 0x00000004, 0x59a81862, 0x0401f13e,
+       0x42006000, 0x00102fb2, 0x497b5064, 0x50301000,
+       0x41784800, 0x4a03902d, 0x00001000, 0x4200b000,
+       0x000001f4, 0x59c8002c, 0x8c00052e, 0x04000007,
+       0x8058b040, 0x040207fc, 0x42000000, 0x00004003,
+       0x41781000, 0x0401f12c, 0x0401f89d, 0x80244800,
+       0x40240000, 0x82000580, 0x00000088, 0x040207fb,
+       0x0401f92d, 0x41784800, 0x0401f8c5, 0x80244800,
+       0x40240000, 0x82000580, 0x00000088, 0x040207fb,
+       0x80306000, 0x82300580, 0x00102fb4, 0x040207e0,
+       0x59a80863, 0x800409c0, 0x04000007, 0x42000000,
+       0x00004004, 0x42001000, 0x00000001, 0x59a81862,
+       0x0401f111, 0x42006000, 0x00102fb2, 0x50301000,
+       0x41784800, 0x4a03902d, 0x00000800, 0x0401f87c,
+       0x80244800, 0x40240000, 0x82000580, 0x00000018,
+       0x040207fb, 0x0401f90c, 0x41784800, 0x0401f8a4,
+       0x80244800, 0x40240000, 0x82000580, 0x00000018,
+       0x040207fb, 0x80306000, 0x82300580, 0x00102fb4,
+       0x040207eb, 0x59a80863, 0x800409c0, 0x04000007,
+       0x42000000, 0x00004004, 0x42001000, 0x00000010,
+       0x59a81862, 0x0401f0f0, 0x42006000, 0x00102fb2,
+       0x50301000, 0x41784800, 0x4a03902d, 0x00000400,
+       0x0401f85b, 0x80244800, 0x40240000, 0x82000580,
+       0x00000088, 0x040207fb, 0x0401f8eb, 0x41784800,
+       0x0401f883, 0x80244800, 0x40240000, 0x82000580,
+       0x00000088, 0x040207fb, 0x80306000, 0x82300580,
+       0x00102fb4, 0x040207eb, 0x59a80863, 0x800409c0,
+       0x04000007, 0x42000000, 0x00004004, 0x42001000,
+       0x00000008, 0x59a81862, 0x0401f0cf, 0x42006000,
+       0x00102fb2, 0x50301000, 0x41784800, 0x4a03902d,
+       0x00002000, 0x4200b000, 0x000001f4, 0x59c8002c,
+       0x8c000530, 0x04000007, 0x8058b040, 0x040207fc,
+       0x42000000, 0x00004003, 0x41781000, 0x0401f0be,
+       0x59c8002c, 0x82000500, 0xffe0ffff, 0x82080d00,
+       0x001f0000, 0x80040540, 0x4803902c, 0x0401f828,
+       0x80244800, 0x40240000, 0x82000580, 0x00000110,
+       0x040207fb, 0x0401f8b8, 0x41784800, 0x0401f850,
+       0x59c80034, 0x82080d00, 0x001f0000, 0x82000500,
+       0x001f0000, 0x80040580, 0x04000006, 0x59a80063,
+       0x80000000, 0x48035063, 0x40240000, 0x48035062,
+       0x80244800, 0x40240000, 0x82000580, 0x00000110,
+       0x040207ef, 0x80306000, 0x82300580, 0x00102fb4,
+       0x040207cd, 0x59a80863, 0x800409c0, 0x04000006,
+       0x42000000, 0x00004004, 0x42001000, 0x00000020,
+       0x59a81862, 0x0201f000, 0x001022c0, 0x59c8002c,
+       0x82000500, 0xffff0000, 0x82080d00, 0x0000ffff,
+       0x80040540, 0x4803902c, 0x40080000, 0x48039028,
+       0x48039029, 0x59a80064, 0x82000580, 0x00000004,
+       0x04000004, 0x40080000, 0x4803902a, 0x4803902b,
+       0x59c8082d, 0x82040d00, 0xfffffc00, 0x40240000,
+       0x80040d40, 0x4807902d, 0x4200b000, 0x000001f4,
+       0x59c8002c, 0x82000500, 0x18000000, 0x04000007,
+       0x8058b040, 0x040207fb, 0x42000000, 0x00004003,
+       0x41781000, 0x0401f06c, 0x4a03902e, 0x00000001,
+       0x4200b000, 0x000001f4, 0x59c8002e, 0x8c000500,
+       0x04000006, 0x8058b040, 0x040207fc, 0x42000000,
+       0x00004003, 0x0401f060, 0x1c01f000, 0x41783800,
+       0x59c8082d, 0x82040d00, 0xfffffc00, 0x40240000,
+       0x80040d40, 0x4807902d, 0x4200b000, 0x000001f4,
+       0x59c8002c, 0x82000500, 0x18000000, 0x04000007,
+       0x8058b040, 0x040207fb, 0x42000000, 0x00004003,
+       0x41781000, 0x0401f04c, 0x59c80030, 0x59c80830,
+       0x80040580, 0x040207fd, 0x40041800, 0x59c80031,
+       0x59c80831, 0x80040580, 0x040207fd, 0x40042000,
+       0x59c80032, 0x59c80832, 0x80040580, 0x040207fd,
+       0x40042800, 0x59c80033, 0x59c80833, 0x80040580,
+       0x040207fd, 0x40043000, 0x400c0000, 0x80080580,
+       0x04000002, 0x801c3800, 0x40100000, 0x80080580,
+       0x04000002, 0x801c3800, 0x59a80064, 0x82000580,
+       0x00000004, 0x04000009, 0x40140000, 0x80080580,
+       0x04000002, 0x801c3800, 0x40180000, 0x80080580,
+       0x04000002, 0x801c3800, 0x59a80064, 0x82000580,
+       0x00000004, 0x0400000d, 0x59c80034, 0x59c80834,
+       0x80040580, 0x040207fd, 0x82040500, 0x0000ffff,
+       0x82080d00, 0x0000ffff, 0x80040580, 0x0400000e,
+       0x801c3800, 0x0401f00c, 0x59c80034, 0x59c80834,
+       0x80040580, 0x040207fd, 0x82040500, 0x000000ff,
+       0x82080d00, 0x000000ff, 0x80040580, 0x04000002,
+       0x801c3800, 0x801c39c0, 0x04000006, 0x59a80063,
+       0x801c0400, 0x48035063, 0x40240000, 0x48035062,
+       0x1c01f000, 0x48034206, 0x48074406, 0x480b4207,
+       0x480f4407, 0x48134208, 0x48174408, 0x0201f000,
+       0x001022c3, 0x42000000, 0x00600000, 0x80000040,
+       0x040207ff, 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5,
+       0x59a00c0a, 0x800409c0, 0x02000000, 0x00102310,
+       0x82040480, 0x00000021, 0x02021000, 0x00102310,
+       0x82040480, 0x00000011, 0x04001003, 0x42000800,
+       0x00000010, 0x59a00208, 0x59a01407, 0x900811c0,
+       0x80081540, 0x59a00207, 0x59a01c06, 0x900c19c0,
+       0x800c1d40, 0x0201f800, 0x00103a00, 0x04000006,
+       0x0201f800, 0x00103a25, 0x4a01d809, 0x00102fd5,
+       0x1c01f000, 0x4a034406, 0x00000002, 0x0201f000,
+       0x0010230c, 0x4031d800, 0x58ef400b, 0x58ec0002,
+       0x82000580, 0x00000200, 0x02000000, 0x00102304,
+       0x59a00c0a, 0x82040480, 0x00000011, 0x04001003,
+       0x42000800, 0x00000010, 0x59a0040b, 0x59a0120b,
+       0x900811c0, 0x80081540, 0x59a00209, 0x59a01c08,
+       0x900c19c0, 0x800c1d40, 0x58ec0003, 0x0201f800,
+       0x00103a28, 0x4a01d809, 0x00102ff0, 0x1c01f000,
+       0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580,
+       0x00000200, 0x02000000, 0x00102304, 0x59a00c0a,
+       0x82040480, 0x00000011, 0x02001000, 0x001022c0,
+       0x82040c80, 0x00000010, 0x59a00208, 0x59a01407,
+       0x900811c0, 0x80081540, 0x59a00207, 0x59a01c06,
+       0x900c19c0, 0x800c1d40, 0x82081400, 0x00000040,
+       0x58ec0003, 0x0201f800, 0x00103a25, 0x4a01d809,
+       0x0010300e, 0x1c01f000, 0x4031d800, 0x58ef400b,
+       0x58ec0002, 0x82000580, 0x00000200, 0x02000000,
+       0x00102304, 0x59a0040a, 0x82000c80, 0x00000010,
+       0x59a0040b, 0x59a0120b, 0x900811c0, 0x80081540,
+       0x59a00209, 0x59a01c08, 0x900c19c0, 0x800c1d40,
+       0x82081400, 0x00000040, 0x58ec0003, 0x0201f800,
+       0x00103a28, 0x4a01d809, 0x001022b9, 0x1c01f000,
+       0x48efc857, 0x59a00207, 0x59a01407, 0x900001c0,
+       0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0,
+       0x800c1d40, 0x59a00406, 0x48034000, 0x480b4001,
+       0x480f4002, 0x0201f800, 0x00103a00, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x42000800, 0x00000010, 0x0201f800, 0x00103a25,
+       0x4a01d809, 0x00103043, 0x1c01f000, 0x4031d800,
+       0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580,
+       0x00000200, 0x02000000, 0x00102304, 0x48efc857,
+       0x49a3c857, 0x492fc857, 0x592c0a04, 0x80040910,
+       0x04020005, 0x4a034406, 0x00000019, 0x0201f000,
+       0x0010230c, 0x4805d80c, 0x0401f00a, 0x4031d800,
+       0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200,
+       0x02000000, 0x00102304, 0x48efc857, 0x49a3c857,
+       0x48efc857, 0x49a3c857, 0x58ec000c, 0x80000040,
+       0x04000012, 0x4801d80c, 0x0201f800, 0x00103a00,
+       0x04020005, 0x4a034406, 0x00000002, 0x0201f000,
+       0x0010230c, 0x42000800, 0x00000010, 0x58ec1007,
+       0x58ec1808, 0x0201f800, 0x00103a25, 0x4a01d809,
+       0x00103057, 0x1c01f000, 0x58ee580d, 0x48efc857,
+       0x49a3c857, 0x492fc857, 0x492f3006, 0x592c0404,
+       0x8400055e, 0x48025c04, 0x4a01d809, 0x00103081,
+       0x1c01f000, 0x58ee580d, 0x48efc857, 0x49a3c857,
+       0x492fc857, 0x592c0404, 0x8400051e, 0x48025c04,
+       0x59a00000, 0x59a01001, 0x59a01802, 0x80081400,
+       0x820c1c40, 0x00000000, 0x832c0400, 0x00000004,
+       0x42000800, 0x00000010, 0x0201f000, 0x00103a28,
+       0x800409c0, 0x04000005, 0x4a034406, 0x00000001,
+       0x0201f000, 0x0010230c, 0x836c0580, 0x00000003,
+       0x04000005, 0x4a034406, 0x00000007, 0x0201f000,
+       0x0010230c, 0x59a0320b, 0x82183500, 0x000000ff,
+       0x59a28c06, 0x0201f800, 0x00020245, 0x02020000,
+       0x00102310, 0x83440580, 0x000007fd, 0x04000008,
+       0x0201f800, 0x001049e7, 0x04000005, 0x4a034406,
+       0x00000009, 0x0201f000, 0x0010230c, 0x0201f800,
+       0x00103a00, 0x04020005, 0x4a034406, 0x00000002,
+       0x0201f000, 0x0010230c, 0x801831c0, 0x0400000a,
+       0x412c0800, 0x0201f800, 0x00103a00, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x40065800, 0x4a025c04, 0x00008000, 0x497a5a04,
+       0x0201f800, 0x00109100, 0x04020005, 0x4a034406,
+       0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809,
+       0x001030d2, 0x1c01f000, 0x592c0005, 0x82000580,
+       0x01000000, 0x04020005, 0x4a034406, 0x00000004,
+       0x0201f000, 0x0010230c, 0x592c0406, 0x82002d00,
+       0x0000ff00, 0x82000500, 0x000000ff, 0x80000904,
+       0x80040800, 0x82040480, 0x00000006, 0x04001003,
+       0x42000800, 0x00000005, 0x832ca400, 0x00000006,
+       0x4050a800, 0x4004b000, 0x0201f800, 0x0010ab28,
+       0x59a00407, 0x59a01207, 0x900811c0, 0x80081540,
+       0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40,
+       0x832c0400, 0x00000006, 0x4c140000, 0x0201f800,
+       0x00103a28, 0x5c002800, 0x801429c0, 0x04000003,
+       0x4a01d809, 0x001030ff, 0x1c01f000, 0x4031d800,
+       0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580,
+       0x00000200, 0x02000000, 0x00102304, 0x812e59c0,
+       0x02000800, 0x001005d8, 0x592c0006, 0x82000500,
+       0xff000000, 0x80000904, 0x800409c0, 0x02000000,
+       0x00102304, 0x82040480, 0x0000000e, 0x04001003,
+       0x42000800, 0x0000000d, 0x592e5801, 0x812e59c0,
+       0x02000800, 0x001005d8, 0x832ca400, 0x00000005,
+       0x4050a800, 0x4004b000, 0x0201f800, 0x0010ab28,
+       0x58ec1007, 0x58ec1808, 0x832c0400, 0x00000005,
+       0x0201f000, 0x00103a28, 0x0201f800, 0x00103a00,
+       0x04020005, 0x4a034406, 0x00000002, 0x0201f000,
+       0x0010230c, 0x59a00c06, 0x82040500, 0x0000ff00,
+       0x840001c0, 0x82001480, 0x00000007, 0x02021000,
+       0x00102310, 0x0c01f001, 0x0010313d, 0x00103144,
+       0x0010314b, 0x0010314b, 0x0010314b, 0x0010314d,
+       0x00103152, 0x42000800, 0x0000000d, 0x42003800,
+       0x00103166, 0x4a034000, 0x0010b4eb, 0x0401f013,
+       0x42000800, 0x0000000d, 0x42003800, 0x00103166,
+       0x4a034000, 0x0010b4f8, 0x0401f00c, 0x0201f000,
+       0x00102310, 0x42000800, 0x00000008, 0x42003800,
+       0x00103179, 0x0401f005, 0x42000800, 0x00000004,
+       0x42003800, 0x001031c3, 0x59a00207, 0x59a01407,
+       0x900001c0, 0x80081540, 0x59a00209, 0x59a01c09,
+       0x900001c0, 0x800c1d40, 0x832c0400, 0x00000005,
+       0x4c1c0000, 0x0201f800, 0x00103a25, 0x5c003800,
+       0x481dd809, 0x1c01f000, 0x4031d800, 0x58ef400b,
+       0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200,
+       0x02000000, 0x00102304, 0x4a03501f, 0x00000001,
+       0x4200b000, 0x0000000d, 0x59a0a800, 0x832ca400,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x0201f000,
+       0x001022c0, 0x4031d800, 0x58ef400b, 0x58ee580d,
+       0x58ec0002, 0x82000580, 0x00000200, 0x02000000,
+       0x00102304, 0x832ca400, 0x00000005, 0x50500000,
+       0x82001500, 0x000c0016, 0x02020000, 0x00102310,
+       0x82500c00, 0x00000003, 0x50040000, 0x82001500,
+       0x00000001, 0x02020000, 0x00102310, 0x50500000,
+       0x82001500, 0x00000028, 0x0400001d, 0x82081580,
+       0x00000028, 0x02020000, 0x00102310, 0x80500800,
+       0x50040000, 0x82001500, 0x00000013, 0x82081580,
+       0x00000013, 0x02020000, 0x00102310, 0x80040800,
+       0x50040000, 0x82001500, 0x00010000, 0x82081580,
+       0x00010000, 0x02020000, 0x00102310, 0x836c0580,
+       0x00000000, 0x04000012, 0x599c0019, 0x8c00050e,
+       0x0402000f, 0x0201f000, 0x00102310, 0x80500800,
+       0x50040000, 0x82001500, 0x00000013, 0x02020000,
+       0x00102310, 0x80040800, 0x50040000, 0x82001500,
+       0x00010000, 0x02020000, 0x00102310, 0x4200b000,
+       0x00000008, 0x4200a800, 0x0010b4e3, 0x0201f800,
+       0x0010ab17, 0x0201f000, 0x001022c0, 0x4031d800,
+       0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580,
+       0x00000200, 0x02000000, 0x00102304, 0x4200b000,
+       0x00000004, 0x4200a800, 0x0010b8fa, 0x832ca400,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x59a80005,
+       0x84000550, 0x48035005, 0x0201f000, 0x001022c0,
+       0x0201f800, 0x00103a00, 0x04020005, 0x4a034406,
+       0x00000002, 0x0201f000, 0x0010230c, 0x59a00c06,
+       0x82040500, 0x0000ff00, 0x840001c0, 0x82001480,
+       0x00000006, 0x02021000, 0x00102310, 0x0c01f001,
+       0x001031ee, 0x001031f3, 0x001031f8, 0x001031f8,
+       0x001031f8, 0x001031fa, 0x42000800, 0x0000000d,
+       0x4200a000, 0x0010b4eb, 0x0401f00c, 0x42000800,
+       0x0000000d, 0x4200a000, 0x0010b4f8, 0x0401f007,
+       0x0201f000, 0x00102310, 0x42000800, 0x00000008,
+       0x4200a000, 0x0010b4e3, 0x4004b000, 0x832cac00,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x59a00207,
+       0x59a01407, 0x900001c0, 0x80081540, 0x59a00209,
+       0x59a01c09, 0x900001c0, 0x800c1d40, 0x832c0400,
+       0x00000005, 0x0201f000, 0x00103a28, 0x836c0580,
+       0x00000000, 0x04020005, 0x4a034406, 0x00000007,
+       0x0201f000, 0x0010230c, 0x59a00406, 0x800001c0,
+       0x0400001a, 0x59a80005, 0x8c000514, 0x04000005,
+       0x42000000, 0x00000001, 0x40000800, 0x0401f003,
+       0x59a00207, 0x59a80853, 0x48035053, 0x0201f800,
+       0x0010163b, 0x04000022, 0x0201f800, 0x00101642,
+       0x0400001f, 0x0201f800, 0x00101649, 0x0400001c,
+       0x0201f800, 0x00101650, 0x04000019, 0x48075053,
+       0x0201f000, 0x00102310, 0x59c40801, 0x82040d00,
+       0x00018000, 0x82040580, 0x00000000, 0x04020004,
+       0x4a034406, 0x00000000, 0x0401f00d, 0x82040580,
+       0x00008000, 0x04020004, 0x4a034406, 0x00000001,
+       0x0401f007, 0x82040580, 0x00010000, 0x02020800,
+       0x001005d8, 0x4a034406, 0x00000003, 0x59a00406,
+       0x82000580, 0x00000002, 0x0402001f, 0x59c40006,
+       0x84000500, 0x48038806, 0x0201f800, 0x00106ede,
+       0x497b8880, 0x0201f800, 0x0010a9c0, 0x0201f800,
+       0x0010a9ce, 0x42000000, 0x0010b8ca, 0x0201f800,
+       0x0010aa47, 0x82000540, 0x00000001, 0x0201f800,
+       0x0010518c, 0x4a038808, 0x00000000, 0x4202d800,
+       0x00000004, 0x42001000, 0x00000001, 0x0201f800,
+       0x0010193d, 0x4a035049, 0x00000001, 0x0201f800,
+       0x001006d4, 0x0201f000, 0x001022c0, 0x800409c0,
+       0x04000005, 0x4a034406, 0x00000001, 0x0201f000,
+       0x0010230c, 0x836c0580, 0x00000003, 0x04000005,
+       0x4a034406, 0x00000007, 0x0201f000, 0x0010230c,
+       0x59a28c06, 0x59a0320b, 0x82183500, 0x000000ff,
+       0x0201f800, 0x00020245, 0x02020000, 0x00102310,
+       0x83440580, 0x000007fd, 0x04000008, 0x0201f800,
+       0x001049e7, 0x04000005, 0x42000800, 0x00000009,
+       0x0201f000, 0x0010230c, 0x0201f800, 0x00103a00,
+       0x04020005, 0x4a034406, 0x00000002, 0x0201f000,
+       0x0010230c, 0x497a5a04, 0x4a025c04, 0x00008000,
+       0x0201f800, 0x00109115, 0x04020005, 0x4a034406,
+       0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809,
+       0x0010329e, 0x1c01f000, 0x592c0005, 0x82000d00,
+       0x0000ffff, 0x82000500, 0xffff0000, 0x82000580,
+       0x01000000, 0x04020005, 0x4a034406, 0x00000004,
+       0x0201f000, 0x0010230c, 0x80040904, 0x832ca400,
+       0x00000005, 0x4050a800, 0x4004b000, 0x0201f800,
+       0x0010ab28, 0x59a00207, 0x59a01407, 0x900001c0,
+       0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0,
+       0x800c1d40, 0x832c0400, 0x00000005, 0x0201f000,
+       0x00103a28, 0x496fc857, 0x836c0580, 0x00000000,
+       0x04000005, 0x4a034406, 0x0000001a, 0x0201f000,
+       0x0010230c, 0x0201f800, 0x0010513b, 0x02020800,
+       0x00104142, 0x42000800, 0x00000020, 0x59a00407,
+       0x59a01207, 0x900811c0, 0x80081540, 0x59a00409,
+       0x59a01a09, 0x900c19c0, 0x800c1d40, 0x419c0000,
+       0x49a3c857, 0x0201f800, 0x00103a25, 0x4a01d809,
+       0x001032da, 0x1c01f000, 0x4833c857, 0x4031d800,
+       0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200,
+       0x02000000, 0x00102304, 0x599c0200, 0x800001c0,
+       0x02000000, 0x00102310, 0x59a80005, 0x8c000512,
+       0x04000004, 0x599c0019, 0x8400050c, 0x48033819,
+       0x0201f800, 0x001097d7, 0x59a80005, 0x8c000514,
+       0x04000004, 0x599c0017, 0x84000508, 0x48033817,
+       0x0201f800, 0x00103b25, 0x04020004, 0x8c00050a,
+       0x02020000, 0x00102310, 0x4803c857, 0x8c000504,
+       0x04020004, 0x59c408a3, 0x84040d7a, 0x480788a3,
+       0x8c000502, 0x04020004, 0x59c408a3, 0x84040d08,
+       0x480788a3, 0x599c0c02, 0x8c000500, 0x04020004,
+       0x8c000516, 0x04000012, 0x0401f001, 0x82041480,
+       0x0000007f, 0x02021000, 0x00102310, 0x82041400,
+       0x0010210e, 0x50081000, 0x82081500, 0x000000ff,
+       0x8c000500, 0x04020006, 0x480b5010, 0x42000800,
+       0x00000003, 0x0201f800, 0x00106c78, 0x599c0019,
+       0x8c00050e, 0x0402000b, 0x59a80806, 0x8c040d14,
+       0x04000008, 0x42000800, 0x0010b4e3, 0x50040800,
+       0x82040d00, 0x00000028, 0x02020000, 0x00102310,
+       0x82000500, 0x00000030, 0x04000003, 0x80000108,
+       0x0401f003, 0x42000000, 0x00000002, 0x48039040,
+       0x42000800, 0x00000002, 0x82000400, 0x00103415,
+       0x50001000, 0x0201f800, 0x00106c78, 0x599c0201,
+       0x82000c80, 0x00000100, 0x02001000, 0x00102310,
+       0x82000c80, 0x00000841, 0x02021000, 0x00102310,
+       0x82000500, 0x00000007, 0x02020000, 0x00102310,
+       0x599c0401, 0x80000540, 0x02000000, 0x00102310,
+       0x599c0409, 0x599c0c07, 0x80040c80, 0x02021000,
+       0x00102310, 0x80000040, 0x02000000, 0x00102310,
+       0x599c0209, 0x599c0a07, 0x80040c80, 0x02021000,
+       0x00102310, 0x80000040, 0x02000000, 0x00102310,
+       0x0201f800, 0x001053cd, 0x0201f800, 0x00104cb6,
+       0x599c0201, 0x48035004, 0x0201f800, 0x001012ee,
+       0x599c020a, 0x800001c0, 0x04000003, 0x4803504d,
+       0x0401f003, 0x4a03504d, 0x000000c8, 0x0201f800,
+       0x00103b25, 0x04000004, 0x0201f800, 0x001060df,
+       0x417a5000, 0x836c0580, 0x00000000, 0x04020098,
+       0x599c0003, 0x599c0804, 0x9c0001c0, 0x9c0409c0,
+       0x48035002, 0x48075003, 0x599c1017, 0x8c08151c,
+       0x04000006, 0x599c0005, 0x599c0806, 0x9c0001c0,
+       0x9c0409c0, 0x0401f003, 0x82000500, 0xf0ffffff,
+       0x48035000, 0x48075001, 0x42001000, 0x0010b4eb,
+       0x48001000, 0x48041001, 0x42001000, 0x0010b4f8,
+       0x48001000, 0x48041001, 0x59a80005, 0x8c000514,
+       0x04020015, 0x599c1019, 0x82081500, 0x0000e000,
+       0x82080580, 0x00000000, 0x0402000c, 0x4a035053,
+       0x00000000, 0x42000000, 0x00000001, 0x0201f800,
+       0x0010188c, 0x42000000, 0x00000001, 0x0201f800,
+       0x00101821, 0x0401f02b, 0x82080580, 0x00002000,
+       0x0402000a, 0x4a035053, 0x00000001, 0x41780000,
+       0x0201f800, 0x0010188c, 0x41780000, 0x0201f800,
+       0x00101821, 0x0401f01f, 0x82080580, 0x00004000,
+       0x04020006, 0x4a035053, 0x00000002, 0x4a035049,
+       0x00000001, 0x0401f017, 0x82080580, 0x00006000,
+       0x02020000, 0x00102310, 0x59a80858, 0x82040d80,
+       0x01391077, 0x04020005, 0x59e00813, 0x8c040d00,
+       0x02020000, 0x00102310, 0x4a035053, 0x00000003,
+       0x42000000, 0x00000002, 0x0201f800, 0x0010188c,
+       0x42000000, 0x00000002, 0x0201f800, 0x00101821,
+       0x599c0019, 0x8c000520, 0x0400000d, 0x42000000,
+       0x00000004, 0x42000800, 0x00000040, 0x0201f800,
+       0x00101944, 0x42000000, 0x00000010, 0x42000800,
+       0x000000c0, 0x0201f800, 0x00101944, 0x4a035032,
+       0x0000aaaa, 0x599c1018, 0x82081500, 0x00000030,
+       0x59a8006c, 0x80000540, 0x0400000c, 0x82080580,
+       0x00000000, 0x02000000, 0x00102310, 0x599c1018,
+       0x82081500, 0xffffffcf, 0x82081540, 0x00000010,
+       0x480b3818, 0x0401f010, 0x82080d80, 0x00000000,
+       0x04000007, 0x82080d80, 0x00000010, 0x0400000a,
+       0x82080d80, 0x00000020, 0x04020002, 0x48075032,
+       0x0201f800, 0x00103aba, 0x04000008, 0x0201f800,
+       0x001015fe, 0x0201f800, 0x0010162a, 0x59a8002a,
+       0x80040540, 0x4803502a, 0x49f3c857, 0x42001000,
+       0x00105065, 0x0201f800, 0x00105f90, 0x42001000,
+       0x00105058, 0x0201f800, 0x00106084, 0x4a038805,
+       0xffffffff, 0x4a03c014, 0x00400040, 0x4a03c013,
+       0x00400000, 0x0201f800, 0x001048c7, 0x59a0001d,
+       0x84000540, 0x4803401d, 0x49f3c857, 0x0201f000,
+       0x001022c0, 0x00000018, 0x0000000c, 0x00000018,
+       0x00000020, 0x836c0580, 0x00000000, 0x04020005,
+       0x42000800, 0x00000007, 0x0201f000, 0x0010230c,
+       0x42000800, 0x00000020, 0x59a00407, 0x59a01207,
+       0x900811c0, 0x80081540, 0x59a00409, 0x59a01a09,
+       0x900c19c0, 0x800c1d40, 0x419c0000, 0x0201f000,
+       0x00103a28, 0x800409c0, 0x04000005, 0x4a034406,
+       0x00000001, 0x0201f000, 0x0010230c, 0x0201f800,
+       0x0010513b, 0x04020005, 0x4a034406, 0x00000016,
+       0x0201f000, 0x0010230c, 0x59a80013, 0x8c000500,
+       0x04000011, 0x4a034406, 0x00000000, 0x42000800,
+       0x00000020, 0x59a00407, 0x59a01207, 0x900811c0,
+       0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0,
+       0x800c1d40, 0x42000000, 0x0010be21, 0x0201f000,
+       0x00103a28, 0x4a034406, 0x00000001, 0x4200b000,
+       0x00000020, 0x4200a800, 0x0010be21, 0x4200a000,
+       0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040,
+       0x040207fd, 0x4d440000, 0x4d340000, 0x42028800,
+       0xffffffff, 0x42002000, 0xffffffff, 0x42003000,
+       0x00000001, 0x42003800, 0x00000001, 0x42001800,
+       0x0010be21, 0x59a81010, 0x82081500, 0x000000ff,
+       0x40180000, 0x0c01f001, 0x0010346e, 0x00103471,
+       0x00103475, 0x00103479, 0x82102500, 0xffffff00,
+       0x0401f014, 0x82102500, 0xffff00ff, 0x840811c0,
+       0x0401f010, 0x82102500, 0xff00ffff, 0x900811c0,
+       0x0401f00c, 0x82102500, 0x00ffffff, 0x9c0801c0,
+       0x80102540, 0x44101800, 0x42003000, 0xffffffff,
+       0x42002000, 0xffffffff, 0x800c1800, 0x0401f003,
+       0x40080000, 0x80102540, 0x81468800, 0x83442c80,
+       0x0000007f, 0x04021014, 0x4c080000, 0x4c0c0000,
+       0x4c180000, 0x4c1c0000, 0x0201f800, 0x00020245,
+       0x5c003800, 0x5c003000, 0x5c001800, 0x5c001000,
+       0x040207f2, 0x0201f800, 0x001049f3, 0x040207ef,
+       0x80183000, 0x801c3800, 0x59341202, 0x40180000,
+       0x0c01f7ce, 0x82100580, 0xffffffff, 0x04000002,
+       0x44101800, 0x42001800, 0x0010be21, 0x500c0000,
+       0x82000500, 0xffffff00, 0x801c0540, 0x44001800,
+       0x5c026800, 0x5c028800, 0x42000800, 0x00000020,
+       0x59a00407, 0x59a01207, 0x900811c0, 0x80081540,
+       0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40,
+       0x42000000, 0x0010be21, 0x0201f000, 0x00103a28,
+       0x59a28c06, 0x59a0020b, 0x8c000500, 0x0400000e,
+       0x59a01208, 0x59a00408, 0x82000500, 0x000000ff,
+       0x900001c0, 0x80081540, 0x41784000, 0x0201f800,
+       0x00104919, 0x04000008, 0x48034406, 0x0201f000,
+       0x00102310, 0x0201f800, 0x00020245, 0x02020000,
+       0x00102310, 0x0201f800, 0x00103a00, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x59a0020b, 0x8c000500, 0x04000005, 0x0201f800,
+       0x001049f3, 0x02020000, 0x00103ac4, 0x59a0020b,
+       0x8c000502, 0x04000019, 0x83440480, 0x000007f0,
+       0x04021016, 0x0201f800, 0x001049fc, 0x04020013,
+       0x497a5a04, 0x4a025c04, 0x00008000, 0x0201f800,
+       0x001090e6, 0x04020005, 0x4a034406, 0x00000003,
+       0x0201f000, 0x0010230c, 0x4a01d809, 0x001034f1,
+       0x1c01f000, 0x59a28c06, 0x0201f800, 0x00020245,
+       0x02020000, 0x00102310, 0x4200b000, 0x0000000a,
+       0x4134a000, 0x832e5c00, 0x00000002, 0x412ca800,
+       0x0201f800, 0x0010ab17, 0x832cac00, 0x00000006,
+       0x4054a000, 0x4200b000, 0x00000004, 0x0201f800,
+       0x0010ab28, 0x592c0802, 0x82040500, 0x00ff00ff,
+       0x900001c0, 0x82041500, 0xff00ff00, 0x80080540,
+       0x48025802, 0x592c0801, 0x82040500, 0x00ff00ff,
+       0x900001c0, 0x82041500, 0xff00ff00, 0x80080540,
+       0x48025801, 0x42000800, 0x0000000a, 0x59a00407,
+       0x59a01207, 0x900811c0, 0x80081540, 0x59a00409,
+       0x59a01a09, 0x900c19c0, 0x800c1d40, 0x412c0000,
+       0x0201f000, 0x00103a28, 0x496fc857, 0x496f4406,
+       0x0201f000, 0x001022c0, 0x59a28c06, 0x0201f800,
+       0x00020245, 0x02020000, 0x00102310, 0x836c0580,
+       0x00000003, 0x04000005, 0x4a034406, 0x00000007,
+       0x0201f000, 0x0010230c, 0x83340c00, 0x00000006,
+       0x59a0020b, 0x8c000500, 0x04000003, 0x83340c00,
+       0x00000008, 0x58040001, 0x48034409, 0x900001c0,
+       0x48034209, 0x50040000, 0x48034407, 0x900001c0,
+       0x48034207, 0x59340200, 0x48034406, 0x0201f000,
+       0x001022c0, 0x800409c0, 0x04000005, 0x4a034406,
+       0x00000001, 0x0201f000, 0x0010230c, 0x59a0220b,
+       0x8c102500, 0x0402002e, 0x8c102506, 0x04020006,
+       0x59a03208, 0x82180480, 0x00000003, 0x02021000,
+       0x00102310, 0x59a28c06, 0x0201f800, 0x00020245,
+       0x02020000, 0x00102310, 0x0201f800, 0x001049e7,
+       0x04000005, 0x4a034406, 0x00000009, 0x0201f000,
+       0x0010230c, 0x0201f800, 0x00103a00, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x59a0220b, 0x8c102506, 0x04000004, 0x59343002,
+       0x82183500, 0x00ffffff, 0x497a5a04, 0x4a025c04,
+       0x00008000, 0x0201f800, 0x001090a8, 0x04020005,
+       0x4a034406, 0x00000003, 0x0201f000, 0x0010230c,
+       0x4a01d809, 0x001035d1, 0x1c01f000, 0x59a28c06,
+       0x0201f800, 0x00020245, 0x02020000, 0x00102310,
+       0x0201f800, 0x001049e7, 0x04000005, 0x4a034406,
+       0x00000009, 0x0201f000, 0x0010230c, 0x0201f800,
+       0x00103a00, 0x04020005, 0x4a034406, 0x00000002,
+       0x0201f000, 0x0010230c, 0x497a5a04, 0x4a025c04,
+       0x00008000, 0x0201f800, 0x00103a00, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x592e5800, 0x0201f800, 0x001090bd, 0x04020005,
+       0x4a034406, 0x00000003, 0x0201f000, 0x0010230c,
+       0x4a01d809, 0x001035a3, 0x1c01f000, 0x592c2805,
+       0x82140d80, 0x01000000, 0x04020005, 0x4a034406,
+       0x00000004, 0x0201f000, 0x0010230c, 0x42000800,
+       0x00000008, 0x59a00207, 0x59a01407, 0x900001c0,
+       0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0,
+       0x800c1d40, 0x832c0400, 0x00000005, 0x0201f800,
+       0x00103a28, 0x8c142d00, 0x04000003, 0x4a01d809,
+       0x001035be, 0x1c01f000, 0x4031d800, 0x58ef400b,
+       0x58ee580e, 0x58ec0002, 0x82000580, 0x00000200,
+       0x02000000, 0x00102304, 0x812e59c0, 0x02000800,
+       0x001005d8, 0x42000800, 0x00000008, 0x832c0400,
+       0x00000005, 0x58ec1007, 0x58ec1808, 0x0201f000,
+       0x00103a28, 0x592c0005, 0x82000580, 0x01000000,
+       0x04020005, 0x4a034406, 0x00000004, 0x0201f000,
+       0x0010230c, 0x59a00207, 0x59a01407, 0x900001c0,
+       0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0,
+       0x800c1d40, 0x42000800, 0x00000006, 0x832c0400,
+       0x00000006, 0x0201f000, 0x00103a28, 0x59a00a0a,
+       0x800409c0, 0x02000000, 0x00102310, 0x82040480,
+       0x000000e7, 0x04001003, 0x42000800, 0x000000e6,
+       0x59a00207, 0x59a01407, 0x900001c0, 0x80081540,
+       0x59a00209, 0x59a01c09, 0x900001c0, 0x800c1d40,
+       0x83880400, 0x00000000, 0x0201f800, 0x00103a28,
+       0x4a01d809, 0x001035ff, 0x1c01f000, 0x4031d800,
+       0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200,
+       0x02000000, 0x00102304, 0x58ef400b, 0x59a0020b,
+       0x8c000500, 0x04000008, 0x83880400, 0x00000000,
+       0x4803c840, 0x4a03c842, 0x00000006, 0x04011000,
+       0x497b8885, 0x4a034207, 0x000000e6, 0x0201f000,
+       0x001022c0, 0x800409c0, 0x04000005, 0x4a034406,
+       0x00000001, 0x0201f000, 0x0010230c, 0x0401fbe5,
+       0x04020005, 0x4a034406, 0x00000002, 0x0201f000,
+       0x0010230c, 0x497a5a04, 0x4a025c04, 0x00008000,
+       0x59a00406, 0x800001c0, 0x02000000, 0x00102310,
+       0x82001580, 0x000000ff, 0x04000005, 0x82001480,
+       0x00000004, 0x02021000, 0x00102310, 0x40001000,
+       0x0201f800, 0x00101fbf, 0x04020005, 0x4a034406,
+       0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809,
+       0x0010363a, 0x1c01f000, 0x592c0005, 0x82000580,
+       0x01000000, 0x02020000, 0x001022c0, 0x4a034406,
+       0x00000004, 0x0201f000, 0x0010230c, 0x59a01406,
+       0x8c081508, 0x04020007, 0x800409c0, 0x04000005,
+       0x4a034406, 0x00000001, 0x0201f000, 0x0010230c,
+       0x59a01c07, 0x820c0480, 0x00001000, 0x02021000,
+       0x00102310, 0x497b2804, 0x497b2805, 0x497b281c,
+       0x497b281d, 0x497b281f, 0x497b2820, 0x497b2822,
+       0x497b2823, 0x80000580, 0x0201f800, 0x001015fe,
+       0x59a80805, 0x8c081500, 0x04000004, 0x82040d40,
+       0x00000011, 0x0401f004, 0x8c081506, 0x04000002,
+       0x84040d42, 0x84040d0a, 0x48075005, 0x4202d800,
+       0x00000001, 0x82081500, 0x000000e0, 0x8008010a,
+       0x0c020036, 0x0201f800, 0x0010513b, 0x04020009,
+       0x4a035033, 0x00000001, 0x0201f800, 0x001050a2,
+       0x0401f01f, 0x4a035033, 0x00000000, 0x0401f7fb,
+       0x497b5032, 0x0201f800, 0x00104142, 0x0201f800,
+       0x00106c55, 0x0201f800, 0x00106ede, 0x0201f800,
+       0x00106c4b, 0x59a00a07, 0x480788a7, 0x59c400a3,
+       0x82000500, 0xfeffffff, 0x82000540, 0x80018000,
+       0x40000800, 0x84040d20, 0x480388a3, 0x480788a3,
+       0x497b504e, 0x42000800, 0x0000002d, 0x42001000,
+       0x001041bc, 0x0201f800, 0x00105f69, 0x59a00407,
+       0x800000c2, 0x800008c4, 0x8005d400, 0x42000000,
+       0x0000ffff, 0x0201f800, 0x0010513b, 0x04000003,
+       0x59a00207, 0x80000110, 0x0201f800, 0x00103afc,
+       0x0201f000, 0x001022c0, 0x0010366d, 0x00103670,
+       0x00103678, 0x00102310, 0x00103675, 0x00102310,
+       0x00102310, 0x00102310, 0x836c0580, 0x00000003,
+       0x04000005, 0x4a034406, 0x00000007, 0x0201f000,
+       0x0010230c, 0x59a03c06, 0x59a00407, 0x59a04a07,
+       0x902449c0, 0x80244d40, 0x59a00409, 0x59a05209,
+       0x902851c0, 0x80285540, 0x0401fb46, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x417a8800, 0x41783000, 0x497b4001, 0x497b4004,
+       0x832c4400, 0x00000005, 0x48234002, 0x8c1c3d04,
+       0x04020078, 0x0201f800, 0x00020245, 0x0402002a,
+       0x0201f800, 0x001049e7, 0x04000004, 0x0201f800,
+       0x001048e3, 0x04020024, 0x8c1c3d00, 0x04000008,
+       0x59340009, 0x44004000, 0x59340008, 0x80204000,
+       0x44004000, 0x80204000, 0x0401f007, 0x59340007,
+       0x44004000, 0x59340006, 0x80204000, 0x44004000,
+       0x80204000, 0x83440580, 0x000007fe, 0x0400000d,
+       0x83440580, 0x000007fc, 0x0400000a, 0x0201f800,
+       0x001049f3, 0x04000003, 0x85468d5e, 0x0401f005,
+       0x0201f800, 0x00104838, 0x04020002, 0x85468d5e,
+       0x45444000, 0x85468d1e, 0x80204000, 0x82183400,
+       0x00000003, 0x81468800, 0x83440480, 0x000007f0,
+       0x0400100e, 0x8c1c3d06, 0x04000010, 0x83440580,
+       0x000007f0, 0x04020004, 0x42028800, 0x000007fe,
+       0x0401f006, 0x83440580, 0x000007ff, 0x04020007,
+       0x42028800, 0x000007fc, 0x82180580, 0x0000000f,
+       0x0400000b, 0x0401f7c0, 0x801831c0, 0x04020006,
+       0x59a00801, 0x800408c4, 0x48074406, 0x0201f000,
+       0x001022c0, 0x4a034004, 0x00000001, 0x49474000,
+       0x59a00001, 0x80180400, 0x48034001, 0x481f4003,
+       0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002,
+       0x4801d803, 0x4825d807, 0x4829d808, 0x4000a800,
+       0x4000a000, 0x4018b000, 0x0201f800, 0x0010ab17,
+       0x40ec1000, 0x0201f800, 0x00100858, 0x4a01d809,
+       0x0010372a, 0x1c01f000, 0x4031d800, 0x58ef400b,
+       0x58ec0002, 0x82000580, 0x00000200, 0x02000000,
+       0x00102304, 0x59a00004, 0x80000540, 0x04020008,
+       0x59a28800, 0x59a04002, 0x59a03803, 0x41783000,
+       0x58ec4807, 0x58ec5008, 0x0401f78f, 0x59a00801,
+       0x800408c4, 0x48074406, 0x0201f000, 0x001022c0,
+       0x0201f800, 0x00020245, 0x0402002f, 0x0201f800,
+       0x001049e7, 0x04000004, 0x0201f800, 0x001048e3,
+       0x04020029, 0x83440580, 0x000007fe, 0x04000011,
+       0x83440580, 0x000007fc, 0x0400000e, 0x0201f800,
+       0x001049f3, 0x04000005, 0x59340403, 0x8400055e,
+       0x48026c03, 0x0401f007, 0x0201f800, 0x00104838,
+       0x04020004, 0x59340403, 0x8400055e, 0x48026c03,
+       0x4134a000, 0x4020a800, 0x4200b000, 0x00000006,
+       0x0201f800, 0x0010ab17, 0x59340007, 0x4400a800,
+       0x59340006, 0x4800a801, 0x59340009, 0x4800a802,
+       0x59340008, 0x4800a803, 0x59340403, 0x8400051e,
+       0x48026c03, 0x82204400, 0x0000000a, 0x82183400,
+       0x0000000a, 0x81468800, 0x83440480, 0x000007f0,
+       0x0400100e, 0x8c1c3d06, 0x04000010, 0x83440580,
+       0x000007f0, 0x04020004, 0x42028800, 0x000007fe,
+       0x0401f006, 0x83440580, 0x000007ff, 0x04020007,
+       0x42028800, 0x000007fc, 0x82180580, 0x0000000a,
+       0x0400000b, 0x0401f7bb, 0x801831c0, 0x04020006,
+       0x59a00801, 0x800408c4, 0x48074406, 0x0201f000,
+       0x001022c0, 0x4a034004, 0x00000001, 0x49474000,
+       0x59a00001, 0x80180400, 0x48034001, 0x481f4003,
+       0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002,
+       0x4801d803, 0x4825d807, 0x4829d808, 0x40ec1000,
+       0x0201f800, 0x00100858, 0x4a01d809, 0x001037a1,
+       0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ec0002,
+       0x82000580, 0x00000200, 0x02000000, 0x00102304,
+       0x59a00004, 0x80000540, 0x04020008, 0x59a28800,
+       0x59a04002, 0x59a03803, 0x41783000, 0x58ec4807,
+       0x58ec5008, 0x0401f78f, 0x59a00801, 0x800408c4,
+       0x48074406, 0x0201f000, 0x001022c0, 0x42002800,
+       0x0000007e, 0x59a00c06, 0x59a01207, 0x59a01c07,
+       0x59a02209, 0x82040500, 0x0000ff00, 0x840001c0,
+       0x82003480, 0x00000020, 0x02001000, 0x00102310,
+       0x80140480, 0x02001000, 0x00102310, 0x82040500,
+       0x000000ff, 0x82003480, 0x00000020, 0x02001000,
+       0x00102310, 0x80140480, 0x02001000, 0x00102310,
+       0x82080500, 0x0000ff00, 0x840001c0, 0x82003480,
+       0x00000020, 0x02001000, 0x00102310, 0x80140480,
+       0x02001000, 0x00102310, 0x82080500, 0x000000ff,
+       0x82003480, 0x00000020, 0x02001000, 0x00102310,
+       0x80140480, 0x02001000, 0x00102310, 0x820c0500,
+       0x0000ff00, 0x840001c0, 0x82003480, 0x00000020,
+       0x02001000, 0x00102310, 0x80140480, 0x02001000,
+       0x00102310, 0x820c0500, 0x000000ff, 0x82003480,
+       0x00000020, 0x02001000, 0x00102310, 0x80140480,
+       0x02001000, 0x00102310, 0x82100500, 0x0000ff00,
+       0x840001c0, 0x82003480, 0x00000020, 0x02001000,
+       0x00102310, 0x80140480, 0x02001000, 0x00102310,
+       0x82100500, 0x000000ff, 0x82003480, 0x00000020,
+       0x02001000, 0x00102310, 0x80140480, 0x02001000,
+       0x00102310, 0x900401c0, 0x80080d40, 0x900c01c0,
+       0x80101d40, 0x83a83400, 0x0000003a, 0x44043000,
+       0x80183000, 0x440c3000, 0x0201f000, 0x001022c0,
+       0x0401f9ec, 0x04020005, 0x4a034406, 0x00000002,
+       0x0201f000, 0x0010230c, 0x42000800, 0x0000000c,
+       0x0401f853, 0x4a01d809, 0x00103820, 0x1c01f000,
+       0x4031d800, 0x58ee580d, 0x58ef400b, 0x58ec0002,
+       0x82000580, 0x00000200, 0x02000000, 0x00102304,
+       0x832ca400, 0x00000004, 0x4200b000, 0x0000000c,
+       0x40c8a800, 0x0201f800, 0x0010ab17, 0x58c80200,
+       0x80000540, 0x04000034, 0x58c80400, 0x82000500,
+       0xfffffffb, 0x04020030, 0x58c80401, 0x80000540,
+       0x0400002d, 0x82000480, 0x0000ff01, 0x0402102a,
+       0x58c80202, 0x82000480, 0x0000005c, 0x04001026,
+       0x0201f800, 0x001063a3, 0x58c80c08, 0x58c80204,
+       0x80040480, 0x04001020, 0x58c80204, 0x82000480,
+       0x00000005, 0x0402101c, 0x58c80205, 0x58c80c08,
+       0x80040902, 0x80040480, 0x04001017, 0x58c80c08,
+       0x0201f800, 0x001062f1, 0x0400001b, 0x0201f800,
+       0x001061b9, 0x04020012, 0x4979940b, 0x59c408a3,
+       0x82040d40, 0x00000002, 0x480788a3, 0x4a038830,
+       0x00000001, 0x4a038832, 0x01ffffff, 0x58c80202,
+       0x48030804, 0x0201f800, 0x0010619b, 0x0201f000,
+       0x001022c0, 0x0201f000, 0x00102310, 0x0201f800,
+       0x001063f5, 0x0201f800, 0x00106402, 0x0201f800,
+       0x001062e4, 0x0201f000, 0x0010230c, 0x4c000000,
+       0x59a01207, 0x59a00407, 0x900811c0, 0x80081540,
+       0x59a01a09, 0x59a00409, 0x900c19c0, 0x800c1d40,
+       0x5c000000, 0x0401f1ac, 0x59840000, 0x82000580,
+       0x00000000, 0x04000054, 0x59840002, 0x8c000504,
+       0x04000051, 0x84000546, 0x48030802, 0x0201f800,
+       0x001062e4, 0x59c408a3, 0x82040d00, 0xfffffffd,
+       0x480788a3, 0x4c5c0000, 0x4200b800, 0x0010ac00,
+       0x505e6800, 0x813669c0, 0x04000008, 0x5936600e,
+       0x813261c0, 0x04000005, 0x0201f800, 0x001062d5,
+       0x02000800, 0x001064ad, 0x805cb800, 0x825c0580,
+       0x0010b3f0, 0x040207f3, 0x59866003, 0x813261c0,
+       0x0400000b, 0x59300406, 0x82000580, 0x00000009,
+       0x02020800, 0x001005d8, 0x5930b800, 0x0201f800,
+       0x001062c1, 0x405e6000, 0x0401f7f5, 0x497b0803,
+       0x4200b800, 0x0010b51b, 0x505e6000, 0x813261c0,
+       0x04000011, 0x59300406, 0x82000580, 0x00000009,
+       0x0402000d, 0x59300203, 0x82000580, 0x00000004,
+       0x04020009, 0x59326809, 0x813669c0, 0x02020800,
+       0x001005d8, 0x0201f800, 0x00100e99, 0x0201f800,
+       0x001062c1, 0x4578b800, 0x805cb800, 0x825c0580,
+       0x0010b523, 0x040207e9, 0x42000800, 0x0010b519,
+       0x49780801, 0x49780800, 0x59a80069, 0x82000400,
+       0x00000007, 0x48035069, 0x0201f800, 0x001063f5,
+       0x0201f800, 0x00106402, 0x5c00b800, 0x0201f800,
+       0x001061b4, 0x0201f000, 0x001022c0, 0x836c0580,
+       0x00000003, 0x04000005, 0x4a034406, 0x00000007,
+       0x0201f000, 0x0010230c, 0x59a00407, 0x59a02207,
+       0x901021c0, 0x80102540, 0x59a00409, 0x59a02a09,
+       0x901429c0, 0x80142d40, 0x0401f91e, 0x04020005,
+       0x4a034406, 0x00000002, 0x0201f000, 0x0010230c,
+       0x417a8800, 0x41781800, 0x497b4001, 0x497b4003,
+       0x832c3400, 0x00000004, 0x481b4002, 0x41440000,
+       0x81ac0400, 0x50026800, 0x813669c0, 0x0400000b,
+       0x0201f800, 0x001049e7, 0x04020008, 0x59340002,
+       0x48003000, 0x49443001, 0x82183400, 0x00000002,
+       0x820c1c00, 0x00000002, 0x81468800, 0x83440480,
+       0x00000800, 0x04000005, 0x820c0480, 0x00000010,
+       0x0402100b, 0x0401f7ea, 0x800c19c0, 0x04020006,
+       0x59a00801, 0x80040902, 0x48074406, 0x0201f000,
+       0x001022c0, 0x4a034003, 0x00000001, 0x49474000,
+       0x59a00001, 0x800c0400, 0x48034001, 0x40ec1000,
+       0x4a001001, 0x00000000, 0x480c1004, 0x59a00002,
+       0x48001003, 0x48101007, 0x48141008, 0x0201f800,
+       0x00100858, 0x4a01d809, 0x00103920, 0x1c01f000,
+       0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580,
+       0x00000200, 0x02000000, 0x00102304, 0x59a00003,
+       0x80000540, 0x04020008, 0x59a28800, 0x59a03002,
+       0x41781800, 0x40ec1000, 0x58082007, 0x58082808,
+       0x0401f7bf, 0x59a00801, 0x80040902, 0x48074406,
+       0x0201f000, 0x001022c0, 0x800409c0, 0x04000005,
+       0x4a034406, 0x00000001, 0x0201f000, 0x0010230c,
+       0x59a80026, 0x8c00050a, 0x04020007, 0x8c000506,
+       0x04020005, 0x4a034406, 0x00000016, 0x0201f000,
+       0x0010230c, 0x0401f8bb, 0x04020005, 0x4a034406,
+       0x00000002, 0x0201f000, 0x0010230c, 0x59a00c06,
+       0x80040902, 0x59a00407, 0x59a01207, 0x900811c0,
+       0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0,
+       0x800c1d40, 0x832c0400, 0x00000005, 0x0401f8ce,
+       0x4a01d809, 0x0010395b, 0x1c01f000, 0x4031d800,
+       0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580,
+       0x00000200, 0x02000000, 0x00102304, 0x592c0009,
+       0x0201f800, 0x00105c9a, 0x02000800, 0x001045a6,
+       0x02020000, 0x00102310, 0x49474001, 0x481a6802,
+       0x592c000a, 0x82001d80, 0x70000000, 0x04020007,
+       0x0401f890, 0x04020011, 0x4a034406, 0x00000002,
+       0x0201f000, 0x0010230c, 0x82001d80, 0x72000000,
+       0x02020000, 0x00102310, 0x0401f886, 0x04020885,
+       0x04020884, 0x04020005, 0x4a034406, 0x00000002,
+       0x0201f000, 0x0010230c, 0x58ee580d, 0x4a025c04,
+       0x00008000, 0x497a5a04, 0x592c3208, 0x80183102,
+       0x592c1801, 0x4a001805, 0x01000000, 0x0201f800,
+       0x001090d1, 0x04020005, 0x4a034406, 0x00000003,
+       0x0201f000, 0x0010230c, 0x4a01d809, 0x00103995,
+       0x1c01f000, 0x592c4000, 0x592c0005, 0x82000580,
+       0x01000000, 0x04020005, 0x4a034406, 0x00000004,
+       0x0201f000, 0x0010230c, 0x832c3c00, 0x00000005,
+       0x401ca000, 0x401ca800, 0x5820280a, 0x4200b000,
+       0x00000002, 0x82143580, 0x70000000, 0x04000003,
+       0x4200b000, 0x0000000f, 0x0201f800, 0x0010ab28,
+       0x401c0000, 0x58201006, 0x58201807, 0x58202205,
+       0x80102102, 0x82143580, 0x70000000, 0x04020008,
+       0x82103480, 0x00000002, 0x02001000, 0x00102310,
+       0x42000800, 0x00000002, 0x0401f06e, 0x82143580,
+       0x72000000, 0x02020000, 0x00102310, 0x82103480,
+       0x0000002a, 0x02001000, 0x00102310, 0x42000800,
+       0x0000000f, 0x0401f863, 0x4a01d809, 0x001039c9,
+       0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e,
+       0x58ec0002, 0x82000580, 0x00000200, 0x02000000,
+       0x00102304, 0x592e5800, 0x832c0c00, 0x00000005,
+       0x4004a000, 0x4004a800, 0x4200b000, 0x0000000f,
+       0x0201f800, 0x0010ab28, 0x40ec1000, 0x4a001001,
+       0x00000000, 0x4a001004, 0x0000000f, 0x48041003,
+       0x0201f800, 0x00100858, 0x4a01d809, 0x001039e5,
+       0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e,
+       0x58ec0002, 0x82000580, 0x00000200, 0x02000000,
+       0x00102304, 0x832c0c00, 0x00000005, 0x4004a000,
+       0x4004a800, 0x4200b000, 0x0000000c, 0x0201f800,
+       0x0010ab28, 0x40ec1000, 0x4a001001, 0x00000000,
+       0x4a001004, 0x0000000c, 0x48041003, 0x0201f800,
+       0x00100858, 0x4a01d809, 0x001022b9, 0x1c01f000,
+       0x0201f800, 0x001007e4, 0x04000010, 0x497a5800,
+       0x58ec000d, 0x80000540, 0x04020004, 0x492dd80d,
+       0x492dd80e, 0x0401f007, 0x58ec000e, 0x48025800,
+       0x82000400, 0x00000001, 0x452c0000, 0x492dd80e,
+       0x832c0400, 0x00000004, 0x492fc857, 0x4803c857,
+       0x1c01f000, 0x4d2c0000, 0x48efc857, 0x58ec400d,
+       0x4823c857, 0x802041c0, 0x04000007, 0x40225800,
+       0x592c4001, 0x497a5801, 0x0201f800, 0x001007f4,
+       0x0401f7f8, 0x4979d80d, 0x4979d80e, 0x5c025800,
+       0x1c01f000, 0x42003000, 0x00000001, 0x0401f003,
+       0x42003000, 0x00000000, 0x4803c857, 0x4807c857,
+       0x480bc857, 0x480fc857, 0x481bc857, 0x48efc857,
+       0x4819d801, 0x800409c0, 0x02000800, 0x001005d8,
+       0x4805d804, 0x4801d803, 0x4809d807, 0x480dd808,
+       0x40ec1000, 0x0201f800, 0x00100858, 0x4a01d809,
+       0x001022b9, 0x1c01f000, 0x80002d80, 0x480bc857,
+       0x480fc857, 0x4813c857, 0x4817c857, 0x4d2c0000,
+       0x4da00000, 0x42034000, 0x0010b4a4, 0x59a00017,
+       0x800001c0, 0x04020013, 0x04006012, 0x480bc020,
+       0x480fc021, 0x4813c022, 0x4817c023, 0x900811c0,
+       0x82081540, 0x00000012, 0x480bc011, 0x59e00017,
+       0x8c000508, 0x04020004, 0x4203e000, 0x30000001,
+       0x0401f053, 0x4a03c017, 0x00000002, 0x0401f7fb,
+       0x4c040000, 0x4c1c0000, 0x80000800, 0x48074017,
+       0x59a0381a, 0x481fc857, 0x801c39c0, 0x04020027,
+       0x82000480, 0x0000000a, 0x04021010, 0x59a00018,
+       0x80000000, 0x48034018, 0x59a00219, 0x82000400,
+       0x00000002, 0x82000c80, 0x00000013, 0x48034219,
+       0x04001003, 0x497b4219, 0x41780000, 0x59a03816,
+       0x801c3c00, 0x0401f030, 0x4803c856, 0x0201f800,
+       0x001007e4, 0x04000007, 0x492f401a, 0x492f401b,
+       0x412c3800, 0x497b421c, 0x497a5813, 0x0401f026,
+       0x59880051, 0x80000000, 0x48031051, 0x59a00017,
+       0x80000040, 0x48034017, 0x59a00219, 0x59a03816,
+       0x801c3c00, 0x0401f01c, 0x59a0021c, 0x82000400,
+       0x00000002, 0x82000c80, 0x00000012, 0x04021004,
+       0x4803421c, 0x801c3c00, 0x0401f013, 0x0201f800,
+       0x001007e4, 0x0402000b, 0x59880051, 0x80000000,
+       0x48031051, 0x59a00017, 0x80000040, 0x48034017,
+       0x4803c856, 0x59a0021c, 0x801c3c00, 0x0401f006,
+       0x492f401a, 0x492c3813, 0x412c3800, 0x497b421c,
+       0x497a5813, 0x48083c00, 0x480c3a00, 0x48103c01,
+       0x48143a01, 0x5c003800, 0x5c000800, 0x5c034000,
+       0x5c025800, 0x1c01f000, 0x480fc857, 0x4813c857,
+       0x481bc857, 0x42000000, 0x0010b813, 0x0201f800,
+       0x0010aa47, 0x801800d0, 0x40002800, 0x42001000,
+       0x00008014, 0x0401f786, 0x4c000000, 0x599c0017,
+       0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000,
+       0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000,
+       0x59a80821, 0x800409c0, 0x04000005, 0x4a034406,
+       0x00000001, 0x0201f000, 0x0010230c, 0x836c0580,
+       0x00000003, 0x04000005, 0x4a034406, 0x00000007,
+       0x0201f000, 0x0010230c, 0x599c0017, 0x8c00050a,
+       0x04000005, 0x4a034406, 0x00000008, 0x0201f000,
+       0x0010230c, 0x59340405, 0x8c000508, 0x04020004,
+       0x8c00050a, 0x02020000, 0x001034db, 0x497a5a04,
+       0x497a5805, 0x4a025c04, 0x00008000, 0x0201f800,
+       0x00109176, 0x04020005, 0x4a034406, 0x00000003,
+       0x0201f000, 0x0010230c, 0x4a01d809, 0x00103aed,
+       0x1c01f000, 0x592c0005, 0x82000580, 0x01000000,
+       0x04020005, 0x4a034406, 0x00000004, 0x0201f000,
+       0x0010230c, 0x59a28c06, 0x0201f800, 0x00020245,
+       0x02020000, 0x00102310, 0x0201f000, 0x001034db,
+       0x82001580, 0x0000ffff, 0x04000009, 0x0201f800,
+       0x00105c9a, 0x02000800, 0x00020245, 0x0402000c,
+       0x0201f800, 0x00105fae, 0x0401f009, 0x42028800,
+       0x000007ef, 0x0201f800, 0x00020245, 0x02000800,
+       0x00105fae, 0x81468840, 0x040217fb, 0x1c01f000,
+       0x4803c856, 0x4c0c0000, 0x4d340000, 0x4d440000,
+       0x42028800, 0x000007fe, 0x0201f800, 0x00020245,
+       0x04020009, 0x5934180a, 0x820c1d00, 0x00000001,
+       0x820c1d80, 0x00000001, 0x42001000, 0x0000801b,
+       0x0401ff1e, 0x5c028800, 0x5c026800, 0x5c001800,
+       0x1c01f000, 0x599c0017, 0x8c000508, 0x1c01f000,
+       0x48efc857, 0x04011000, 0x48efc840, 0x4a03c842,
+       0x00000011, 0x40000000, 0x040117ff, 0x4a01d80f,
+       0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001,
+       0x497b4002, 0x497b4003, 0x497b4004, 0x1c01f000,
+       0x59c400a4, 0x4c580000, 0x4c500000, 0x4c540000,
+       0x82000500, 0x0000000f, 0x82000480, 0x00000007,
+       0x0400100a, 0x82006c80, 0x00000006, 0x02021800,
+       0x001005d8, 0x0c01f807, 0x5c00a800, 0x5c00a000,
+       0x5c00b000, 0x1c01f000, 0x0401f906, 0x0401f7fb,
+       0x00103b51, 0x00103b57, 0x00103b7c, 0x00103b9e,
+       0x00103c59, 0x59c40806, 0x8c040d00, 0x04020003,
+       0x84040d40, 0x48078806, 0x1c01f000, 0x59c40005,
+       0x8c000534, 0x02020000, 0x0010429e, 0x4a038805,
+       0xffffffff, 0x42006000, 0x00020000, 0x0201f800,
+       0x00104282, 0x59a80015, 0x82000500, 0xfffffffa,
+       0x84000542, 0x48035015, 0x497b5026, 0x42000800,
+       0x0010be21, 0x45780800, 0x497b5013, 0x42006000,
+       0xffefffff, 0x42006800, 0x40000000, 0x0201f800,
+       0x0010427d, 0x59c40006, 0x82000500, 0xffffff0f,
+       0x48038806, 0x42000800, 0x00000010, 0x42001000,
+       0x001041f3, 0x0201f800, 0x00105f83, 0x0401f001,
+       0x42006000, 0xffffffff, 0x42006800, 0x00800000,
+       0x0201f800, 0x0010427d, 0x4200b000, 0x000000c8,
+       0x59c400a4, 0x82000500, 0x0000000f, 0x82000580,
+       0x0000000a, 0x0400000f, 0x8058b040, 0x040207f9,
+       0x497b5014, 0x42006000, 0xbf7fffff, 0x42006800,
+       0x00018000, 0x0201f800, 0x0010427d, 0x42006000,
+       0xfffeffff, 0x41786800, 0x0201f000, 0x0010427d,
+       0x497b5014, 0x4a035012, 0x00000000, 0x80000580,
+       0x0201f000, 0x00104289, 0x4a038805, 0xffffffff,
+       0x59a80012, 0x82000c80, 0x00000004, 0x02021800,
+       0x001005d8, 0x0c01f001, 0x00103ba9, 0x00103bd6,
+       0x00103c4f, 0x4803c856, 0x59c400a3, 0x8400051e,
+       0x480388a3, 0x4a035012, 0x00000001, 0x59c40008,
+       0x8400054e, 0x48038808, 0x0201f800, 0x00104263,
+       0x42007800, 0x0010b54c, 0x4a007806, 0x11010000,
+       0x4200a000, 0x0010b402, 0x4200a800, 0x0010b553,
+       0x4200b000, 0x00000002, 0x0201f800, 0x0010ab17,
+       0x497b8802, 0x42000800, 0x00000003, 0x497b504a,
+       0x0201f800, 0x0010416e, 0x4a03504a, 0x00000001,
+       0x497b5016, 0x0201f800, 0x00104290, 0x42006000,
+       0xffffffff, 0x42006800, 0x00080000, 0x0201f800,
+       0x0010427d, 0x42006000, 0xfff7ffff, 0x41786800,
+       0x0201f000, 0x0010427d, 0x59a80016, 0x497b5016,
+       0x80002540, 0x04000066, 0x59c40004, 0x82000500,
+       0x00000003, 0x04020071, 0x59a80815, 0x8c040d02,
+       0x0400004b, 0x82100580, 0x0000000c, 0x0402004f,
+       0x82100400, 0x00000018, 0x8000b104, 0x41cc1000,
+       0x42001800, 0x0010b54c, 0x50080800, 0x500c0000,
+       0x80040580, 0x0402001a, 0x80081000, 0x800c1800,
+       0x8058b040, 0x040207f9, 0x0201f800, 0x00104290,
+       0x42006000, 0xffffffff, 0x42006800, 0x00500000,
+       0x0201f800, 0x0010427d, 0x4a035012, 0x00000002,
+       0x4a035014, 0x00000002, 0x42000800, 0x000007d0,
+       0x42001000, 0x00104148, 0x0201f800, 0x0010606e,
+       0x0201f800, 0x00104263, 0x0401f048, 0x59cc0806,
+       0x82040d80, 0x11010000, 0x04020028, 0x59cc0800,
+       0x82040500, 0x00ffffff, 0x0400001a, 0x82000580,
+       0x000000ef, 0x04020017, 0x59cc0801, 0x82040500,
+       0x00ffffff, 0x82000580, 0x000000ef, 0x04020011,
+       0x83cca400, 0x00000007, 0x4200a800, 0x0010b402,
+       0x4200b000, 0x00000002, 0x50500800, 0x50540000,
+       0x80040480, 0x04001007, 0x04020010, 0x8050a000,
+       0x8054a800, 0x8058b040, 0x040207f8, 0x0401f00b,
+       0x59a80015, 0x84000502, 0x48035015, 0x41cca000,
+       0x4200a800, 0x0010b54c, 0x4200b000, 0x00000009,
+       0x0201f800, 0x0010ab17, 0x0201f800, 0x00104290,
+       0x42006000, 0xffffffff, 0x42006800, 0x00080000,
+       0x0201f800, 0x0010427d, 0x42006000, 0xfff7ffff,
+       0x41786800, 0x0201f800, 0x0010427d, 0x42006000,
+       0xffffffff, 0x42006800, 0x00004000, 0x0201f800,
+       0x0010427d, 0x59c40004, 0x82000500, 0x00000003,
+       0x04020006, 0x497b5016, 0x42000800, 0x00000003,
+       0x0201f000, 0x0010416e, 0x1c01f000, 0x1c01f000,
+       0x59a80014, 0x82006d80, 0x0000000f, 0x04000005,
+       0x82000580, 0x0000001b, 0x02020800, 0x00104139,
+       0x1c01f000, 0x59a80015, 0x84000506, 0x48035015,
+       0x497b504a, 0x59a80014, 0x82000c80, 0x0000001e,
+       0x02021800, 0x001005d8, 0x0c01f001, 0x00103c97,
+       0x00103cac, 0x00103cd5, 0x00103cf0, 0x00103d14,
+       0x00103d45, 0x00103d68, 0x00103d9b, 0x00103dbe,
+       0x00103de4, 0x00103e21, 0x00103e48, 0x00103e5f,
+       0x00103e71, 0x00103e8a, 0x00103ea0, 0x00103ea5,
+       0x00103ecd, 0x00103ef0, 0x00103f16, 0x00103f39,
+       0x00103f6c, 0x00103fae, 0x00103fd8, 0x00103ff0,
+       0x00104030, 0x00104049, 0x0010405c, 0x0010405d,
+       0x4803c856, 0x4202d800, 0x00000007, 0x0201f800,
+       0x0010513b, 0x04000007, 0x42006000, 0xffffffd7,
+       0x41786800, 0x0201f800, 0x0010427d, 0x0401f00b,
+       0x59c40006, 0x82000500, 0xffffff0f, 0x48038806,
+       0x42001000, 0x000000f0, 0x0201f800, 0x0010193d,
+       0x0201f800, 0x00105098, 0x1c01f000, 0x4803c856,
+       0x42006000, 0xbf7fffff, 0x42006800, 0x00400000,
+       0x0201f800, 0x0010427d, 0x4a035014, 0x00000001,
+       0x42001000, 0x001041f3, 0x0201f800, 0x00105fa4,
+       0x0201f800, 0x001041f8, 0x42000800, 0x000007d0,
+       0x42001000, 0x00104148, 0x0201f000, 0x0010606e,
+       0x59a80016, 0x82000580, 0x00000014, 0x04020025,
+       0x4803c857, 0x42006000, 0xffbfffff, 0x41786800,
+       0x0201f800, 0x0010427d, 0x59c40004, 0x82000500,
+       0x00000003, 0x0402001b, 0x59cc1006, 0x82081580,
+       0x11020000, 0x04020016, 0x59cc1007, 0x8c08153e,
+       0x0400000b, 0x59a80015, 0x8c000504, 0x04020008,
+       0x42000000, 0x0010b83f, 0x0201f800, 0x0010aa47,
+       0x59a80015, 0x84000544, 0x48035015, 0x42001000,
+       0x00104148, 0x0201f800, 0x00105f90, 0x4a035014,
+       0x00000010, 0x0401f9d4, 0x0401f002, 0x497b5016,
+       0x1c01f000, 0x4803c856, 0x4a035014, 0x00000003,
+       0x42006000, 0xbf3fffff, 0x42006800, 0x00100000,
+       0x0201f800, 0x0010427d, 0x42001000, 0x001041f3,
+       0x0201f800, 0x00105fa4, 0x0201f800, 0x001041f8,
+       0x42001000, 0x00104148, 0x0201f800, 0x00105f90,
+       0x42007800, 0x0010b552, 0x46007800, 0x11020000,
+       0x42000800, 0x00000005, 0x0201f000, 0x0010416e,
+       0x59a80016, 0x80000540, 0x04000021, 0x4803c857,
+       0x42001000, 0x00104148, 0x0201f800, 0x00105f90,
+       0x59a80016, 0x82000580, 0x00000014, 0x04020016,
+       0x59cc1006, 0x82081580, 0x11020000, 0x04020012,
+       0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015,
+       0x8c000504, 0x04020008, 0x42000000, 0x0010b83f,
+       0x0201f800, 0x0010aa47, 0x59a80015, 0x84000544,
+       0x48035015, 0x4a035014, 0x00000004, 0x0401f805,
+       0x0401f003, 0x0201f800, 0x00104139, 0x1c01f000,
+       0x4803c856, 0x4a035014, 0x00000005, 0x83cca400,
+       0x00000006, 0x4200a800, 0x0010b552, 0x4200b000,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x42007800,
+       0x0010b552, 0x46007800, 0x11030000, 0x0201f800,
+       0x0010413e, 0x04020014, 0x59a80015, 0x8c000500,
+       0x04020011, 0x59a80810, 0x82040580, 0x00ffffff,
+       0x0400000d, 0x82040d00, 0x000000ff, 0x82040400,
+       0x0010210e, 0x50000800, 0x80040910, 0x42001000,
+       0x00000004, 0x0401fb9b, 0x0400000b, 0x0201f800,
+       0x0010420d, 0x4200b000, 0x00000004, 0x83cca400,
+       0x00000007, 0x4200a800, 0x0010b553, 0x0201f800,
+       0x0010ab17, 0x42000800, 0x00000005, 0x0201f000,
+       0x0010416e, 0x59a80016, 0x80000540, 0x04000020,
+       0x4803c857, 0x42001000, 0x00104148, 0x0201f800,
+       0x00105f90, 0x59a80016, 0x82000580, 0x00000014,
+       0x04020016, 0x59cc1006, 0x82081580, 0x11030000,
+       0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b,
+       0x59a80015, 0x8c000504, 0x04020008, 0x42000000,
+       0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015,
+       0x84000544, 0x48035015, 0x4a035014, 0x00000006,
+       0x0401f804, 0x0401f002, 0x0401fbd3, 0x1c01f000,
+       0x4803c856, 0x4a035014, 0x00000007, 0x83cca400,
+       0x00000006, 0x4200a800, 0x0010b552, 0x4200b000,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x42007800,
+       0x0010b552, 0x46007800, 0x11040000, 0x0401fbc7,
+       0x04020020, 0x59a80015, 0x8c000500, 0x0402001d,
+       0x599c0017, 0x8c000500, 0x0400001a, 0x599c1402,
+       0x82080480, 0x0000007f, 0x02021800, 0x001005d8,
+       0x4c080000, 0x82081400, 0x0010210e, 0x50081000,
+       0x82081500, 0x000000ff, 0x480b5010, 0x42000800,
+       0x00000003, 0x0201f800, 0x00106c78, 0x5c000800,
+       0x42001000, 0x00000004, 0x0401fb3e, 0x04000005,
+       0x0401fd2b, 0x04000003, 0x0201f800, 0x001015fe,
+       0x42000800, 0x00000005, 0x0401f3d4, 0x59a80016,
+       0x80000540, 0x04000020, 0x4803c857, 0x42001000,
+       0x00104148, 0x0201f800, 0x00105f90, 0x59a80016,
+       0x82000580, 0x00000014, 0x04020016, 0x59cc1006,
+       0x82081580, 0x11040000, 0x04020012, 0x59cc1007,
+       0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504,
+       0x04020008, 0x42000000, 0x0010b83f, 0x0201f800,
+       0x0010aa47, 0x59a80015, 0x84000544, 0x48035015,
+       0x4a035014, 0x00000008, 0x0401f804, 0x0401f002,
+       0x0401fb7d, 0x1c01f000, 0x4803c856, 0x4a035014,
+       0x00000009, 0x83cca400, 0x00000006, 0x4200a800,
+       0x0010b552, 0x4200b000, 0x00000005, 0x0201f800,
+       0x0010ab17, 0x42007800, 0x0010b552, 0x46007800,
+       0x11050100, 0x0401fb71, 0x0402000a, 0x59a80015,
+       0x8c000500, 0x04020007, 0x0401fa8c, 0x04020005,
+       0x82000540, 0x00000001, 0x0201f800, 0x001015fe,
+       0x42000800, 0x00000005, 0x0401fb94, 0x0401fb63,
+       0x04020ea4, 0x4d3c0000, 0x42027800, 0x00000001,
+       0x0201f800, 0x00109874, 0x5c027800, 0x1c01f000,
+       0x59a80016, 0x80000540, 0x0400003a, 0x4803c857,
+       0x42001000, 0x00104148, 0x0201f800, 0x00105f90,
+       0x59a80016, 0x82000580, 0x00000014, 0x04020030,
+       0x59cc1006, 0x82080500, 0x11050000, 0x82000580,
+       0x11050000, 0x0402002a, 0x8c081510, 0x04000014,
+       0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015,
+       0x8c000504, 0x04020008, 0x42000000, 0x0010b83f,
+       0x0201f800, 0x0010aa47, 0x59a80015, 0x84000544,
+       0x48035015, 0x4a035013, 0x00000001, 0x4a035014,
+       0x0000000a, 0x0401f818, 0x0401f016, 0x80000540,
+       0x04020013, 0x59cc1007, 0x8c08153e, 0x0400000b,
+       0x59a80015, 0x8c000504, 0x04020008, 0x42000000,
+       0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015,
+       0x84000544, 0x48035015, 0x497b5013, 0x4a035014,
+       0x0000000e, 0x0401f86d, 0x0401f002, 0x0401fb1a,
+       0x1c01f000, 0x4803c856, 0x4a035014, 0x0000000b,
+       0x42001000, 0x0010b553, 0x4008a800, 0x4200b000,
+       0x00000020, 0x4600a800, 0xffffffff, 0x8054a800,
+       0x8058b040, 0x040207fc, 0x42007800, 0x0010b552,
+       0x46007800, 0x11060000, 0x42001000, 0x0010b553,
+       0x0401fb0a, 0x04000005, 0x50080000, 0x46001000,
+       0x00ffffff, 0x0401f00c, 0x50080800, 0x82040d00,
+       0x0000ffff, 0x59a80010, 0x82000500, 0x000000ff,
+       0x82000540, 0x00000100, 0x800000e0, 0x80040d40,
+       0x44041000, 0x42000800, 0x00000021, 0x0401f327,
+       0x59a80016, 0x80000540, 0x04000014, 0x4803c857,
+       0x59a80016, 0x42001000, 0x00104148, 0x0201f800,
+       0x00105f90, 0x59a80016, 0x82000580, 0x00000084,
+       0x04020009, 0x59cc1006, 0x82081580, 0x11060000,
+       0x04020005, 0x4a035014, 0x0000000c, 0x0401f804,
+       0x0401f002, 0x0401fadc, 0x1c01f000, 0x4803c856,
+       0x4a035014, 0x0000000d, 0x83cca400, 0x00000006,
+       0x4200a800, 0x0010b552, 0x4200b000, 0x00000021,
+       0x0201f800, 0x0010ab17, 0x42007800, 0x0010b552,
+       0x46007800, 0x11070000, 0x42000800, 0x00000021,
+       0x0401f2fe, 0x59a80016, 0x80000540, 0x04000016,
+       0x4803c857, 0x59a80016, 0x42001000, 0x00104148,
+       0x0201f800, 0x00105f90, 0x82000580, 0x00000084,
+       0x0402000c, 0x59cc1006, 0x82081580, 0x11070000,
+       0x04020008, 0x4a035013, 0x00000001, 0x0401fa91,
+       0x4a035014, 0x0000000e, 0x0401f804, 0x0401f002,
+       0x0401fab1, 0x1c01f000, 0x4803c856, 0x82040d40,
+       0x00000001, 0x0401fbfc, 0x4a035014, 0x0000000f,
+       0x497b5016, 0x42006000, 0xffffffff, 0x42006800,
+       0x00300000, 0x0401fbe8, 0x42006000, 0xffdfffff,
+       0x41786800, 0x0401fbe4, 0x42000800, 0x000007d0,
+       0x42001000, 0x00104148, 0x0201f000, 0x00105f69,
+       0x4803c856, 0x59a80016, 0x80000540, 0x04020296,
+       0x1c01f000, 0x4803c856, 0x4a035014, 0x00000011,
+       0x83cca400, 0x00000006, 0x4200a800, 0x0010b552,
+       0x4200b000, 0x00000005, 0x0201f800, 0x0010ab17,
+       0x4200a800, 0x0010b552, 0x4600a800, 0x11020000,
+       0x0401fa8a, 0x04020015, 0x59a80010, 0x82000d00,
+       0xffff0000, 0x04000011, 0x82000500, 0x000000ff,
+       0x0400000e, 0x82000c00, 0x0010210e, 0x50040800,
+       0x80040910, 0x82040580, 0x0000007e, 0x04000007,
+       0x82040580, 0x00000080, 0x04000004, 0x42001000,
+       0x00000004, 0x0401fa07, 0x42000800, 0x00000005,
+       0x0401f2a2, 0x59a80016, 0x80000540, 0x04000020,
+       0x4803c857, 0x42001000, 0x00104148, 0x0201f800,
+       0x00105f90, 0x59a80016, 0x82000580, 0x00000014,
+       0x04020016, 0x59cc1006, 0x82081580, 0x11030000,
+       0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b,
+       0x59a80015, 0x8c000504, 0x04020008, 0x42000000,
+       0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015,
+       0x84000544, 0x48035015, 0x4a035014, 0x00000012,
+       0x0401f804, 0x0401f002, 0x0401fa4b, 0x1c01f000,
+       0x4803c856, 0x4a035014, 0x00000013, 0x83cca400,
+       0x00000006, 0x4200a800, 0x0010b552, 0x4200b000,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x4200a800,
+       0x0010b552, 0x4600a800, 0x11030000, 0x0401fa3f,
+       0x04020013, 0x59a80015, 0x8c000500, 0x04020010,
+       0x59a80810, 0x82040580, 0x00ffffff, 0x0400000c,
+       0x82040d00, 0x000000ff, 0x82040400, 0x0010210e,
+       0x50000800, 0x80040910, 0x42001000, 0x00000004,
+       0x0401f9c0, 0x04000002, 0x0401fafb, 0x42000800,
+       0x00000005, 0x0401f259, 0x59a80016, 0x80000540,
+       0x04000020, 0x4803c857, 0x42001000, 0x00104148,
+       0x0201f800, 0x00105f90, 0x59a80016, 0x82000580,
+       0x00000014, 0x04020016, 0x59cc1006, 0x82081580,
+       0x11040000, 0x04020012, 0x59cc1007, 0x8c08153e,
+       0x0400000b, 0x59a80015, 0x8c000504, 0x04020008,
+       0x42000000, 0x0010b83f, 0x0201f800, 0x0010aa47,
+       0x59a80015, 0x84000544, 0x48035015, 0x4a035014,
+       0x00000014, 0x0401f804, 0x0401f002, 0x0401fa02,
+       0x1c01f000, 0x4803c856, 0x4a035014, 0x00000015,
+       0x83cca400, 0x00000006, 0x4200a800, 0x0010b552,
+       0x4200b000, 0x00000005, 0x0201f800, 0x0010ab17,
+       0x4200a800, 0x0010b552, 0x4600a800, 0x11040000,
+       0x0401f9f6, 0x04020020, 0x59a80015, 0x8c000500,
+       0x0402001d, 0x599c0017, 0x8c000500, 0x0400001a,
+       0x599c1402, 0x82080480, 0x0000007f, 0x02021800,
+       0x001005d8, 0x4c080000, 0x82081400, 0x0010210e,
+       0x50081000, 0x82081500, 0x000000ff, 0x480b5010,
+       0x42000800, 0x00000003, 0x0201f800, 0x00106c78,
+       0x5c000800, 0x42001000, 0x00000004, 0x0401f96d,
+       0x04000005, 0x0201f800, 0x00103abf, 0x02020800,
+       0x001015fe, 0x42000800, 0x00000005, 0x0401f203,
+       0x59a80016, 0x80000540, 0x0400003f, 0x4803c857,
+       0x42001000, 0x00104148, 0x0201f800, 0x00105f90,
+       0x59a80016, 0x82000580, 0x00000014, 0x04020035,
+       0x59cc1006, 0x82080500, 0x11050000, 0x82000580,
+       0x11050000, 0x0402002f, 0x8c081510, 0x04000010,
+       0x0401fb09, 0x59cc1007, 0x8c08153e, 0x0400000b,
+       0x59a80015, 0x8c000504, 0x04020008, 0x42000000,
+       0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015,
+       0x84000544, 0x48035015, 0x0401f013, 0x59cc1007,
+       0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504,
+       0x04020008, 0x42000000, 0x0010b83f, 0x0201f800,
+       0x0010aa47, 0x59a80015, 0x84000544, 0x48035015,
+       0x82000540, 0x00000001, 0x0401faeb, 0x497b5013,
+       0x0401f003, 0x4a035013, 0x00000001, 0x59cc1007,
+       0x8c08153c, 0x04000003, 0x4a035026, 0x00000008,
+       0x4a035014, 0x00000016, 0x0401f804, 0x0401f002,
+       0x0401f98d, 0x1c01f000, 0x4803c856, 0x83cca400,
+       0x00000006, 0x4200a800, 0x0010b552, 0x4200b000,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x4a035014,
+       0x00000017, 0x59a80013, 0x8c000500, 0x04000006,
+       0x42001000, 0x0010b552, 0x46001000, 0x11050100,
+       0x0401f003, 0x4a035014, 0x0000001b, 0x0401f97b,
+       0x0402000a, 0x59a80015, 0x8c000500, 0x04020007,
+       0x0401f896, 0x04020005, 0x82000540, 0x00000001,
+       0x0201f800, 0x001015fe, 0x42000800, 0x00000005,
+       0x0401f99e, 0x4d3c0000, 0x42027800, 0x00000001,
+       0x0201f800, 0x00109874, 0x5c027800, 0x1c01f000,
+       0x59a80016, 0x80000540, 0x04000015, 0x4803c857,
+       0x42001000, 0x00104148, 0x0201f800, 0x00105f90,
+       0x59a80016, 0x82000580, 0x00000084, 0x0402000b,
+       0x59cc1006, 0x82081580, 0x11060000, 0x04020007,
+       0x80000580, 0x0401faa0, 0x4a035014, 0x00000018,
+       0x0401f804, 0x0401f002, 0x0401f94b, 0x1c01f000,
+       0x4803c856, 0x4a035014, 0x00000019, 0x83cca400,
+       0x00000006, 0x4200a800, 0x0010b552, 0x4200b000,
+       0x00000021, 0x0201f800, 0x0010ab17, 0x42003800,
+       0x0010b553, 0x0401f941, 0x04020018, 0x401c2800,
+       0x50141000, 0x80080130, 0x80000000, 0x40001800,
+       0x82081500, 0x00ffffff, 0x800000f0, 0x80080540,
+       0x44002800, 0x59a80810, 0x82040d00, 0x000000ff,
+       0x400c1000, 0x80081104, 0x82082400, 0x0010b553,
+       0x50101000, 0x820c0500, 0x00000003, 0x0c01f806,
+       0x80081540, 0x44082000, 0x42000800, 0x00000021,
+       0x0401f156, 0x0010401d, 0x00104022, 0x00104027,
+       0x0010402c, 0x800408f0, 0x40040000, 0x82081500,
+       0x00ffffff, 0x1c01f000, 0x800408e0, 0x40040000,
+       0x82081500, 0xff00ffff, 0x1c01f000, 0x800408d0,
+       0x40040000, 0x82081500, 0xffff00ff, 0x1c01f000,
+       0x40040000, 0x82081500, 0xffffff00, 0x1c01f000,
+       0x59a80016, 0x80000540, 0x04000016, 0x4803c857,
+       0x42001000, 0x00104148, 0x0201f800, 0x00105f90,
+       0x59a80016, 0x82000580, 0x00000084, 0x0402000c,
+       0x59cc1006, 0x82081580, 0x11070000, 0x04020008,
+       0x4a035013, 0x00000001, 0x0401f8d2, 0x4a035014,
+       0x0000001a, 0x0401f804, 0x0401f002, 0x0401f8f2,
+       0x1c01f000, 0x82000540, 0x00000001, 0x0401fa3e,
+       0x4a035014, 0x0000001b, 0x83cca400, 0x00000006,
+       0x4200a800, 0x0010b552, 0x59a82016, 0x40100000,
+       0x8000b104, 0x40580800, 0x5450a800, 0x8050a000,
+       0x8054a800, 0x8058b040, 0x040207fc, 0x0401f113,
+       0x1c01f000, 0x1c01f000, 0x4803c856, 0x42003000,
+       0x00000004, 0x42004000, 0x0010b553, 0x599c2817,
+       0x8c142d14, 0x0402001f, 0x42001000, 0x00000003,
+       0x40200000, 0x80080400, 0x50000800, 0x82042580,
+       0xffffffff, 0x04020005, 0x80081040, 0x80183040,
+       0x040207f8, 0x0401f05e, 0x800811c0, 0x04020006,
+       0x82042580, 0x3fffffff, 0x04000058, 0x82040d40,
+       0xc0000000, 0x4200b000, 0x00000020, 0x42001800,
+       0x00000001, 0x40042000, 0x80102102, 0x04021021,
+       0x800c18c2, 0x8058b040, 0x040207fc, 0x0401f04b,
+       0x41781000, 0x40200000, 0x80080400, 0x50000800,
+       0x82042580, 0xffffffff, 0x04020005, 0x80081000,
+       0x80183040, 0x040207f8, 0x0401f040, 0x800811c0,
+       0x04020003, 0x82040d40, 0xc0000000, 0x4200b000,
+       0x00000001, 0x42001800, 0x80000000, 0x40042000,
+       0x801020c2, 0x04021007, 0x800c1902, 0x8058b000,
+       0x82580480, 0x00000021, 0x040017fa, 0x0401f02f,
+       0x40200000, 0x80082400, 0x50100000, 0x800c0540,
+       0x44002000, 0x59a80015, 0x84000540, 0x48035015,
+       0x40580000, 0x42002800, 0x00000020, 0x80142c80,
+       0x40080000, 0x42003800, 0x00000003, 0x801c0480,
+       0x800000ca, 0x80142d40, 0x82144c00, 0x0010210e,
+       0x50242800, 0x82142d00, 0x000000ff, 0x48175010,
+       0x4c040000, 0x40140800, 0x0201f800, 0x001015eb,
+       0x5c000800, 0x40001800, 0x500c0000, 0x80100540,
+       0x44001800, 0x59a80015, 0x84000540, 0x48035015,
+       0x4200a800, 0x0010b553, 0x4020a000, 0x4200b000,
+       0x00000004, 0x0201f800, 0x0010ab17, 0x82000540,
+       0x00000001, 0x0401f002, 0x80000580, 0x1c01f000,
+       0x4807c857, 0x480bc857, 0x4008b000, 0x83cca400,
+       0x00000007, 0x4200a800, 0x0010b553, 0x40541000,
+       0x0201f800, 0x0010ab17, 0x40041800, 0x41782000,
+       0x42000000, 0x00000003, 0x820c1c80, 0x00000020,
+       0x04001004, 0x80102000, 0x80000040, 0x0401f7fb,
+       0x40041800, 0x801021c0, 0x04000005, 0x820c1c80,
+       0x00000020, 0x80102040, 0x040207fd, 0x42002000,
+       0x00000001, 0x800c19c0, 0x04000004, 0x801020c2,
+       0x800c1840, 0x040207fe, 0x80083c00, 0x83cc2c00,
+       0x00000007, 0x80142c00, 0x50140000, 0x80102d00,
+       0x04020012, 0x80100540, 0x44003800, 0x82042400,
+       0x0010210e, 0x50102800, 0x82142d00, 0x000000ff,
+       0x48175010, 0x4c040000, 0x40140800, 0x0201f800,
+       0x001015eb, 0x5c000800, 0x59a80015, 0x84000540,
+       0x48035015, 0x80000580, 0x1c01f000, 0x4807c856,
+       0x42001000, 0x00008017, 0x59a8184e, 0x0201f800,
+       0x0010aa4f, 0x0201f800, 0x00103a3e, 0x1c01f000,
+       0x4807c856, 0x4200b000, 0x00000020, 0x83cca400,
+       0x00000007, 0x4200a800, 0x0010be21, 0x0201f000,
+       0x0010ab28, 0x4807c856, 0x0201f800, 0x00106ede,
+       0x42000800, 0x000000f7, 0x0401f8de, 0x497b2804,
+       0x497b2805, 0x497b281c, 0x497b281d, 0x4202d800,
+       0x00000001, 0x42006000, 0xbf7fffff, 0x42006800,
+       0x00018000, 0x0401f950, 0x42006000, 0xfffeffff,
+       0x41786800, 0x0401f94c, 0x497b504e, 0x42000800,
+       0x0000002d, 0x42001000, 0x001041bc, 0x0201f000,
+       0x00105f69, 0x4807c856, 0x0401ffe3, 0x497b5014,
+       0x497b5016, 0x1c01f000, 0x4807c856, 0x59a80005,
+       0x8c000506, 0x1c01f000, 0x4807c856, 0x42006000,
+       0xffffffff, 0x42006800, 0x00000028, 0x0401f136,
+       0x4807c856, 0x0401ffc2, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x59c400a4, 0x82000500,
+       0x0000000f, 0x82000580, 0x00000002, 0x0402000a,
+       0x42006000, 0xffffffff, 0x42006800, 0x00200000,
+       0x0401f921, 0x42006000, 0xffdfffff, 0x41786800,
+       0x0401f91d, 0x497b5014, 0x42000800, 0x000000f7,
+       0x0401f89c, 0x59c400a3, 0x82000500, 0xbf20bfff,
+       0x82000540, 0x0001c000, 0x480388a3, 0x84000520,
+       0x480388a3, 0x1c01f000, 0x497b5016, 0x59b400f5,
+       0x8c000500, 0x04020004, 0x82000540, 0x00000001,
+       0x480368f5, 0x800400c4, 0x82000400, 0x00002000,
+       0x4803910a, 0x59b400f6, 0x82000500, 0x00000018,
+       0x040207fd, 0x4a0368f0, 0x0010b54b, 0x42000000,
+       0x0010b552, 0x480368f1, 0x82040400, 0x0000dc00,
+       0x480368f3, 0x59c400a4, 0x82000500, 0x0000000f,
+       0x82000580, 0x00000008, 0x04020017, 0x4c5c0000,
+       0x4c600000, 0x59c4b805, 0x8c5cbd3a, 0x04020005,
+       0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47,
+       0x4a038805, 0x02000000, 0x0201f800, 0x001019fe,
+       0x4000c000, 0x0201f800, 0x00101963, 0x4202d800,
+       0x00000001, 0x497b5014, 0x5c00c000, 0x5c00b800,
+       0x1c01f000, 0x59c8010b, 0x8c000502, 0x040007e2,
+       0x59c408a4, 0x82040d00, 0x0000000f, 0x82040d80,
+       0x0000000b, 0x04020005, 0x59a80814, 0x82040d40,
+       0x00002000, 0x0401f004, 0x59a80812, 0x82040d40,
+       0x00001000, 0x4807504e, 0x59a8084a, 0x800409c0,
+       0x04020007, 0x42000800, 0x000007d0, 0x42001000,
+       0x00104148, 0x0201f800, 0x0010606e, 0x1c01f000,
+       0x4807c856, 0x0401ff4e, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x59c400a4, 0x82000500,
+       0x0000000f, 0x82000580, 0x00000002, 0x0402000a,
+       0x42006000, 0xffffffff, 0x42006800, 0x00200000,
+       0x0401f8ad, 0x42006000, 0xffdfffff, 0x41786800,
+       0x0401f8a9, 0x0201f800, 0x00105141, 0x04000014,
+       0x0201f800, 0x00105151, 0x04020011, 0x4a035032,
+       0x0000aaaa, 0x4c040000, 0x0201f800, 0x0010162a,
+       0x59a8002a, 0x82000500, 0xffff0000, 0x80040540,
+       0x4803502a, 0x5c000800, 0x4a035033, 0x00000000,
+       0x0201f800, 0x001050a2, 0x0401f008, 0x4a03504c,
+       0x00000005, 0x42000000, 0x00000001, 0x0201f800,
+       0x00101590, 0x0401ff2c, 0x1c01f000, 0x0401f805,
+       0x42006000, 0xbf7f7fff, 0x41786800, 0x0401f086,
+       0x0201f800, 0x00105151, 0x04020005, 0x59c40006,
+       0x82000540, 0x000000f0, 0x48038806, 0x1c01f000,
+       0x800408d0, 0x59a80015, 0x8c000506, 0x04000006,
+       0x59a80010, 0x82000500, 0x000000ff, 0x80040540,
+       0x0401f003, 0x82040540, 0x000000f7, 0x480388a7,
+       0x1c01f000, 0x4807c856, 0x42000000, 0x0010b83b,
+       0x0201f800, 0x0010aa47, 0x42003000, 0x00000005,
+       0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000d,
+       0x42027800, 0x00000002, 0x0401f038, 0x4807c856,
+       0x42000000, 0x0010b86b, 0x0201f800, 0x0010aa47,
+       0x42003000, 0x00000000, 0x4d3c0000, 0x4c180000,
+       0x42003000, 0x0000000f, 0x42027800, 0x00000002,
+       0x0401f02a, 0x4807c856, 0x42000000, 0x0010b86a,
+       0x0201f800, 0x0010aa47, 0x42003000, 0x00000003,
+       0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000e,
+       0x42027800, 0x00000202, 0x0401f01c, 0x4807c856,
+       0x42000000, 0x0010b869, 0x0201f800, 0x0010aa47,
+       0x42003000, 0x00000004, 0x4d3c0000, 0x4c180000,
+       0x42003000, 0x00000010, 0x42027800, 0x00000202,
+       0x0401f00e, 0x4807c856, 0x42000000, 0x0010b83e,
+       0x0201f800, 0x0010aa47, 0x42003000, 0x00000001,
+       0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000c,
+       0x42027800, 0x00000202, 0x42001800, 0x0000ffff,
+       0x42002000, 0x00000007, 0x0201f800, 0x00103aae,
+       0x5c003000, 0x4d400000, 0x0201f800, 0x0010a95d,
+       0x42028000, 0x0000002a, 0x0201f800, 0x00101fe5,
+       0x5c028000, 0x5c027800, 0x1c01f000, 0x4807c856,
+       0x04011000, 0x4a03c840, 0x0010b54b, 0x4a03c842,
+       0x00000040, 0x40000000, 0x040117ff, 0x42007800,
+       0x0010b54b, 0x46007800, 0x00000011, 0x803c7800,
+       0x4a007800, 0x220000ef, 0x4a007801, 0x000000ef,
+       0x4a007802, 0x01380000, 0x4a007803, 0x00000000,
+       0x4a007804, 0xffffffff, 0x4a007805, 0x00000000,
+       0x1c01f000, 0x59c400a3, 0x80300500, 0x80340540,
+       0x480388a3, 0x1c01f000, 0x4833c857, 0x59c400a3,
+       0x80300540, 0x480388a3, 0x80300580, 0x480388a3,
+       0x1c01f000, 0x4803c856, 0x04000004, 0x4a03504b,
+       0x00000001, 0x0401f002, 0x497b504b, 0x1c01f000,
+       0x4803c856, 0x59c80002, 0x80000540, 0x0400000a,
+       0x80000040, 0x04000008, 0x4a039005, 0x00000140,
+       0x42000000, 0x00000006, 0x80000040, 0x040207ff,
+       0x0401f7f4, 0x1c01f000, 0x4c5c0000, 0x4c600000,
+       0x59c4b805, 0x485fc856, 0x8c5cbd3a, 0x04020005,
+       0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47,
+       0x4a038805, 0x02000000, 0x0201f800, 0x001019fe,
+       0x4000c000, 0x0201f800, 0x00101963, 0x4a038805,
+       0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000,
+       0x497a6a00, 0x4937c857, 0x4a026c00, 0x00000707,
+       0x497a6801, 0x497a6808, 0x497a6809, 0x497a6806,
+       0x497a6807, 0x497a6c0b, 0x497a680c, 0x0201f800,
+       0x00103b25, 0x04020006, 0x5934080f, 0x59340010,
+       0x80040540, 0x02020800, 0x001005d8, 0x4a026a04,
+       0x00000100, 0x497a6a03, 0x59340402, 0x82000500,
+       0x000000ff, 0x48026c02, 0x497a6c04, 0x497a6a05,
+       0x497a6c05, 0x497a6811, 0x4d2c0000, 0x5934000d,
+       0x49466c03, 0x80025d40, 0x04000004, 0x0201f800,
+       0x001007fd, 0x497a680d, 0x5c025800, 0x599c0401,
+       0x48026a0b, 0x599c0208, 0x48026c12, 0x497a680a,
+       0x0201f000, 0x00104c62, 0x42000000, 0x00000005,
+       0x80000d80, 0x0401f02d, 0x0201f800, 0x00104a09,
+       0x04020017, 0x59a80026, 0x8c00050a, 0x04020010,
+       0x59340212, 0x82000500, 0x0000ff00, 0x4803c857,
+       0x0400000b, 0x59340a00, 0x8c040d1e, 0x02000000,
+       0x000201c4, 0x42000000, 0x00000029, 0x42000800,
+       0x00001000, 0x492fc857, 0x0401f018, 0x492fc857,
+       0x42000000, 0x00000028, 0x0401f012, 0x59a80805,
+       0x8c040d02, 0x04020003, 0x8c040d00, 0x04000004,
+       0x42000000, 0x00000004, 0x0401f00a, 0x42000000,
+       0x00000029, 0x59340a00, 0x8c040d1e, 0x04000005,
+       0x492fc857, 0x42000800, 0x00001000, 0x0401f003,
+       0x492fc857, 0x80000d80, 0x4803c857, 0x80028540,
+       0x1c01f000, 0x4803c857, 0x59a80005, 0x8c000500,
+       0x040207ec, 0x0201f800, 0x001049e7, 0x040207e4,
+       0x59340200, 0x8c00050e, 0x040007e1, 0x0201f000,
+       0x000201c4, 0x0201f800, 0x001047eb, 0x040007bf,
+       0x0201f000, 0x000201c8, 0x592c0206, 0x492fc857,
+       0x82000d80, 0x000007ff, 0x04020006, 0x4a025c0a,
+       0x00000030, 0x42026800, 0x0010b524, 0x0401f021,
+       0x82000c80, 0x000007f0, 0x04021046, 0x81ac0400,
+       0x50000000, 0x80026d40, 0x04000038, 0x0201f800,
+       0x001048e3, 0x04020038, 0x592c040a, 0x8c00050a,
+       0x04020014, 0x592e6009, 0x83300480, 0x0010d1c0,
+       0x0400103b, 0x41580000, 0x81300480, 0x04021038,
+       0x59300c06, 0x82040580, 0x00000009, 0x04020037,
+       0x4a025a06, 0x00000000, 0x497a5800, 0x59300008,
+       0x80000540, 0x04020018, 0x492e6008, 0x0401f010,
+       0x0201f800, 0x0002075a, 0x04000019, 0x592c0206,
+       0x49366009, 0x492e6008, 0x4a026406, 0x00000009,
+       0x497a6015, 0x49325809, 0x82000d80, 0x000007ff,
+       0x04020003, 0x4a026015, 0x00008000, 0x42027000,
+       0x00000043, 0x0201f800, 0x000207a1, 0x80000580,
+       0x0401f020, 0x40000800, 0x58040000, 0x80000d40,
+       0x040207fd, 0x492c0800, 0x0401f01a, 0x42000000,
+       0x0000002c, 0x0401f016, 0x42000000, 0x00000028,
+       0x0401f013, 0x59a80805, 0x82040500, 0x00000003,
+       0x04000004, 0x42000000, 0x00000004, 0x0401f00c,
+       0x42000000, 0x00000029, 0x0401f009, 0x42000000,
+       0x00000008, 0x0401f006, 0x82040580, 0x00000007,
+       0x040207fb, 0x42000000, 0x00000005, 0x80000540,
+       0x1c01f000, 0x492fc857, 0x592e8c06, 0x83440d80,
+       0x000007fc, 0x04000004, 0x83440480, 0x000007f0,
+       0x04021014, 0x0201f800, 0x00020245, 0x04020011,
+       0x0201f800, 0x001049f3, 0x04020011, 0x0201f800,
+       0x0002075a, 0x0400001c, 0x49366009, 0x492e6008,
+       0x4a026406, 0x0000000a, 0x42027000, 0x00000040,
+       0x0201f800, 0x000207a1, 0x80000580, 0x0401f011,
+       0x42000000, 0x00000028, 0x0401f00d, 0x0201f800,
+       0x00104a09, 0x040007fb, 0x59a80805, 0x82040d00,
+       0x00000003, 0x04000004, 0x42000000, 0x00000004,
+       0x0401f003, 0x42000000, 0x00000029, 0x80000540,
+       0x1c01f000, 0x42000000, 0x0000002c, 0x0401f7fc,
+       0x492fc857, 0x592e8c06, 0x4947c857, 0x83440c80,
+       0x00000800, 0x42000000, 0x0000000a, 0x04021176,
+       0x592c4207, 0x4823c857, 0x82200500, 0x0000000f,
+       0x0c01f001, 0x001043d5, 0x0010445d, 0x001044a9,
+       0x001044b4, 0x001044bf, 0x001043d1, 0x001043d1,
+       0x001043d1, 0x001044cf, 0x00104513, 0x00104530,
+       0x001043d1, 0x001043d1, 0x001043d1, 0x001043d1,
+       0x001043d1, 0x4803c857, 0x42000000, 0x0000000c,
+       0x0401f15d, 0x592c1008, 0x82081500, 0x00ffffff,
+       0x59a80010, 0x80084d80, 0x42000000, 0x00000010,
+       0x04000155, 0x0201f800, 0x00104919, 0x04000036,
+       0x4803c857, 0x82004d80, 0x0000001d, 0x0402001a,
+       0x0201f800, 0x00105755, 0x59340405, 0x4c000000,
+       0x0201f800, 0x001049e7, 0x5c000000, 0x04000004,
+       0x8c20450a, 0x04000028, 0x80000580, 0x44002800,
+       0x59340008, 0x48002802, 0x59340009, 0x48002801,
+       0x59340006, 0x48002804, 0x59340007, 0x48002803,
+       0x4200b000, 0x00000005, 0x0201f800, 0x0010955f,
+       0x0401f166, 0x4803c857, 0x82004d80, 0x0000001a,
+       0x04020003, 0x40101000, 0x0401f136, 0x4803c857,
+       0x82004d80, 0x0000001b, 0x04020003, 0x40181000,
+       0x0401f130, 0x4803c857, 0x82004d80, 0x0000001c,
+       0x04000131, 0x82004d80, 0x00000019, 0x42000000,
+       0x0000000a, 0x04000120, 0x42000000, 0x0000000a,
+       0x04020137, 0x59a80005, 0x8c000514, 0x0400001b,
+       0x0201f800, 0x001049e7, 0x04000018, 0x59340212,
+       0x82000500, 0x0000ff00, 0x42001000, 0x00000010,
+       0x0402000c, 0x42001000, 0x00000008, 0x59a80026,
+       0x8c000506, 0x04020009, 0x59340002, 0x82000500,
+       0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007,
+       0x0201f800, 0x00104c6d, 0x42000000, 0x0000001c,
+       0x40181000, 0x04020107, 0x0201f800, 0x0002075a,
+       0x04000111, 0x49366009, 0x492e6008, 0x4a026406,
+       0x00000001, 0x8c20450a, 0x04000004, 0x592c0404,
+       0x8400055c, 0x48025c04, 0x4c200000, 0x4d3c0000,
+       0x42027800, 0x00001000, 0x0201f800, 0x0010203c,
+       0x5c027800, 0x5c004000, 0x8c204512, 0x0400000b,
+       0x599c0018, 0x8c000518, 0x04000008, 0x592c0009,
+       0x82000500, 0x00000380, 0x5934080a, 0x80040d40,
+       0x84040d54, 0x4806680a, 0x417a7800, 0x0401f914,
+       0x42000800, 0x00000003, 0x0401f91b, 0x42027000,
+       0x00000002, 0x0201f800, 0x000207a1, 0x80000580,
+       0x0401f10a, 0x0201f800, 0x00020245, 0x040200ec,
+       0x0201f800, 0x001049ed, 0x04000008, 0x0201f800,
+       0x001049e7, 0x040200ec, 0x417a7800, 0x417a6000,
+       0x0201f800, 0x001020a1, 0x59a80005, 0x8c000514,
+       0x0400001b, 0x0201f800, 0x001049e7, 0x04000018,
+       0x59340212, 0x82000500, 0x0000ff00, 0x42001000,
+       0x00000010, 0x0402000c, 0x42001000, 0x00000008,
+       0x59a80026, 0x8c000506, 0x04020009, 0x59340002,
+       0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000,
+       0x04000007, 0x0201f800, 0x00104c6d, 0x42000000,
+       0x0000001c, 0x40181000, 0x040200b2, 0x0201f800,
+       0x0002075a, 0x040000bc, 0x5934080a, 0x8c204512,
+       0x0400000c, 0x599c0018, 0x8c000518, 0x04000009,
+       0x592c0009, 0x82000500, 0x00000380, 0x82041500,
+       0xfffffc7f, 0x80080d40, 0x84040d54, 0x0401f002,
+       0x84040d14, 0x4806680a, 0x49366009, 0x492e6008,
+       0x4a026406, 0x00000001, 0x417a7800, 0x0401f8c8,
+       0x42000800, 0x00000005, 0x0401f8cf, 0x42027000,
+       0x00000003, 0x0201f800, 0x000207a1, 0x80000580,
+       0x0401f0be, 0x0201f800, 0x00020245, 0x040200a0,
+       0x0201f800, 0x001049fc, 0x040200a3, 0x0201f800,
+       0x00109517, 0x04000094, 0x80000580, 0x0401f0b3,
+       0x0201f800, 0x00020245, 0x04020095, 0x0201f800,
+       0x001049fc, 0x04020098, 0x0201f800, 0x001090e6,
+       0x04000089, 0x80000580, 0x0401f0a8, 0x0201f800,
+       0x00020245, 0x0402008a, 0x83444d80, 0x000007fe,
+       0x42000000, 0x0000000a, 0x0402006b, 0x0201f800,
+       0x001049e7, 0x04020088, 0x0201f800, 0x0010952f,
+       0x04000079, 0x80000580, 0x0401f098, 0x82200500,
+       0x00000070, 0x04020005, 0x8c20450e, 0x42000000,
+       0x0000000c, 0x0402005c, 0x8c20450a, 0x0400000d,
+       0x4d3c0000, 0x42027800, 0x00001000, 0x8c20450e,
+       0x04020002, 0x853e7d56, 0x82200500, 0x000000a0,
+       0x0201f800, 0x001049d3, 0x5c027800, 0x0401f07f,
+       0x0201f800, 0x00020245, 0x04020065, 0x8c204508,
+       0x04000010, 0x4d3c0000, 0x42027800, 0x00001000,
+       0x8c20450e, 0x04020002, 0x853e7d56, 0x82200500,
+       0x00000090, 0x0201f800, 0x001049bb, 0x5c027800,
+       0x42000000, 0x0000000a, 0x0402003b, 0x0401f06b,
+       0x836c0580, 0x00000003, 0x42000800, 0x00000007,
+       0x0402000f, 0x0201f800, 0x001049f3, 0x04000007,
+       0x4c000000, 0x0201f800, 0x00104a1f, 0x5c000000,
+       0x0400004d, 0x0401f05d, 0x0201f800, 0x001094c5,
+       0x04000007, 0x80000580, 0x0401f05c, 0x0201f800,
+       0x00104a1f, 0x04000051, 0x0401f054, 0x0201f800,
+       0x00104a1f, 0x04000034, 0x0401f050, 0x0201f800,
+       0x00020245, 0x04020036, 0x836c0580, 0x00000003,
+       0x04020040, 0x8c204508, 0x04000006, 0x417a7800,
+       0x417a6000, 0x0201f800, 0x001020a1, 0x0401f043,
+       0x0201f800, 0x001049ed, 0x04000008, 0x0201f800,
+       0x001049e7, 0x0402002c, 0x417a7800, 0x417a6000,
+       0x0201f800, 0x001020a1, 0x480bc856, 0x0201f800,
+       0x00109332, 0x04000018, 0x80000580, 0x0401f037,
+       0x0401f7e3, 0x480bc857, 0x42000800, 0x00000019,
+       0x40001000, 0x4200b000, 0x00000002, 0x0401f00a,
+       0x480bc857, 0x40000800, 0x4200b000, 0x00000002,
+       0x0401f005, 0x480bc857, 0x40000800, 0x4200b000,
+       0x00000001, 0x480bc857, 0x42028000, 0x00000031,
+       0x0401f020, 0x480bc857, 0x42000800, 0x00000003,
+       0x4200b000, 0x00000001, 0x0401f7f7, 0x480bc857,
+       0x42000800, 0x0000000a, 0x4200b000, 0x00000001,
+       0x0401f7f1, 0x480bc857, 0x42000800, 0x00000009,
+       0x40001000, 0x4200b000, 0x00000002, 0x0401f7ea,
+       0x480bc857, 0x42000800, 0x00000007, 0x4200b000,
+       0x00000001, 0x0401f7e4, 0x480bc857, 0x4200b000,
+       0x00000001, 0x0401f7e0, 0x80028580, 0x4178b000,
+       0x82000540, 0x00000001, 0x1c01f000, 0x4937c857,
+       0x59326809, 0x59341200, 0x813e79c0, 0x04000003,
+       0x84081540, 0x0401f002, 0x84081500, 0x480a6a00,
+       0x1c01f000, 0x59326809, 0x5c000000, 0x4c000000,
+       0x4803c857, 0x4937c857, 0x82040580, 0x00000006,
+       0x04020004, 0x42000000, 0x00000606, 0x0401f021,
+       0x82040580, 0x00000004, 0x04020004, 0x42000000,
+       0x00000404, 0x0401f01b, 0x82040580, 0x00000007,
+       0x42000000, 0x00000707, 0x04000016, 0x82040580,
+       0x00000003, 0x42000000, 0x00000703, 0x04000011,
+       0x82040580, 0x00000005, 0x42000000, 0x00000405,
+       0x0400000c, 0x82040580, 0x00000009, 0x42000000,
+       0x00000409, 0x04000007, 0x82040580, 0x0000000b,
+       0x42000000, 0x0000070b, 0x02020800, 0x001005d8,
+       0x4803c857, 0x48026c00, 0x82040d80, 0x00000006,
+       0x04020005, 0x59341404, 0x800811c0, 0x02000800,
+       0x001005d8, 0x1c01f000, 0x5c000000, 0x4c000000,
+       0x4803c857, 0x4947c857, 0x481bc857, 0x83440480,
+       0x00000800, 0x04021034, 0x83441400, 0x0010ac00,
+       0x50080000, 0x80026d40, 0x04020011, 0x4c180000,
+       0x4d2c0000, 0x0201f800, 0x001007d3, 0x412e6800,
+       0x5c025800, 0x5c003000, 0x04000027, 0x45341000,
+       0x497a680d, 0x497a6810, 0x497a680f, 0x497a680e,
+       0x4c180000, 0x0401fcf3, 0x5c003000, 0x59340a12,
+       0x4c040000, 0x0201f800, 0x0010513b, 0x5c000800,
+       0x04000009, 0x82180500, 0x00ffff00, 0x04000008,
+       0x59a81010, 0x82081500, 0x00ffff00, 0x80080580,
+       0x04000003, 0x80000580, 0x0401f004, 0x82180500,
+       0x000000ff, 0x800000d0, 0x80040d80, 0x04000003,
+       0x4803c857, 0x48026a12, 0x59340002, 0x80180580,
+       0x04000003, 0x481bc857, 0x481a6802, 0x80000580,
+       0x1c01f000, 0x4803c856, 0x82000540, 0x00000001,
+       0x0401f7fc, 0x4947c857, 0x83440480, 0x00000800,
+       0x04021011, 0x83441400, 0x0010ac00, 0x50080000,
+       0x80026d40, 0x0400000b, 0x0401fbf9, 0x0402000a,
+       0x59a80005, 0x8c000502, 0x04000004, 0x59340200,
+       0x8c00050e, 0x04000004, 0x82000540, 0x00000001,
+       0x1c01f000, 0x80000580, 0x0401f7fe, 0x5c000000,
+       0x4c000000, 0x4803c857, 0x4947c857, 0x4d2c0000,
+       0x4d300000, 0x83440480, 0x00000800, 0x04021024,
+       0x83441400, 0x0010ac00, 0x50080000, 0x80026d40,
+       0x0400001b, 0x45781000, 0x5934000d, 0x80025d40,
+       0x02020800, 0x001007fd, 0x59366011, 0x813261c0,
+       0x0400000e, 0x4c640000, 0x5930c800, 0x59325808,
+       0x0201f800, 0x00109037, 0x02020800, 0x001007fd,
+       0x0201f800, 0x0002077d, 0x82666540, 0x00000000,
+       0x040207f6, 0x5c00c800, 0x0201f800, 0x00104c62,
+       0x41365800, 0x0201f800, 0x001007f5, 0x80000580,
+       0x5c026000, 0x5c025800, 0x1c01f000, 0x82000540,
+       0x00000001, 0x0401f7fb, 0x4937c857, 0x4c580000,
+       0x59cc0001, 0x82000500, 0x00ffffff, 0x48026802,
+       0x497a6c01, 0x497a6a01, 0x59340200, 0x84000502,
+       0x48026a00, 0x0201f800, 0x0010513b, 0x04020017,
+       0x59340403, 0x82000580, 0x000007fe, 0x04000005,
+       0x59a80026, 0x8c00050a, 0x04020010, 0x0401f008,
+       0x59cc0408, 0x8c000518, 0x0400000c, 0x59cc0009,
+       0x48035035, 0x59cc000a, 0x48035036, 0x59cc0207,
+       0x80000540, 0x04020003, 0x42000000, 0x00000001,
+       0x48038893, 0x4803501e, 0x59cc0a09, 0x82040d00,
+       0x00000010, 0x59cc0408, 0x82000500, 0x00000020,
+       0x04000002, 0x84040d40, 0x5934000a, 0x82000500,
+       0xffffffee, 0x80040540, 0x4802680a, 0x83cca400,
+       0x0000000b, 0x8334ac00, 0x00000006, 0x4200b000,
+       0x00000002, 0x0201f800, 0x0010ab17, 0x83cca400,
+       0x0000000d, 0x8334ac00, 0x00000008, 0x4200b000,
+       0x00000002, 0x0201f800, 0x0010ab17, 0x59cc0a18,
+       0x82040480, 0x00000800, 0x0402100c, 0x82040480,
+       0x00000400, 0x04001004, 0x42000800, 0x00000400,
+       0x0401f006, 0x82040480, 0x00000200, 0x04001003,
+       0x42000800, 0x00000200, 0x48066a04, 0x59340403,
+       0x82000580, 0x000007fe, 0x04020003, 0x59cc0a08,
+       0x48066a04, 0x42000800, 0x00000004, 0x59cc1207,
+       0x800811c0, 0x04000005, 0x82080480, 0x00000004,
+       0x04021002, 0x40080800, 0x48066c04, 0x5c00b000,
+       0x1c01f000, 0x4937c857, 0x59a80026, 0x8c000508,
+       0x04000004, 0x84000556, 0x4803c857, 0x48035026,
+       0x59cc0207, 0x4803c857, 0x48026a05, 0x59cc020a,
+       0x4803c857, 0x48026c05, 0x59341200, 0x599c0818,
+       0x5934180a, 0x4807c857, 0x480bc857, 0x480fc857,
+       0x59cc2006, 0x82102500, 0xff000000, 0x82102580,
+       0x02000000, 0x04000007, 0x8c00050e, 0x04000009,
+       0x8c0c1d14, 0x04000003, 0x8c0c1d0e, 0x04000005,
+       0x8c040d18, 0x04000003, 0x8408154a, 0x0401f002,
+       0x8408150a, 0x8c000510, 0x04000009, 0x8c0c1d14,
+       0x04000003, 0x8c0c1d10, 0x04000005, 0x8c040d18,
+       0x04000003, 0x8408154e, 0x0401f002, 0x8408150e,
+       0x8c000512, 0x04000009, 0x8c0c1d14, 0x04000003,
+       0x8c0c1d12, 0x04000005, 0x8c040d18, 0x04000003,
+       0x8408155c, 0x0401f002, 0x8408151c, 0x480a6a00,
+       0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000,
+       0x4c580000, 0x5934000d, 0x80025d40, 0x04000029,
+       0x592c0003, 0x82000480, 0x00000008, 0x0400100b,
+       0x412cb800, 0x592c0001, 0x80025d40, 0x040207f9,
+       0x0201f800, 0x001007e4, 0x04000037, 0x492fc857,
+       0x492cb801, 0x0401f020, 0x832c0c00, 0x00000004,
+       0x4200b000, 0x00000008, 0x50040000, 0x82000580,
+       0xffffffff, 0x04020006, 0x80041000, 0x50080000,
+       0x82000580, 0xffffffff, 0x04000007, 0x82040c00,
+       0x00000002, 0x8058b040, 0x040207f4, 0x0201f800,
+       0x001005d8, 0x45480800, 0x454c1000, 0x592c1803,
+       0x800c1800, 0x480e5803, 0x480fc857, 0x0401f014,
+       0x0201f800, 0x001007e4, 0x04000017, 0x492fc857,
+       0x492e680d, 0x497a5802, 0x4a025803, 0x00000001,
+       0x494a5804, 0x494e5805, 0x832c0c00, 0x00000006,
+       0x4200b000, 0x0000000e, 0x46000800, 0xffffffff,
+       0x80040800, 0x8058b040, 0x040207fc, 0x82000540,
+       0x00000001, 0x5c00b000, 0x5c025800, 0x5c00b800,
+       0x1c01f000, 0x80000580, 0x0401f7fb, 0x4803c856,
+       0x4d3c0000, 0x4d2c0000, 0x5934000d, 0x80025d40,
+       0x0400001f, 0x592c0002, 0x80000540, 0x0402001f,
+       0x412e7800, 0x0401f8ce, 0x0402001c, 0x46000800,
+       0xffffffff, 0x46001000, 0xffffffff, 0x4813c857,
+       0x480fc857, 0x580c0003, 0x82000c80, 0x00000002,
+       0x04021014, 0x480fc857, 0x400c0000, 0x812c0580,
+       0x04020004, 0x580c0001, 0x4802680d, 0x0401f003,
+       0x580c0001, 0x48002001, 0x400e5800, 0x0201f800,
+       0x001007f4, 0x82000540, 0x00000001, 0x5c025800,
+       0x5c027800, 0x1c01f000, 0x80000580, 0x0401f7fc,
+       0x80000040, 0x48001803, 0x4803c857, 0x0401f7f6,
+       0x0201f800, 0x00020086, 0x59300007, 0x8400054e,
+       0x48026007, 0x592c1a04, 0x820c1d00, 0x000000ff,
+       0x820c0580, 0x00000048, 0x04000013, 0x0201f000,
+       0x0002028e, 0x8c000500, 0x02020800, 0x000200e5,
+       0x4a026203, 0x00000002, 0x592c1a04, 0x820c1d00,
+       0x000000ff, 0x820c0580, 0x00000018, 0x02000000,
+       0x0002028e, 0x820c0580, 0x00000048, 0x02020000,
+       0x0002028e, 0x42000800, 0x80000804, 0x0201f800,
+       0x00106721, 0x0201f000, 0x00020297, 0x4a025a06,
+       0x00000008, 0x0201f000, 0x000202da, 0x4a025a06,
+       0x00000029, 0x0201f000, 0x000202da, 0x4a025a06,
+       0x0000002a, 0x0201f000, 0x000202da, 0x4a025a06,
+       0x00000028, 0x0201f000, 0x000202da, 0x4943c857,
+       0x4d440000, 0x4d340000, 0x4d2c0000, 0x4c580000,
+       0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800,
+       0x00020245, 0x0402000d, 0x8d3e7d14, 0x04000005,
+       0x59340212, 0x82000500, 0x0000ff00, 0x04000007,
+       0x8d3e7d06, 0x04000004, 0x59340200, 0x8c00050e,
+       0x04020002, 0x0401f813, 0x81468800, 0x8058b040,
+       0x040207ef, 0x83440480, 0x00000800, 0x04021008,
+       0x8d3e7d02, 0x04000006, 0x42028800, 0x000007f0,
+       0x4200b000, 0x00000010, 0x0401f7e5, 0x5c00b000,
+       0x5c025800, 0x5c026800, 0x5c028800, 0x1c01f000,
+       0x4d2c0000, 0x41783000, 0x5936580f, 0x812e59c0,
+       0x04000029, 0x592c0204, 0x82000500, 0x000000ff,
+       0x82000580, 0x00000012, 0x04000020, 0x8d3e7d00,
+       0x04000003, 0x0401f83c, 0x0402001c, 0x592c2000,
+       0x497a5800, 0x801831c0, 0x04020009, 0x59340010,
+       0x812c0580, 0x04020004, 0x497a680f, 0x497a6810,
+       0x0401f008, 0x4812680f, 0x0401f006, 0x48103000,
+       0x59340010, 0x812c0580, 0x04020002, 0x481a6810,
+       0x4a025a04, 0x00000103, 0x49425a06, 0x497a5c09,
+       0x0201f800, 0x001091c6, 0x0201f800, 0x000202da,
+       0x40125800, 0x0401f7da, 0x412c3000, 0x592e5800,
+       0x0401f7d7, 0x5c025800, 0x1c01f000, 0x4803c856,
+       0x41781800, 0x5934000f, 0x80025d40, 0x04000010,
+       0x592c0005, 0x80200580, 0x592c0000, 0x04000003,
+       0x412c1800, 0x0401f7f9, 0x497a5800, 0x800c19c0,
+       0x04000008, 0x48001800, 0x80000540, 0x04020004,
+       0x480e6810, 0x82000540, 0x00000001, 0x1c01f000,
+       0x4802680f, 0x80000540, 0x040207fd, 0x497a6810,
+       0x0401f7f9, 0x592c0008, 0x81480580, 0x04020003,
+       0x592c0009, 0x814c0580, 0x1c01f000, 0x4803c856,
+       0x4c580000, 0x413c1800, 0x400c2000, 0x593c0002,
+       0x80000540, 0x04020018, 0x4200b000, 0x00000008,
+       0x820c0c00, 0x00000004, 0x50040000, 0x81480580,
+       0x04020005, 0x80041000, 0x50080000, 0x814c0580,
+       0x0400000d, 0x82040c00, 0x00000002, 0x8058b040,
+       0x040207f6, 0x400c2000, 0x580c0001, 0x80001d40,
+       0x040207ee, 0x82000540, 0x00000001, 0x5c00b000,
+       0x1c01f000, 0x80000580, 0x0401f7fd, 0x4937c857,
+       0x4c580000, 0x4d2c0000, 0x5934000d, 0x80025d40,
+       0x04020016, 0x0201f800, 0x001007e4, 0x04000010,
+       0x492e680d, 0x4a025802, 0x00000001, 0x497a5803,
+       0x832c0c00, 0x00000004, 0x4200b000, 0x00000010,
+       0x46000800, 0xffffffff, 0x80040800, 0x8058b040,
+       0x040207fc, 0x82000540, 0x00000001, 0x5c025800,
+       0x5c00b000, 0x1c01f000, 0x4d2c0000, 0x592e5801,
+       0x0201f800, 0x001007fd, 0x5c025800, 0x0401f7ea,
+       0x4d2c0000, 0x5936580d, 0x812e59c0, 0x04000007,
+       0x4937c857, 0x497a680d, 0x0201f800, 0x001007fd,
+       0x82000540, 0x00000001, 0x5c025800, 0x1c01f000,
+       0x59340405, 0x4937c857, 0x4803c857, 0x8c000508,
+       0x1c01f000, 0x4803c856, 0x0201f800, 0x0010513b,
+       0x04000011, 0x59a80815, 0x8c040d04, 0x0402000e,
+       0x59a80826, 0x8c040d06, 0x0400000b, 0x83ac0400,
+       0x000007fe, 0x50000000, 0x80026d40, 0x04000006,
+       0x0401f9a7, 0x04020004, 0x59340200, 0x8400055a,
+       0x48026a00, 0x599c0017, 0x8c000508, 0x04000015,
+       0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800,
+       0x00020245, 0x0402000c, 0x0401f999, 0x0402000a,
+       0x59a80010, 0x59340802, 0x80040580, 0x82000500,
+       0x00ffff00, 0x04020004, 0x59340200, 0x8400055a,
+       0x48026a00, 0x81468800, 0x8058b040, 0x040207f0,
+       0x0401f884, 0x04000003, 0x59a80836, 0x0401f006,
+       0x599c0017, 0x8c000508, 0x04000007, 0x42000800,
+       0x000007d0, 0x42001000, 0x00104876, 0x0201f800,
+       0x0010606e, 0x1c01f000, 0x4803c856, 0x4d340000,
+       0x4d440000, 0x4d3c0000, 0x4c580000, 0x42001000,
+       0x00104876, 0x0201f800, 0x00105f90, 0x59a80826,
+       0x8c040d06, 0x04000015, 0x0401f86a, 0x04000013,
+       0x83ae6c00, 0x000007fe, 0x51366800, 0x59340200,
+       0x8400051a, 0x48026a00, 0x599c0017, 0x8c000508,
+       0x04000007, 0x42000800, 0x000007d0, 0x42001000,
+       0x00104876, 0x0201f800, 0x0010606e, 0x0201f800,
+       0x00101e45, 0x0401f027, 0x4200b000, 0x000007f0,
+       0x80028d80, 0x0201f800, 0x00020245, 0x0402001e,
+       0x59340200, 0x8c00051a, 0x0400001b, 0x59368c03,
+       0x417a7800, 0x42028000, 0x00000029, 0x41783000,
+       0x0201f800, 0x0010a446, 0x59340200, 0x84000558,
+       0x8400051a, 0x48026a00, 0x4937c857, 0x4a026c00,
+       0x00000707, 0x42028000, 0x00000029, 0x0201f800,
+       0x00106ab4, 0x417a7800, 0x0201f800, 0x001067fd,
+       0x80000d80, 0x0201f800, 0x0010a2ff, 0x0201f800,
+       0x00106c4b, 0x81468800, 0x8058b040, 0x040207de,
+       0x5c00b000, 0x5c027800, 0x5c028800, 0x5c026800,
+       0x1c01f000, 0x4933c857, 0x59303809, 0x581c0200,
+       0x8400051a, 0x48003a00, 0x1c01f000, 0x4803c856,
+       0x42026800, 0x0010b524, 0x497a680e, 0x42028800,
+       0x000007ff, 0x0201f800, 0x001042b4, 0x4937c857,
+       0x4a026c00, 0x00000606, 0x4a026802, 0x00ffffff,
+       0x4a026a04, 0x00000200, 0x4a026c04, 0x00000002,
+       0x1c01f000, 0x59300009, 0x50000000, 0x4933c857,
+       0x4803c857, 0x8c00050e, 0x1c01f000, 0x59300009,
+       0x50000000, 0x8c00050a, 0x1c01f000, 0x4933c856,
+       0x0401f90f, 0x04000006, 0x59340400, 0x82000d00,
+       0x000000ff, 0x82041580, 0x00000005, 0x1c01f000,
+       0x4d340000, 0x83ac0400, 0x000007fe, 0x50000000,
+       0x80026d40, 0x04000003, 0x59340200, 0x8c00051a,
+       0x5c026800, 0x1c01f000, 0x4937c857, 0x493fc857,
+       0x59340403, 0x81ac0400, 0x50000000, 0x81340580,
+       0x02020800, 0x001005d8, 0x59341200, 0x813e79c0,
+       0x04000003, 0x8408155e, 0x0401f002, 0x8408151e,
+       0x480a6a00, 0x1c01f000, 0x4937c857, 0x0201f800,
+       0x0010210a, 0x04000006, 0x59a80835, 0x42001000,
+       0x00104910, 0x0201f800, 0x0010606e, 0x1c01f000,
+       0x4937c857, 0x42001000, 0x00104910, 0x0201f800,
+       0x00105f90, 0x59a81026, 0x84081512, 0x480b5026,
+       0x1c01f000, 0x4c380000, 0x4c340000, 0x4c240000,
+       0x4c600000, 0x4008c000, 0x83440480, 0x00000800,
+       0x04021045, 0x80002d80, 0x41442000, 0x83447400,
+       0x0010ac00, 0x4200b000, 0x000007f0, 0x83444c80,
+       0x000007f0, 0x04001003, 0x4200b000, 0x00000010,
+       0x50380000, 0x80000540, 0x0402001e, 0x41440000,
+       0x80100580, 0x04020043, 0x40102800, 0x82104c80,
+       0x000007f0, 0x04001015, 0x82104d80, 0x000007fc,
+       0x04020005, 0x82604d80, 0x00fffffc, 0x0402002a,
+       0x0401f00e, 0x82104d80, 0x000007fd, 0x04020005,
+       0x82604d80, 0x00fffffd, 0x04020023, 0x0401f007,
+       0x82104d80, 0x000007ff, 0x0402001f, 0x82604d80,
+       0x00ffffff, 0x0402001c, 0x84142d5e, 0x0401f029,
+       0x40006800, 0x58343002, 0x82183500, 0x00ffffff,
+       0x40180000, 0x80600580, 0x04020019, 0x40100000,
+       0x81440580, 0x0402000a, 0x40366800, 0x8c204508,
+       0x04000053, 0x0401ff8a, 0x04020051, 0x4947c857,
+       0x42000000, 0x0000001d, 0x0401f04e, 0x4947c857,
+       0x480bc857, 0x4823c857, 0x42000000, 0x0000001a,
+       0x0401f048, 0x4947c857, 0x4863c857, 0x4813c857,
+       0x42000000, 0x00000019, 0x0401f042, 0x40100000,
+       0x81440580, 0x04020007, 0x58343002, 0x4947c857,
+       0x481bc857, 0x42000000, 0x0000001b, 0x0401f039,
+       0x80102000, 0x80387000, 0x83444c80, 0x000007f0,
+       0x04001009, 0x82104d80, 0x00000800, 0x0402000c,
+       0x42002000, 0x000007f0, 0x42007000, 0x0010b3f0,
+       0x0401f007, 0x82104d80, 0x000007f0, 0x04020004,
+       0x41782000, 0x42007000, 0x0010ac00, 0x8058b040,
+       0x040207a4, 0x801429c0, 0x04020007, 0x0201f800,
+       0x001005d8, 0x4947c857, 0x42000000, 0x0000000a,
+       0x0401f01c, 0x4d2c0000, 0x4c180000, 0x40603000,
+       0x0401fc12, 0x4947c857, 0x4937c857, 0x5c003000,
+       0x5c025800, 0x040207f4, 0x497a6a12, 0x59a80026,
+       0x8c00050a, 0x0402000d, 0x82600500, 0x00ffff00,
+       0x04000006, 0x59a84810, 0x82244d00, 0x00ffff00,
+       0x80240580, 0x04020005, 0x82600500, 0x000000ff,
+       0x800000d0, 0x48026a12, 0x48626802, 0x80000580,
+       0x80000540, 0x5c00c000, 0x5c004800, 0x5c006800,
+       0x5c007000, 0x1c01f000, 0x5934000f, 0x5934140b,
+       0x80081040, 0x04001002, 0x480a6c0b, 0x80000540,
+       0x02020800, 0x00020253, 0x1c01f000, 0x4803c857,
+       0x4947c857, 0x4c300000, 0x82006500, 0x00000030,
+       0x04000006, 0x4c000000, 0x0201f800, 0x0010942a,
+       0x5c000000, 0x0402000b, 0x8c00050e, 0x04000006,
+       0x0201f800, 0x00020245, 0x04020006, 0x4937c857,
+       0x0401fc2f, 0x80000580, 0x5c006000, 0x1c01f000,
+       0x82000540, 0x00000001, 0x0401f7fc, 0x4803c857,
+       0x4c580000, 0x4d440000, 0x40001000, 0x80000d80,
+       0x4200b000, 0x000007f0, 0x4c040000, 0x40068800,
+       0x4c080000, 0x40080000, 0x0401ffdd, 0x5c001000,
+       0x5c000800, 0x80040800, 0x8058b040, 0x040207f7,
+       0x5c028800, 0x5c00b000, 0x1c01f000, 0x4c5c0000,
+       0x59340400, 0x8200bd80, 0x00000606, 0x5c00b800,
+       0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80,
+       0x00000404, 0x5c00b800, 0x1c01f000, 0x4c5c0000,
+       0x59340400, 0x8200bd80, 0x00000404, 0x04000003,
+       0x8200bd80, 0x00000606, 0x5c00b800, 0x1c01f000,
+       0x4c5c0000, 0x4c600000, 0x59340400, 0x8200bd00,
+       0x0000ff00, 0x825cc580, 0x00000400, 0x04000003,
+       0x825cc580, 0x00000600, 0x5c00c000, 0x5c00b800,
+       0x1c01f000, 0x4c5c0000, 0x59340400, 0x82000500,
+       0x000000ff, 0x8200bd80, 0x00000003, 0x04000003,
+       0x8200bd80, 0x00000005, 0x5c00b800, 0x1c01f000,
+       0x4c5c0000, 0x59340400, 0x82000500, 0x0000ff00,
+       0x8400b9c0, 0x805c0580, 0x4937c857, 0x4803c857,
+       0x48026c00, 0x5c00b800, 0x1c01f000, 0x4c040000,
+       0x4c080000, 0x592c0207, 0x8c00050c, 0x0400000f,
+       0x592e8c06, 0x82000500, 0x00000080, 0x84000548,
+       0x4d3c0000, 0x42027800, 0x00001000, 0x0401ff90,
+       0x5c027800, 0x82000540, 0x00000001, 0x5c001000,
+       0x5c000800, 0x1c01f000, 0x80000580, 0x0401f7fc,
+       0x592c040b, 0x82000500, 0x0000e000, 0x82000580,
+       0x00006000, 0x04000019, 0x836c0580, 0x00000003,
+       0x04000016, 0x836c0580, 0x00000002, 0x040200ff,
+       0x59a80026, 0x82000d00, 0x00000038, 0x04020005,
+       0x59a80832, 0x800409c0, 0x0400000c, 0x0401f0f7,
+       0x82000d00, 0x00000003, 0x82040d80, 0x00000003,
+       0x040200f2, 0x82000d00, 0x00000028, 0x04020003,
+       0x8c00050c, 0x040000ed, 0x592c100a, 0x82080500,
+       0xff000000, 0x040200ce, 0x59a80010, 0x80080580,
+       0x040000c8, 0x592c0c0b, 0x82040d00, 0x0000e000,
+       0x82040480, 0x00008000, 0x040210c8, 0x592e8c06,
+       0x83440480, 0x00000800, 0x04001007, 0x83440580,
+       0x0000ffff, 0x040200af, 0x800409c0, 0x040200f7,
+       0x0401f0ac, 0x800409c0, 0x040200f4, 0x41784000,
+       0x0401fead, 0x040200db, 0x42027000, 0x00000053,
+       0x592c2409, 0x82100500, 0xffffff00, 0x040200aa,
+       0x4813c857, 0x592c000c, 0x800001c0, 0x04000083,
+       0x82100580, 0x00000004, 0x040000a0, 0x82100580,
+       0x00000051, 0x0400009d, 0x82100580, 0x00000003,
+       0x04000016, 0x82100580, 0x00000020, 0x0400004b,
+       0x82100580, 0x00000024, 0x04000042, 0x82100580,
+       0x00000021, 0x04000042, 0x82100580, 0x00000050,
+       0x04000037, 0x82100580, 0x00000052, 0x04000031,
+       0x82100580, 0x00000005, 0x0402006b, 0x42027000,
+       0x00000001, 0x0401f01b, 0x42027000, 0x00000002,
+       0x59a80005, 0x8c000514, 0x04000016, 0x0401ff4c,
+       0x04000014, 0x59340212, 0x82000500, 0x0000ff00,
+       0x42001000, 0x00000010, 0x0402000c, 0x59a80026,
+       0x8c000506, 0x0402006f, 0x42001000, 0x00000008,
+       0x59340002, 0x82000500, 0x00ff0000, 0x82000580,
+       0x00ff0000, 0x04000003, 0x0401f9bf, 0x04020065,
+       0x0201f800, 0x0002075a, 0x0400007e, 0x4a026406,
+       0x00000010, 0x49366009, 0x42000800, 0x00000003,
+       0x83380580, 0x00000002, 0x04000003, 0x42000800,
+       0x0000000b, 0x0201f800, 0x00104571, 0x0401f044,
+       0x42027000, 0x00000000, 0x0401f003, 0x42027000,
+       0x00000004, 0x0401ff37, 0x04020071, 0x0401f036,
+       0x42027000, 0x00000033, 0x0401f006, 0x42027000,
+       0x00000005, 0x0401f003, 0x42027000, 0x00000003,
+       0x0401ff23, 0x04020066, 0x59a80005, 0x8c000514,
+       0x04000016, 0x0401ff12, 0x04000014, 0x59340212,
+       0x82000500, 0x0000ff00, 0x42001000, 0x00000010,
+       0x0402000c, 0x59a80026, 0x8c000506, 0x04020035,
+       0x42001000, 0x00000008, 0x59340002, 0x82000500,
+       0x00ff0000, 0x82000580, 0x00ff0000, 0x04000003,
+       0x0401f985, 0x0402002b, 0x0201f800, 0x0002075a,
+       0x04000044, 0x4a026406, 0x00000010, 0x49366009,
+       0x42000800, 0x00000005, 0x83380580, 0x00000003,
+       0x04000003, 0x42000800, 0x00000009, 0x0201f800,
+       0x00104571, 0x0401f00a, 0x82102580, 0x00000011,
+       0x0402002d, 0x0201f800, 0x0002075a, 0x04000031,
+       0x4a026406, 0x00000010, 0x49366009, 0x492e6008,
+       0x49325808, 0x813669c0, 0x04000007, 0x592c0c0b,
+       0x8c040d18, 0x04000004, 0x59340200, 0x84000514,
+       0x48026a00, 0x0201f800, 0x000207a1, 0x80000580,
+       0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd,
+       0x42001000, 0x0000000a, 0x0401f015, 0x42001000,
+       0x00000010, 0x0401f012, 0x42001000, 0x00000016,
+       0x0401f00f, 0x42001000, 0x00000017, 0x0401f00c,
+       0x42001000, 0x00000018, 0x0401f009, 0x42001000,
+       0x0000001b, 0x0401f006, 0x42001000, 0x0000001e,
+       0x0401f003, 0x42001000, 0x00000020, 0x42000800,
+       0x00000019, 0x42028000, 0x00000031, 0x0401f7e2,
+       0x42000800, 0x00000003, 0x0401f003, 0x42000800,
+       0x0000000a, 0x41781000, 0x0401f7f7, 0x42000800,
+       0x00000009, 0x59341400, 0x0401f7f3, 0x42028000,
+       0x00000008, 0x0401f005, 0x42000800, 0x00000007,
+       0x416c1000, 0x0401f7ec, 0x41780800, 0x41781000,
+       0x0401f7cd, 0x42028000, 0x00000000, 0x0401f7fb,
+       0x82004d80, 0x0000001d, 0x02000800, 0x001005d8,
+       0x82004d80, 0x0000001a, 0x04020004, 0x40101000,
+       0x40000800, 0x0401f7dc, 0x82004d80, 0x0000001b,
+       0x04020003, 0x40181000, 0x0401f7fa, 0x82004d80,
+       0x0000001c, 0x040007f7, 0x82004d80, 0x00000019,
+       0x040007b8, 0x0401f7d6, 0x592e6008, 0x0201f800,
+       0x0010941a, 0x040007b6, 0x59300c06, 0x82040580,
+       0x00000011, 0x040207d6, 0x83440580, 0x0000ffff,
+       0x04020005, 0x59326809, 0x813669c0, 0x0400000e,
+       0x0401f7cf, 0x592c100a, 0x82081500, 0x00ffffff,
+       0x41784000, 0x0401fda8, 0x040207d6, 0x59300009,
+       0x800001c0, 0x04000003, 0x81340580, 0x040207c4,
+       0x49366009, 0x592c0c0b, 0x82041500, 0x0000e000,
+       0x82080580, 0x00006000, 0x04000009, 0x59300a03,
+       0x82040580, 0x00000007, 0x040207b9, 0x492e6008,
+       0x42027000, 0x00000054, 0x0401f77f, 0x0201f800,
+       0x0010a8d4, 0x040007bc, 0x0401f7b1, 0x492fc857,
+       0x59a80021, 0x800001c0, 0x04020073, 0x592e6008,
+       0x4933c857, 0x0201f800, 0x0010941a, 0x04000041,
+       0x59301406, 0x82080580, 0x00000005, 0x0402005b,
+       0x59301203, 0x82080580, 0x00000007, 0x04020057,
+       0x592e8c06, 0x83440480, 0x00000800, 0x04021032,
+       0x41784000, 0x592c1009, 0x82081500, 0x00ffffff,
+       0x0401fd75, 0x0402005f, 0x59300009, 0x800001c0,
+       0x04000003, 0x81340580, 0x04020048, 0x4d300000,
+       0x592e6013, 0x4933c857, 0x83300580, 0xffffffff,
+       0x0400000d, 0x0201f800, 0x0010941a, 0x5c026000,
+       0x04000029, 0x591c1406, 0x82080580, 0x00000006,
+       0x04000046, 0x82080580, 0x00000011, 0x04000043,
+       0x0401f002, 0x5c026000, 0x59a80010, 0x592c100a,
+       0x82081500, 0x00ffffff, 0x80081580, 0x04020017,
+       0x592c1009, 0x82081500, 0x00ffffff, 0x80081580,
+       0x0400000f, 0x49366009, 0x492e6008, 0x42027000,
+       0x00000092, 0x0201f800, 0x000207a1, 0x80000580,
+       0x1c01f000, 0x42001000, 0x0000000a, 0x0401f00c,
+       0x42001000, 0x00000010, 0x0401f009, 0x42001000,
+       0x00000014, 0x0401f006, 0x42001000, 0x00000018,
+       0x0401f003, 0x42001000, 0x0000003c, 0x492fc857,
+       0x480bc857, 0x42000800, 0x00000019, 0x42028000,
+       0x00000031, 0x82000540, 0x00000001, 0x0401f7e9,
+       0x492fc857, 0x4803c857, 0x480bc857, 0x40000800,
+       0x0401f7f7, 0x492fc857, 0x42000800, 0x0000000a,
+       0x41781000, 0x0401f7f2, 0x4933c857, 0x59300406,
+       0x4803c857, 0x59300203, 0x4803c857, 0x59300009,
+       0x4803c857, 0x42028000, 0x00000008, 0x41780800,
+       0x41781000, 0x0401f7e8, 0x42000800, 0x0000001e,
+       0x0401f7f0, 0x42000800, 0x00000001, 0x0401f7ed,
+       0x82004d80, 0x0000001d, 0x02000800, 0x001005d8,
+       0x82004d80, 0x0000001a, 0x04020003, 0x40101000,
+       0x0401f7dc, 0x82004d80, 0x0000001b, 0x04020003,
+       0x40181000, 0x0401f7d7, 0x82004d80, 0x0000001c,
+       0x040007d4, 0x82004d80, 0x00000019, 0x040007d1,
+       0x0401f7d5, 0x59302009, 0x801021c0, 0x04000035,
+       0x58101400, 0x82081d00, 0x000000ff, 0x59300c03,
+       0x82040580, 0x00000008, 0x04000022, 0x82040580,
+       0x0000000a, 0x04000017, 0x82040580, 0x0000000c,
+       0x04000010, 0x82040580, 0x00000002, 0x04000019,
+       0x82040580, 0x00000001, 0x04000012, 0x82040580,
+       0x00000003, 0x0400000b, 0x82040580, 0x00000005,
+       0x04000004, 0x82040580, 0x00000033, 0x04020019,
+       0x820c0580, 0x00000009, 0x0400000d, 0x0401f015,
+       0x820c0580, 0x00000005, 0x04000009, 0x0401f011,
+       0x820c0580, 0x0000000b, 0x04000005, 0x0401f00d,
+       0x820c0580, 0x00000003, 0x0402000a, 0x82081d00,
+       0xffffff00, 0x840c01c0, 0x800c0540, 0x4813c857,
+       0x480bc857, 0x4807c857, 0x4803c857, 0x48002400,
+       0x1c01f000, 0x599c0017, 0x8c00050a, 0x04000003,
+       0x80000580, 0x1c01f000, 0x59a80026, 0x82000500,
+       0x00000028, 0x04000008, 0x42028800, 0x000007fd,
+       0x0201f800, 0x00020245, 0x04020003, 0x5934000a,
+       0x8c000504, 0x1c01f000, 0x4d300000, 0x5934000e,
+       0x80026540, 0x04000006, 0x0201f800, 0x001062d5,
+       0x02000800, 0x001064ad, 0x497a680e, 0x5c026000,
+       0x1c01f000, 0x4d440000, 0x4d340000, 0x80000580,
+       0x40001800, 0x40028800, 0x82080580, 0x00000008,
+       0x04020003, 0x42001800, 0x00000001, 0x0201f800,
+       0x00020245, 0x0402000a, 0x0401fd6d, 0x04020008,
+       0x800c19c0, 0x04000004, 0x59340405, 0x8c000508,
+       0x04000003, 0x80081040, 0x04000009, 0x81468800,
+       0x83440480, 0x00000800, 0x040017f1, 0x80000580,
+       0x5c026800, 0x5c028800, 0x1c01f000, 0x82000540,
+       0x00000001, 0x5c026800, 0x5c028800, 0x1c01f000,
+       0x4a033020, 0x00000000, 0x497b3026, 0x497b3027,
+       0x497b3028, 0x497b3029, 0x497b302b, 0x497b3021,
+       0x4a03b104, 0x60000001, 0x1c01f000, 0x4803c856,
+       0x599c0018, 0x497b3024, 0x497b3025, 0x82000500,
+       0x0000000f, 0x82000d80, 0x00000005, 0x04000006,
+       0x82000580, 0x00000006, 0x0400000d, 0x497b3022,
+       0x1c01f000, 0x4a033022, 0x00000005, 0x599c0216,
+       0x82000500, 0x0000ffff, 0x04020003, 0x42000000,
+       0x00000002, 0x48033023, 0x1c01f000, 0x4a033022,
+       0x00000006, 0x0401f7f6, 0x0401ffe5, 0x4a03c826,
+       0x00000004, 0x599c0209, 0x80000540, 0x0400001f,
+       0x599c0207, 0x80000540, 0x04000007, 0x800000cc,
+       0x599c080d, 0x80040400, 0x4803b100, 0x497bb102,
+       0x59d80101, 0x599c000d, 0x4803b100, 0x599c000e,
+       0x4803b101, 0x599c0207, 0x80000540, 0x04020002,
+       0x497bb102, 0x599c0a09, 0x82040540, 0x00400000,
+       0x59980822, 0x4803b103, 0x4a03b109, 0x00000004,
+       0x4a03b104, 0x10000001, 0x800409c0, 0x04020004,
+       0x4a033020, 0x00000001, 0x1c01f000, 0x4a033020,
+       0x00000002, 0x0401f7fd, 0x59980022, 0x4803c856,
+       0x80000540, 0x02000000, 0x000202de, 0x0401f017,
+       0x42034000, 0x0010b4a4, 0x59a1d81e, 0x80edd9c0,
+       0x02000800, 0x001005d8, 0x58ec0009, 0x48efc857,
+       0x49a3c857, 0x492fc857, 0x4803c857, 0x800001c0,
+       0x08020000, 0x0201f800, 0x001005d8, 0x5931d821,
+       0x58ef400b, 0x58ec0009, 0x800001c0, 0x08020000,
+       0x0201f800, 0x001005d8, 0x497a5800, 0x59980026,
+       0x80000540, 0x0402008c, 0x59d80105, 0x82000d00,
+       0x00018780, 0x040201da, 0x80000106, 0x82000500,
+       0x00000003, 0x0c01f001, 0x00104d0a, 0x00104d89,
+       0x00104d22, 0x00104d50, 0x592c0001, 0x492fc857,
+       0x492fb107, 0x80000d40, 0x04020007, 0x59940019,
+       0x80000540, 0x04022003, 0x59980023, 0x48032819,
+       0x1c01f000, 0x497a5801, 0x40065800, 0x592c0001,
+       0x496a5800, 0x815eb800, 0x412ed000, 0x80000d40,
+       0x040207f9, 0x59c80000, 0x82000540, 0x00001200,
+       0x48039000, 0x0401f7ee, 0x492fc857, 0x492fb107,
+       0x592c0001, 0x80000d40, 0x04020012, 0x59da5908,
+       0x835c0480, 0x00000020, 0x0400101c, 0x0402b01a,
+       0x492fb007, 0x0400e7fa, 0x59d80105, 0x82000500,
+       0x00018780, 0x040201aa, 0x59940019, 0x80000540,
+       0x04022003, 0x59980023, 0x48032819, 0x1c01f000,
+       0x497a5801, 0x40065800, 0x592c0001, 0x496a5800,
+       0x815eb800, 0x412ed000, 0x80000d40, 0x040207f9,
+       0x59c80000, 0x82000540, 0x00001200, 0x48039000,
+       0x0401f7e3, 0x0400f009, 0x496a5800, 0x412ed000,
+       0x815eb800, 0x59c80000, 0x82000540, 0x00001200,
+       0x48039000, 0x0401f7e0, 0x492fa807, 0x0401f7de,
+       0x492fc857, 0x59d81108, 0x45681000, 0x400ad000,
+       0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540,
+       0x00001200, 0x48039000, 0x0402d00c, 0x592c0001,
+       0x492fc857, 0x492fb107, 0x80000d40, 0x0402001d,
+       0x59940019, 0x80000540, 0x04022003, 0x59980023,
+       0x48032819, 0x1c01f000, 0x59d80105, 0x82000500,
+       0x00018780, 0x04020172, 0x42000000, 0x0010b855,
+       0x0201f800, 0x0010aa47, 0x59980026, 0x59980828,
+       0x80000000, 0x48033026, 0x492fc857, 0x800409c0,
+       0x492f3028, 0x04000003, 0x492c0800, 0x0401f002,
+       0x492f3029, 0x592c0001, 0x80000d40, 0x040007e5,
+       0x497a5801, 0x40065800, 0x592c0001, 0x496a5800,
+       0x815eb800, 0x412ed000, 0x80000d40, 0x040207f9,
+       0x59c80000, 0x82000540, 0x00001200, 0x48039000,
+       0x0401f7d8, 0x59980026, 0x59980828, 0x80000000,
+       0x48033026, 0x492fc857, 0x800409c0, 0x492f3028,
+       0x04000003, 0x492c0800, 0x0401f002, 0x492f3029,
+       0x592c0001, 0x80000d40, 0x04020027, 0x0402d00e,
+       0x59980029, 0x80025d40, 0x0400000f, 0x59980026,
+       0x80000040, 0x48033026, 0x04020002, 0x48033028,
+       0x592c0000, 0x48033029, 0x492fc857, 0x492fb107,
+       0x0400d7f4, 0x42000000, 0x0010b855, 0x0201f800,
+       0x0010aa47, 0x0402e00a, 0x59da5908, 0x496a5800,
+       0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000,
+       0x82000540, 0x00001200, 0x48039000, 0x59d80105,
+       0x82000500, 0x00018780, 0x04020125, 0x59940019,
+       0x80000540, 0x04022003, 0x59980023, 0x48032819,
+       0x1c01f000, 0x497a5801, 0x40065800, 0x592c0001,
+       0x496a5800, 0x815eb800, 0x412ed000, 0x80000d40,
+       0x040207f9, 0x59c80000, 0x82000540, 0x00001200,
+       0x48039000, 0x0401f7ce, 0x592c0204, 0x4803c856,
+       0x04000008, 0x42034000, 0x0010b4a4, 0x59a1d81e,
+       0x80edd9c0, 0x02000800, 0x001005d8, 0x0401f003,
+       0x5931d821, 0x58ef400b, 0x58ec0009, 0x800001c0,
+       0x08020000, 0x0201f800, 0x001005d8, 0x497a5801,
+       0x40065800, 0x592c0001, 0x496a5800, 0x412ed000,
+       0x815eb800, 0x80000d40, 0x040207f9, 0x59c80000,
+       0x82000540, 0x00001200, 0x48039000, 0x1c01f000,
+       0x497a5801, 0x40065800, 0x592c0001, 0x496a5800,
+       0x412ed000, 0x815eb800, 0x80000d40, 0x040207f9,
+       0x59c80000, 0x82000540, 0x00001200, 0x48039000,
+       0x0200e000, 0x000202fb, 0x0201f000, 0x00020302,
+       0x5998002b, 0x84000540, 0x4803302b, 0x0201f000,
+       0x0002035e, 0x42000000, 0x0010b855, 0x0201f800,
+       0x0010aa47, 0x492fc857, 0x59980026, 0x59980828,
+       0x80000000, 0x48033026, 0x800409c0, 0x492f3028,
+       0x04000003, 0x492c0800, 0x0401f002, 0x492f3029,
+       0x592c0001, 0x80000d40, 0x04020002, 0x1c01f000,
+       0x497a5801, 0x40065800, 0x592c0001, 0x496a5800,
+       0x412ed000, 0x815eb800, 0x80000d40, 0x040207f9,
+       0x59c80000, 0x82000540, 0x00001200, 0x48039000,
+       0x1c01f000, 0x59980026, 0x59980828, 0x80000000,
+       0x48033026, 0x492fc857, 0x800409c0, 0x492f3028,
+       0x04000003, 0x492c0800, 0x0401f002, 0x492f3029,
+       0x592c0001, 0x80000d40, 0x04020039, 0x0402d00e,
+       0x59980029, 0x80025d40, 0x0400000f, 0x59980026,
+       0x80000040, 0x48033026, 0x04020002, 0x48033028,
+       0x592c0000, 0x48033029, 0x492fc857, 0x492fb107,
+       0x0400d7f4, 0x42000000, 0x0010b855, 0x0201f800,
+       0x0010aa47, 0x0402e01d, 0x59da5908, 0x496a5800,
+       0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000,
+       0x82000540, 0x00001200, 0x48039000, 0x04006018,
+       0x59d8010a, 0x59d8090a, 0x80040d80, 0x040207fd,
+       0x900001c0, 0x82000540, 0x00000013, 0x4803c011,
+       0x5998002b, 0x84000500, 0x4803302b, 0x59e00017,
+       0x8c000508, 0x04000003, 0x4a03c017, 0x00000003,
+       0x4203e000, 0x30000001, 0x59d80105, 0x82000500,
+       0x00018780, 0x0402007e, 0x1c01f000, 0x5998002b,
+       0x84000540, 0x4803302b, 0x0401f7f8, 0x497a5801,
+       0x40065800, 0x592c0001, 0x496a5800, 0x412ed000,
+       0x815eb800, 0x80000d40, 0x040207f9, 0x59c80000,
+       0x82000540, 0x00001200, 0x48039000, 0x0401f7bc,
+       0x5c000000, 0x4c000000, 0x4803c857, 0x492fc857,
+       0x4943c857, 0x4807c857, 0x4a025a04, 0x00000103,
+       0x49425a06, 0x48065a08, 0x4a025c06, 0x0000ffff,
+       0x813261c0, 0x04000003, 0x59300402, 0x48025c06,
+       0x832c0400, 0x00000009, 0x04011000, 0x4803c840,
+       0x4a03c842, 0x0000000b, 0x04011000, 0x1c01f000,
+       0x4df00000, 0x4203e000, 0x50000000, 0x599cb817,
+       0x59940019, 0x80000540, 0x04002023, 0x0400000e,
+       0x59980022, 0x82000580, 0x00000005, 0x0400001e,
+       0x59a80069, 0x81640580, 0x0402001b, 0x8c5cbd08,
+       0x04000005, 0x59a8006a, 0x59a80866, 0x80040580,
+       0x04020015, 0x8c5cbd08, 0x04020030, 0x59d8090b,
+       0x59d8010a, 0x80040580, 0x0400000d, 0x0400600e,
+       0x4a03c011, 0x80400012, 0x4a03c020, 0x00008040,
+       0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017,
+       0x00000002, 0x4203e000, 0x30000001, 0x4a032819,
+       0xffff0000, 0x04026835, 0x04006003, 0x8c5cbd08,
+       0x04020860, 0x59980029, 0x80025d40, 0x04000010,
+       0x59d80105, 0x82000500, 0x00018780, 0x04020020,
+       0x0402d00d, 0x59980026, 0x492fc857, 0x80000040,
+       0x48033026, 0x592c0000, 0x492fb107, 0x48033029,
+       0x04020003, 0x4803c856, 0x48033028, 0x5c03e000,
+       0x1c01f000, 0x42000000, 0x0010b855, 0x0201f800,
+       0x0010aa47, 0x0401f7fa, 0x59e0000f, 0x59e0080f,
+       0x80040580, 0x040207fd, 0x59e00010, 0x59e01010,
+       0x80081580, 0x040207fd, 0x40065000, 0x80041580,
+       0x040007c7, 0x040067dc, 0x0401f7ca, 0x4803c857,
+       0x485fc857, 0x8c00050e, 0x02020800, 0x001005d0,
+       0x4203e000, 0x50000000, 0x4200b800, 0x00008004,
+       0x0201f000, 0x001005dd, 0x5998002b, 0x8c000500,
+       0x04000013, 0x84000500, 0x4803302b, 0x59d8010a,
+       0x59d8090a, 0x80040580, 0x040207fd, 0x800408e0,
+       0x82040d40, 0x00000013, 0x4807c011, 0x59e00017,
+       0x8c000508, 0x04000003, 0x4a03c017, 0x00000003,
+       0x4203e000, 0x30000001, 0x1c01f000, 0x0402e014,
+       0x59da5908, 0x496a5800, 0x412ed000, 0x815eb800,
+       0x0400e7fc, 0x59c80000, 0x82000540, 0x00001200,
+       0x48039000, 0x59d8090b, 0x59980024, 0x48073024,
+       0x80040480, 0x04020004, 0x59940019, 0x80000540,
+       0x04022003, 0x59980823, 0x48072819, 0x59d80105,
+       0x82000500, 0x00018780, 0x040207c9, 0x1c01f000,
+       0x59981025, 0x59e00010, 0x59e00810, 0x80041d80,
+       0x040207fd, 0x80080580, 0x04000013, 0x48073025,
+       0x59e0000f, 0x59e0100f, 0x80081d80, 0x040207fd,
+       0x81280580, 0x04000008, 0x400a5000, 0x40080000,
+       0x80040580, 0x04000003, 0x59980823, 0x48072819,
+       0x1c01f000, 0x59940019, 0x80000540, 0x040227f8,
+       0x0401f7fc, 0x59e0000f, 0x59e0100f, 0x80081d80,
+       0x040207fd, 0x81280580, 0x040007f6, 0x400a5000,
+       0x59940019, 0x80000540, 0x040027ed, 0x0401f7f1,
+       0x59a80017, 0x82000c80, 0x0000000a, 0x02021800,
+       0x001005d8, 0x0c01f809, 0x4a038805, 0x000000f0,
+       0x59c400a3, 0x82000500, 0x02870000, 0x02020800,
+       0x001005d8, 0x1c01f000, 0x00104fc5, 0x00104f51,
+       0x00104f6c, 0x00104f95, 0x00104fb8, 0x00104ff2,
+       0x00105004, 0x00104f6c, 0x00104fd6, 0x00104f50,
+       0x1c01f000, 0x4a038808, 0x00000004, 0x0401f8f9,
+       0x0201f800, 0x001053ab, 0x59c40805, 0x8c040d0e,
+       0x04020013, 0x8c040d0a, 0x0402000b, 0x8c040d0c,
+       0x04020006, 0x8c040d08, 0x0400000d, 0x4a035017,
+       0x00000003, 0x0401f00a, 0x4a035017, 0x00000000,
+       0x0401f007, 0x42000000, 0x0010b844, 0x0201f800,
+       0x0010aa47, 0x4a035017, 0x00000002, 0x1c01f000,
+       0x4a038808, 0x00000002, 0x0401f8de, 0x59c40805,
+       0x8c040d08, 0x04020021, 0x8c040d0c, 0x0402001c,
+       0x8c040d0e, 0x04020017, 0x82040500, 0x000000f0,
+       0x0402001c, 0x0201f800, 0x001053ab, 0x4a038808,
+       0x00000080, 0x59c40002, 0x8400050c, 0x48038802,
+       0x0401f9d9, 0x4d3c0000, 0x42027800, 0x00000001,
+       0x0201f800, 0x00109874, 0x5c027800, 0x4a038808,
+       0x00000080, 0x4a035017, 0x00000009, 0x0401f009,
+       0x4a035017, 0x00000001, 0x0401f006, 0x4a035017,
+       0x00000000, 0x0401f003, 0x4a035017, 0x00000003,
+       0x1c01f000, 0x0401f8b7, 0x4a038808, 0x00000080,
+       0x59c40805, 0x8c040d0a, 0x0402001b, 0x8c040d0c,
+       0x04020016, 0x8c040d0e, 0x04020011, 0x82040500,
+       0x000000f0, 0x04020016, 0x59c40002, 0x8400050c,
+       0x48038802, 0x0401f9b4, 0x4d3c0000, 0x42027800,
+       0x00000001, 0x0201f800, 0x00109874, 0x5c027800,
+       0x4a035017, 0x00000009, 0x0401f009, 0x4a035017,
+       0x00000001, 0x0401f006, 0x4a035017, 0x00000000,
+       0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000,
+       0x4a038808, 0x00000008, 0x59c40805, 0x8c040d0c,
+       0x04020006, 0x8c040d0e, 0x04000006, 0x4a035017,
+       0x00000001, 0x0401f003, 0x4a035017, 0x00000000,
+       0x1c01f000, 0x0401f8d3, 0x59c40805, 0x8c040d0c,
+       0x0402000d, 0x4c040000, 0x0401f882, 0x5c000800,
+       0x8c040d0a, 0x04020006, 0x8c040d0e, 0x04000006,
+       0x4a035017, 0x00000001, 0x0401f003, 0x4a035017,
+       0x00000002, 0x1c01f000, 0x4a038808, 0x00000008,
+       0x42001000, 0x00105058, 0x0201f800, 0x00106084,
+       0x59c40805, 0x8c040d0a, 0x0402000d, 0x8c040d08,
+       0x0402000b, 0x8c040d0c, 0x04020006, 0x8c040d0e,
+       0x0400000d, 0x4a035017, 0x00000001, 0x0401f00a,
+       0x4a035017, 0x00000000, 0x0401f007, 0x42000000,
+       0x0010b844, 0x0201f800, 0x0010aa47, 0x4a035017,
+       0x00000004, 0x1c01f000, 0x0401f8a6, 0x0401f859,
+       0x59c40805, 0x8c040d0a, 0x0402000b, 0x8c040d0c,
+       0x04020006, 0x8c040d0e, 0x04000009, 0x4a035017,
+       0x00000001, 0x0401f006, 0x4a035017, 0x00000000,
+       0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000,
+       0x4a038808, 0x00000004, 0x0401f846, 0x59c40805,
+       0x8c040d0a, 0x04020010, 0x8c040d08, 0x0402000b,
+       0x8c040d0c, 0x04020006, 0x8c040d0e, 0x0400000c,
+       0x4a035017, 0x00000001, 0x0401f009, 0x4a035017,
+       0x00000000, 0x0401f006, 0x4a035017, 0x00000003,
+       0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000,
+       0x0401f91f, 0x02020800, 0x001005d8, 0x59a80805,
+       0x8c040d0c, 0x04000015, 0x84040d0c, 0x48075005,
+       0x4a038805, 0x00000010, 0x0201f800, 0x00101937,
+       0x59c40005, 0x8c000508, 0x04000008, 0x4a038808,
+       0x00000008, 0x4a035033, 0x00000001, 0x4202d800,
+       0x00000001, 0x0401f01a, 0x59c40006, 0x84000548,
+       0x48038806, 0x0401f016, 0x59a80017, 0x82000580,
+       0x00000001, 0x0400000c, 0x59a80017, 0x82000580,
+       0x00000005, 0x0402000c, 0x42000000, 0x0010b844,
+       0x0201f800, 0x0010aa47, 0x4a035017, 0x00000008,
+       0x0401f007, 0x42000000, 0x0010b844, 0x0201f800,
+       0x0010aa47, 0x4a035017, 0x00000004, 0x1c01f000,
+       0x4803c856, 0x4c040000, 0x4c080000, 0x42000800,
+       0x00000064, 0x42001000, 0x00105058, 0x0201f800,
+       0x00106079, 0x5c001000, 0x5c000800, 0x1c01f000,
+       0x4803c856, 0x4c040000, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x0401ffba, 0x5c000800,
+       0x1c01f000, 0x4803c856, 0x4c040000, 0x4c080000,
+       0x0201f800, 0x00106c55, 0x4df00000, 0x0201f800,
+       0x00106e21, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x59c40006, 0x84000500, 0x48038806, 0x0201f800,
+       0x00106ede, 0x497b8880, 0x0201f800, 0x0010a9c0,
+       0x0201f800, 0x0010a9ce, 0x0201f800, 0x00101815,
+       0x4a03504c, 0x00000004, 0x4202d800, 0x00000004,
+       0x4a038805, 0x00000001, 0x42001000, 0x00105058,
+       0x0201f800, 0x00106084, 0x0201f800, 0x001006d4,
+       0x0401f8c1, 0x04000006, 0x42006000, 0xfeffffff,
+       0x41786800, 0x0201f800, 0x0010427d, 0x0201f800,
+       0x00100452, 0x42000000, 0x00000001, 0x0201f800,
+       0x00101590, 0x5c001000, 0x5c000800, 0x1c01f000,
+       0x59c40008, 0x8c000508, 0x04020007, 0x4a038808,
+       0x00000010, 0x4201d000, 0x00001388, 0x0201f800,
+       0x0010608e, 0x1c01f000, 0x4c040000, 0x59a80833,
+       0x82040580, 0x00000000, 0x0400000b, 0x82040580,
+       0x00000001, 0x0400000b, 0x82040580, 0x00000002,
+       0x0400000b, 0x82040580, 0x00000003, 0x0400000b,
+       0x0401f057, 0x4a035017, 0x00000000, 0x0401f009,
+       0x4a035017, 0x00000004, 0x0401f006, 0x4a035017,
+       0x00000001, 0x0401f003, 0x4a035017, 0x00000007,
+       0x497b8880, 0x4a038893, 0x00000001, 0x41780000,
+       0x0201f800, 0x00101606, 0x0201f800, 0x00106ede,
+       0x836c0d80, 0x00000004, 0x04000008, 0x59c40006,
+       0x82000500, 0xffffff0f, 0x82000540, 0x04000001,
+       0x48038806, 0x0401f007, 0x59c40006, 0x82000500,
+       0xffffff0f, 0x82000540, 0x04000000, 0x48038806,
+       0x0401f875, 0x04020005, 0x59c40806, 0x82040d00,
+       0xfbffff0f, 0x48078806, 0x4200b000, 0x00000005,
+       0x59c40005, 0x8c000534, 0x04020033, 0x42006000,
+       0xfc18ffff, 0x42006800, 0x01000000, 0x0201f800,
+       0x0010427d, 0x0201f800, 0x00101937, 0x59c408a4,
+       0x82040d00, 0x0000000f, 0x82040d80, 0x0000000c,
+       0x0400000a, 0x42006000, 0xfeffffff, 0x42006800,
+       0x02000000, 0x0201f800, 0x0010427d, 0x8058b040,
+       0x040207e8, 0x0401f8a1, 0x0401f853, 0x04000006,
+       0x42006000, 0xfeffffff, 0x41786800, 0x0201f800,
+       0x0010427d, 0x836c0d80, 0x00000004, 0x04000006,
+       0x59a8084d, 0x42001000, 0x00105065, 0x0201f800,
+       0x0010606e, 0x4a035033, 0x00000004, 0x0401fe31,
+       0x0401f841, 0x04020008, 0x59c408a4, 0x82040d00,
+       0x0000000f, 0x82040580, 0x0000000c, 0x02020800,
+       0x001005d8, 0x5c000800, 0x1c01f000, 0x4803c856,
+       0x4c000000, 0x0201f800, 0x0010609e, 0x4a035010,
+       0x00ffffff, 0x497b5032, 0x59a8002a, 0x82000500,
+       0xffff0000, 0x4803502a, 0x497b8880, 0x497b8893,
+       0x41780000, 0x0201f800, 0x00101606, 0x59c40001,
+       0x82000500, 0xfffffcff, 0x48038801, 0x42006000,
+       0xfc18ffff, 0x41786800, 0x0201f800, 0x0010427d,
+       0x4a038808, 0x00000000, 0x5c000000, 0x800001c0,
+       0x02020800, 0x0010411d, 0x4a038805, 0x040000f0,
+       0x59c40006, 0x82000500, 0xffffffcf, 0x82000540,
+       0x440000c1, 0x48038806, 0x1c01f000, 0x4c5c0000,
+       0x59a8b832, 0x825cbd80, 0x0000aaaa, 0x5c00b800,
+       0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00,
+       0x00000030, 0x825cbd80, 0x00000000, 0x5c00b800,
+       0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00,
+       0x00000030, 0x825cbd80, 0x00000010, 0x5c00b800,
+       0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00,
+       0x00000030, 0x825cbd80, 0x00000020, 0x5c00b800,
+       0x1c01f000, 0x59a80005, 0x4803c857, 0x82000d00,
+       0x00000013, 0x04000025, 0x599c1017, 0x4d3c0000,
+       0x82000500, 0x00000011, 0x04000007, 0x42027800,
+       0x00000400, 0x0201f800, 0x00103b25, 0x0402000a,
+       0x0401f012, 0x42027800, 0x00000408, 0x0201f800,
+       0x00103b25, 0x0400000d, 0x42003000, 0x00000003,
+       0x0401f003, 0x42003000, 0x00000004, 0x42028000,
+       0x0000000e, 0x0201f800, 0x0010a449, 0x599c1017,
+       0x8c08150a, 0x04020007, 0x42028000, 0x00000004,
+       0x0201f800, 0x00101fe5, 0x80000580, 0x0401f80d,
+       0x5c027800, 0x0401f00a, 0x0201f800, 0x00103b25,
+       0x04000007, 0x42028000, 0x0000000f, 0x42003000,
+       0x00000001, 0x0201f800, 0x0010a449, 0x1c01f000,
+       0x59a80005, 0x04000004, 0x82000540, 0x00000010,
+       0x0401f003, 0x82000500, 0xffffffef, 0x48035005,
+       0x4803c857, 0x1c01f000, 0x4803c856, 0x4c580000,
+       0x42000000, 0x0010b8cb, 0x0201f800, 0x0010aa47,
+       0x42000800, 0x0010c0f1, 0x59c40003, 0x44000800,
+       0x59c40004, 0x48000801, 0x59c4000b, 0x48000802,
+       0x59c4008e, 0x48000803, 0x59c4008f, 0x48000804,
+       0x59c40090, 0x48000805, 0x59c40091, 0x48000806,
+       0x59c40092, 0x48000807, 0x59c40093, 0x48000808,
+       0x59c40099, 0x48000809, 0x59c4009e, 0x4800080a,
+       0x59c400aa, 0x4800080b, 0x59c400af, 0x4800080c,
+       0x59c400b2, 0x4800080d, 0x59c400b1, 0x4800080e,
+       0x82040c00, 0x0000000f, 0x41c41800, 0x4200b000,
+       0x00000030, 0x580c0050, 0x44000800, 0x80040800,
+       0x800c1800, 0x8058b040, 0x040207fb, 0x41c41800,
+       0x4200b000, 0x00000020, 0x580c0010, 0x44000800,
+       0x80040800, 0x800c1800, 0x8058b040, 0x040207fb,
+       0x497b8830, 0x4200b000, 0x00000040, 0x59c40031,
+       0x44000800, 0x80040800, 0x8058b040, 0x040207fc,
+       0x497b88ac, 0x4200b000, 0x00000010, 0x59c400ad,
+       0x44000800, 0x80040800, 0x8058b040, 0x040207fc,
+       0x59c41001, 0x4c080000, 0x8408150c, 0x480b8801,
+       0x4a0370e4, 0x00000300, 0x4a0370e5, 0xb0000000,
+       0x42000800, 0x00000800, 0x80040840, 0x02000800,
+       0x001005d8, 0x59b800e5, 0x8c000538, 0x040207fb,
+       0x4a0370e4, 0x00000200, 0x42006000, 0xffffffff,
+       0x42006800, 0x80000000, 0x0201f800, 0x0010427d,
+       0x4a038807, 0x00000001, 0x497b8807, 0x4a038808,
+       0x00000010, 0x42006000, 0xfcf8ffff, 0x42006800,
+       0x01000000, 0x0201f800, 0x0010427d, 0x5c001000,
+       0x480b8801, 0x42000800, 0x0010c0f1, 0x50040000,
+       0x48038803, 0x58040001, 0x48038804, 0x58040002,
+       0x4803880b, 0x58040003, 0x4803888e, 0x58040004,
+       0x4803888f, 0x58040005, 0x48038890, 0x58040006,
+       0x48038891, 0x58040007, 0x48038892, 0x58040008,
+       0x48038893, 0x58040009, 0x48038899, 0x5804000a,
+       0x4803889e, 0x5804000b, 0x480388aa, 0x5804000c,
+       0x480388af, 0x5804000d, 0x480388b2, 0x5804000e,
+       0x480388b1, 0x82040c00, 0x0000000f, 0x41c41800,
+       0x4200b000, 0x00000030, 0x50040000, 0x48001850,
+       0x80040800, 0x800c1800, 0x8058b040, 0x040207fb,
+       0x41c41800, 0x4200b000, 0x00000020, 0x50040000,
+       0x48001810, 0x80040800, 0x800c1800, 0x8058b040,
+       0x040207fb, 0x497b8830, 0x4200b000, 0x00000040,
+       0x50040000, 0x48038831, 0x80040800, 0x8058b040,
+       0x040207fc, 0x497b88ac, 0x4200b000, 0x00000010,
+       0x50040000, 0x480388ad, 0x80040800, 0x8058b040,
+       0x040207fc, 0x497b8880, 0x41780000, 0x0201f800,
+       0x00101606, 0x59c408a4, 0x82040d00, 0x0000000f,
+       0x82040580, 0x0000000c, 0x02020800, 0x001005d8,
+       0x4a038805, 0x04000000, 0x5c00b000, 0x1c01f000,
+       0x4803c856, 0x4c580000, 0x4ce80000, 0x42000000,
+       0x0010b845, 0x0201f800, 0x0010aa47, 0x59c41008,
+       0x4c080000, 0x82080500, 0xffffff7f, 0x48038808,
+       0x59c40004, 0x82000500, 0x00003e02, 0x04000005,
+       0x4201d000, 0x00000014, 0x0201f800, 0x0010608e,
+       0x59c40006, 0x82000500, 0xffffff0f, 0x48038806,
+       0x4a038805, 0x00000010, 0x4a038808, 0x00000004,
+       0x4200b000, 0x00000065, 0x59c40005, 0x8c000508,
+       0x04020012, 0x4201d000, 0x000003e8, 0x0201f800,
+       0x0010608e, 0x8058b040, 0x040207f8, 0x0201f800,
+       0x00106ede, 0x4a038808, 0x00000008, 0x4a035033,
+       0x00000001, 0x4202d800, 0x00000001, 0x82000540,
+       0x00000001, 0x0401f030, 0x0201f800, 0x00100ae0,
+       0x42000000, 0x0010b8a8, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00100ef4, 0x497b8880, 0x59a8002a,
+       0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800,
+       0x00101606, 0x5c000000, 0x48038880, 0x4a038808,
+       0x00000000, 0x4200b000, 0x00000065, 0x4a038805,
+       0x000000f0, 0x0201f800, 0x00101937, 0x42000800,
+       0x000000f0, 0x59c40005, 0x80040d00, 0x04000008,
+       0x4201d000, 0x000003e8, 0x0201f800, 0x0010608e,
+       0x8058b040, 0x040207f2, 0x0401f7d1, 0x59c40006,
+       0x82000540, 0x000000f0, 0x48038806, 0x59a8001e,
+       0x80000540, 0x04020002, 0x80000000, 0x48038893,
+       0x80000580, 0x5c001000, 0x4df00000, 0x0201f800,
+       0x0010195d, 0x5c03e000, 0x480b8808, 0x5c01d000,
+       0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000,
+       0x4ce80000, 0x59c41008, 0x82080500, 0xffffff7f,
+       0x48038808, 0x4c080000, 0x59c40004, 0x82000500,
+       0x00003e02, 0x04000005, 0x4201d000, 0x00000014,
+       0x0201f800, 0x0010608e, 0x0201f800, 0x00100ae0,
+       0x42000000, 0x0010b8a9, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00100ef4, 0x4a038808, 0x00000002,
+       0x80000580, 0x48038880, 0x48038893, 0x0201f800,
+       0x00101606, 0x4200b000, 0x00000384, 0x4a038805,
+       0x000000f0, 0x0201f800, 0x00101937, 0x42000800,
+       0x000000f0, 0x59c40005, 0x80040d00, 0x04000015,
+       0x82000500, 0x000000d0, 0x04020012, 0x4201d000,
+       0x00000067, 0x0201f800, 0x0010608e, 0x8058b040,
+       0x040207ef, 0x0201f800, 0x00106ede, 0x4a038808,
+       0x00000008, 0x4a035033, 0x00000001, 0x4202d800,
+       0x00000001, 0x82000540, 0x00000001, 0x0401f010,
+       0x497b8880, 0x59a8001e, 0x80000540, 0x04020002,
+       0x80000000, 0x48038893, 0x59a8002a, 0x82000500,
+       0x0000ffff, 0x4c000000, 0x0201f800, 0x00101606,
+       0x5c000000, 0x48038880, 0x80000580, 0x5c001000,
+       0x4df00000, 0x0201f800, 0x0010195d, 0x5c03e000,
+       0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000,
+       0x4803c856, 0x59c40004, 0x82000500, 0x00003e02,
+       0x0400000a, 0x0201f800, 0x00106ede, 0x4a038808,
+       0x00000008, 0x4a035033, 0x00000001, 0x4202d800,
+       0x00000001, 0x0401f052, 0x0201f800, 0x00100ae0,
+       0x42000000, 0x0010b8aa, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00100ef4, 0x59c40006, 0x84000508,
+       0x48038806, 0x4a038805, 0x00000010, 0x59a80805,
+       0x84040d4c, 0x48075005, 0x42000800, 0x00000064,
+       0x42001000, 0x00105058, 0x0201f800, 0x0010606e,
+       0x4a038808, 0x00000000, 0x497b8880, 0x4a038805,
+       0x000000f0, 0x0201f800, 0x00101937, 0x42000800,
+       0x000000f0, 0x59c40005, 0x80040d00, 0x0400000e,
+       0x82000500, 0x000000e0, 0x0402000b, 0x4201d000,
+       0x000003e8, 0x0201f800, 0x0010608e, 0x0201f800,
+       0x00105f48, 0x59940004, 0x80000540, 0x040207ec,
+       0x0401f023, 0x4c080000, 0x42001000, 0x00105065,
+       0x0201f800, 0x00105f90, 0x42001000, 0x00105058,
+       0x0201f800, 0x00106084, 0x5c001000, 0x497b8880,
+       0x59a8001e, 0x80000540, 0x04020002, 0x80000000,
+       0x48038893, 0x59a8002a, 0x82000500, 0x0000ffff,
+       0x4c000000, 0x0201f800, 0x00101606, 0x5c000000,
+       0x48038880, 0x59a80805, 0x84040d0c, 0x48075005,
+       0x59c40006, 0x84000548, 0x48038806, 0x0201f800,
+       0x0010195d, 0x4a038808, 0x00000080, 0x1c01f000,
+       0x4803c856, 0x4d400000, 0x4d3c0000, 0x0201f800,
+       0x00106ede, 0x0201f800, 0x0010ab33, 0x04020025,
+       0x599c1017, 0x59a80805, 0x8c040d00, 0x0402000c,
+       0x8c08151a, 0x0400001f, 0x84040d42, 0x48075005,
+       0x42028000, 0x00000004, 0x42027800, 0x0000000c,
+       0x8c081508, 0x04020008, 0x0401f012, 0x42028000,
+       0x00000004, 0x42027800, 0x00000004, 0x8c081508,
+       0x0400000c, 0x4d400000, 0x42028000, 0x0000000e,
+       0x42028800, 0x0000ffff, 0x0201f800, 0x0010a446,
+       0x5c028000, 0x599c0817, 0x8c040d0a, 0x04020005,
+       0x4943c857, 0x493fc857, 0x0201f800, 0x00101fe5,
+       0x497b8880, 0x4202d800, 0x00000001, 0x0401fcfb,
+       0x5c027800, 0x5c028000, 0x1c01f000, 0x0201f800,
+       0x00100ae0, 0x42000000, 0x0010b8ab, 0x0201f800,
+       0x0010aa47, 0x0201f800, 0x00100ef4, 0x42000000,
+       0x00000001, 0x0201f800, 0x00101606, 0x4a038880,
+       0x00000001, 0x0201f000, 0x0010195d, 0x4202e000,
+       0x00000000, 0x4a033015, 0x00000001, 0x497b301d,
+       0x497b3006, 0x4a03b004, 0x60000001, 0x59d80005,
+       0x4a03b004, 0x90000001, 0x4a03a804, 0x60000001,
+       0x59d40005, 0x4a03a804, 0x90000001, 0x0201f000,
+       0x00105983, 0x4a03c825, 0x00000004, 0x4a03c827,
+       0x00000004, 0x599c0409, 0x80000d40, 0x04000020,
+       0x599c0407, 0x80000540, 0x04000007, 0x800000cc,
+       0x599c100b, 0x80080400, 0x4803b000, 0x497bb002,
+       0x59d80001, 0x599c000b, 0x4803b000, 0x599c000c,
+       0x4803b001, 0x599c0407, 0x80000540, 0x04020002,
+       0x497bb002, 0x599c0c09, 0x82040540, 0x00400000,
+       0x4803b003, 0x4a03b009, 0x00000004, 0x4a03b004,
+       0x10000001, 0x59e00803, 0x82040d00, 0xfffffeff,
+       0x82040d40, 0x00008000, 0x4807c003, 0x599c040a,
+       0x80000540, 0x04000020, 0x599c0408, 0x80000540,
+       0x04000007, 0x800000cc, 0x599c100f, 0x80080400,
+       0x4803a800, 0x497ba802, 0x59d40001, 0x599c000f,
+       0x4803a800, 0x599c0010, 0x4803a801, 0x599c0408,
+       0x80000540, 0x04020002, 0x497ba802, 0x599c0c0a,
+       0x82040540, 0x00400000, 0x4803a803, 0x4a03a809,
+       0x00000004, 0x4a03a804, 0x10000001, 0x59e00803,
+       0x82040d00, 0xfffffbff, 0x82040d40, 0x00008000,
+       0x4807c003, 0x800409c0, 0x04000007, 0x4202e000,
+       0x00000001, 0x0200b800, 0x00020551, 0x0200f000,
+       0x00020566, 0x1c01f000, 0x0201f800, 0x001005d8,
+       0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000,
+       0x59981005, 0x800811c0, 0x0400001e, 0x58080005,
+       0x82000d00, 0x43018780, 0x02020000, 0x00105846,
+       0x8c000508, 0x04000015, 0x580a5808, 0x592c0204,
+       0x497a5800, 0x497a5801, 0x82000500, 0x000000ff,
+       0x82000c80, 0x0000004b, 0x0402100b, 0x0c01f80f,
+       0x5c03e000, 0x83700580, 0x00000003, 0x040007e6,
+       0x0200f800, 0x00020566, 0x0200b000, 0x00020551,
+       0x1c01f000, 0x0401f850, 0x5c03e000, 0x0401f7f9,
+       0x0401f8de, 0x0401f7fd, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x001054a1, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105519, 0x00105491, 0x00105491, 0x001054a1,
+       0x001054a1, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x492fc857, 0x42000000, 0x0010b85e,
+       0x0201f800, 0x0010aa47, 0x42000000, 0x00000400,
+       0x0401f019, 0x492fc857, 0x42000000, 0x0010b85d,
+       0x0201f800, 0x0010aa47, 0x42000000, 0x00001000,
+       0x0401f011, 0x492fc857, 0x42000000, 0x0010b85c,
+       0x0201f800, 0x0010aa47, 0x42000000, 0x00002000,
+       0x0401f009, 0x492fc857, 0x42000000, 0x0010b85f,
+       0x0201f800, 0x0010aa47, 0x42000000, 0x00000800,
+       0x0401f001, 0x4803c857, 0x4202e000, 0x00000001,
+       0x592c0c04, 0x82040d00, 0xffff80ff, 0x80040540,
+       0x48025c04, 0x0201f000, 0x000202da, 0x592c0204,
+       0x492fc857, 0x80000110, 0x040007db, 0x80000040,
+       0x04000025, 0x48033002, 0x492f3003, 0x492f3004,
+       0x4a033008, 0x001054e5, 0x4202e000, 0x00000003,
+       0x1c01f000, 0x592c0204, 0x492fc857, 0x80000110,
+       0x040007cd, 0x80000040, 0x04000033, 0x48033002,
+       0x492f3003, 0x492f3004, 0x4a033008, 0x00105501,
+       0x4202e000, 0x00000003, 0x1c01f000, 0x0201f800,
+       0x0010ab33, 0x02020000, 0x000204d9, 0x42028000,
+       0x00000028, 0x41780800, 0x417a6000, 0x0201f800,
+       0x00104e70, 0x0201f800, 0x001091c6, 0x0201f000,
+       0x000202da, 0x592c0a0a, 0x8c040d02, 0x04020016,
+       0x59a80021, 0x492fc857, 0x80000540, 0x0402000f,
+       0x592c0207, 0x80000540, 0x04000005, 0x0201f800,
+       0x00104326, 0x04020004, 0x1c01f000, 0x42000000,
+       0x00000000, 0x592c0a06, 0x48065c06, 0x48025a06,
+       0x0201f000, 0x000202da, 0x42000000, 0x00000028,
+       0x0401f7f9, 0x42000800, 0x00000009, 0x0201f000,
+       0x0010665b, 0x592c0208, 0x492fc857, 0x82000c80,
+       0x0000199a, 0x040217a4, 0x592c0408, 0x80000540,
+       0x040207a1, 0x59a80821, 0x800409c0, 0x04020009,
+       0x592c0207, 0x80000540, 0x0400079b, 0x497a5a06,
+       0x0201f800, 0x00104385, 0x04020004, 0x1c01f000,
+       0x42000000, 0x00000028, 0x48025a06, 0x0201f000,
+       0x000202da, 0x59980804, 0x59980002, 0x48065800,
+       0x492c0801, 0x492f3004, 0x80000040, 0x48033002,
+       0x04000002, 0x1c01f000, 0x599a5803, 0x59980008,
+       0x4202e000, 0x00000001, 0x0801f000, 0x592e8a06,
+       0x592c0406, 0x4803c856, 0x82000500, 0x000000ff,
+       0x4200b800, 0x00000001, 0x82000d80, 0x00000001,
+       0x04000015, 0x417a8800, 0x4200b800, 0x000007f0,
+       0x82000d80, 0x00000002, 0x0400000f, 0x80000540,
+       0x02020000, 0x000202da, 0x592e8a06, 0x0201f800,
+       0x00020245, 0x02020000, 0x000202da, 0x592e9008,
+       0x592e9809, 0x0201f800, 0x00104713, 0x0201f000,
+       0x000202da, 0x59a80805, 0x84040d00, 0x48075005,
+       0x0201f800, 0x00020245, 0x02000800, 0x0010482c,
+       0x81468800, 0x805cb840, 0x040207fa, 0x0201f000,
+       0x000202da, 0x592c0a08, 0x4807c857, 0x82040580,
+       0x0000000e, 0x04000045, 0x82040580, 0x00000046,
+       0x04000046, 0x82040580, 0x00000045, 0x04000020,
+       0x82040580, 0x00000029, 0x04000010, 0x82040580,
+       0x0000002a, 0x04000009, 0x82040580, 0x0000000f,
+       0x040001fc, 0x82040580, 0x0000002e, 0x040001f9,
+       0x4807c856, 0x0401f1f2, 0x59a80805, 0x84040d04,
+       0x48075005, 0x0401f1f3, 0x592e8a06, 0x0201f800,
+       0x00020245, 0x040201ef, 0x59340200, 0x84000518,
+       0x48026a00, 0x592e6009, 0x4933c857, 0x83300580,
+       0xffffffff, 0x0402002a, 0x0401f1e6, 0x592c1407,
+       0x480bc857, 0x0201f800, 0x00109410, 0x411e6000,
+       0x04020003, 0x4803c856, 0x0401f1d9, 0x592e3809,
+       0x591c1414, 0x84081516, 0x84081554, 0x480a3c14,
+       0x4a026403, 0x0000003a, 0x592c040b, 0x80000540,
+       0x04000007, 0x4a026403, 0x0000003b, 0x592c020c,
+       0x4802641a, 0x592c040c, 0x4802621a, 0x4a026203,
+       0x00000001, 0x42000800, 0x80000040, 0x0201f800,
+       0x00020721, 0x0401f1c7, 0x59a80068, 0x84000510,
+       0x48035068, 0x0401f1c3, 0x592c1207, 0x8c081500,
+       0x040201c0, 0x592e8a06, 0x592e6009, 0x0201f800,
+       0x0010941a, 0x04020003, 0x4803c856, 0x0401f1b4,
+       0x59300c06, 0x82040580, 0x00000004, 0x04000003,
+       0x4803c856, 0x0401f1ae, 0x59300a03, 0x82040580,
+       0x00000007, 0x04000003, 0x4803c856, 0x0401f1a8,
+       0x59300c03, 0x82040580, 0x00000001, 0x04000021,
+       0x82040580, 0x00000003, 0x04000016, 0x82040580,
+       0x00000006, 0x04000020, 0x82040580, 0x00000008,
+       0x04000015, 0x82040580, 0x0000000a, 0x0400000a,
+       0x82040580, 0x0000000c, 0x04000004, 0x82040580,
+       0x0000002e, 0x04020018, 0x42000800, 0x00000009,
+       0x0401f013, 0x42000800, 0x00000005, 0x0401f010,
+       0x417a7800, 0x0201f800, 0x0010203c, 0x4a026406,
+       0x00000001, 0x42000800, 0x00000003, 0x0401f008,
+       0x417a7800, 0x0201f800, 0x0010203c, 0x4a026406,
+       0x00000001, 0x42000800, 0x0000000b, 0x0201f800,
+       0x00104571, 0x4a026203, 0x00000001, 0x0201f800,
+       0x0010672b, 0x0401f17b, 0x40000800, 0x58040000,
+       0x80000540, 0x040207fd, 0x492c0800, 0x1c01f000,
+       0x492fc857, 0x59300c06, 0x82040580, 0x00000006,
+       0x04020094, 0x0201f800, 0x001049e7, 0x04020005,
+       0x59340200, 0x8c00051a, 0x02000000, 0x00020533,
+       0x59340200, 0x8c00050e, 0x0400008a, 0x59300203,
+       0x42027800, 0x00000001, 0x82000580, 0x00000007,
+       0x02020000, 0x00020533, 0x4a026203, 0x00000002,
+       0x0201f000, 0x00020533, 0x42028000, 0x00000002,
+       0x4a026206, 0x00000014, 0x4d2c0000, 0x0201f800,
+       0x0010a1d1, 0x5c025800, 0x59300c06, 0x4807c857,
+       0x82040580, 0x00000007, 0x04020063, 0x492fc857,
+       0x4a025a06, 0x00000001, 0x0201f000, 0x000202da,
+       0x592c240a, 0x492fc857, 0x4813c857, 0x8c10251c,
+       0x04020016, 0x8c10251a, 0x04000003, 0x8c10250a,
+       0x04000069, 0x59340a00, 0x8c040d0e, 0x04000003,
+       0x8c10251e, 0x04000064, 0x0201f800, 0x0002075a,
+       0x0400006b, 0x592c240a, 0x49366009, 0x49325809,
+       0x4a026406, 0x00000006, 0x4a026203, 0x00000007,
+       0x0201f000, 0x0002052f, 0x592c0a0c, 0x5934000f,
+       0x41784000, 0x80001540, 0x0400006d, 0x58080204,
+       0x82000500, 0x000000ff, 0x82000580, 0x00000012,
+       0x04020004, 0x5808020c, 0x80040580, 0x04000004,
+       0x58080000, 0x40084000, 0x0401f7f3, 0x58080000,
+       0x49781000, 0x802041c0, 0x04000006, 0x48004000,
+       0x80000540, 0x04020007, 0x48226810, 0x0401f005,
+       0x4802680f, 0x80000540, 0x04020002, 0x497a6810,
+       0x4d2c0000, 0x400a5800, 0x4a025a06, 0x00000002,
+       0x0201f800, 0x000202da, 0x5c025800, 0x0401f7bc,
+       0x592c040a, 0x8c00051c, 0x04000016, 0x592c0206,
+       0x82000580, 0x0000ffff, 0x04020012, 0x592e6009,
+       0x83300580, 0xffffffff, 0x040007b1, 0x83300480,
+       0x0010d1c0, 0x04001010, 0x59a8000b, 0x81300480,
+       0x0402100d, 0x59300008, 0x800001c0, 0x04020005,
+       0x59300203, 0x82000580, 0x00000007, 0x04000797,
+       0x492fc857, 0x4a025a06, 0x00000029, 0x0201f000,
+       0x000202da, 0x492fc857, 0x4a025a06, 0x00000008,
+       0x0201f000, 0x000202da, 0x492fc857, 0x4a025a06,
+       0x00000045, 0x0201f000, 0x000202da, 0x492fc857,
+       0x4a025a06, 0x0000002a, 0x0201f000, 0x000202da,
+       0x492fc857, 0x4a025a06, 0x00000028, 0x0201f000,
+       0x000202da, 0x492fc857, 0x4a025a06, 0x00000006,
+       0x0201f000, 0x000202da, 0x492fc857, 0x4a025a06,
+       0x0000000e, 0x0201f000, 0x000202da, 0x59340010,
+       0x492e6810, 0x492fc857, 0x80000d40, 0x04000003,
+       0x492c0800, 0x1c01f000, 0x5934040b, 0x492e680f,
+       0x492fc857, 0x4803c857, 0x80000540, 0x04020003,
+       0x4a026a03, 0x00000001, 0x1c01f000, 0x59a8000e,
+       0x81640480, 0x0402176e, 0x42026000, 0x0010d1c0,
+       0x59300009, 0x81340580, 0x04020004, 0x59300202,
+       0x80040580, 0x04000759, 0x83326400, 0x00000024,
+       0x41580000, 0x81300480, 0x040017f6, 0x0401f760,
+       0x492fc857, 0x592c0407, 0x82000c80, 0x0000199a,
+       0x040215f1, 0x592c0204, 0x80000112, 0x040205de,
+       0x592e8a06, 0x0201f800, 0x00020245, 0x04020059,
+       0x0201f800, 0x001049e7, 0x04020059, 0x592e780a,
+       0x493fc857, 0x8d3e7d3e, 0x04020007, 0x59a80021,
+       0x80000540, 0x0402004f, 0x0201f800, 0x00104838,
+       0x040005dd, 0x833c1d00, 0x0000001f, 0x040005da,
+       0x592c0207, 0x82000c80, 0x00001000, 0x040215d6,
+       0x800000c2, 0x800008c4, 0x8005d400, 0x592e9008,
+       0x592e9809, 0x5934080d, 0x800409c0, 0x0402002e,
+       0x833c1d00, 0x0000001f, 0x81780040, 0x80000000,
+       0x800c1902, 0x040217fe, 0x040205c7, 0x0c01f001,
+       0x001056e9, 0x001056ec, 0x001056f9, 0x001056fc,
+       0x001056ff, 0x0201f800, 0x0010903e, 0x0401f01a,
+       0x0201f800, 0x0010480b, 0x04000027, 0x80e9d1c0,
+       0x02020800, 0x00105fae, 0x42028000, 0x00000005,
+       0x417a9000, 0x417a9800, 0x0201f800, 0x0010904e,
+       0x0401f00d, 0x42027000, 0x0000004d, 0x0401f006,
+       0x42027000, 0x0000004e, 0x0401f003, 0x42027000,
+       0x00000052, 0x0201f800, 0x001046c9, 0x02020800,
+       0x0010907e, 0x04000010, 0x8d3e7d3e, 0x04020017,
+       0x1c01f000, 0x58040002, 0x80000540, 0x04020007,
+       0x4d3c0000, 0x40067800, 0x0201f800, 0x001047eb,
+       0x5c027800, 0x040207cb, 0x4a025a06, 0x00000030,
+       0x0401f00d, 0x4a025a06, 0x0000002c, 0x0401f00a,
+       0x4a025a06, 0x00000028, 0x0401f007, 0x4a025a06,
+       0x00000029, 0x0401f004, 0x497a5c09, 0x4a025a06,
+       0x00000000, 0x4a025a04, 0x00000103, 0x0201f000,
+       0x000202da, 0x492fc857, 0x592c0204, 0x80000110,
+       0x80000040, 0x04000002, 0x0401f56f, 0x592c0207,
+       0x82000500, 0x000003ff, 0x48025a07, 0x8c000506,
+       0x04000004, 0x82000500, 0x00000070, 0x04020004,
+       0x59a80821, 0x800409c0, 0x04020018, 0x4a025a06,
+       0x0000dead, 0x592c0408, 0x82000500, 0x0000f0ff,
+       0x48025c08, 0x0201f800, 0x001043b4, 0x04020002,
+       0x1c01f000, 0x49425a06, 0x8058b1c0, 0x04000009,
+       0x0201f800, 0x0010955f, 0x0401f80f, 0x44042800,
+       0x82580580, 0x00000002, 0x04020002, 0x48082801,
+       0x0201f000, 0x000202da, 0x42028000, 0x00000031,
+       0x42000800, 0x00000001, 0x4200b000, 0x00000001,
+       0x0401f7ed, 0x592c0408, 0x80000118, 0x832c2c00,
+       0x00000009, 0x80142c00, 0x1c01f000, 0x492fc857,
+       0x4a025a08, 0x00000006, 0x0201f000, 0x000202da,
+       0x492fc857, 0x4a025a08, 0x00000001, 0x0201f000,
+       0x000202da, 0x492fc857, 0x592c040a, 0x82000500,
+       0x00000003, 0x04000020, 0x0201f800, 0x0002075a,
+       0x04000021, 0x592c0204, 0x492e6008, 0x82000500,
+       0x000000ff, 0x82000580, 0x00000045, 0x0400000e,
+       0x592c000b, 0x0201f800, 0x00105c9a, 0x02000800,
+       0x00020245, 0x04020018, 0x42027000, 0x00000041,
+       0x49366009, 0x4a026406, 0x00000001, 0x0201f000,
+       0x000207a1, 0x59300015, 0x8400055e, 0x48026015,
+       0x42026800, 0x0010b524, 0x42027000, 0x00000040,
+       0x0401f7f4, 0x4a025a06, 0x00000101, 0x0201f000,
+       0x000202da, 0x4a025a06, 0x0000002c, 0x0201f000,
+       0x000202da, 0x4a025a06, 0x00000028, 0x0201f800,
+       0x000202da, 0x0201f000, 0x0002077d, 0x492fc857,
+       0x0201f800, 0x001062e1, 0x0400000b, 0x592c0204,
+       0x80000110, 0x80000040, 0x040204fb, 0x592c0c06,
+       0x800409c0, 0x04000009, 0x42000000, 0x00000102,
+       0x0401f003, 0x42000000, 0x00000104, 0x48025a06,
+       0x0201f000, 0x000202da, 0x592c0c07, 0x800409c0,
+       0x04000024, 0x82040480, 0x00000005, 0x04021021,
+       0x4c040000, 0x80040800, 0x0201f800, 0x00106306,
+       0x5c001000, 0x04020018, 0x832c0400, 0x00000008,
+       0x4000a000, 0x0201f800, 0x0010632f, 0x04020012,
+       0x592c1207, 0x82cc0580, 0x0010b50e, 0x04020009,
+       0x58c80c0b, 0x84040d00, 0x84040d02, 0x8c081500,
+       0x04000002, 0x84040d5e, 0x4805940b, 0x0401f001,
+       0x42000000, 0x00000000, 0x48025a06, 0x0201f000,
+       0x000202da, 0x42000000, 0x00000103, 0x0401f7fb,
+       0x42000000, 0x00000102, 0x0401f7f8, 0x492fc857,
+       0x592e7c06, 0x833c0500, 0xfffffffe, 0x04020043,
+       0x592c4007, 0x42026000, 0x0010d1c0, 0x41581800,
+       0x400c0000, 0x81300480, 0x04021023, 0x59300203,
+       0x82000580, 0x00000000, 0x04000007, 0x59300008,
+       0x80000d40, 0x04000004, 0x58040005, 0x80200580,
+       0x04000004, 0x83326400, 0x00000024, 0x0401f7f1,
+       0x58040204, 0x82000500, 0x000000ff, 0x82000d80,
+       0x00000053, 0x04000007, 0x82000d80, 0x00000048,
+       0x04000004, 0x82000580, 0x00000018, 0x04020023,
+       0x4d2c0000, 0x0201f800, 0x00108be3, 0x5c025800,
+       0x0400001e, 0x4a025a06, 0x00000000, 0x0201f000,
+       0x000202da, 0x592e8a06, 0x83440480, 0x000007f0,
+       0x04021016, 0x83440400, 0x0010ac00, 0x50000000,
+       0x80026d40, 0x04000011, 0x4d2c0000, 0x0201f800,
+       0x001047cb, 0x0400000c, 0x42028000, 0x00000005,
+       0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800,
+       0x001091cc, 0x0201f800, 0x000202da, 0x5c025800,
+       0x0401f7e5, 0x5c025800, 0x4a025a06, 0x00000031,
+       0x0201f000, 0x000202da, 0x492fc857, 0x4d2c0000,
+       0x0201f800, 0x001007e4, 0x04000016, 0x492fc857,
+       0x412f4000, 0x0201f800, 0x001007e4, 0x0400000e,
+       0x492fc857, 0x412dd800, 0x0201f800, 0x00103b28,
+       0x0201f800, 0x00103b32, 0x49a1d80b, 0x5c025800,
+       0x492dd80a, 0x0201f800, 0x00102214, 0x0201f000,
+       0x00102233, 0x41a25800, 0x0201f800, 0x001007f4,
+       0x5c025800, 0x4a025a06, 0x00004005, 0x4a025c06,
+       0x00000002, 0x0201f000, 0x000202da, 0x4807c857,
+       0x485fc857, 0x4200b800, 0x00000001, 0x5c000800,
+       0x4c5c0000, 0x0401f005, 0x4807c857, 0x485fc857,
+       0x5c000800, 0x4d780000, 0x4803c857, 0x492fc857,
+       0x8c00050e, 0x02020800, 0x001005d0, 0x4203e000,
+       0x50000000, 0x4200b800, 0x00008003, 0x0201f000,
+       0x001005dd, 0x592c0204, 0x80000110, 0x80000040,
+       0x04020441, 0x0201f800, 0x00104a34, 0x04020002,
+       0x1c01f000, 0x49425a06, 0x4806580d, 0x480a580e,
+       0x4943c857, 0x4807c857, 0x480bc857, 0x0201f000,
+       0x000202da, 0x592c0204, 0x80000110, 0x80000040,
+       0x04020431, 0x0201f800, 0x00104b8b, 0x04020002,
+       0x1c01f000, 0x49425a06, 0x48065811, 0x480a5812,
+       0x0201f000, 0x000202da, 0x592c0204, 0x80000110,
+       0x04000425, 0x80000040, 0x0402000c, 0x4202e000,
+       0x00000001, 0x592c020a, 0x8c000504, 0x02000000,
+       0x000204d0, 0x592c0207, 0x82000c80, 0x00001001,
+       0x04021429, 0x0401f009, 0x4202e000, 0x00000003,
+       0x48033002, 0x492f3003, 0x492f3004, 0x4a033008,
+       0x000204d0, 0x1c01f000, 0x4202e000, 0x00000002,
+       0x42000000, 0x0010beda, 0x50007000, 0x492c700b,
+       0x4978700e, 0x4978700c, 0x592c0011, 0x592c0812,
+       0x48007007, 0x48047008, 0x592c1013, 0x82080500,
+       0xffff0000, 0x04000003, 0x0201f800, 0x001005d8,
+       0x4978700d, 0x82080480, 0x00000180, 0x4803c857,
+       0x04001007, 0x4800700f, 0x4a007005, 0x00000180,
+       0x4a007004, 0x00000060, 0x0401f005, 0x4978700f,
+       0x48087005, 0x80081104, 0x48087004, 0x5838000a,
+       0x48007003, 0x40381000, 0x0201f000, 0x00100858,
+       0x0201f800, 0x001007d3, 0x04000003, 0x59980007,
+       0x0801f000, 0x1c01f000, 0x40307000, 0x5838000b,
+       0x80025d40, 0x0400001b, 0x58380002, 0x82000580,
+       0x00000100, 0x0400001d, 0x4c380000, 0x592c0204,
+       0x82000500, 0x000000ff, 0x82000580, 0x00000012,
+       0x0400000b, 0x592c0208, 0x8400054e, 0x48025a08,
+       0x4a025a06, 0x00000002, 0x4a025a04, 0x00000103,
+       0x0201f800, 0x000202c1, 0x0401f005, 0x4a025a06,
+       0x00000010, 0x0201f800, 0x000202da, 0x5c007000,
+       0x4202e000, 0x00000001, 0x4a007002, 0x00000100,
+       0x49787010, 0x1c01f000, 0x58380004, 0x82000480,
+       0x00000003, 0x04000087, 0x58380010, 0x8c000500,
+       0x04020019, 0x4200b000, 0x00000003, 0x832cac00,
+       0x00000011, 0x5838000a, 0x5838100d, 0x8008a400,
+       0x4c380000, 0x0201f800, 0x0010ab17, 0x5c007000,
+       0x5838000d, 0x82000400, 0x00000003, 0x4800700d,
+       0x4a007010, 0x00000001, 0x58380004, 0x82000480,
+       0x00000003, 0x48007004, 0x82000580, 0x00000003,
+       0x0400006c, 0x5838000e, 0x80001d40, 0x04020020,
+       0x4c380000, 0x0201f800, 0x001007d3, 0x5c007000,
+       0x04000010, 0x4a025a04, 0x0000010a, 0x42001800,
+       0x00000005, 0x480c700e, 0x5838000c, 0x80000540,
+       0x04020002, 0x5838000b, 0x40000800, 0x492c0801,
+       0x492c700c, 0x42000800, 0x0000000f, 0x0401f011,
+       0x4202e000, 0x00000008, 0x4a033007, 0x00105915,
+       0x1c01f000, 0x4202e000, 0x00000002, 0x42000000,
+       0x0010beda, 0x50007000, 0x0401f7e7, 0x583a580c,
+       0x400c0000, 0x42000800, 0x00000014, 0x80040c80,
+       0x58381004, 0x5838000f, 0x41783000, 0x80000540,
+       0x04020005, 0x84183540, 0x82081480, 0x00000003,
+       0x0400003c, 0x40080000, 0x80040480, 0x04001002,
+       0x40080800, 0x4004b000, 0x412c0000, 0x800c0400,
+       0x4000a800, 0x5838000a, 0x5838100d, 0x8008a400,
+       0x4c080000, 0x4c040000, 0x4c0c0000, 0x4c380000,
+       0x0201f800, 0x0010ab17, 0x5c007000, 0x5c001800,
+       0x5c000800, 0x40040000, 0x58381004, 0x80080480,
+       0x48007004, 0x82000580, 0x00000003, 0x04000002,
+       0x84183500, 0x5c000000, 0x80041400, 0x82080480,
+       0x00000060, 0x04020003, 0x84183542, 0x41781000,
+       0x400c0000, 0x80041c00, 0x820c0480, 0x00000014,
+       0x04020003, 0x84183544, 0x40001800, 0x40080800,
+       0x4804700d, 0x480c700e, 0x40180000, 0x0c01f001,
+       0x00105960, 0x00105964, 0x00105962, 0x00105960,
+       0x001058fc, 0x00105964, 0x00105962, 0x00105960,
+       0x0201f800, 0x001005d8, 0x5838100f, 0x0401f739,
+       0x5838080d, 0x82040400, 0x00000002, 0x5838100a,
+       0x80080400, 0x50001000, 0x800811c0, 0x0402000f,
+       0x4202e000, 0x00000001, 0x583a580b, 0x4978700b,
+       0x49787010, 0x592c0204, 0x82000500, 0x000000ff,
+       0x82000580, 0x00000012, 0x02000000, 0x00020507,
+       0x0201f000, 0x000204d0, 0x5838000a, 0x80040c00,
+       0x82381c00, 0x00000007, 0x54041800, 0x80040800,
+       0x800c1800, 0x54041800, 0x0401f71a, 0x0201f800,
+       0x001007d3, 0x02000800, 0x001005d8, 0x4a02580a,
+       0x0010be79, 0x42000800, 0x0010beda, 0x452c0800,
+       0x497a580b, 0x497a580c, 0x497a580d, 0x497a580e,
+       0x497a580f, 0x4a025809, 0x001058b6, 0x497a5810,
+       0x4a025802, 0x00000100, 0x4a025801, 0x00000001,
+       0x1c01f000, 0x59c80007, 0x8c000502, 0x04000070,
+       0x835c2c80, 0x00000005, 0x02001000, 0x00105f23,
+       0x59c82817, 0x497b9005, 0x82140500, 0x00e00000,
+       0x0402004f, 0x82140500, 0x000003ff, 0x82001c00,
+       0x00000006, 0x41cc2000, 0x42003000, 0x00006080,
+       0x820c0480, 0x00000040, 0x04001006, 0x42001000,
+       0x00000040, 0x820c1c80, 0x00000040, 0x0401f003,
+       0x400c1000, 0x41781800, 0x54182000, 0x80102000,
+       0x80183000, 0x80081040, 0x040207fc, 0x800c19c0,
+       0x04000005, 0x59c80005, 0x80000000, 0x48039005,
+       0x0401f7ea, 0x82140500, 0x01f60000, 0x04020029,
+       0x82140500, 0x0000f000, 0x0400000b, 0x82000c80,
+       0x00002000, 0x0402100f, 0x82140500, 0x0e000000,
+       0x80000132, 0x0c01f840, 0x4a039005, 0x00000140,
+       0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00,
+       0x82000580, 0x00008100, 0x040007f4, 0x0401f01c,
+       0x4817c857, 0x82140500, 0x000003ff, 0x04020007,
+       0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580,
+       0x00008100, 0x04020012, 0x42000000, 0x0010b8bd,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x00105dfa,
+       0x4803c856, 0x4a039005, 0x00000140, 0x0401f020,
+       0x4817c857, 0x82140500, 0x00f60000, 0x04020004,
+       0x0201f800, 0x00105e35, 0x040207d2, 0x0201f800,
+       0x0010513b, 0x04000010, 0x59c400a4, 0x4803c857,
+       0x82000500, 0x0000000f, 0x82000580, 0x0000000a,
+       0x04020009, 0x497b5016, 0x59c400a3, 0x82000540,
+       0x00080000, 0x480388a3, 0x82000500, 0xfff7ffff,
+       0x480388a3, 0x4817c856, 0x0201f800, 0x0010a978,
+       0x4a039005, 0x00000140, 0x0401f842, 0x4803c856,
+       0x1c01f000, 0x00105a1d, 0x00105cf4, 0x00105a15,
+       0x00105a15, 0x00105a15, 0x00105a15, 0x00105a15,
+       0x00105a15, 0x4803c857, 0x42000000, 0x0010b85a,
+       0x0201f800, 0x0010aa47, 0x4a039005, 0x00000140,
+       0x1c01f000, 0x4817c857, 0x59cc0400, 0x4803c857,
+       0x82000d00, 0x0000ff00, 0x82041500, 0x0000f000,
+       0x840409c0, 0x82140500, 0x000003ff, 0x800018c4,
+       0x8c142d14, 0x04000005, 0x59cc0002, 0x82000500,
+       0x00000003, 0x800c1c80, 0x480f5016, 0x82080580,
+       0x00002000, 0x04020011, 0x836c0580, 0x00000001,
+       0x0402000c, 0x59cc0006, 0x82000500, 0xff000000,
+       0x82000580, 0x11000000, 0x04020011, 0x0201f800,
+       0x00103b38, 0x0201f800, 0x00105f48, 0x0401f00c,
+       0x0401f81f, 0x0401f00a, 0x82080580, 0x00003000,
+       0x04020003, 0x0401fa06, 0x0401f005, 0x82080580,
+       0x00008000, 0x04020002, 0x0401fafc, 0x1c01f000,
+       0x4817c857, 0x42000000, 0x0010b859, 0x0201f800,
+       0x0010aa47, 0x836c0580, 0x00000003, 0x0402000b,
+       0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048,
+       0x40141800, 0x80142120, 0x0201f800, 0x00103a3e,
+       0x5c001800, 0x5c001000, 0x1c01f000, 0x4807c857,
+       0x59cc0002, 0x82000500, 0xff000000, 0x82001580,
+       0x01000000, 0x04000004, 0x82001580, 0x23000000,
+       0x04020192, 0x82040580, 0x00000023, 0x0402003f,
+       0x0401fb6a, 0x0400018d, 0x59300c06, 0x82040580,
+       0x00000010, 0x04000013, 0x82040580, 0x00000011,
+       0x04000010, 0x82040580, 0x00000001, 0x0400000d,
+       0x82040580, 0x00000004, 0x0400000a, 0x82040580,
+       0x00000008, 0x04000007, 0x82040580, 0x0000000a,
+       0x04000004, 0x4933c857, 0x4807c857, 0x0401f177,
+       0x59300004, 0x82000500, 0x80010000, 0x04000004,
+       0x0201f800, 0x00106f60, 0x04020170, 0x59cc0a04,
+       0x48066202, 0x59cc0006, 0x82000500, 0xffff0000,
+       0x82000d80, 0x02000000, 0x04020005, 0x42027000,
+       0x00000015, 0x0201f000, 0x000207a1, 0x82000d80,
+       0x02140000, 0x040007fa, 0x82000d80, 0x02100000,
+       0x040007f7, 0x82000d80, 0x02100000, 0x040007f4,
+       0x82000d80, 0x01000000, 0x04020158, 0x59cc0006,
+       0x82000500, 0x0000ffff, 0x04020154, 0x42027000,
+       0x00000016, 0x0401f7ec, 0x82040580, 0x00000022,
+       0x0402014e, 0x59a80806, 0x8c040d14, 0x04000011,
+       0x0401f967, 0x0402000f, 0x0401f97d, 0x0400000d,
+       0x42027000, 0x0000004c, 0x59cc0001, 0x82000500,
+       0x00ffffff, 0x0201f800, 0x00105eec, 0x0400012a,
+       0x42028800, 0x0000ffff, 0x417a6800, 0x0401f126,
+       0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80,
+       0x03000000, 0x04020021, 0x59a80026, 0x8c000508,
+       0x04000017, 0x8400054c, 0x48035026, 0x59cc0800,
+       0x82040d00, 0x00ffffff, 0x48075010, 0x497b8830,
+       0x84040d70, 0x48078832, 0x59c40802, 0x84040d4c,
+       0x48078802, 0x59cc0007, 0x82000500, 0x0000ffff,
+       0x48038893, 0x4803501e, 0x42000800, 0x00000003,
+       0x59a81010, 0x0201f800, 0x00106c78, 0x59cc0006,
+       0x82000500, 0x0000ffff, 0x04020118, 0x42027000,
+       0x00000017, 0x0401f0d9, 0x82000d80, 0x04000000,
+       0x04020011, 0x59cc0006, 0x82000500, 0x0000ffff,
+       0x0402010e, 0x0201f800, 0x0010513b, 0x04000004,
+       0x42027000, 0x0000001d, 0x0401f0cc, 0x59a80026,
+       0x84000548, 0x48035026, 0x42027000, 0x00000030,
+       0x0401f0c6, 0x82000d80, 0x05000000, 0x04020008,
+       0x59cc0006, 0x82000500, 0x0000ffff, 0x040200fb,
+       0x42027000, 0x00000018, 0x0401f0bc, 0x82000d80,
+       0x20100000, 0x04020004, 0x42027000, 0x00000019,
+       0x0401f0b6, 0x82000d80, 0x21100000, 0x04020004,
+       0x42027000, 0x0000001a, 0x0401f0b0, 0x82000d80,
+       0x52000000, 0x04020008, 0x59cc0006, 0x82000500,
+       0x0000ffff, 0x040200e5, 0x42027000, 0x0000001b,
+       0x0401f0a6, 0x82000d80, 0x50000000, 0x04020008,
+       0x59cc0006, 0x82000500, 0x0000ffff, 0x040200db,
+       0x42027000, 0x0000001c, 0x0401f09c, 0x82000d80,
+       0x13000000, 0x04020004, 0x42027000, 0x00000034,
+       0x0401f096, 0x82000d80, 0x12000000, 0x04020008,
+       0x59cc0006, 0x82000500, 0x0000ffff, 0x040200cb,
+       0x42027000, 0x00000024, 0x0401f08c, 0x82000d00,
+       0xff000000, 0x82040d80, 0x24000000, 0x04020004,
+       0x42027000, 0x0000002d, 0x0401f084, 0x82000d00,
+       0xff000000, 0x82040d80, 0x53000000, 0x04020004,
+       0x42027000, 0x0000002a, 0x0401f07c, 0x82000d80,
+       0x0f000000, 0x04020004, 0x42027000, 0x00000020,
+       0x0401f076, 0x82000d80, 0x61040000, 0x04020036,
+       0x83cc1400, 0x00000006, 0x80080800, 0x50080000,
+       0x82000500, 0x0000ffff, 0x82000480, 0x00000004,
+       0x4c580000, 0x8000b104, 0x8058b1c0, 0x04000026,
+       0x4c100000, 0x50041800, 0x820c1500, 0x03000000,
+       0x80081130, 0x42000000, 0x0010b817, 0x82082580,
+       0x00000000, 0x04020004, 0x42000000, 0x0010b814,
+       0x0401f00c, 0x82082580, 0x00000001, 0x04020004,
+       0x42000000, 0x0010b815, 0x0401f006, 0x82082580,
+       0x00000002, 0x04020003, 0x42000000, 0x0010b816,
+       0x0201f800, 0x0010aa47, 0x42001000, 0x00008015,
+       0x820c2500, 0x0000ffff, 0x800c1920, 0x0201f800,
+       0x00103a3e, 0x5c002000, 0x80040800, 0x8058b040,
+       0x040207da, 0x5c00b000, 0x42027000, 0x00000023,
+       0x0401f03e, 0x82000d80, 0x60000000, 0x04020004,
+       0x42027000, 0x0000003f, 0x0401f038, 0x82000d80,
+       0x54000000, 0x04020006, 0x0401fb12, 0x0402006f,
+       0x42027000, 0x00000046, 0x0401f030, 0x82000d80,
+       0x55000000, 0x04020009, 0x0401fb32, 0x04020004,
+       0x42027000, 0x00000041, 0x0401f028, 0x42027000,
+       0x00000042, 0x0401f025, 0x82000d80, 0x78000000,
+       0x04020004, 0x42027000, 0x00000045, 0x0401f01f,
+       0x82000d80, 0x10000000, 0x04020004, 0x42027000,
+       0x0000004e, 0x0401f019, 0x82000d80, 0x63000000,
+       0x04020004, 0x42027000, 0x0000004a, 0x0401f013,
+       0x82000d00, 0xff000000, 0x82040d80, 0x56000000,
+       0x04020004, 0x42027000, 0x0000004f, 0x0401f00b,
+       0x82000d00, 0xff000000, 0x82040d80, 0x57000000,
+       0x04020004, 0x42027000, 0x00000050, 0x0401f003,
+       0x42027000, 0x0000001d, 0x59cc3800, 0x821c3d00,
+       0x00ffffff, 0x821c0580, 0x00fffffe, 0x59cc0001,
+       0x04020005, 0x40003000, 0x42028800, 0x000007fe,
+       0x0401f003, 0x0401f8d1, 0x04020030, 0x0201f800,
+       0x001045a6, 0x0402002d, 0x83380580, 0x00000046,
+       0x04020004, 0x59a80010, 0x80180580, 0x04000027,
+       0x59340200, 0x8c000514, 0x0400000f, 0x83380580,
+       0x00000030, 0x0400000c, 0x83380580, 0x0000003f,
+       0x04000009, 0x83380580, 0x00000034, 0x04000006,
+       0x83380580, 0x00000024, 0x04000003, 0x42027000,
+       0x0000004c, 0x0201f800, 0x0002075a, 0x04000018,
+       0x49366009, 0x4a026406, 0x00000004, 0x59cc0c04,
+       0x48066202, 0x83380580, 0x0000004c, 0x04020009,
+       0x4a026406, 0x00000011, 0x813669c0, 0x04020005,
+       0x59cc0001, 0x82000500, 0x00ffffff, 0x4802601e,
+       0x0201f000, 0x000207a1, 0x59880052, 0x4803c857,
+       0x80000000, 0x48031052, 0x1c01f000, 0x42001000,
+       0x00008049, 0x59cc1806, 0x800c1930, 0x0201f800,
+       0x00103a3e, 0x0201f800, 0x00107942, 0x040007f3,
+       0x49366009, 0x4a026406, 0x00000004, 0x59cc0c04,
+       0x48066202, 0x4a026403, 0x00000009, 0x4a02641a,
+       0x00000009, 0x4a02621a, 0x00002900, 0x4a026203,
+       0x00000001, 0x0201f000, 0x0010672b, 0x59a80026,
+       0x4803c857, 0x8c000508, 0x04000010, 0x59cc0006,
+       0x82000500, 0xff000000, 0x82000d80, 0x03000000,
+       0x0400000c, 0x82000d80, 0x20000000, 0x04000009,
+       0x82000d80, 0x05000000, 0x04000006, 0x82000d80,
+       0x21000000, 0x04000003, 0x80000580, 0x1c01f000,
+       0x82000540, 0x00000001, 0x0401f7fd, 0x59cc2006,
+       0x82102500, 0xff000000, 0x9c1021c0, 0x0401f807,
+       0x820c1c00, 0x0010b4e3, 0x500c1800, 0x800c0500,
+       0x4803c857, 0x1c01f000, 0x40100800, 0x41781800,
+       0x82040480, 0x00000020, 0x04001004, 0x800c1800,
+       0x40000800, 0x0401f7fb, 0x82040500, 0x0000000f,
+       0x82000400, 0x0010ab38, 0x50000000, 0x8c040d08,
+       0x04000002, 0x900001c0, 0x1c01f000, 0x4803c856,
+       0x0401fac3, 0x0402000a, 0x0201f800, 0x0010210a,
+       0x04020007, 0x59cc0002, 0x82000500, 0xff000000,
+       0x82000d80, 0x08000000, 0x04000802, 0x1c01f000,
+       0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00,
+       0x840409c0, 0x82040580, 0x00000033, 0x0402001f,
+       0x0401f976, 0x04000038, 0x59cc0a04, 0x48066202,
+       0x59cc0006, 0x4803c857, 0x82000500, 0xffff0000,
+       0x82000d80, 0x02000000, 0x04020009, 0x59cc0006,
+       0x82000500, 0x0000ffff, 0x0402002b, 0x42027000,
+       0x00000015, 0x0201f000, 0x000207a1, 0x82000d80,
+       0x01000000, 0x04020024, 0x59cc0006, 0x82000500,
+       0x0000ffff, 0x04020020, 0x42027000, 0x00000016,
+       0x0201f000, 0x000207a1, 0x82040580, 0x00000032,
+       0x04020019, 0x59cc0006, 0x82000500, 0xffff0000,
+       0x82000d80, 0x14000000, 0x04020013, 0x42027000,
+       0x00000038, 0x59cc0001, 0x0401f810, 0x0402000e,
+       0x0201f800, 0x001045a6, 0x0402000b, 0x0201f800,
+       0x0002075a, 0x04000008, 0x49366009, 0x4a026406,
+       0x00000004, 0x59cc0c04, 0x48066202, 0x0201f000,
+       0x000207a1, 0x1c01f000, 0x4803c857, 0x4c580000,
+       0x4c100000, 0x4c380000, 0x4c340000, 0x82003500,
+       0x00ffffff, 0x82181500, 0x00ff0000, 0x82081580,
+       0x00ff0000, 0x04020016, 0x82181480, 0x00fffffc,
+       0x04001013, 0x82181580, 0x00fffffd, 0x04020004,
+       0x42028800, 0x000007fd, 0x0401f040, 0x82181580,
+       0x00fffffe, 0x04020004, 0x42028800, 0x000007fe,
+       0x0401f03a, 0x82181580, 0x00fffffc, 0x04020004,
+       0x42028800, 0x000007fc, 0x0401f034, 0x41781000,
+       0x42002000, 0x00000000, 0x4200b000, 0x000007f0,
+       0x41ac7000, 0x50380000, 0x80006d40, 0x04020005,
+       0x800811c0, 0x0402001e, 0x8410155e, 0x0401f01c,
+       0x58340212, 0x82000500, 0x0000ff00, 0x04000011,
+       0x59a84010, 0x82204500, 0x00ffff00, 0x82180500,
+       0x00ffff00, 0x04000002, 0x80200580, 0x58340002,
+       0x0402000f, 0x82000500, 0x000000ff, 0x82184500,
+       0x000000ff, 0x80204580, 0x04020009, 0x0401f006,
+       0x58340002, 0x82000500, 0x00ffffff, 0x80184580,
+       0x04020003, 0x40128800, 0x0401f00c, 0x80102000,
+       0x80387000, 0x8058b040, 0x040207db, 0x800811c0,
+       0x04020005, 0x481bc857, 0x82000540, 0x00000001,
+       0x0401f003, 0x840a8d1e, 0x80000580, 0x5c006800,
+       0x5c007000, 0x5c002000, 0x5c00b000, 0x1c01f000,
+       0x59a80026, 0x8c00050e, 0x04000003, 0x8c000502,
+       0x04000006, 0x59cc0c00, 0x80040910, 0x82040500,
+       0x0000000f, 0x0c01f002, 0x1c01f000, 0x00105d0f,
+       0x00105d0f, 0x00105d0f, 0x00105de5, 0x00105d0f,
+       0x00105d11, 0x00105d29, 0x00105d2c, 0x00105d0f,
+       0x00105d0f, 0x00105d0f, 0x00105d0f, 0x00105d0f,
+       0x00105d0f, 0x00105d0f, 0x00105d0f, 0x4803c856,
+       0x1c01f000, 0x0401f8c5, 0x04000014, 0x82140500,
+       0x000003ff, 0x800000c4, 0x82000480, 0x00000008,
+       0x0400100e, 0x59cc0001, 0x59326809, 0x59340802,
+       0x80040580, 0x82000500, 0x00ffffff, 0x04020007,
+       0x59cc0a04, 0x48066202, 0x42027000, 0x00000046,
+       0x0201f000, 0x000207a1, 0x59cc0004, 0x4803c857,
+       0x1c01f000, 0x59cc0004, 0x4803c857, 0x1c01f000,
+       0x0401f8aa, 0x04000016, 0x82140500, 0x000003ff,
+       0x800000c4, 0x82000480, 0x0000000c, 0x04001010,
+       0x59cc0001, 0x82000500, 0x00ffffff, 0x59326809,
+       0x59340802, 0x82040d00, 0x00ffffff, 0x80040580,
+       0x04020007, 0x59cc0a04, 0x48066202, 0x42027000,
+       0x00000045, 0x0201f000, 0x000207a1, 0x59cc0004,
+       0x4803c857, 0x1c01f000, 0x4817c857, 0x0401f9c8,
+       0x04020011, 0x0201f800, 0x0010210a, 0x0402000e,
+       0x59cc0002, 0x82000500, 0xff000000, 0x82000580,
+       0x00000000, 0x04020008, 0x82040500, 0x0000000f,
+       0x82000c80, 0x00000006, 0x04021003, 0x4803c857,
+       0x0c01f002, 0x1c01f000, 0x00105d60, 0x00105d64,
+       0x00105d60, 0x00105d60, 0x00105db2, 0x00105dc3,
+       0x4803c857, 0x59cc0004, 0x4803c857, 0x1c01f000,
+       0x59cc0004, 0x4803c857, 0x59a80016, 0x800001c0,
+       0x040207f8, 0x59cc0802, 0x8c040d2e, 0x0402001d,
+       0x0201f800, 0x00107942, 0x02000800, 0x001005d8,
+       0x59cc0001, 0x4803c857, 0x0401ff28, 0x0402000d,
+       0x0201f800, 0x00020245, 0x0402000a, 0x4a026406,
+       0x00000005, 0x49366009, 0x59cc0c04, 0x48066202,
+       0x42027000, 0x00000088, 0x0201f000, 0x000207a1,
+       0x42028800, 0x0000ffff, 0x417a6800, 0x59cc0001,
+       0x82000500, 0x00ffffff, 0x4802601e, 0x0401f7f0,
+       0x59cc0001, 0x4803c857, 0x0401ff10, 0x040207d5,
+       0x0201f800, 0x001045a6, 0x040207d2, 0x59cc0005,
+       0x8c000500, 0x04020004, 0x59340200, 0x8c00050e,
+       0x040207cc, 0x0201f800, 0x001049f3, 0x0402000f,
+       0x0401f83e, 0x040007c7, 0x0201f800, 0x0002075a,
+       0x040007c4, 0x49366009, 0x4a026406, 0x00000002,
+       0x59cc0c04, 0x48066202, 0x42027000, 0x00000088,
+       0x0201f000, 0x000207a1, 0x0201f800, 0x0002075a,
+       0x040007b8, 0x49366009, 0x4a026406, 0x00000004,
+       0x59cc0c04, 0x48066202, 0x42027000, 0x00000001,
+       0x0201f000, 0x000207a1, 0x59cc0004, 0x4803c857,
+       0x59cc0802, 0x8c040d2e, 0x0400000b, 0x0401f81f,
+       0x04000009, 0x0401f960, 0x04020007, 0x59cc0a04,
+       0x48066202, 0x42027000, 0x00000089, 0x0201f000,
+       0x000207a1, 0x4933c857, 0x1c01f000, 0x59cc0004,
+       0x4803c857, 0x59cc0802, 0x8c040d2e, 0x0400000b,
+       0x0401f80e, 0x04000009, 0x0401f94f, 0x04020007,
+       0x59cc0a04, 0x48066202, 0x42027000, 0x0000008a,
+       0x0201f000, 0x000207a1, 0x4933c857, 0x1c01f000,
+       0x59cc0a04, 0x0401f002, 0x59cc0c04, 0x59a8000e,
+       0x59a81067, 0x80080400, 0x80040480, 0x04021008,
+       0x40040000, 0x800000c4, 0x800408ca, 0x80040c00,
+       0x82066400, 0x0010d1c0, 0x1c01f000, 0x80000580,
+       0x0401f7fe, 0x59cc0802, 0x8c040d2e, 0x04020010,
+       0x0401ffec, 0x0400000e, 0x59cc0001, 0x82000500,
+       0x00ffffff, 0x59326809, 0x59340802, 0x82040d00,
+       0x00ffffff, 0x80040580, 0x04020005, 0x42027000,
+       0x00000051, 0x0201f000, 0x000207a1, 0x59cc0004,
+       0x4803c857, 0x1c01f000, 0x4803c856, 0x42003000,
+       0x00000105, 0x0401f001, 0x4803c856, 0x4c3c0000,
+       0x41cc7800, 0x0401f803, 0x5c007800, 0x1c01f000,
+       0x4803c856, 0x4c580000, 0x583c0400, 0x82000500,
+       0x0000f000, 0x82000580, 0x0000c000, 0x04000024,
+       0x0201f800, 0x0002075a, 0x04000021, 0x4c180000,
+       0x583c0001, 0x0401fe89, 0x0402001f, 0x0201f800,
+       0x001045a6, 0x0402001c, 0x49366009, 0x0201f800,
+       0x001007e4, 0x04000018, 0x492e6017, 0x497a5800,
+       0x497a5a04, 0x48125c04, 0x832cac00, 0x00000005,
+       0x4200b000, 0x00000007, 0x403ca000, 0x0201f800,
+       0x0010ab17, 0x5c003000, 0x481a641a, 0x4a026403,
+       0x0000003e, 0x4a026406, 0x00000001, 0x4a026203,
+       0x00000001, 0x0201f800, 0x0010672b, 0x5c00b000,
+       0x1c01f000, 0x0201f800, 0x0002077d, 0x5c003000,
+       0x0401f7fb, 0x4803c856, 0x59cc0400, 0x82000d00,
+       0x0000ff00, 0x82040500, 0x0000f000, 0x840409c0,
+       0x82000580, 0x00002000, 0x04020049, 0x82040580,
+       0x00000022, 0x0402003a, 0x59c400a4, 0x82000500,
+       0x0000000f, 0x82000c80, 0x00000007, 0x04001004,
+       0x82000480, 0x0000000c, 0x0400103f, 0x59cc0006,
+       0x82000500, 0xffff0000, 0x82000d80, 0x04000000,
+       0x04000039, 0x82000d80, 0x60000000, 0x04000036,
+       0x82000d80, 0x54000000, 0x04000033, 0x82000d80,
+       0x03000000, 0x04020015, 0x59a80826, 0x8c040d02,
+       0x0402002d, 0x8c040d08, 0x0402002b, 0x0201f800,
+       0x001048ec, 0x0400002b, 0x59a8001d, 0x800000d0,
+       0x59a80810, 0x82040d00, 0x000000ff, 0x80040540,
+       0x59cc0800, 0x82040d00, 0x00ffffff, 0x80040580,
+       0x0402001b, 0x0401f01c, 0x59c40802, 0x8c040d0c,
+       0x04020017, 0x82000d80, 0x52000000, 0x040007ec,
+       0x82000d80, 0x05000000, 0x040007e9, 0x82000d80,
+       0x50000000, 0x040007e6, 0x0401f00d, 0x82040580,
+       0x00000023, 0x0402000a, 0x0401ff58, 0x04000008,
+       0x59300c03, 0x82040580, 0x00000002, 0x04000006,
+       0x82040580, 0x00000051, 0x04000003, 0x80000580,
+       0x0401f003, 0x82000540, 0x00000001, 0x1c01f000,
+       0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80,
+       0x03000000, 0x04000004, 0x82000d80, 0x52000000,
+       0x040207f3, 0x59a80026, 0x82000500, 0x00000009,
+       0x82000580, 0x00000008, 0x040007ef, 0x0401f7ec,
+       0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a80016,
+       0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807,
+       0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00,
+       0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00,
+       0x00000002, 0x83cc1400, 0x0000000d, 0x0201f800,
+       0x0010855a, 0x04020010, 0x8c5cbd02, 0x0400000a,
+       0x4200b000, 0x00000002, 0x83a81c00, 0x00000000,
+       0x83cc1400, 0x0000000f, 0x0201f800, 0x0010855a,
+       0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540,
+       0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000,
+       0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a80016,
+       0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807,
+       0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00,
+       0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00,
+       0x00000002, 0x83cc1400, 0x00000009, 0x0201f800,
+       0x0010855a, 0x04020010, 0x8c5cbd02, 0x0400000a,
+       0x4200b000, 0x00000002, 0x83a81c00, 0x00000000,
+       0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a,
+       0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540,
+       0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000,
+       0x4803c857, 0x4c580000, 0x40003000, 0x42002000,
+       0x000007f0, 0x4200b000, 0x00000010, 0x83ac7400,
+       0x000007f0, 0x50380000, 0x80026d40, 0x04000006,
+       0x59340002, 0x82000500, 0x00ffffff, 0x80180580,
+       0x04000010, 0x80102000, 0x80387000, 0x8058b040,
+       0x040207f5, 0x82100480, 0x00000800, 0x42002000,
+       0x00000000, 0x4200b000, 0x000007f0, 0x41ac7000,
+       0x040217ed, 0x82000540, 0x00000001, 0x0401f002,
+       0x40128800, 0x5c00b000, 0x1c01f000, 0x59a80026,
+       0x8c00050e, 0x04000004, 0x8c000502, 0x04000003,
+       0x80000580, 0x1c01f000, 0x82000540, 0x00000001,
+       0x0401f7fd, 0x59300c06, 0x82040580, 0x00000002,
+       0x04000006, 0x82040580, 0x00000005, 0x04000003,
+       0x82000540, 0x00000001, 0x1c01f000, 0x59c80000,
+       0x84000558, 0x84000512, 0x48039000, 0x1c01f000,
+       0x4a03281a, 0x000003e8, 0x4a032802, 0x0010d1c0,
+       0x4a032800, 0x00000000, 0x4a032808, 0x00107049,
+       0x42000000, 0x00000005, 0x83947c00, 0x00000009,
+       0x49787801, 0x4a007802, 0x00106fff, 0x823c7c00,
+       0x00000003, 0x80000040, 0x040207fa, 0x4a032819,
+       0xffff0000, 0x4201d000, 0x00000064, 0x0401f96e,
+       0x4201d000, 0x000186a0, 0x0401f184, 0x00000000,
+       0x00000003, 0x00000006, 0x00000009, 0x0000000c,
+       0x4d300000, 0x4d2c0000, 0x4d340000, 0x4d400000,
+       0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000,
+       0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000,
+       0x4c640000, 0x4cc80000, 0x4ccc0000, 0x0201f800,
+       0x0002057b, 0x5c019800, 0x5c019000, 0x5c00c800,
+       0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800,
+       0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800,
+       0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000,
+       0x1c01f000, 0x59940004, 0x80000540, 0x0402000a,
+       0x59940025, 0x80040400, 0x02001800, 0x001005d8,
+       0x48032804, 0x480b2805, 0x4a032803, 0x0000000a,
+       0x80000580, 0x1c01f000, 0x5994001f, 0x80000540,
+       0x0402000a, 0x59940025, 0x80040400, 0x02001800,
+       0x001005d8, 0x4803281f, 0x480b2820, 0x4a03281e,
+       0x00000001, 0x80000580, 0x1c01f000, 0x59940022,
+       0x80000540, 0x0402000a, 0x59940025, 0x80040400,
+       0x02001800, 0x001005d8, 0x48032822, 0x480b2823,
+       0x4a032821, 0x0000000a, 0x80000580, 0x1c01f000,
+       0x4c000000, 0x59940005, 0x4803c857, 0x480bc857,
+       0x80080580, 0x04020003, 0x497b2804, 0x497b2805,
+       0x5c000000, 0x1c01f000, 0x4c000000, 0x59940020,
+       0x4803c857, 0x480bc857, 0x80080580, 0x04020003,
+       0x497b281f, 0x497b2820, 0x5c000000, 0x1c01f000,
+       0x4c000000, 0x59940023, 0x4803c857, 0x480bc857,
+       0x80080580, 0x04020003, 0x497b2822, 0x497b2823,
+       0x5c000000, 0x1c01f000, 0x4937c857, 0x48ebc857,
+       0x59340203, 0x80e80480, 0x04001002, 0x48ea6a03,
+       0x1c01f000, 0x5c03e000, 0x1c01f000, 0x4d440000,
+       0x42007800, 0x00000010, 0x59968801, 0x0201f800,
+       0x00020245, 0x04020012, 0x59341a03, 0x800c1840,
+       0x0400100f, 0x59940027, 0x800c0480, 0x04000003,
+       0x48026a03, 0x0402100a, 0x5934000f, 0x497a6a03,
+       0x80000540, 0x04000006, 0x4c3c0000, 0x5934140b,
+       0x0201f800, 0x00020253, 0x5c007800, 0x81468800,
+       0x83440480, 0x00000800, 0x04021007, 0x803c7840,
+       0x040207e7, 0x49472801, 0x5c028800, 0x5c03e000,
+       0x1c01f000, 0x4a032800, 0x00000002, 0x497b2801,
+       0x0401f7fa, 0x42007800, 0x00000010, 0x59966002,
+       0x59300205, 0x80000d40, 0x04000006, 0x59940027,
+       0x80040480, 0x48026205, 0x0400102d, 0x0400002c,
+       0x59300206, 0x80000d40, 0x04000014, 0x59b800e4,
+       0x8c000524, 0x04020011, 0x4a0370e4, 0x00030000,
+       0x40000000, 0x59b800e4, 0x8c000524, 0x04000004,
+       0x4a0370e4, 0x00020000, 0x0401f008, 0x59940027,
+       0x80040480, 0x48026206, 0x4a0370e4, 0x00020000,
+       0x0400101c, 0x0400001b, 0x83326400, 0x00000024,
+       0x49332802, 0x41540000, 0x81300480, 0x04021005,
+       0x803c7840, 0x040207db, 0x5c03e000, 0x1c01f000,
+       0x59940026, 0x48032827, 0x4a032802, 0x0010d1c0,
+       0x497b2826, 0x80000540, 0x0400000f, 0x4a032800,
+       0x00000001, 0x5c03e000, 0x1c01f000, 0x4c3c0000,
+       0x0201f800, 0x001091db, 0x5c007800, 0x0401f7d1,
+       0x4c3c0000, 0x0201f800, 0x00108d5d, 0x5c007800,
+       0x0401f7e2, 0x4a032800, 0x00000000, 0x5c03e000,
+       0x1c01f000, 0x59a8086b, 0x8c040d30, 0x04020029,
+       0x8c040d32, 0x0400000f, 0x59a80069, 0x81640480,
+       0x04001019, 0x59a8000b, 0x81500580, 0x04000005,
+       0x59a8006a, 0x59a81066, 0x80080580, 0x04020012,
+       0x900411c0, 0x82081500, 0x00007000, 0x0401f012,
+       0x82040500, 0x0000001f, 0x04000016, 0x80040840,
+       0x82040500, 0x0000001f, 0x04000003, 0x4807506b,
+       0x0401f010, 0x900401c0, 0x82000500, 0x0000001f,
+       0x80040d40, 0x900401c0, 0x80040580, 0x82001500,
+       0x00007000, 0x82040500, 0xffff8fff, 0x80080540,
+       0x4803506b, 0x80081114, 0x0201f800, 0x001006e2,
+       0x1c01f000, 0x4a032807, 0x000007d0, 0x4a032806,
+       0x0000000a, 0x1c01f000, 0x42000800, 0x000007d0,
+       0x83180480, 0x00000005, 0x02021800, 0x001005d8,
+       0x83947c00, 0x00000009, 0x83180400, 0x00105f43,
+       0x50000000, 0x803c7c00, 0x48047801, 0x4a007800,
+       0x0000000a, 0x1c01f000, 0x83180480, 0x00000005,
+       0x02021800, 0x001005d8, 0x83947c00, 0x00000009,
+       0x83180400, 0x00105f43, 0x50000000, 0x803c7c00,
+       0x49787801, 0x1c01f000, 0x4807c857, 0x480bc857,
+       0x59940025, 0x80040400, 0x02001800, 0x001005d8,
+       0x48032804, 0x480b2805, 0x4a032803, 0x0000000a,
+       0x1c01f000, 0x4807c857, 0x480bc857, 0x59940025,
+       0x80040400, 0x02001800, 0x001005d8, 0x4803281c,
+       0x480b281d, 0x4a03281b, 0x0000000a, 0x1c01f000,
+       0x4c000000, 0x5994001d, 0x4803c857, 0x480bc857,
+       0x80080580, 0x04020003, 0x4803281c, 0x4803281d,
+       0x5c000000, 0x1c01f000, 0x80e9d1c0, 0x0400000e,
+       0x0401f836, 0x04025000, 0x4203e000, 0x80000000,
+       0x40e81000, 0x41780800, 0x42000000, 0x00000064,
+       0x0201f800, 0x001066a0, 0x59940024, 0x80080400,
+       0x48032824, 0x1c01f000, 0x42001000, 0x00105065,
+       0x0401fef0, 0x42001000, 0x00105058, 0x0401ffe1,
+       0x42001000, 0x00104148, 0x0401feea, 0x42001000,
+       0x001041bc, 0x0401fee7, 0x42001000, 0x001041f3,
+       0x0401f6f8, 0x4203e000, 0x70000000, 0x4203e000,
+       0xb0300000, 0x41fc0000, 0x40ebf800, 0x80e80480,
+       0x04001011, 0x04000004, 0x82000480, 0x00000003,
+       0x0402100d, 0x42000000, 0x0000000f, 0x04004004,
+       0x80000040, 0x040207fe, 0x0401f007, 0x4203e000,
+       0x70000000, 0x42000000, 0x0010b87e, 0x0201f800,
+       0x0010aa47, 0x1c01f000, 0x4203e000, 0x80000000,
+       0x4203e000, 0xb0400000, 0x41fc0000, 0x40ebf800,
+       0x80e80480, 0x04001011, 0x04000004, 0x82000480,
+       0x00000003, 0x0402100d, 0x42000000, 0x0000000f,
+       0x04005004, 0x80000040, 0x040207fe, 0x0401f007,
+       0x4203e000, 0x80000000, 0x42000000, 0x0010b87f,
+       0x0201f800, 0x0010aa47, 0x1c01f000, 0x59a8000e,
+       0x82000480, 0x00000100, 0x599c0a02, 0x800409c0,
+       0x04020002, 0x80040800, 0x80041480, 0x04001002,
+       0x40000800, 0x48075067, 0x59a8100e, 0x40040000,
+       0x800acc80, 0x4967500e, 0x49675069, 0x59aaa80b,
+       0x41640800, 0x42001000, 0x00000024, 0x0201f800,
+       0x00106681, 0x8206a400, 0x0010d1c0, 0x49535065,
+       0x4152b000, 0x42006000, 0x0010be65, 0x4a006004,
+       0x0000012c, 0x4a006005, 0xda10da10, 0x4a006008,
+       0x00000011, 0x4a006009, 0x0010be65, 0x4a00600a,
+       0x001010b8, 0x599c0014, 0x48006011, 0x599c0015,
+       0x48006012, 0x42006000, 0x0010be41, 0x4a006203,
+       0x00000008, 0x4a006406, 0x00000006, 0x4a006002,
+       0xffff0000, 0x4a006008, 0x0010be65, 0x4a006014,
+       0x0010be65, 0x599c0014, 0x48006015, 0x599c0015,
+       0x48006016, 0x599c0413, 0x48006017, 0x49506018,
+       0x49546019, 0x59a80067, 0x4800601a, 0x4a00601b,
+       0x0010b465, 0x4a00601c, 0x0010b466, 0x4a00601d,
+       0x0010b46a, 0x42000000, 0xb0000000, 0x42000800,
+       0x0010be41, 0x0201f800, 0x00100b68, 0x1c01f000,
+       0x82000d00, 0x000000c0, 0x04000004, 0x82040d80,
+       0x000000c0, 0x04020055, 0x82000d00, 0x00002020,
+       0x59300414, 0x84000512, 0x82040d80, 0x00002020,
+       0x0400000b, 0x8c000514, 0x0402000f, 0x48026414,
+       0x813e79c0, 0x02020000, 0x000206d0, 0x42027000,
+       0x00000043, 0x0201f000, 0x000207a1, 0x59326809,
+       0x59340a00, 0x8c040d0a, 0x040007f3, 0x84000552,
+       0x0401f7f1, 0x84000514, 0x592c080d, 0x48066015,
+       0x0401f7ef, 0x59326809, 0x59340a00, 0x8c040d0a,
+       0x02000000, 0x000206e3, 0x59300c14, 0x84040d52,
+       0x48066414, 0x0201f000, 0x000206e3, 0x0201f800,
+       0x00020086, 0x813e79c0, 0x02020000, 0x000206d0,
+       0x0201f000, 0x000206f1, 0x8c00051e, 0x02000000,
+       0x000206fd, 0x82000d00, 0x00002020, 0x82040d80,
+       0x00002020, 0x04000014, 0x82000500, 0x000000c0,
+       0x82000d80, 0x00000080, 0x04000008, 0x813e79c0,
+       0x02020000, 0x000206d0, 0x42027000, 0x00000041,
+       0x0201f000, 0x000207a1, 0x813e79c0, 0x02020000,
+       0x000206d0, 0x42027000, 0x00000043, 0x0201f000,
+       0x000207a1, 0x59326809, 0x59340a00, 0x8c040d0a,
+       0x040007ea, 0x59300c14, 0x84040d52, 0x48066414,
+       0x0401f7e6, 0x492fc857, 0x42000800, 0x00000006,
+       0x0201f000, 0x000206f8, 0x492fc857, 0x42000800,
+       0x00000004, 0x0201f000, 0x000206f8, 0x4807c856,
+       0x59a80068, 0x800409c0, 0x04000003, 0x80080540,
+       0x0401f002, 0x80080500, 0x48035068, 0x1c01f000,
+       0x4a030800, 0x00000000, 0x4a030802, 0x00000001,
+       0x497b0803, 0x497b0804, 0x1c01f000, 0x59840002,
+       0x8c000500, 0x04000004, 0x84000500, 0x4a030800,
+       0x00000001, 0x84000544, 0x84000506, 0x48030802,
+       0x82000d00, 0x0fffffff, 0x42000000, 0x90000000,
+       0x0201f800, 0x00100b94, 0x59a80069, 0x82000480,
+       0x00000007, 0x48035069, 0x80000580, 0x42000800,
+       0x0010b519, 0x48000800, 0x48000801, 0x1c01f000,
+       0x59a80069, 0x82000480, 0x00000007, 0x48035069,
+       0x1c01f000, 0x83640480, 0x00000008, 0x0400101b,
+       0x58c80a03, 0x80000580, 0x82000400, 0x00000008,
+       0x80040840, 0x040207fd, 0x815c0480, 0x04001013,
+       0x4200b000, 0x00000007, 0x0201f800, 0x0002075a,
+       0x4a026203, 0x00000004, 0x4a026406, 0x00000009,
+       0x4a026203, 0x00000004, 0x4a026007, 0x00000101,
+       0x0401f809, 0x0401f880, 0x8058b040, 0x040207f3,
+       0x80000580, 0x1c01f000, 0x82000540, 0x00000001,
+       0x0401f7fd, 0x0201f800, 0x001007e4, 0x492e6008,
+       0x58c80a03, 0x4a025a04, 0x0000002c, 0x497a5800,
+       0x497a5801, 0x497a5c04, 0x497a5c06, 0x497a5805,
+       0x4a025a08, 0x00000005, 0x4a025a07, 0x00000002,
+       0x58c80201, 0x48025c04, 0x58c80202, 0x48025c07,
+       0x58c80204, 0x48025c08, 0x4a02580d, 0x0000ffff,
+       0x80040840, 0x0400000c, 0x412c2000, 0x0201f800,
+       0x001007e4, 0x4a025a04, 0x0000000a, 0x497a5c04,
+       0x48125800, 0x492c2001, 0x412c2000, 0x80040840,
+       0x040207f7, 0x1c01f000, 0x4d7c0000, 0x4202f800,
+       0x00000010, 0x4df00000, 0x4203e000, 0x50000000,
+       0x59847803, 0x803c79c0, 0x0400001e, 0x4c5c0000,
+       0x583cb808, 0x585c3408, 0x801831c0, 0x0400000b,
+       0x0401f84a, 0x04000016, 0x42001000, 0x0010b519,
+       0x0401f87f, 0x04000012, 0x0201f800, 0x001007d3,
+       0x0400000f, 0x492cb805, 0x585c0005, 0x80000540,
+       0x02000800, 0x001005d8, 0x0401f830, 0x585c5408,
+       0x0401f80b, 0x5c00b800, 0x5c03e000, 0x817ef840,
+       0x040207e1, 0x5c02f800, 0x1c01f000, 0x5c00b800,
+       0x5c03e000, 0x5c02f800, 0x1c01f000, 0x4803c856,
+       0x405c6000, 0x802851c0, 0x04000018, 0x585c0204,
+       0x82000d00, 0x0000000f, 0x82040c00, 0x001010bd,
+       0x50044000, 0x4cf00000, 0x4d000000, 0x4d040000,
+       0x4021e000, 0x40320800, 0x59860004, 0x4c280000,
+       0x0401f934, 0x5c005000, 0x40f04000, 0x41046000,
+       0x0201f800, 0x0010109b, 0x040207f6, 0x5c020800,
+       0x5c020000, 0x5c01e000, 0x58c80204, 0x4800bc08,
+       0x0201f800, 0x00020086, 0x4a026007, 0x00000101,
+       0x497a6009, 0x0401f055, 0x4803c856, 0x59840003,
+       0x80026540, 0x04000003, 0x59300000, 0x48030803,
+       0x1c01f000, 0x4803c856, 0x59840003, 0x48026000,
+       0x49330803, 0x1c01f000, 0x58cc0805, 0x40180000,
+       0x80040480, 0x0400100d, 0x82cc0580, 0x0010b50e,
+       0x02020800, 0x001005d8, 0x58c80205, 0x80040480,
+       0x0400101d, 0x82000540, 0x00000001, 0x1c01f000,
+       0x80003580, 0x0401f7fe, 0x82cc0580, 0x0010b50e,
+       0x02020800, 0x001005d8, 0x58c80400, 0x8c000504,
+       0x040007f8, 0x58c8040b, 0x8c00051e, 0x040007f5,
+       0x8c000500, 0x040207f3, 0x84000540, 0x4801940b,
+       0x42000000, 0x0010b839, 0x0201f800, 0x0010aa47,
+       0x42001000, 0x00008026, 0x0201f800, 0x00103a3e,
+       0x0401f7e8, 0x58c8040b, 0x8c00051e, 0x040007e2,
+       0x8c000502, 0x040207e0, 0x84000542, 0x4801940b,
+       0x42000000, 0x0010b838, 0x0201f800, 0x0010aa47,
+       0x42001000, 0x00008025, 0x42001800, 0x00000000,
+       0x0201f800, 0x00103a3e, 0x0401f7d3, 0x4803c856,
+       0x58080000, 0x42001800, 0x00000007, 0x58080801,
+       0x80040480, 0x04020004, 0x400c0000, 0x80000540,
+       0x0401f005, 0x04001003, 0x800c0480, 0x0401f002,
+       0x80000080, 0x1c01f000, 0x4803c856, 0x59300008,
+       0x80000d40, 0x02000800, 0x001005d8, 0x58040005,
+       0x80000540, 0x02000800, 0x001005d8, 0x59300007,
+       0x82000500, 0x00000101, 0x82000580, 0x00000101,
+       0x02020800, 0x001005d8, 0x42001000, 0x0010b519,
+       0x58080801, 0x82040400, 0x0010b51b, 0x497a6414,
+       0x4a026015, 0x0000ffff, 0x45300000, 0x80040800,
+       0x82040480, 0x00000008, 0x04001002, 0x80000d80,
+       0x48041001, 0x82040400, 0x0010b51b, 0x45780000,
+       0x1c01f000, 0x4933c857, 0x59300808, 0x800409c0,
+       0x02000800, 0x001005d8, 0x4d2c0000, 0x58065805,
+       0x812e59c0, 0x02020800, 0x001007f4, 0x49780805,
+       0x40065800, 0x0201f800, 0x001007fd, 0x5c025800,
+       0x4d300000, 0x0201f800, 0x0002077d, 0x5c026000,
+       0x1c01f000, 0x59300406, 0x82000580, 0x00000009,
+       0x04020006, 0x59300007, 0x8c000510, 0x04000003,
+       0x80000580, 0x1c01f000, 0x82000540, 0x00000001,
+       0x1c01f000, 0x59840802, 0x8c040d04, 0x1c01f000,
+       0x4803c856, 0x59840802, 0x84040d04, 0x84040d40,
+       0x4a030800, 0x00000000, 0x48070802, 0x82040d00,
+       0x0fffffff, 0x42000000, 0x90000000, 0x0201f000,
+       0x00100b94, 0x4807c857, 0x4805980a, 0x49799801,
+       0x49799803, 0x49799806, 0x49799807, 0x49799808,
+       0x49799805, 0x49799809, 0x0401f8c9, 0x0400000a,
+       0x0401f8eb, 0x04000008, 0x48359800, 0x48359802,
+       0x48359806, 0x4a019804, 0x00000001, 0x4a019807,
+       0x00000005, 0x1c01f000, 0x4807c857, 0x58cc1007,
+       0x40040000, 0x80080480, 0x04021020, 0x4c040000,
+       0x4c080000, 0x0401f8da, 0x5c001000, 0x5c000800,
+       0x0400001c, 0x58cc0006, 0x80006540, 0x0402000b,
+       0x48359800, 0x48359802, 0x48359806, 0x49799801,
+       0x49799803, 0x49786801, 0x49786800, 0x49799804,
+       0x49799807, 0x0401f005, 0x48306801, 0x48346000,
+       0x48359806, 0x49786800, 0x58cc0004, 0x58cc1007,
+       0x80000000, 0x82081400, 0x00000005, 0x48019804,
+       0x48099807, 0x0401f7df, 0x80000580, 0x1c01f000,
+       0x82000540, 0x00000001, 0x1c01f000, 0x480bc857,
+       0x4c500000, 0x4c540000, 0x4c580000, 0x40083000,
+       0x58cc0801, 0x82040480, 0x00000005, 0x02021800,
+       0x001005d8, 0x82040400, 0x00106418, 0x50000000,
+       0x58cca800, 0x8054ac00, 0x42001800, 0x00000005,
+       0x40040000, 0x800c0480, 0x80082480, 0x04021002,
+       0x40080000, 0x8000b0c2, 0x8058b400, 0x5450a800,
+       0x8050a000, 0x8054a800, 0x8058b040, 0x040207fc,
+       0x40001000, 0x58cc2805, 0x58cc0807, 0x58cc2001,
+       0x80142c00, 0x80040c80, 0x80102400, 0x48159805,
+       0x48059807, 0x48119801, 0x82100580, 0x00000005,
+       0x0400000c, 0x48119801, 0x40080000, 0x80181480,
+       0x40083000, 0x04000003, 0x040217d6, 0x80000580,
+       0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000,
+       0x58cc0800, 0x800409c0, 0x02000800, 0x001005d8,
+       0x58040800, 0x48059800, 0x41782000, 0x0401f7ee,
+       0x0401f813, 0x50f00000, 0x81040400, 0x40001800,
+       0x585c0204, 0x4803c857, 0x82000580, 0x0000002c,
+       0x02020800, 0x001005d8, 0x58040202, 0x800000e0,
+       0x81000540, 0x48001802, 0x58040000, 0x48001800,
+       0x58040001, 0x48001801, 0x1c01f000, 0x4807c856,
+       0x58cc0005, 0x80000040, 0x02001800, 0x001005d8,
+       0x48019805, 0x58cc1003, 0x82080480, 0x00000005,
+       0x02021800, 0x001005d8, 0x82080400, 0x00106418,
+       0x50000000, 0x58cc0802, 0x80040c00, 0x80081000,
+       0x82080480, 0x00000005, 0x0402000f, 0x58cc2002,
+       0x58100000, 0x80006d40, 0x04000009, 0x4c340000,
+       0x0401f858, 0x5c006800, 0x49786801, 0x48359802,
+       0x58cc0004, 0x80000040, 0x48019804, 0x49799803,
+       0x0401f002, 0x48099803, 0x1c01f000, 0x4807c856,
+       0x41781800, 0x58c80201, 0x80000540, 0x04000002,
+       0x800c1800, 0x58c80c01, 0x80040c80, 0x0400100a,
+       0x04000009, 0x800c1800, 0x58c80202, 0x80041480,
+       0x04001005, 0x04000004, 0x800c1800, 0x40080800,
+       0x0401f7fb, 0x480d9204, 0x400c0000, 0x42002000,
+       0x00000001, 0x80000040, 0x04000007, 0x04001006,
+       0x80102000, 0x82000480, 0x00000005, 0x04000002,
+       0x040217fc, 0x48119203, 0x1c01f000, 0x4807c856,
+       0x4d2c0000, 0x58cc000a, 0x80000540, 0x02000800,
+       0x001005d8, 0x82002400, 0x00000005, 0x0201f800,
+       0x001007d3, 0x04000012, 0x492d9809, 0x497a5800,
+       0x497a5801, 0x0201f800, 0x001007d3, 0x0400000c,
+       0x58cc0009, 0x48025800, 0x497a5801, 0x492d9809,
+       0x82102480, 0x00000005, 0x040217f7, 0x82000540,
+       0x00000001, 0x5c025800, 0x1c01f000, 0x58cc0009,
+       0x80025d40, 0x040007fc, 0x592c2000, 0x0201f800,
+       0x001007f4, 0x40100000, 0x0401f7fa, 0x58cc0009,
+       0x48cfc857, 0x80006d40, 0x04000005, 0x50340000,
+       0x48019809, 0x49786800, 0x49786801, 0x1c01f000,
+       0x4813c857, 0x58cc0009, 0x48002000, 0x48119809,
+       0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc0009,
+       0x80025d40, 0x04000007, 0x592c0000, 0x4c000000,
+       0x0201f800, 0x001007f4, 0x5c000000, 0x0401f7f9,
+       0x5c025800, 0x1c01f000, 0x4807c856, 0x4d2c0000,
+       0x58cc0002, 0x80025d40, 0x04000007, 0x592c0000,
+       0x4c000000, 0x0201f800, 0x001007f4, 0x5c000000,
+       0x0401f7f9, 0x49799800, 0x49799802, 0x49799801,
+       0x49799803, 0x49799806, 0x49799807, 0x49799808,
+       0x49799809, 0x4979980a, 0x5c025800, 0x1c01f000,
+       0x00000003, 0x00000006, 0x00000009, 0x0000000c,
+       0x0000000f, 0x00000012, 0x4803c856, 0x0401f857,
+       0x4a00c204, 0x0000003c, 0x59301009, 0x82080580,
+       0x0010b524, 0x04000013, 0x58080802, 0x82040d00,
+       0x00ffffff, 0x58080403, 0x4804c005, 0x4800c406,
+       0x4a00c207, 0x00000003, 0x59300811, 0x585c0404,
+       0x4978c206, 0x4804c407, 0x80000540, 0x0400000d,
+       0x58600206, 0x84000540, 0x4800c206, 0x0401f009,
+       0x585c080a, 0x82040d00, 0x00ffffff, 0x4804c005,
+       0x4a00c406, 0x000007ff, 0x4978c207, 0x0401f7ef,
+       0x82603c00, 0x00000008, 0x58605404, 0x40282000,
+       0x405c6000, 0x585c0a04, 0x82040d00, 0x0000000f,
+       0x82040c00, 0x001010bd, 0x50044000, 0x80004d80,
+       0x50200000, 0x80307400, 0x58380402, 0x8c244d00,
+       0x04020003, 0x48003a00, 0x0401f003, 0x48003c00,
+       0x801c3800, 0x80244800, 0x80102040, 0x04000006,
+       0x0201f800, 0x0010109b, 0x02000800, 0x001005d8,
+       0x0401f7f0, 0x1c01f000, 0x4803c856, 0x4d340000,
+       0x59300009, 0x80026d40, 0x02000800, 0x001005d8,
+       0x59340401, 0x80000540, 0x0400000e, 0x59840000,
+       0x80000540, 0x0400000b, 0x836c0580, 0x00000003,
+       0x04020008, 0x59341c03, 0x42002000, 0x00000004,
+       0x42003000, 0x00000004, 0x0201f800, 0x00103aae,
+       0x5c026800, 0x1c01f000, 0x4803c856, 0x80001580,
+       0x58c80c01, 0x59300011, 0x80040c80, 0x48066011,
+       0x58c80201, 0x80000540, 0x04000005, 0x80081000,
+       0x80040c80, 0x04001007, 0x04000006, 0x58c80202,
+       0x80081000, 0x80040c80, 0x04001002, 0x040207fd,
+       0x4808bc08, 0x4808c404, 0x1c01f000, 0x4803c856,
+       0x4a0370e5, 0x00020000, 0x59b800e5, 0x8c000524,
+       0x040207fc, 0x4a0370e5, 0x00030000, 0x40000000,
+       0x40000000, 0x59b800e5, 0x8c000524, 0x040207f5,
+       0x5934000e, 0x80006d40, 0x04000010, 0x81300580,
+       0x04020004, 0x58340000, 0x4802680e, 0x0401f00a,
+       0x40347800, 0x58340000, 0x80006d40, 0x02000800,
+       0x001005d8, 0x81300580, 0x040207fa, 0x58340000,
+       0x48007800, 0x497a6000, 0x4a0370e5, 0x00020000,
+       0x1c01f000, 0x4803c856, 0x4d300000, 0x4d2c0000,
+       0x42000800, 0x000003ff, 0x4a0370e5, 0x00020000,
+       0x59b800e5, 0x8c000524, 0x04000005, 0x80040840,
+       0x040207fa, 0x0201f800, 0x001005d8, 0x4a0370e5,
+       0x00030000, 0x40000000, 0x40000000, 0x59b800e5,
+       0x8c000524, 0x040207f1, 0x5934000e, 0x80026540,
+       0x0400000e, 0x4933c857, 0x59300000, 0x4802680e,
+       0x4a026203, 0x00000004, 0x497a6206, 0x497a6009,
+       0x4a026007, 0x00000101, 0x59325808, 0x497a5c08,
+       0x0401fd81, 0x0401f7f1, 0x4a0370e5, 0x00020000,
+       0x5c025800, 0x5c026000, 0x1c01f000, 0x4803c856,
+       0x4c000000, 0x0201f800, 0x00105c9a, 0x04020011,
+       0x0201f800, 0x001045a6, 0x02020800, 0x001005d8,
+       0x5c000000, 0x48026802, 0x0201f800, 0x0002075a,
+       0x04000009, 0x49366009, 0x4a026406, 0x00000001,
+       0x42027000, 0x00000001, 0x0201f000, 0x000207a1,
+       0x5c000000, 0x1c01f000, 0x59300203, 0x82000c80,
+       0x0000000e, 0x02021800, 0x001005d8, 0x4803c857,
+       0x0c01f001, 0x00106503, 0x00106503, 0x00106503,
+       0x00106505, 0x00106565, 0x00106503, 0x00106503,
+       0x001065b7, 0x001065b8, 0x00106503, 0x00106503,
+       0x00106503, 0x00106503, 0x00106503, 0x0201f800,
+       0x001005d8, 0x493bc857, 0x83380480, 0x00000050,
+       0x02021800, 0x001005d8, 0x83380480, 0x00000049,
+       0x02001800, 0x001005d8, 0x0c01f001, 0x00106518,
+       0x0010653a, 0x00106516, 0x00106516, 0x00106516,
+       0x00106516, 0x00106549, 0x0201f800, 0x001005d8,
+       0x4d2c0000, 0x59325808, 0x592c0206, 0x48025c06,
+       0x4a025a06, 0x00000000, 0x4c5c0000, 0x592cbc0a,
+       0x592c0000, 0x48026008, 0x0201f800, 0x00104cde,
+       0x59300008, 0x80000540, 0x04000008, 0x4a026203,
+       0x00000007, 0x42027000, 0x00000043, 0x5c00b800,
+       0x5c025800, 0x0401f08a, 0x8c5cbd08, 0x04020006,
+       0x4a026203, 0x00000007, 0x497a6206, 0x497a6008,
+       0x0401f003, 0x0201f800, 0x0002077d, 0x5c00b800,
+       0x5c025800, 0x1c01f000, 0x0201f800, 0x00106b8a,
+       0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037,
+       0x04000006, 0x4d400000, 0x42028000, 0x00000001,
+       0x0401f8f8, 0x5c028000, 0x5c025800, 0x0201f000,
+       0x0002077d, 0x0201f800, 0x00106b8a, 0x4d3c0000,
+       0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800,
+       0x42003000, 0x00000014, 0x0201f800, 0x0010a942,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037,
+       0x04000006, 0x4d400000, 0x42028000, 0x00000029,
+       0x0401f8dc, 0x5c028000, 0x5c025800, 0x0201f000,
+       0x0002077d, 0x493bc857, 0x497a6206, 0x83380480,
+       0x00000054, 0x02021800, 0x001005d8, 0x83380480,
+       0x00000047, 0x02001800, 0x001005d8, 0x0c01f001,
+       0x001065b6, 0x0010657f, 0x0010657d, 0x0010657d,
+       0x0010657d, 0x0010657d, 0x0010657d, 0x0010657d,
+       0x0010657d, 0x0010657d, 0x0010657d, 0x0010657d,
+       0x00106583, 0x0201f800, 0x001005d8, 0x59300011,
+       0x82000500, 0xffff0000, 0x04020034, 0x59840802,
+       0x8c040d04, 0x04000025, 0x59300009, 0x80026d40,
+       0x0400001f, 0x4c5c0000, 0x4c600000, 0x497a6206,
+       0x5930b808, 0x585c0005, 0x8000c540, 0x02000800,
+       0x001005d8, 0x0401fe8d, 0x40625800, 0x0201f800,
+       0x00104cde, 0x4978b805, 0x0401fef5, 0x497a6009,
+       0x585c3408, 0x0401fcbd, 0x0400000e, 0x42001000,
+       0x0010b519, 0x0401fcf2, 0x0400000a, 0x0201f800,
+       0x001007e4, 0x04000007, 0x492cb805, 0x585c5408,
+       0x0401fc83, 0x5c00c000, 0x5c00b800, 0x1c01f000,
+       0x0401fca9, 0x0401f7fc, 0x8c040d06, 0x040207fc,
+       0x59300009, 0x80026d40, 0x04000006, 0x5934000e,
+       0x80000540, 0x02020800, 0x001005d8, 0x497a6009,
+       0x0401fd0d, 0x0401f7f2, 0x0401f06f, 0x4803c856,
+       0x4803c856, 0x83380580, 0x00000043, 0x02020800,
+       0x001005d8, 0x4a026203, 0x00000003, 0x493a6403,
+       0x59325808, 0x592c000f, 0x48026011, 0x497a6013,
+       0x592c0406, 0x800000c2, 0x800010c4, 0x80081400,
+       0x480a6206, 0x0201f800, 0x00100f4e, 0x42000800,
+       0x80000060, 0x0401f154, 0x42000000, 0x0010b875,
+       0x0201f800, 0x0010aa47, 0x59300203, 0x82000c80,
+       0x0000000e, 0x02021800, 0x001005d8, 0x4803c857,
+       0x82000d80, 0x00000003, 0x04000006, 0x82000d80,
+       0x00000004, 0x04000045, 0x0201f800, 0x001005d8,
+       0x0201f800, 0x00106c55, 0x59300004, 0x8c00053e,
+       0x04020007, 0x0201f800, 0x00106b6c, 0x02020800,
+       0x001005d8, 0x0201f000, 0x00106c4b, 0x0401f9c3,
+       0x0201f800, 0x00106c4b, 0x59325808, 0x42028000,
+       0x00000006, 0x0401f84b, 0x0201f000, 0x0002077d,
+       0x4803c856, 0x59300203, 0x82000c80, 0x0000000e,
+       0x02021800, 0x001005d8, 0x82000d80, 0x00000003,
+       0x04000006, 0x82000d80, 0x00000004, 0x04000023,
+       0x0201f800, 0x001005d8, 0x4803c856, 0x0201f800,
+       0x00106c55, 0x4df00000, 0x59300004, 0x8c00053e,
+       0x04020006, 0x0201f800, 0x00106f60, 0x02020800,
+       0x001005d8, 0x0401f010, 0x0201f800, 0x00108cd6,
+       0x04020004, 0x0201f800, 0x00106e62, 0x0402000a,
+       0x0401f99a, 0x02020800, 0x001005d8, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x82000540, 0x00000001,
+       0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x80000580, 0x1c01f000, 0x4933c857, 0x0201f800,
+       0x00100e99, 0x4933c857, 0x4c5c0000, 0x4d340000,
+       0x497a6206, 0x5930b808, 0x59300009, 0x80026d40,
+       0x04020e5f, 0x42001000, 0x0010b519, 0x0401fc60,
+       0x04000009, 0x58c80204, 0x4800bc08, 0x41785000,
+       0x0201f800, 0x00106227, 0x5c026800, 0x5c00b800,
+       0x1c01f000, 0x4978bc08, 0x0401fc17, 0x0401f7fb,
+       0x4803c856, 0x0201f800, 0x00109037, 0x0400000f,
+       0x592c0000, 0x80000d40, 0x04000009, 0x497a5800,
+       0x49425a06, 0x4c040000, 0x0201f800, 0x000202da,
+       0x5c000800, 0x40065800, 0x0401f7f6, 0x49425a06,
+       0x0201f800, 0x000202da, 0x1c01f000, 0x4933c857,
+       0x59300c06, 0x82040580, 0x0000000e, 0x04000004,
+       0x82040580, 0x00000009, 0x04020004, 0x0401ffe5,
+       0x497a6008, 0x80000580, 0x1c01f000, 0x592e6009,
+       0x83300480, 0x0010d1c0, 0x04001016, 0x41580000,
+       0x81300480, 0x04021013, 0x40040000, 0x59300c06,
+       0x80040580, 0x04020012, 0x59300a03, 0x82040580,
+       0x00000007, 0x02020800, 0x001005d8, 0x59300008,
+       0x80000540, 0x02020800, 0x001005d8, 0x0201f800,
+       0x0002077d, 0x42000000, 0x00000000, 0x0401f009,
+       0x42000000, 0x00000008, 0x0401f006, 0x82040580,
+       0x00000007, 0x040207fb, 0x42000000, 0x00000005,
+       0x592c0a06, 0x48065c06, 0x48025a06, 0x0201f000,
+       0x000202da, 0x4c0c0000, 0x4c100000, 0x4c140000,
+       0x4c180000, 0x80001d80, 0x80002580, 0x42003000,
+       0x00000020, 0x82040500, 0x00000001, 0x04000003,
+       0x40080000, 0x800c1c00, 0x400c2800, 0x800c1902,
+       0x80102102, 0x82140500, 0x00000001, 0x04000003,
+       0x82102540, 0x80000000, 0x80040902, 0x80183040,
+       0x040207f1, 0x40100800, 0x400c0000, 0x5c003000,
+       0x5c002800, 0x5c002000, 0x5c001800, 0x1c01f000,
+       0x4c580000, 0x4200b000, 0x00000020, 0x80000540,
+       0x04000018, 0x80041c80, 0x04021016, 0x800810c2,
+       0x80040982, 0x04001006, 0x80041c80, 0x04021005,
+       0x8058b040, 0x040207fa, 0x0401f006, 0x80041c80,
+       0x400c0800, 0x80081000, 0x8058b040, 0x040207f4,
+       0x4c000000, 0x41f00000, 0x82000500, 0xf7ffffff,
+       0x4003e000, 0x5c000000, 0x5c00b000, 0x1c01f000,
+       0x4c000000, 0x41f00000, 0x82000540, 0x08000000,
+       0x0401f7f8, 0x4a0378e8, 0x00000000, 0x4a03c821,
+       0x00000010, 0x4a03c823, 0x00000004, 0x0401f82c,
+       0x4a0378e9, 0x00003a0d, 0x4a0378e8, 0x00000001,
+       0x42000000, 0x00001000, 0x50000000, 0x82000480,
+       0x24220001, 0x04000004, 0x59e00002, 0x84000548,
+       0x4803c002, 0x42000800, 0x00000005, 0x4203a000,
+       0x00007600, 0x42000000, 0x00001000, 0x50000000,
+       0x82000480, 0x24320001, 0x04021003, 0x4a03a005,
+       0xd0000001, 0x59d00006, 0x4a03a005, 0x90000001,
+       0x83d3a400, 0x00000020, 0x80040840, 0x040207fa,
+       0x59e00003, 0x82000500, 0xffffffe0, 0x82000540,
+       0x00008000, 0x4803c003, 0x59c40006, 0x82000500,
+       0xfffcffff, 0x48038806, 0x1c01f000, 0x4d900000,
+       0x4d180000, 0x4a0378e7, 0xaaaaaaaa, 0x4a0378e6,
+       0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, 0x4a0378e4,
+       0xaaaaaaaa, 0x42000800, 0x0000bf00, 0x4a00081a,
+       0x0010b7d4, 0x4a00081b, 0x001010bd, 0x4a00081c,
+       0x001010cd, 0x4a031800, 0x00000000, 0x4a031801,
+       0x0010b544, 0x4a031802, 0x0010b54b, 0x42000800,
+       0x0010b7d7, 0x417a3000, 0x811b20c8, 0x83932400,
+       0x0000bf32, 0x48072000, 0x4a032001, 0x00000000,
+       0x83180400, 0x001070ea, 0x50000000, 0x48032002,
+       0x82040c00, 0x00000003, 0x811a3000, 0x83180480,
+       0x00000005, 0x040017f1, 0x5c023000, 0x5c032000,
+       0x1c01f000, 0x48066004, 0x497a6000, 0x497a6001,
+       0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400,
+       0xa0000000, 0x480378e1, 0x1c01f000, 0x4933c857,
+       0x42000800, 0x80000040, 0x48066004, 0x497a6000,
+       0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400,
+       0x60000000, 0x480378e1, 0x1c01f000, 0x0201f800,
+       0x00106c55, 0x4df00000, 0x4d300000, 0x4d340000,
+       0x4d2c0000, 0x4d180000, 0x4c5c0000, 0x4c600000,
+       0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000,
+       0x42003000, 0x0000bf2e, 0x581a6001, 0x813261c0,
+       0x0400002c, 0x41302800, 0x4178c000, 0x59300000,
+       0x4c000000, 0x59326809, 0x5930b801, 0x59300406,
+       0x82000d80, 0x00000006, 0x04020003, 0x8d3e7d18,
+       0x04000010, 0x8d3e7d06, 0x04000007, 0x82000580,
+       0x00000003, 0x04020004, 0x59340200, 0x8c00050e,
+       0x04020008, 0x0401f92f, 0x4c0c0000, 0x4c140000,
+       0x0401fb5f, 0x5c002800, 0x5c001800, 0x0401f005,
+       0x41301800, 0x8060c1c0, 0x04020002, 0x400cc000,
+       0x805cb9c0, 0x04000003, 0x405e6000, 0x0401f7e3,
+       0x5c026000, 0x813261c0, 0x04000006, 0x8060c1c0,
+       0x04000002, 0x40602800, 0x4178c000, 0x0401f7d8,
+       0x417a3000, 0x0201f800, 0x001070d8, 0x59926004,
+       0x813261c0, 0x04000023, 0x59326809, 0x4130c000,
+       0x59300001, 0x8000bd40, 0x04000016, 0x40026000,
+       0x40602800, 0x5930b801, 0x59300406, 0x82000d80,
+       0x00000006, 0x0400000e, 0x8d3e7d06, 0x04000007,
+       0x82000580, 0x00000003, 0x04020004, 0x59340200,
+       0x8c00050e, 0x04020006, 0x0401f8dc, 0x4c140000,
+       0x0401fb2f, 0x5c002800, 0x0401f002, 0x41302800,
+       0x405e6000, 0x813261c0, 0x040207eb, 0x8060c1c0,
+       0x04000004, 0x40626000, 0x4178c000, 0x0401f7e7,
+       0x811a3000, 0x83180480, 0x00000005, 0x040017d6,
+       0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000,
+       0x5c00c000, 0x5c00b800, 0x5c023000, 0x5c025800,
+       0x5c026800, 0x5c026000, 0x5c03e000, 0x02000800,
+       0x00106c4b, 0x1c01f000, 0x4933c857, 0x0201f800,
+       0x00106c55, 0x4df00000, 0x4d340000, 0x4d180000,
+       0x4d900000, 0x42003000, 0x0000bf2e, 0x59326809,
+       0x58182001, 0x40102800, 0x801021c0, 0x04000016,
+       0x41300000, 0x80100580, 0x04000011, 0x58100009,
+       0x81340580, 0x0402000b, 0x40101800, 0x58102001,
+       0x41300000, 0x801021c0, 0x0400000b, 0x80100d80,
+       0x04000007, 0x40101800, 0x58102001, 0x0401f7fa,
+       0x40102800, 0x58102000, 0x0401f7ec, 0x0401f8bd,
+       0x0401f01a, 0x42032000, 0x0000bf32, 0x417a3000,
+       0x59902004, 0x40102800, 0x801021c0, 0x0400000b,
+       0x58100009, 0x81340580, 0x04020008, 0x41300000,
+       0x80100580, 0x0400000c, 0x40102800, 0x58102001,
+       0x801021c0, 0x040207fa, 0x811a3000, 0x83180480,
+       0x00000005, 0x0402100d, 0x83932400, 0x00000010,
+       0x0401f7ec, 0x0401f881, 0x5c032000, 0x5c023000,
+       0x5c026800, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x80000580, 0x1c01f000, 0x0401fb6f, 0x040007f7,
+       0x5c032000, 0x5c023000, 0x5c026800, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x82000540, 0x00000001,
+       0x1c01f000, 0x0201f800, 0x00106c55, 0x4df00000,
+       0x4d300000, 0x4d340000, 0x4d180000, 0x4d2c0000,
+       0x4c5c0000, 0x4c600000, 0x4d900000, 0x4dd00000,
+       0x4da40000, 0x4d140000, 0x42003000, 0x0000bf2e,
+       0x581a6001, 0x813261c0, 0x04000023, 0x41302800,
+       0x5930b800, 0x59326809, 0x59340403, 0x81440580,
+       0x04000006, 0x805cb9c0, 0x0400001b, 0x41302800,
+       0x405e6000, 0x0401f7f7, 0x5930b801, 0x8d3e7d00,
+       0x04000003, 0x0401fb67, 0x0402000e, 0x59300406,
+       0x82000580, 0x00000006, 0x04020003, 0x8d3e7d18,
+       0x04000008, 0x0401f867, 0x4c0c0000, 0x4c140000,
+       0x0401fa97, 0x5c002800, 0x5c001800, 0x0401f002,
+       0x41301800, 0x405e6000, 0x813261c0, 0x040207eb,
+       0x0401f02d, 0x417a3000, 0x0201f800, 0x001070d8,
+       0x59926004, 0x813261c0, 0x04000005, 0x59326809,
+       0x59340403, 0x81440580, 0x04000006, 0x811a3000,
+       0x83180480, 0x00000005, 0x040017f4, 0x0401f01e,
+       0x4130c000, 0x59300001, 0x8000bd40, 0x04000012,
+       0x40026000, 0x40602800, 0x5930b801, 0x8d3e7d00,
+       0x04000003, 0x0401fb3b, 0x0402000a, 0x59300406,
+       0x82000580, 0x00000006, 0x04000006, 0x0401f81b,
+       0x4c140000, 0x0401fa6e, 0x5c002800, 0x0401f002,
+       0x41302800, 0x405e6000, 0x813261c0, 0x040207ef,
+       0x8060c1c0, 0x04000004, 0x40626000, 0x4178c000,
+       0x0401f7eb, 0x5c022800, 0x5c034800, 0x5c03a000,
+       0x5c032000, 0x5c00c000, 0x5c00b800, 0x5c025800,
+       0x5c023000, 0x5c026800, 0x5c026000, 0x5c03e000,
+       0x04000be3, 0x1c01f000, 0x0401fbc8, 0x59900004,
+       0x81300580, 0x04020018, 0x4c140000, 0x0201f800,
+       0x00106dc3, 0x0401fbb8, 0x5c002800, 0x59300001,
+       0x800001c0, 0x04020003, 0x497a680c, 0x1c01f000,
+       0x42003000, 0x0000bf2e, 0x497a6001, 0x58180801,
+       0x800409c0, 0x04020004, 0x48003000, 0x48003001,
+       0x1c01f000, 0x58180800, 0x48000800, 0x48003000,
+       0x1c01f000, 0x59300001, 0x48002801, 0x800001c0,
+       0x04020002, 0x4816680c, 0x497a6001, 0x1c01f000,
+       0x0401fba6, 0x42003000, 0x0000bf2e, 0x58180001,
+       0x81300580, 0x0402001c, 0x59300801, 0x800409c0,
+       0x0400000e, 0x59300000, 0x800001c0, 0x04020005,
+       0x48043001, 0x48043000, 0x497a6001, 0x1c01f000,
+       0x59300000, 0x48000800, 0x48043001, 0x497a6000,
+       0x497a6001, 0x1c01f000, 0x59300800, 0x800409c0,
+       0x04020005, 0x49783001, 0x49783000, 0x497a680c,
+       0x1c01f000, 0x48043001, 0x497a6000, 0x497a680c,
+       0x1c01f000, 0x58180000, 0x81300580, 0x0402000c,
+       0x59300001, 0x800001c0, 0x04020005, 0x48143000,
+       0x49782800, 0x497a680c, 0x1c01f000, 0x48003000,
+       0x48002800, 0x497a6001, 0x1c01f000, 0x59300000,
+       0x800001c0, 0x04020008, 0x59300001, 0x48001801,
+       0x800001c0, 0x04020002, 0x480e680c, 0x497a6001,
+       0x1c01f000, 0x59300801, 0x800409c0, 0x04020006,
+       0x59300800, 0x48042800, 0x497a6000, 0x497a680c,
+       0x1c01f000, 0x59300000, 0x48000800, 0x48042800,
+       0x497a6000, 0x497a6001, 0x1c01f000, 0x0401fb82,
+       0x4df00000, 0x0401f839, 0x040208c4, 0x04020945,
+       0x04020a89, 0x04020005, 0x5c03e000, 0x04000b70,
+       0x80000580, 0x1c01f000, 0x5c03e000, 0x04000b6c,
+       0x82000540, 0x00000001, 0x1c01f000, 0x4d2c0000,
+       0x4d340000, 0x4d300000, 0x41783000, 0x598e6009,
+       0x813261c0, 0x04000021, 0x59300406, 0x82000580,
+       0x00000006, 0x04020004, 0x8d3e7d18, 0x0402000a,
+       0x0401f017, 0x82040580, 0x00000005, 0x04020006,
+       0x8d3e7d16, 0x04000004, 0x59300420, 0x8c000500,
+       0x0402000f, 0x0401fa4e, 0x59300000, 0x4c000000,
+       0x8d3e7d06, 0x04000004, 0x0201f800, 0x001092d7,
+       0x04000005, 0x0401f867, 0x4c180000, 0x0401f9bc,
+       0x5c003000, 0x5c026000, 0x0401f7e2, 0x41303000,
+       0x59326000, 0x0401f7df, 0x5c026000, 0x5c026800,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000,
+       0x813261c0, 0x02000800, 0x001005d8, 0x41300000,
+       0x598cb809, 0x41783000, 0x805cb9c0, 0x04000013,
+       0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800,
+       0x0401f7fa, 0x0401f84b, 0x598c000d, 0x81300580,
+       0x02000800, 0x001070b9, 0x59300403, 0x82000580,
+       0x00000042, 0x04020002, 0x497a6007, 0x80000580,
+       0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001,
+       0x5c00b800, 0x1c01f000, 0x0401fb27, 0x4df00000,
+       0x4d2c0000, 0x4d340000, 0x4d300000, 0x41783000,
+       0x598e6009, 0x813261c0, 0x0400002c, 0x59300c06,
+       0x82040580, 0x00000006, 0x04020004, 0x8d3e7d18,
+       0x0402000a, 0x0401f022, 0x82040580, 0x00000005,
+       0x04020006, 0x8d3e7d18, 0x04000004, 0x59300420,
+       0x8c000500, 0x0402001a, 0x59326809, 0x59340403,
+       0x81440580, 0x04020016, 0x8d3e7d00, 0x04000006,
+       0x82040580, 0x00000003, 0x04020011, 0x0401fa35,
+       0x0402000f, 0x0401f9f6, 0x59300000, 0x4c000000,
+       0x8d3e7d06, 0x04000004, 0x0201f800, 0x001092d7,
+       0x04000005, 0x0401f80f, 0x4c180000, 0x0401f964,
+       0x5c003000, 0x5c026000, 0x0401f7d7, 0x41303000,
+       0x59326000, 0x0401f7d4, 0x5c026000, 0x5c026800,
+       0x5c025800, 0x5c03e000, 0x04000ae5, 0x1c01f000,
+       0x59300800, 0x497a6000, 0x0401fac8, 0x801831c0,
+       0x04020009, 0x598c0008, 0x81300580, 0x04020004,
+       0x48031808, 0x48031809, 0x0401f008, 0x48071809,
+       0x0401f006, 0x48043000, 0x598c0008, 0x81300580,
+       0x04020002, 0x481b1808, 0x0401f2ca, 0x4d2c0000,
+       0x4d300000, 0x4d340000, 0x41783000, 0x598e600b,
+       0x813261c0, 0x04000013, 0x8d3e7d06, 0x04000005,
+       0x59326809, 0x59340200, 0x8c00050e, 0x0402000a,
+       0x0401f9bf, 0x59300000, 0x4c000000, 0x0401f853,
+       0x4c180000, 0x0401f932, 0x5c003000, 0x5c026000,
+       0x0401f7f0, 0x41303000, 0x59326000, 0x0401f7ed,
+       0x0201f800, 0x00104773, 0x5c026800, 0x5c026000,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000,
+       0x813261c0, 0x02000800, 0x001005d8, 0x41300000,
+       0x598cb80b, 0x41783000, 0x805cb9c0, 0x0400000f,
+       0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800,
+       0x0401f7fa, 0x0401f835, 0x598c000d, 0x81300580,
+       0x02000800, 0x001070b9, 0x497a6007, 0x80000580,
+       0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001,
+       0x5c00b800, 0x1c01f000, 0x0401fa9f, 0x4df00000,
+       0x4d340000, 0x4d300000, 0x4d2c0000, 0x0201f800,
+       0x00020245, 0x02020800, 0x001005d8, 0x41783000,
+       0x598e600b, 0x813261c0, 0x04000014, 0x59300009,
+       0x81340580, 0x0402000e, 0x8d3e7d00, 0x04000003,
+       0x0401f9bc, 0x0402000a, 0x0401f97d, 0x59300000,
+       0x4c000000, 0x0401f811, 0x4c180000, 0x0401f8f0,
+       0x5c003000, 0x5c026000, 0x0401f7ef, 0x41303000,
+       0x59326000, 0x0401f7ec, 0x0201f800, 0x0010479c,
+       0x5c025800, 0x5c026000, 0x5c026800, 0x5c03e000,
+       0x04000a6f, 0x1c01f000, 0x59300800, 0x497a6000,
+       0x0401fa52, 0x801831c0, 0x04020009, 0x598c000a,
+       0x81300580, 0x04020004, 0x4803180a, 0x4803180b,
+       0x0401f008, 0x4807180b, 0x0401f006, 0x48043000,
+       0x598c000a, 0x81300580, 0x04020002, 0x481b180a,
+       0x0401f254, 0x0401fa64, 0x4df00000, 0x4d300000,
+       0x598e6005, 0x813261c0, 0x04000020, 0x59300000,
+       0x4c000000, 0x59300c06, 0x82040580, 0x00000011,
+       0x04020007, 0x833c0500, 0x00001800, 0x04000015,
+       0x8d3e7d16, 0x04020013, 0x0401f009, 0x82040580,
+       0x00000004, 0x04020006, 0x8d3e7d16, 0x04000004,
+       0x59300420, 0x8c000500, 0x0402000a, 0x0201f800,
+       0x0010914e, 0x02000800, 0x0010801c, 0x0201f800,
+       0x00109326, 0x0201f800, 0x0002077d, 0x0401fa31,
+       0x5c026000, 0x0401f7e0, 0x497b1805, 0x497b1804,
+       0x5c026000, 0x5c03e000, 0x04000a31, 0x1c01f000,
+       0x4933c857, 0x4c5c0000, 0x4c600000, 0x813261c0,
+       0x02000800, 0x001005d8, 0x41300000, 0x598cb805,
+       0x405cc000, 0x805cb9c0, 0x04000025, 0x805c0d80,
+       0x04000004, 0x405cc000, 0x5860b800, 0x0401f7fa,
+       0x598c000d, 0x81300580, 0x02000800, 0x001070b9,
+       0x0401fa02, 0x598c0005, 0x805c0580, 0x04020009,
+       0x585c0000, 0x48031805, 0x4978b800, 0x598c0004,
+       0x805c0580, 0x0402000d, 0x497b1804, 0x0401f00b,
+       0x598c0004, 0x805c0580, 0x04020005, 0x48631804,
+       0x4978b800, 0x4978c000, 0x0401f004, 0x585c0000,
+       0x4800c000, 0x4978b800, 0x0401f9fe, 0x80000580,
+       0x5c00c000, 0x5c00b800, 0x1c01f000, 0x82000540,
+       0x00000001, 0x5c00c000, 0x5c00b800, 0x1c01f000,
+       0x4933c857, 0x0401fa04, 0x4df00000, 0x4d2c0000,
+       0x4d340000, 0x4d300000, 0x4c5c0000, 0x4178b800,
+       0x8d3e7d18, 0x0400000d, 0x8d3e7d16, 0x0402000b,
+       0x0201f800, 0x00109037, 0x04000008, 0x0201f800,
+       0x00109597, 0x04020005, 0x592c0207, 0x492fc857,
+       0x8200bd00, 0x0000000f, 0x41783000, 0x598e6005,
+       0x813261c0, 0x04000029, 0x59326809, 0x813669c0,
+       0x04000023, 0x59340403, 0x81440580, 0x04020020,
+       0x59300c06, 0x82040580, 0x00000011, 0x0400001a,
+       0x82040580, 0x00000004, 0x04020004, 0x59300420,
+       0x8c000500, 0x04020016, 0x0201f800, 0x00109037,
+       0x04000008, 0x0201f800, 0x00109597, 0x04020005,
+       0x59300403, 0x82000580, 0x00000043, 0x0400000c,
+       0x0401f8c3, 0x59300000, 0x4c000000, 0x0401f812,
+       0x4c180000, 0x0401f836, 0x5c003000, 0x5c026000,
+       0x0401f7dc, 0x805cb9c0, 0x040207ec, 0x41303000,
+       0x59326000, 0x0401f7d7, 0x5c00b800, 0x5c026000,
+       0x5c026800, 0x5c025800, 0x5c03e000, 0x040009b4,
+       0x1c01f000, 0x59300800, 0x497a6000, 0x0401f997,
+       0x801831c0, 0x04020009, 0x598c0004, 0x81300580,
+       0x04020004, 0x48031804, 0x48031805, 0x0401f008,
+       0x48071805, 0x0401f006, 0x48043000, 0x598c0004,
+       0x81300580, 0x04020002, 0x481b1804, 0x0401f199,
+       0x4943c857, 0x0401f9a8, 0x4df00000, 0x0401fe34,
+       0x0401fecb, 0x5c03e000, 0x04000999, 0x1c01f000,
+       0x4947c857, 0x0401f9a0, 0x4df00000, 0x4d3c0000,
+       0x853e7d00, 0x0401fe75, 0x0401fefc, 0x5c027800,
+       0x5c03e000, 0x0400098e, 0x1c01f000, 0x5c000000,
+       0x4c000000, 0x4803c857, 0x4d340000, 0x4d2c0000,
+       0x59326809, 0x59325808, 0x59300406, 0x82000c80,
+       0x00000012, 0x02021800, 0x001005d8, 0x4933c857,
+       0x4943c857, 0x493fc857, 0x4803c857, 0x0c01f804,
+       0x5c025800, 0x5c026800, 0x1c01f000, 0x00106ae5,
+       0x00106ae7, 0x00106af1, 0x00106b0b, 0x00106ae7,
+       0x00106afb, 0x00106b23, 0x00106ae5, 0x00106ae5,
+       0x00106b36, 0x00106b2d, 0x00106ae5, 0x00106ae5,
+       0x00106ae5, 0x00106ae5, 0x00106ae5, 0x00106b3c,
+       0x00106b3c, 0x0201f800, 0x001005d8, 0x0201f800,
+       0x00109134, 0x02000800, 0x00102074, 0x0201f800,
+       0x00109326, 0x0201f800, 0x0010801c, 0x0201f000,
+       0x00107911, 0x812e59c0, 0x02020800, 0x001005d8,
+       0x5930021d, 0x82000580, 0x00000003, 0x02000800,
+       0x0010912a, 0x0201f000, 0x00107911, 0x0201f800,
+       0x00109037, 0x02000000, 0x00107911, 0x592c1204,
+       0x82081500, 0x000000ff, 0x82080580, 0x00000055,
+       0x02020800, 0x001005d8, 0x49425a06, 0x0201f800,
+       0x000202da, 0x0201f000, 0x00107911, 0x59300004,
+       0x8400055c, 0x48026004, 0x59300007, 0x8c000500,
+       0x02020800, 0x00100e99, 0x0201f800, 0x00109037,
+       0x0400000d, 0x4a025a04, 0x00000103, 0x49425a06,
+       0x497a5c09, 0x0201f800, 0x001091c6, 0x0201f800,
+       0x0010a693, 0x0201f800, 0x000202da, 0x0201f800,
+       0x0010912a, 0x0201f000, 0x00107911, 0x59300007,
+       0x8c000500, 0x02020800, 0x00100e99, 0x0201f800,
+       0x00109037, 0x02020800, 0x0010a3ef, 0x0201f000,
+       0x00107911, 0x0201f800, 0x00109037, 0x04000005,
+       0x49425a06, 0x497a5c09, 0x0201f800, 0x000202da,
+       0x0201f000, 0x00107911, 0x0201f800, 0x00109037,
+       0x02020800, 0x0010664f, 0x0201f000, 0x00107911,
+       0x0201f800, 0x00109037, 0x04000004, 0x49425a06,
+       0x0201f800, 0x000202da, 0x59325817, 0x0201f800,
+       0x001007fd, 0x0201f000, 0x00107911, 0x598c000d,
+       0x81300580, 0x04000003, 0x497a6007, 0x1c01f000,
+       0x59c40004, 0x82000500, 0x0000000c, 0x04000005,
+       0x4a038804, 0x0000000c, 0x497b2807, 0x0401f00a,
+       0x0401facd, 0x59300403, 0x82000d80, 0x00000040,
+       0x04000004, 0x82000580, 0x00000042, 0x04020002,
+       0x497a6007, 0x0201f800, 0x001070b9, 0x80000580,
+       0x1c01f000, 0x59300804, 0x8c040d3e, 0x04020004,
+       0x82000540, 0x00000001, 0x0401f005, 0x4933c857,
+       0x84040d3e, 0x48066004, 0x80000580, 0x1c01f000,
+       0x59300804, 0x8c040d20, 0x04020004, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4933c857, 0x4d380000,
+       0x59300804, 0x84040d20, 0x48066004, 0x42027000,
+       0x00000049, 0x59300203, 0x82000580, 0x00000003,
+       0x04000003, 0x42027000, 0x00000013, 0x0201f800,
+       0x000207a1, 0x80000580, 0x5c027000, 0x1c01f000,
+       0x59300017, 0x81480580, 0x04020003, 0x59300018,
+       0x814c0580, 0x1c01f000, 0x4d2c0000, 0x4d300000,
+       0x0401f8c9, 0x4df00000, 0x0201f800, 0x00106062,
+       0x59900001, 0x82000500, 0x00000003, 0x0c01f001,
+       0x00106bba, 0x00106b9a, 0x00106b98, 0x00106b98,
+       0x0201f800, 0x001005d8, 0x59926004, 0x0401f88e,
+       0x813261c0, 0x0400001d, 0x59300004, 0x8c000516,
+       0x04000004, 0x59325808, 0x497a5808, 0x497a5809,
+       0x0401f88e, 0x59300001, 0x800001c0, 0x0400000e,
+       0x497a6001, 0x42003000, 0x0000bf2e, 0x58180801,
+       0x800409c0, 0x04020004, 0x48003001, 0x48003000,
+       0x0401f00a, 0x58180800, 0x48000800, 0x48003000,
+       0x0401f006, 0x59300809, 0x800409c0, 0x02000800,
+       0x001005d8, 0x4978080c, 0x5c03e000, 0x04000890,
+       0x5c026000, 0x5c025800, 0x1c01f000, 0x4d300000,
+       0x497b2807, 0x0401f894, 0x4df00000, 0x598c0000,
+       0x82000500, 0x00000007, 0x4803c857, 0x0c01f001,
+       0x00106bef, 0x00106bd2, 0x00106bdb, 0x00106bdf,
+       0x00106bea, 0x00106bef, 0x00106bd0, 0x00106bd0,
+       0x0201f800, 0x001005d8, 0x598c000d, 0x80026540,
+       0x04000004, 0x0401f81e, 0x02020800, 0x001005d8,
+       0x0201f800, 0x001070b9, 0x0401f015, 0x0401f827,
+       0x0201f800, 0x001070b9, 0x0401f011, 0x598c000d,
+       0x80026540, 0x0400000e, 0x0401f838, 0x04000004,
+       0x0401f80f, 0x04000002, 0x0401f81c, 0x0201f800,
+       0x001070b9, 0x0401f006, 0x0401f830, 0x02020800,
+       0x001005d8, 0x0201f800, 0x001070b9, 0x5c03e000,
+       0x0400085b, 0x5c026000, 0x1c01f000, 0x598c0009,
+       0x81300580, 0x0402000c, 0x0401f84e, 0x0401f83b,
+       0x59300000, 0x800001c0, 0x04000004, 0x48031809,
+       0x497a6000, 0x0401f003, 0x497b1809, 0x497b1808,
+       0x80000580, 0x1c01f000, 0x4d2c0000, 0x59300406,
+       0x82000580, 0x00000003, 0x04020012, 0x598c000b,
+       0x81300580, 0x0402000f, 0x0401f83a, 0x59325808,
+       0x497a5808, 0x497a5809, 0x0401f824, 0x59300000,
+       0x800001c0, 0x04000004, 0x4803180b, 0x497a6000,
+       0x0401f003, 0x497b180a, 0x497b180b, 0x80000580,
+       0x5c025800, 0x1c01f000, 0x598c0005, 0x81300580,
+       0x0402000c, 0x0401f827, 0x0401f814, 0x59300000,
+       0x800001c0, 0x04000004, 0x48031805, 0x497a6000,
+       0x0401f003, 0x497b1805, 0x497b1804, 0x80000580,
+       0x1c01f000, 0x4a032001, 0x00000000, 0x497b2004,
+       0x497b2005, 0x59900006, 0x82000500, 0x0000ffff,
+       0x48032006, 0x1c01f000, 0x4c040000, 0x59300004,
+       0x82000500, 0x7ffeffff, 0x48026004, 0x59bc00e4,
+       0x8c000514, 0x04000009, 0x42000800, 0x0000bf00,
+       0x58040012, 0x81300580, 0x04020004, 0x49780812,
+       0x4a0378e4, 0x00000800, 0x5c000800, 0x1c01f000,
+       0x4803c856, 0x598c000c, 0x80000540, 0x04000003,
+       0x80000040, 0x4803180c, 0x1c01f000, 0x59bc00ea,
+       0x82000500, 0x00000007, 0x82000580, 0x00000003,
+       0x04020004, 0x4803c856, 0x4a0378e8, 0x00000001,
+       0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007,
+       0x82000580, 0x00000001, 0x04020011, 0x4803c856,
+       0x42000800, 0x00000000, 0x0401f80e, 0x42000800,
+       0x00001000, 0x59bc00ea, 0x82000500, 0x00000007,
+       0x82000580, 0x00000003, 0x04000005, 0x80040840,
+       0x040207f9, 0x0201f800, 0x001005d8, 0x1c01f000,
+       0x59bc00ea, 0x82000500, 0x00000007, 0x82000580,
+       0x00000001, 0x02020800, 0x001005d8, 0x59bc00ea,
+       0x8c000516, 0x040207fe, 0x480778e1, 0x1c01f000,
+       0x59bc00ea, 0x8c000516, 0x040207fe, 0x480778e1,
+       0x59bc00ea, 0x8c000516, 0x040207fe, 0x480b78e1,
+       0x1c01f000, 0x82000d00, 0x80000018, 0x02020800,
+       0x001005d0, 0x0201f800, 0x001005d8, 0x00106c97,
+       0x00106d3b, 0x00106d55, 0x00106c97, 0x00106c99,
+       0x00106cba, 0x00106cd9, 0x00106d0d, 0x00106c97,
+       0x00106d39, 0x00106c97, 0x00106c97, 0x00106c97,
+       0x00106c97, 0x00106c97, 0x00106c97, 0x0201f800,
+       0x001005d8, 0x4d300000, 0x4d900000, 0x4dd00000,
+       0x4da40000, 0x4d140000, 0x0201f800, 0x001070d8,
+       0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0,
+       0x59300004, 0x8c000520, 0x04000011, 0x82000500,
+       0xfffefeff, 0x48026004, 0x4a026203, 0x00000003,
+       0x0401ffa9, 0x0201f800, 0x00100fd0, 0x5c022800,
+       0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000,
+       0x4a0378e4, 0x00000008, 0x0401f795, 0x84000510,
+       0x48026004, 0x0401f7f6, 0x4d300000, 0x4d900000,
+       0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800,
+       0x001070d8, 0x59bc00ea, 0x8c000510, 0x040007fe,
+       0x59be60e0, 0x59300004, 0x8c000520, 0x0400000f,
+       0x82000500, 0xfffefeff, 0x48026004, 0x0401ff8a,
+       0x0201f800, 0x0010100e, 0x5c022800, 0x5c034800,
+       0x5c03a000, 0x5c032000, 0x5c026000, 0x4a0378e4,
+       0x00000008, 0x0401f776, 0x84000510, 0x48026004,
+       0x0401f7f6, 0x4d300000, 0x4d2c0000, 0x4d340000,
+       0x4da40000, 0x4cd00000, 0x59bc00ea, 0x8c000510,
+       0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800,
+       0x001005d8, 0x59300004, 0x8c000520, 0x0400001d,
+       0x82000500, 0xfffefeff, 0x48026004, 0x59326809,
+       0x42034800, 0x0010b544, 0x04011000, 0x4a03c840,
+       0x0010b54b, 0x4a03c842, 0x00000012, 0x04011000,
+       0x4a03c840, 0x0010b55d, 0x4a03c842, 0x000000ff,
+       0x04011000, 0x4a03c840, 0x0010b65c, 0x4a03c842,
+       0x000000ff, 0x0401fbf2, 0x5c01a000, 0x5c034800,
+       0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000,
+       0x84000510, 0x48026004, 0x5c01a000, 0x5c034800,
+       0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000,
+       0x1c01f000, 0x4d300000, 0x4d2c0000, 0x4d340000,
+       0x4cd00000, 0x4d900000, 0x4dd00000, 0x4da40000,
+       0x4d140000, 0x0401fbc3, 0x59bc00ea, 0x8c000510,
+       0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800,
+       0x001005d8, 0x59300004, 0x8c000520, 0x0400000f,
+       0x82000500, 0xfffefeff, 0x48026004, 0x0201f800,
+       0x0010783a, 0x5c022800, 0x5c034800, 0x5c03a000,
+       0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800,
+       0x5c026000, 0x1c01f000, 0x84000510, 0x48026004,
+       0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000,
+       0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000,
+       0x1c01f000, 0x0201f800, 0x001005d8, 0x4d300000,
+       0x4d380000, 0x42000000, 0x0010b8c4, 0x0201f800,
+       0x0010aa47, 0x0401ff14, 0x598e600d, 0x59c40004,
+       0x8c000506, 0x04000004, 0x0401f8db, 0x4a038804,
+       0x00000008, 0x813261c0, 0x04000006, 0x0401fb87,
+       0x42027000, 0x00000014, 0x0201f800, 0x000207a1,
+       0x4a0378e4, 0x00000002, 0x5c027000, 0x5c026000,
+       0x0401f6f7, 0x4d180000, 0x4d300000, 0x4d380000,
+       0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000,
+       0x0401fef9, 0x417a3000, 0x59c40804, 0x83180400,
+       0x0010709f, 0x50000000, 0x80040500, 0x0400001b,
+       0x42000000, 0x0010b8c5, 0x0201f800, 0x0010aa47,
+       0x0401fb70, 0x59926004, 0x0401f859, 0x83180400,
+       0x0010709f, 0x50000000, 0x48038804, 0x813261c0,
+       0x0400000a, 0x59300004, 0x8c00050c, 0x04020003,
+       0x4a026203, 0x00000003, 0x42027000, 0x0000004a,
+       0x0201f800, 0x000207a1, 0x59c40004, 0x82000500,
+       0x00f80000, 0x04000005, 0x811a3000, 0x83180480,
+       0x00000005, 0x040017dd, 0x4a0378e4, 0x00000008,
+       0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000,
+       0x5c027000, 0x5c026000, 0x5c023000, 0x0401f6c0,
+       0x4d2c0000, 0x4d340000, 0x59326809, 0x598c0800,
+       0x82040580, 0x00000004, 0x04020004, 0x838c1400,
+       0x00000005, 0x0401f00c, 0x82040580, 0x00000001,
+       0x04020004, 0x838c1400, 0x00000009, 0x0401f006,
+       0x82040580, 0x00000002, 0x04020022, 0x838c1400,
+       0x0000000b, 0x41306800, 0x58340000, 0x80007d40,
+       0x0400001c, 0x583c0009, 0x81340580, 0x04020006,
+       0x403c6800, 0x583c0000, 0x80007d40, 0x040207fa,
+       0x0401f014, 0x4933c857, 0x483fc857, 0x583c0000,
+       0x48006800, 0x49307800, 0x443c1000, 0x80000580,
+       0x4803180d, 0x4803180f, 0x598c0000, 0x82000580,
+       0x00000003, 0x04000003, 0x4a031800, 0x00000000,
+       0x80000580, 0x5c026800, 0x5c025800, 0x1c01f000,
+       0x82000540, 0x00000001, 0x0401f7fb, 0x491bc857,
+       0x59c80840, 0x82040540, 0x00000010, 0x48039040,
+       0x59c41008, 0x82080500, 0xffffff7f, 0x48038808,
+       0x4c040000, 0x4c080000, 0x0401fabb, 0x04020007,
+       0x0401fabf, 0x04000022, 0x48038804, 0x0201f800,
+       0x0010107a, 0x0401f042, 0x4a038803, 0x00000008,
+       0x59c40003, 0x82000500, 0x00000003, 0x040007fd,
+       0x8c000502, 0x04020007, 0x0401fab1, 0x04000014,
+       0x48038804, 0x0201f800, 0x0010107a, 0x0401f034,
+       0x59c80040, 0x8400056a, 0x48039040, 0x59c80040,
+       0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500,
+       0xc0000000, 0x04000006, 0x59c400a3, 0x84000540,
+       0x480388a3, 0x4a038805, 0xc0000000, 0x0201f800,
+       0x0010101d, 0x4a03a005, 0x30000000, 0x59d00006,
+       0x4a03a005, 0x30000000, 0x59900006, 0x82000500,
+       0xffff0000, 0x48032006, 0x59d00005, 0x8c000504,
+       0x040207fe, 0x42000800, 0x00007600, 0x83180540,
+       0x60000000, 0x480008a1, 0x811800dc, 0x59c80840,
+       0x80040540, 0x48039040, 0x82000540, 0x00003000,
+       0x48039040, 0x59c80040, 0x82000500, 0x00003000,
+       0x040207fd, 0x0201f800, 0x00101068, 0x83180400,
+       0x0010709f, 0x50000000, 0x48038804, 0x80000580,
+       0x4df00000, 0x0201f800, 0x00106062, 0x5c03e000,
+       0x5c001000, 0x5c000800, 0x480b8808, 0x48079040,
+       0x1c01f000, 0x4803c856, 0x59c80840, 0x82040540,
+       0x00000010, 0x48039040, 0x59c41008, 0x82080500,
+       0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000,
+       0x59c40004, 0x82000500, 0x00000003, 0x04020010,
+       0x59c40004, 0x82000500, 0x0000000c, 0x04000005,
+       0x4a038804, 0x0000000c, 0x8c000504, 0x0401f025,
+       0x59c80040, 0x8400056e, 0x48039040, 0x59c80040,
+       0x8c00052e, 0x040207fe, 0x0401f01e, 0x4a038803,
+       0x00000008, 0x59c40003, 0x82000500, 0x00000003,
+       0x040007fd, 0x8c000502, 0x04020006, 0x59c40004,
+       0x4a038804, 0x0000000c, 0x8c000504, 0x0401f011,
+       0x59c80040, 0x8400056a, 0x48039040, 0x59c80040,
+       0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500,
+       0xc0000000, 0x04000007, 0x59c400a3, 0x84000540,
+       0x480388a3, 0x4a038805, 0xc0000000, 0x80000580,
+       0x497b2807, 0x5c001000, 0x5c000800, 0x480b8808,
+       0x48079040, 0x1c01f000, 0x4933c857, 0x4d900000,
+       0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fdee,
+       0x4df00000, 0x0401fa6f, 0x59900004, 0x800001c0,
+       0x04000011, 0x81300580, 0x0402000f, 0x59300004,
+       0x84000520, 0x48026004, 0x0401ff51, 0x04020009,
+       0x5c03e000, 0x04000dd6, 0x80000580, 0x5c022800,
+       0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000,
+       0x0401fd0e, 0x42027000, 0x00000049, 0x59300004,
+       0x84000520, 0x48026004, 0x8c00050c, 0x02020800,
+       0x000207a1, 0x5c03e000, 0x04000dc5, 0x82000540,
+       0x00000001, 0x5c022800, 0x5c034800, 0x5c03a000,
+       0x5c032000, 0x1c01f000, 0x4933c857, 0x0401fdc6,
+       0x4df00000, 0x598c000d, 0x80026540, 0x04000012,
+       0x59300004, 0x84000520, 0x48026004, 0x0401ff8a,
+       0x04000017, 0x0401fd26, 0x42027000, 0x00000013,
+       0x59300004, 0x8c00050c, 0x02020800, 0x000207a1,
+       0x5c03e000, 0x04000daa, 0x82000540, 0x00000001,
+       0x1c01f000, 0x836c1580, 0x00000001, 0x040007f9,
+       0x836c1580, 0x00000004, 0x040007f6, 0x42001000,
+       0x00104148, 0x0201f800, 0x00105f90, 0x5c03e000,
+       0x04000d9b, 0x80000580, 0x1c01f000, 0x4d300000,
+       0x4d180000, 0x4d3c0000, 0x0401fd9f, 0x4df00000,
+       0x4a0378e4, 0x0000000f, 0x0401f9ff, 0x417a3000,
+       0x59926004, 0x813261c0, 0x04000010, 0x417a7800,
+       0x0201f800, 0x001048d9, 0x0400000a, 0x59300c06,
+       0x82040580, 0x00000003, 0x04000004, 0x82040580,
+       0x00000006, 0x04020003, 0x42027800, 0x00000002,
+       0x0201f800, 0x00108be3, 0x811a3000, 0x83180480,
+       0x00000005, 0x040017eb, 0x42000800, 0x00000040,
+       0x0201f800, 0x00101345, 0x4a0378e4, 0x0000000a,
+       0x5c03e000, 0x04000d72, 0x5c027800, 0x5c023000,
+       0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000,
+       0x0401fd75, 0x4df00000, 0x59c80840, 0x82040540,
+       0x00000010, 0x48039040, 0x59c41008, 0x82080500,
+       0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000,
+       0x42001000, 0x00000003, 0x0401f9c2, 0x598e600d,
+       0x813261c0, 0x04020f9d, 0x040009c7, 0x497b2807,
+       0x0401f80a, 0x5c001000, 0x5c000800, 0x480b8808,
+       0x84040d74, 0x48079040, 0x5c03e000, 0x04000d50,
+       0x5c026000, 0x1c01f000, 0x4d380000, 0x4d180000,
+       0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000,
+       0x4d140000, 0x59c41004, 0x480bc857, 0x82080500,
+       0x00003ff0, 0x04000025, 0x417a3000, 0x4c080000,
+       0x0201f800, 0x00106062, 0x5c001000, 0x82080500,
+       0x00000210, 0x04020004, 0x811a3000, 0x80081102,
+       0x0401f7f7, 0x0401f9c3, 0x59926004, 0x4933c857,
+       0x813261c0, 0x04020005, 0x59c400a3, 0x8c00051a,
+       0x02000800, 0x001005d8, 0x0401fea5, 0x04000009,
+       0x0401fc6a, 0x42027000, 0x00000049, 0x59300004,
+       0x8c00050c, 0x02020800, 0x000207a1, 0x0401f007,
+       0x42027000, 0x0000004a, 0x4a026203, 0x00000003,
+       0x0201f800, 0x000207a1, 0x5c022800, 0x5c034800,
+       0x5c03a000, 0x5c032000, 0x5c026000, 0x5c023000,
+       0x5c027000, 0x1c01f000, 0x4d300000, 0x4d180000,
+       0x4d900000, 0x0401fd1c, 0x42001000, 0x00000000,
+       0x598c0000, 0x82000580, 0x00000005, 0x04000971,
+       0x417a3000, 0x811b20c8, 0x83932400, 0x0000bf32,
+       0x59900001, 0x82000580, 0x00000001, 0x0402000d,
+       0x42000800, 0x000007d0, 0x59926004, 0x59300011,
+       0x82000500, 0xfff00000, 0x80000540, 0x04000003,
+       0x42000800, 0x00001b58, 0x0201f800, 0x00106054,
+       0x811a3000, 0x83180480, 0x00000005, 0x040017ea,
+       0x59c81040, 0x84081534, 0x480b9040, 0x0401fcf0,
+       0x5c032000, 0x5c023000, 0x5c026000, 0x1c01f000,
+       0x4933c857, 0x4d900000, 0x4dd00000, 0x4da40000,
+       0x4d140000, 0x4d380000, 0x0401fcef, 0x4df00000,
+       0x59300004, 0x8c00053e, 0x04020007, 0x8c000520,
+       0x04000025, 0x0201f800, 0x00106b6c, 0x04000022,
+       0x0401f02a, 0x598c000d, 0x81300580, 0x04000011,
+       0x0201f800, 0x00108cd6, 0x04020024, 0x0401f918,
+       0x04000022, 0x48038804, 0x0401f95e, 0x0201f800,
+       0x0010107a, 0x0401fc0d, 0x42027000, 0x00000049,
+       0x59300004, 0x8c00050c, 0x0402000d, 0x0401f00e,
+       0x59c40004, 0x8c000504, 0x04000014, 0x4a038804,
+       0x00000004, 0x0401fc36, 0x42027000, 0x00000013,
+       0x59300004, 0x8c00050c, 0x04000003, 0x0201f800,
+       0x000207a1, 0x5c03e000, 0x04000cb9, 0x5c027000,
+       0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000,
+       0x80000580, 0x1c01f000, 0x5c03e000, 0x04000cb0,
+       0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000,
+       0x5c032000, 0x82000540, 0x00000001, 0x1c01f000,
+       0x497b2807, 0x0401fcb0, 0x59c400af, 0x800001c0,
+       0x04020004, 0x0401fca2, 0x0201f000, 0x001014fb,
+       0x598c000f, 0x82001480, 0x00000002, 0x04021007,
+       0x80000000, 0x4803180f, 0x80000580, 0x0201f800,
+       0x0010604d, 0x0400000e, 0x0401fed8, 0x0402000c,
+       0x0401fdd4, 0x0400000a, 0x0201f800, 0x0010a9c7,
+       0x0401f916, 0x4d380000, 0x42027000, 0x00000014,
+       0x0201f800, 0x000207a1, 0x5c027000, 0x0401fc88,
+       0x0201f000, 0x001014fb, 0x4d900000, 0x4dd00000,
+       0x4da40000, 0x4d140000, 0x4d300000, 0x0201f800,
+       0x00106062, 0x0401fc88, 0x59c400af, 0x800001c0,
+       0x04000027, 0x0401f907, 0x59926004, 0x4933c857,
+       0x59300004, 0x8c000516, 0x0400000b, 0x0401fe8b,
+       0x0402001f, 0x0201f800, 0x00106b8a, 0x0401fc70,
+       0x42000800, 0x80000804, 0x0201f800, 0x00106721,
+       0x0401f017, 0x42001800, 0x00007530, 0x0401f8c1,
+       0x04020004, 0x0201f800, 0x00106052, 0x0401f010,
+       0x0401fe7a, 0x0402000e, 0x0201f800, 0x0010a9c7,
+       0x59300004, 0x8c00050c, 0x04020003, 0x4a026203,
+       0x00000003, 0x4d380000, 0x42027000, 0x0000004a,
+       0x0201f800, 0x000207a1, 0x5c027000, 0x0401fc54,
+       0x5c026000, 0x5c022800, 0x5c034800, 0x5c03a000,
+       0x5c032000, 0x0201f000, 0x001014fb, 0x4d900000,
+       0x4dd00000, 0x4da40000, 0x4d140000, 0x4d300000,
+       0x4d2c0000, 0x0401fc50, 0x0401f8d2, 0x59926004,
+       0x4933c857, 0x0401f880, 0x04000016, 0x0201f800,
+       0x00106062, 0x813261c0, 0x04000034, 0x59325808,
+       0x812e59c0, 0x02000800, 0x001005d8, 0x0201f800,
+       0x0010513b, 0x0402001d, 0x592c0208, 0x84000550,
+       0x48025a08, 0x0201f800, 0x00105258, 0x04020027,
+       0x592c0208, 0x84000510, 0x48025a08, 0x0401f023,
+       0x0201f800, 0x00106052, 0x0401f020, 0x0201f800,
+       0x0010a9c7, 0x0401fd9e, 0x592c0208, 0x84000550,
+       0x48025a08, 0x4d380000, 0x42027000, 0x0000004a,
+       0x4a026203, 0x00000003, 0x0201f800, 0x000207a1,
+       0x5c027000, 0x0401f011, 0x59900006, 0x82000500,
+       0xffff0000, 0x040207ee, 0x59c408af, 0x82040480,
+       0x000003e8, 0x040217ea, 0x59900006, 0x82000400,
+       0x00010000, 0x48032006, 0x0201f800, 0x00106052,
+       0x0201f800, 0x0010411d, 0x5c025800, 0x5c026000,
+       0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000,
+       0x0401f403, 0x4d300000, 0x4d2c0000, 0x0401fc0a,
+       0x598e600d, 0x4933c857, 0x59c41004, 0x8c081500,
+       0x04000007, 0x0201f800, 0x0010513b, 0x04020007,
+       0x0201f800, 0x00105258, 0x0402002f, 0x0201f800,
+       0x0010604d, 0x0401f02c, 0x598c000f, 0x80000540,
+       0x04020011, 0x59c408af, 0x82040480, 0x000003e8,
+       0x0402100d, 0x598c080f, 0x80040800, 0x4807180f,
+       0x0201f800, 0x0010604d, 0x42000000, 0x0010b852,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x0010411d,
+       0x0401f019, 0x0401fdb4, 0x813261c0, 0x04020003,
+       0x0401f849, 0x0401f014, 0x0201f800, 0x0010a9c7,
+       0x59300406, 0x82000580, 0x00000003, 0x04020007,
+       0x59325808, 0x812e59c0, 0x04000004, 0x592c0208,
+       0x84000550, 0x48025a08, 0x0401f854, 0x4d380000,
+       0x42027000, 0x00000014, 0x0201f800, 0x000207a1,
+       0x5c027000, 0x5c025800, 0x5c026000, 0x0201f000,
+       0x00106c4b, 0x59c40804, 0x83180400, 0x00107095,
+       0x50000000, 0x80040500, 0x1c01f000, 0x59c40804,
+       0x83180400, 0x0010709a, 0x50000000, 0x80040500,
+       0x1c01f000, 0x00000210, 0x00000420, 0x00000840,
+       0x00001080, 0x00002100, 0x00004000, 0x00008000,
+       0x00010000, 0x00020000, 0x00040000, 0x00080000,
+       0x00100000, 0x00200000, 0x00400000, 0x00800000,
+       0x59900806, 0x80040120, 0x800c0480, 0x04021004,
+       0x82000540, 0x00000001, 0x0401f005, 0x82040c00,
+       0x00010000, 0x48072006, 0x80000580, 0x1c01f000,
+       0x480bc857, 0x0201f800, 0x00106c55, 0x4df00000,
+       0x480b1800, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x1c01f000, 0x4803c856, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x497b180d, 0x497b1803, 0x497b180e,
+       0x497b180f, 0x497b1810, 0x598c0000, 0x82000580,
+       0x00000003, 0x04000009, 0x836c0580, 0x00000002,
+       0x04020004, 0x4a031800, 0x00000005, 0x0401f003,
+       0x4a031800, 0x00000000, 0x5c03e000, 0x02000800,
+       0x00106c4b, 0x1c01f000, 0x59300004, 0x8c00050c,
+       0x04020003, 0x4a026203, 0x00000001, 0x1c01f000,
+       0x83180480, 0x00000005, 0x02021800, 0x001005d8,
+       0x491bc857, 0x811b20c8, 0x83932400, 0x0000bf32,
+       0x811ba0ca, 0x83d3a400, 0x00007600, 0x83180400,
+       0x001070ea, 0x50034800, 0x811a28c2, 0x83162c00,
+       0x00006100, 0x1c01f000, 0x0010b75b, 0x0010b772,
+       0x0010b789, 0x0010b7a0, 0x0010b7b7, 0x4933c857,
+       0x59300406, 0x82000c80, 0x00000012, 0x04021016,
+       0x4803c857, 0x04011000, 0x0c01f001, 0x00107109,
+       0x00107198, 0x001074d1, 0x00107556, 0x00107198,
+       0x001074d1, 0x00107556, 0x00107109, 0x00107198,
+       0x00107109, 0x00107109, 0x00107109, 0x00107109,
+       0x00107109, 0x00107109, 0x00107109, 0x0010710f,
+       0x0010710f, 0x0201f800, 0x00106c55, 0x0201f800,
+       0x00106bbf, 0x0201f000, 0x00106c4b, 0x42001000,
+       0x0010b7f6, 0x50081000, 0x4930100c, 0x58080002,
+       0x82000580, 0x00000100, 0x04020032, 0x59325808,
+       0x812e59c0, 0x02000800, 0x001005d8, 0x59326809,
+       0x813669c0, 0x04000019, 0x592c040b, 0x82000500,
+       0x0000e000, 0x04000003, 0x0401fba8, 0x0401f002,
+       0x0401fb98, 0x42001000, 0x0010b7f6, 0x50081000,
+       0x4930100b, 0x492c100a, 0x82d00400, 0x00000006,
+       0x48001003, 0x592c000d, 0x80000104, 0x48001004,
+       0x592c000e, 0x48001007, 0x592c000f, 0x48001008,
+       0x0201f000, 0x00100858, 0x42026800, 0x0010be0d,
+       0x592c080a, 0x48066802, 0x82040500, 0x00ffff00,
+       0x04000007, 0x497a6a12, 0x59a81010, 0x82081500,
+       0x00ffff00, 0x80080580, 0x040207dc, 0x82040d00,
+       0x000000ff, 0x800408d0, 0x48066a12, 0x0401f7d7,
+       0x1c01f000, 0x4d2c0000, 0x4d300000, 0x4c580000,
+       0x4c540000, 0x4c500000, 0x5832580a, 0x812e59c0,
+       0x02000800, 0x001005d8, 0x58300002, 0x4a006002,
+       0x00000100, 0x82000580, 0x00000100, 0x0402001c,
+       0x5830000b, 0x5832600c, 0x81300580, 0x04020010,
+       0x0401f828, 0x04020010, 0x592c080d, 0x80040904,
+       0x4004b000, 0x4200a000, 0x0010b54b, 0x4050a800,
+       0x0201f800, 0x0010ab28, 0x42001000, 0x0000dc00,
+       0x0201f800, 0x001078bc, 0x0401f003, 0x0401f819,
+       0x04000fa3, 0x5c00a000, 0x5c00a800, 0x5c00b000,
+       0x5c026000, 0x5c025800, 0x1c01f000, 0x5830000b,
+       0x5832600c, 0x81300580, 0x040207f5, 0x0401f80d,
+       0x040207f5, 0x0201f800, 0x001068d3, 0x02020800,
+       0x001005d8, 0x4a025a06, 0x00000002, 0x0201f800,
+       0x000202da, 0x0201f800, 0x00107911, 0x0401f7ea,
+       0x0201f800, 0x00106c55, 0x4df00000, 0x598c000d,
+       0x81300580, 0x04020009, 0x598c0005, 0x81300580,
+       0x04020006, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x80000580, 0x1c01f000, 0x5c03e000, 0x02000800,
+       0x00106c4b, 0x82000540, 0x00000001, 0x1c01f000,
+       0x59300403, 0x82000c80, 0x00000056, 0x02021800,
+       0x001005d8, 0x4803c857, 0x0c01f001, 0x00107302,
+       0x0010731d, 0x0010732e, 0x00107431, 0x001073f1,
+       0x001073f5, 0x00107406, 0x0010741a, 0x0010740f,
+       0x0010741a, 0x00107455, 0x0010741a, 0x00107497,
+       0x0010741a, 0x001074a5, 0x0010741a, 0x0010740f,
+       0x0010741a, 0x001074a9, 0x001071f5, 0x001071f5,
+       0x001071f5, 0x001071f5, 0x001071f5, 0x001071f5,
+       0x001071f5, 0x001071f5, 0x001071f5, 0x001071f5,
+       0x001071f5, 0x00107574, 0x00107593, 0x0010759d,
+       0x001071f5, 0x001075b3, 0x00107406, 0x001071f5,
+       0x00107406, 0x0010741a, 0x001071f5, 0x0010732e,
+       0x00107431, 0x001071f5, 0x00107603, 0x0010741a,
+       0x001071f5, 0x00107613, 0x0010741a, 0x001071f5,
+       0x0010740f, 0x001072f3, 0x001071f7, 0x001071f5,
+       0x0010762a, 0x0010765d, 0x001076d7, 0x001071f5,
+       0x001076e7, 0x00107404, 0x001076da, 0x001071f5,
+       0x001075bf, 0x00107700, 0x001071f5, 0x00107735,
+       0x00107788, 0x001071f5, 0x0010720c, 0x00107265,
+       0x00107272, 0x001071f5, 0x00107406, 0x001071f5,
+       0x001072b9, 0x001072c4, 0x001071f5, 0x001071f5,
+       0x00107220, 0x00107245, 0x001077c7, 0x00107808,
+       0x0010782e, 0x001071f5, 0x001071f5, 0x001071f5,
+       0x001077fc, 0x0201f800, 0x001005d8, 0x0401fac5,
+       0x59325808, 0x592c0009, 0x4801a006, 0x592c000a,
+       0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c,
+       0x4801a009, 0x592c000d, 0x4801a00a, 0x4979a00b,
+       0x592c0809, 0x82040d00, 0x00000fff, 0x80040904,
+       0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc,
+       0x4a026202, 0x0000ffff, 0x0401faae, 0x4d2c0000,
+       0x4a01a006, 0x05000000, 0x59325808, 0x592c0009,
+       0x4801a007, 0x592c000a, 0x4801a008, 0x592c000b,
+       0x4801a009, 0x42000800, 0x00000004, 0x42001000,
+       0x0000dc00, 0x5c025800, 0x0201f000, 0x001078bc,
+       0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000,
+       0x0401fa98, 0x59325808, 0x5930040b, 0x800000c2,
+       0x4200a800, 0x0010b54b, 0x592cb205, 0x832ca400,
+       0x00000006, 0x0201f800, 0x0010ab17, 0x40580000,
+       0x8054ac00, 0x592c0001, 0x80000540, 0x04000003,
+       0x40025800, 0x0401f7f5, 0x4200a000, 0x0010b54b,
+       0x4050a800, 0x5930b40b, 0x0201f800, 0x0010ab28,
+       0x59300c0b, 0x42001000, 0x0000dc00, 0x5c025800,
+       0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000,
+       0x001078bc, 0x4c580000, 0x4c500000, 0x4c540000,
+       0x4d2c0000, 0x42034800, 0x0010b544, 0x0401fa7f,
+       0x59325808, 0x4a025805, 0x02000000, 0x592c0802,
+       0x82d0ac00, 0x00000006, 0x592cb011, 0x832ca400,
+       0x00000005, 0x0201f800, 0x0010ab17, 0x40580000,
+       0x8054ac00, 0x592e5801, 0x41780000, 0x812e5d40,
+       0x040207f6, 0x42001000, 0x0000dc00, 0x5c025800,
+       0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000,
+       0x001078bc, 0x0401fa57, 0x4a01a006, 0x78000000,
+       0x5930001c, 0x840001c0, 0x4801a407, 0x4979a207,
+       0x42000800, 0x00000002, 0x42001000, 0x0000dc00,
+       0x0201f000, 0x001078bc, 0x4c580000, 0x4c540000,
+       0x4c500000, 0x0401fa55, 0x4a01a006, 0x02000000,
+       0x59a80002, 0x4801a008, 0x59a80003, 0x4801a009,
+       0x59a80000, 0x4801a00a, 0x59a80001, 0x4801a00b,
+       0x5930001c, 0x82000d80, 0x0000e000, 0x04000016,
+       0x82000d80, 0x0000df00, 0x04000006, 0x4a01a407,
+       0x00000010, 0x42000800, 0x00000006, 0x0401f027,
+       0x4a03c840, 0x0010b4eb, 0x4a03c842, 0x0000000d,
+       0x42001800, 0x0010b4eb, 0x0201f800, 0x001007af,
+       0x42000000, 0x0000df00, 0x4200a000, 0x0010b4eb,
+       0x0401f00d, 0x4a03c840, 0x0010b4f8, 0x4a03c842,
+       0x0000000d, 0x42001800, 0x0010b4f8, 0x0201f800,
+       0x001007af, 0x42000000, 0x0000e000, 0x4200a000,
+       0x0010b4f8, 0x82000540, 0x00000010, 0x4801a407,
+       0x4a01a207, 0x00000034, 0x4200b000, 0x0000000d,
+       0x82d0ac00, 0x0000000c, 0x0201f800, 0x0010ab17,
+       0x42000800, 0x00000013, 0x42001000, 0x0000dc00,
+       0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0201f000,
+       0x001078bc, 0x0401fa03, 0x4a01a006, 0x63000028,
+       0x5930001c, 0x4801a007, 0x42000800, 0x00000002,
+       0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc,
+       0x0401fa06, 0x41780000, 0x41780800, 0x42002000,
+       0x00080000, 0x0c01f81b, 0x80000000, 0x80040800,
+       0x42001000, 0x0000000c, 0x59841802, 0x8c0c1d00,
+       0x04020008, 0x42002000, 0x00050000, 0x0c01f811,
+       0x80000000, 0x80040800, 0x82081400, 0x00000004,
+       0x82080540, 0x02000000, 0x4801a006, 0x800408e0,
+       0x5930001c, 0x80040540, 0x4801a007, 0x80080904,
+       0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc,
+       0x001072e9, 0x001072eb, 0x001072ed, 0x001072ef,
+       0x001072f1, 0x4811a008, 0x1c01f000, 0x4811a009,
+       0x1c01f000, 0x4811a00a, 0x1c01f000, 0x4811a00b,
+       0x1c01f000, 0x4811a00c, 0x1c01f000, 0x4a026009,
+       0x0010be0d, 0x59a80010, 0x82000500, 0x000000ff,
+       0x800000d0, 0x42026800, 0x0010be0d, 0x48026a12,
+       0x0401fa3b, 0x41780800, 0x42001000, 0x00005c00,
+       0x0201f000, 0x001078bc, 0x0401f9ba, 0x4a01a006,
+       0x52000000, 0x4979a007, 0x599c0017, 0x8c000500,
+       0x04000005, 0x599c0402, 0x0201f800, 0x001015da,
+       0x4805a007, 0x59a80002, 0x4801a008, 0x59a80003,
+       0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001,
+       0x4801a00b, 0x59a80010, 0x4801a00c, 0x42000800,
+       0x00000007, 0x42001000, 0x0000dc00, 0x0201f000,
+       0x001078bc, 0x4a026202, 0x0000ffff, 0x0401f99d,
+       0x4a01a006, 0x05000000, 0x59a80010, 0x4801a007,
+       0x59a80002, 0x59a80803, 0x4801a008, 0x4805a009,
+       0x42000800, 0x00000004, 0x42001000, 0x0000dc00,
+       0x0201f000, 0x001078bc, 0x4a026202, 0x0000ffff,
+       0x0401f98c, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x001048f6, 0x5c027800, 0x4a01a006, 0x03000000,
+       0x59340403, 0x82000580, 0x000007fe, 0x0402006e,
+       0x4a01a006, 0x04000000, 0x81a40800, 0x4a000800,
+       0x22fffffe, 0x5934000a, 0x84000500, 0x4802680a,
+       0x59c41002, 0x8408150c, 0x480b8802, 0x59a80026,
+       0x8c000508, 0x04000010, 0x59a8002a, 0x4801a007,
+       0x59a8002b, 0x82000500, 0xffff2000, 0x599c0818,
+       0x8c040d16, 0x04000002, 0x8400056a, 0x4801a008,
+       0x4a01a009, 0x00002710, 0x59a8002d, 0x4801a00a,
+       0x0401f039, 0x59a8002a, 0x4801a007, 0x0201f800,
+       0x0010513b, 0x04020009, 0x497b8880, 0x82000500,
+       0x0000ffff, 0x4c000000, 0x0201f800, 0x00101606,
+       0x5c000000, 0x48038880, 0x59a8002b, 0x0201f800,
+       0x0010513b, 0x04020004, 0x82000500, 0x37ffffff,
+       0x0401f003, 0x82000500, 0x3fffffff, 0x599c0818,
+       0x8c040d16, 0x04000002, 0x8400056a, 0x59a80805,
+       0x8c040d10, 0x04000019, 0x59300c03, 0x82041580,
+       0x00000051, 0x04000015, 0x82041580, 0x00000031,
+       0x04000012, 0x4c580000, 0x4c500000, 0x4c540000,
+       0x4200b000, 0x00000004, 0x4200a000, 0x0010b8fa,
+       0x82d0ac00, 0x0000001f, 0x4c000000, 0x0201f800,
+       0x0010ab17, 0x5c000000, 0x5c00a800, 0x5c00a000,
+       0x5c00b000, 0x8400057a, 0x4801a008, 0x4979a009,
+       0x4979a00a, 0x59a80002, 0x59a80803, 0x4801a00b,
+       0x4805a00c, 0x59a80000, 0x59a80801, 0x4801a00d,
+       0x4805a00e, 0x4979a00f, 0x4979a010, 0x4979a011,
+       0x4979a012, 0x4979a013, 0x4979a014, 0x4979a015,
+       0x4979a016, 0x59a8002e, 0x84000576, 0x4801a017,
+       0x59a8002f, 0x4801a018, 0x4979a019, 0x4979a01a,
+       0x0401f043, 0x59a80026, 0x8c000508, 0x0400000d,
+       0x59a8002a, 0x82000500, 0x0000ffff, 0x59c40880,
+       0x80040d80, 0x04000007, 0x497b8880, 0x4c000000,
+       0x0201f800, 0x00101606, 0x5c000000, 0x48038880,
+       0x59a8002a, 0x4801a007, 0x4c640000, 0x4d2c0000,
+       0x59a8c82b, 0x0201f800, 0x00109037, 0x0400000d,
+       0x0201f800, 0x00109597, 0x0402000a, 0x592c0207,
+       0x8c00050e, 0x04000007, 0x8264cd00, 0x0000ffff,
+       0x592c0009, 0x82000500, 0xffff0000, 0x8064cd40,
+       0x4865a008, 0x5c025800, 0x5c00c800, 0x59a8002c,
+       0x4801a009, 0x59a8002d, 0x4801a00a, 0x59a80002,
+       0x59a80803, 0x4801a00b, 0x4805a00c, 0x59a80000,
+       0x59a80801, 0x4801a00d, 0x4805a00e, 0x4979a00f,
+       0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013,
+       0x4979a014, 0x4979a015, 0x4979a016, 0x59a8002e,
+       0x4801a017, 0x59a8002f, 0x4801a018, 0x59a80030,
+       0x4801a019, 0x59a80031, 0x4801a01a, 0x42000800,
+       0x0000001d, 0x42001000, 0x0000dc00, 0x0201f000,
+       0x001078bc, 0x0401f8cb, 0x4a01a006, 0x50000000,
+       0x0401f7b5, 0x0401f8c7, 0x4a01a406, 0x21000010,
+       0x4a01a206, 0x00000014, 0x4979a007, 0x4979a008,
+       0x4979a009, 0x4979a00a, 0x42000800, 0x00000005,
+       0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc,
+       0x0401f8bf, 0x0401f002, 0x0401f8c4, 0x4a01a006,
+       0x02000000, 0x42000800, 0x00000001, 0x42001000,
+       0x0000dc00, 0x0201f000, 0x001078bc, 0x0401f8bb,
+       0x4a01a006, 0x02000000, 0x59300403, 0x82000580,
+       0x00000031, 0x04020794, 0x81a40800, 0x4a000801,
+       0x00fffffe, 0x0401f72b, 0x0401f8b0, 0x4a01a006,
+       0x01000000, 0x5930041a, 0x80000540, 0x04000003,
+       0x4801a407, 0x0401f003, 0x4a01a407, 0x00000003,
+       0x5930021a, 0x80000540, 0x04000003, 0x4801a207,
+       0x0401f003, 0x4a01a207, 0x00002a00, 0x42000800,
+       0x00000002, 0x42001000, 0x0000dc00, 0x0201f000,
+       0x001078bc, 0x4a026202, 0x0000ffff, 0x0401f889,
+       0x4a01a406, 0x00002010, 0x4a01a206, 0x00000014,
+       0x4a01a407, 0x00000800, 0x4a01a207, 0x00002000,
+       0x80000580, 0x599c0817, 0x8c040d0a, 0x04020003,
+       0x82000540, 0x00000020, 0x8c040d08, 0x04000003,
+       0x82000540, 0x00000010, 0x82000540, 0x00000002,
+       0x5934080a, 0x8c040d14, 0x04000005, 0x82040d00,
+       0x00000380, 0x80040540, 0x0401f006, 0x599c0818,
+       0x8c040d18, 0x04000003, 0x82000540, 0x00000380,
+       0x0401f03c, 0x0401f875, 0x4a01a406, 0x00000210,
+       0x4a01a206, 0x00000014, 0x4a01a407, 0x00000800,
+       0x5934000a, 0x8c000516, 0x04000014, 0x59340c05,
+       0x82040500, 0x00000030, 0x04000013, 0x59340a05,
+       0x82040500, 0x0000c000, 0x04020009, 0x8c040d1a,
+       0x04000004, 0x4a01a207, 0x00002100, 0x0401f00c,
+       0x4a01a207, 0x00000100, 0x0401f009, 0x4a01a207,
+       0x00000400, 0x0401f006, 0x4a01a207, 0x00000700,
+       0x0401f003, 0x4a01a207, 0x00000800, 0x80000580,
+       0x599c0817, 0x8c040d0a, 0x04020003, 0x82000540,
+       0x00000020, 0x8c040d08, 0x04000003, 0x82000540,
+       0x00000010, 0x82000540, 0x00000002, 0x59340a00,
+       0x8c040d0e, 0x0400000b, 0x84000550, 0x599c1017,
+       0x8c08150a, 0x04020004, 0x8c040d0a, 0x04000002,
+       0x8400054e, 0x8c040d1c, 0x04000002, 0x84000552,
+       0x4801a20a, 0x42000800, 0x00000005, 0x42001000,
+       0x0000dc00, 0x0201f000, 0x001078bc, 0x0401f833,
+       0x4a01a006, 0x02100014, 0x4a01a007, 0x01000000,
+       0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800,
+       0x00000005, 0x42001000, 0x0000dc00, 0x0201f000,
+       0x001078bc, 0x0401f825, 0x4a01a006, 0x02000000,
+       0x0401f65d, 0x4933c857, 0x0401f820, 0x4a01a006,
+       0x01000000, 0x4a01a407, 0x0000000b, 0x42000800,
+       0x00000002, 0x42001000, 0x0000dc00, 0x0201f000,
+       0x001078bc, 0x42005000, 0x32000000, 0x42006000,
+       0x08290000, 0x41786800, 0x41787800, 0x0401f3df,
+       0x42005000, 0x22000000, 0x42006000, 0x01290000,
+       0x41786800, 0x41787800, 0x0401f3d8, 0x42005000,
+       0x33000000, 0x42006000, 0x08980000, 0x41786800,
+       0x41787800, 0x0401f3d1, 0x42005000, 0x23000000,
+       0x42006000, 0x01980000, 0x41786800, 0x41787800,
+       0x0401f3ca, 0x59300403, 0x82000c80, 0x00000085,
+       0x02001800, 0x001005d8, 0x82000c80, 0x00000093,
+       0x02021800, 0x001005d8, 0x82000480, 0x00000085,
+       0x0c01f001, 0x001074eb, 0x001074ed, 0x001074fb,
+       0x001074eb, 0x001074eb, 0x001074eb, 0x001074eb,
+       0x001074eb, 0x001074eb, 0x001074eb, 0x001074eb,
+       0x001074eb, 0x001074eb, 0x00107506, 0x0201f800,
+       0x001005d8, 0x4933c857, 0x0401f850, 0x59300402,
+       0x4801a407, 0x5930001c, 0x4801a207, 0x4979a408,
+       0x4a01a208, 0x0000ffff, 0x42000800, 0x00000003,
+       0x42001000, 0x0000dc00, 0x0401f3c2, 0x4933c857,
+       0x0401f84e, 0x4a01a406, 0x00000003, 0x4a01a206,
+       0x00000300, 0x42000800, 0x00000001, 0x42001000,
+       0x0000dc00, 0x0401f3b7, 0x4d2c0000, 0x59325808,
+       0x4933c857, 0x492fc857, 0x812e59c0, 0x02000800,
+       0x001005d8, 0x59340a12, 0x82040d00, 0x0000ff00,
+       0x592c000a, 0x82000500, 0x000000ff, 0x900001c0,
+       0x80040540, 0x82000540, 0x00000011, 0x44034800,
+       0x81a5a000, 0x42001000, 0x00000009, 0x42000800,
+       0x00000003, 0x592c0009, 0x82000500, 0xff000000,
+       0x82001d80, 0x84000000, 0x04000009, 0x82001d80,
+       0x85000000, 0x02020800, 0x001005d8, 0x42001000,
+       0x00000007, 0x42000800, 0x00000001, 0x832c1c00,
+       0x00000009, 0x500c0000, 0x4401a000, 0x800c1800,
+       0x80d1a000, 0x80081040, 0x040207fb, 0x42001000,
+       0x0000dc00, 0x5c025800, 0x0401f386, 0x42005000,
+       0x81000000, 0x42006000, 0x00090000, 0x41786800,
+       0x41787800, 0x0401f35d, 0x42005000, 0x84000000,
+       0x42006000, 0x00990000, 0x59300406, 0x82000580,
+       0x00000005, 0x04000002, 0x8430652e, 0x41786800,
+       0x41787800, 0x0401f351, 0x42005000, 0x85000000,
+       0x42006000, 0x00990000, 0x59300406, 0x82000580,
+       0x00000005, 0x04000002, 0x8430652e, 0x41786800,
+       0x41787800, 0x0401f345, 0x59300403, 0x82000c80,
+       0x00000053, 0x02021800, 0x001005d8, 0x82000480,
+       0x0000004b, 0x02001800, 0x001005d8, 0x59326809,
+       0x59368c03, 0x4803c857, 0x0c01f001, 0x001075da,
+       0x001075e2, 0x001075ea, 0x001075f2, 0x0010756b,
+       0x0010756b, 0x0010756b, 0x001075d2, 0x0201f800,
+       0x001005d8, 0x42005000, 0x06000000, 0x42006000,
+       0x08290000, 0x41786800, 0x41787800, 0x0401f327,
+       0x4933c857, 0x0401ff47, 0x4a01a006, 0x12000000,
+       0x59300406, 0x82000580, 0x00000004, 0x04020003,
+       0x59340002, 0x0401f002, 0x59a80010, 0x82000500,
+       0x00ffffff, 0x4801a007, 0x59300419, 0x4801a408,
+       0x59300219, 0x4801a208, 0x4979a009, 0x4979a00a,
+       0x4979a00b, 0x4979a00c, 0x4979a00d, 0x4979a00e,
+       0x4979a00f, 0x4979a010, 0x42000800, 0x0000000b,
+       0x42001000, 0x0000dc00, 0x0401f32a, 0x0401ff29,
+       0x4a01a006, 0x0f000000, 0x5930001c, 0x4801a007,
+       0x42000800, 0x00000002, 0x42001000, 0x0000dc00,
+       0x0401f320, 0x0401ff2d, 0x4a01a006, 0x02000000,
+       0x59c40085, 0x48031004, 0x59880000, 0x4801a007,
+       0x59880001, 0x4801a008, 0x59880002, 0x4801a009,
+       0x59880003, 0x4801a00a, 0x59880004, 0x4801a00b,
+       0x59880005, 0x4801a00c, 0x42000800, 0x00000007,
+       0x42001000, 0x0000dc00, 0x0401f30a, 0x4a026202,
+       0x0000ffff, 0x0401ff07, 0x4a01a006, 0x62000000,
+       0x5930001c, 0x4801a007, 0x42000800, 0x00000002,
+       0x42001000, 0x0000dc00, 0x0401f2fe, 0x0401fefd,
+       0x59300808, 0x4c500000, 0x4c540000, 0x4c580000,
+       0x8204a400, 0x0000000a, 0x5930b01c, 0x82d0ac00,
+       0x00000006, 0x0201f800, 0x0010ab17, 0x5930081c,
+       0x42001000, 0x0000dc00, 0x5c00b000, 0x5c00a800,
+       0x5c00a000, 0x0401f2eb, 0x0401ff9b, 0x59300017,
+       0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008,
+       0x00001000, 0x0401f020, 0x0401ff93, 0x59300017,
+       0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008,
+       0x00004000, 0x0401f018, 0x0401ff8b, 0x59300017,
+       0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008,
+       0x00002000, 0x0401f010, 0x0401ff83, 0x59300017,
+       0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008,
+       0x00000400, 0x0401f008, 0x0401ff7b, 0x59300017,
+       0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008,
+       0x00000200, 0x4979a009, 0x4979a00a, 0x4979a00b,
+       0x4979a00c, 0x4979a00d, 0x42000800, 0x00000008,
+       0x42001000, 0x0000dc00, 0x0401f2ba, 0x0401fec7,
+       0x4a01a006, 0x02000014, 0x4979a407, 0x4979a207,
+       0x59a8003a, 0x4801a008, 0x59a8003b, 0x4801a009,
+       0x4a01a00a, 0x00047878, 0x42000800, 0x00000005,
+       0x42001000, 0x0000dc00, 0x0401f2aa, 0x0401feb7,
+       0x4a01a006, 0x02140018, 0x4a01a407, 0x00000800,
+       0x5930001c, 0x82000d00, 0xff000000, 0x900409c0,
+       0x4805a207, 0x82000500, 0x00ffffff, 0x4801a00a,
+       0x4979a408, 0x4979a208, 0x4979a409, 0x4979a209,
+       0x4979a00b, 0x42000800, 0x00000006, 0x42001000,
+       0x0000dc00, 0x0401f293, 0x4803c856, 0x4d380000,
+       0x4d1c0000, 0x42027000, 0x00000035, 0x0201f800,
+       0x001093ba, 0x0402001e, 0x0401fe8a, 0x4a01a006,
+       0x13000000, 0x5932381e, 0x591c0019, 0x4801a005,
+       0x591c0406, 0x82000580, 0x00000003, 0x04000007,
+       0x59300809, 0x58040002, 0x82000500, 0x00ffffff,
+       0x4801a007, 0x0401f003, 0x59a80010, 0x4801a007,
+       0x59300419, 0x4801a408, 0x59300219, 0x4801a208,
+       0x42000800, 0x00000003, 0x42001000, 0x0000dc00,
+       0x5c023800, 0x5c027000, 0x0401f26e, 0x0201f800,
+       0x00106c55, 0x598c000d, 0x81300580, 0x02020800,
+       0x001005d8, 0x0201f800, 0x00106bbf, 0x0201f800,
+       0x0002077d, 0x5c023800, 0x5c027000, 0x0201f000,
+       0x00106c4b, 0x4803c856, 0x4d2c0000, 0x4d1c0000,
+       0x5932381e, 0x811e39c0, 0x02000800, 0x001005d8,
+       0x591c0c06, 0x82040580, 0x00000006, 0x0400000d,
+       0x82040580, 0x00000003, 0x04000036, 0x4a026403,
+       0x00000037, 0x4a02641a, 0x00000003, 0x4a02621a,
+       0x00001700, 0x5c023800, 0x5c025800, 0x0401f064,
+       0x0401f84b, 0x42001000, 0x40000000, 0x591c0203,
+       0x591c0804, 0x8c040d3e, 0x04020023, 0x82000c80,
+       0x0000000e, 0x0c001003, 0x0201f800, 0x001005d8,
+       0x00107691, 0x0010769d, 0x00107693, 0x0010769d,
+       0x00107699, 0x00107691, 0x00107691, 0x0010769d,
+       0x0010769d, 0x00107691, 0x00107691, 0x00107691,
+       0x00107691, 0x00107691, 0x0010769d, 0x00107691,
+       0x0010769d, 0x0201f800, 0x001005d8, 0x591c0414,
+       0x4803c857, 0x8c000518, 0x04000003, 0x8c000512,
+       0x04000003, 0x80001580, 0x0401f003, 0x42001000,
+       0x20000000, 0x591c0015, 0x4801a00a, 0x0401f018,
+       0x0401f81f, 0x591e5808, 0x812e59c0, 0x02000800,
+       0x001005d8, 0x592c100f, 0x591c0011, 0x80080480,
+       0x4801a00a, 0x591c0203, 0x591c0804, 0x8c040d3e,
+       0x04020007, 0x82000d80, 0x00000002, 0x04000007,
+       0x82000d80, 0x00000004, 0x04000004, 0x42001000,
+       0x40000000, 0x0401f002, 0x80001580, 0x4809a00b,
+       0x42000800, 0x00000006, 0x42001000, 0x0000dc00,
+       0x5c023800, 0x5c025800, 0x0401f1fe, 0x4803c856,
+       0x0401fe0a, 0x4a01a006, 0x02000000, 0x59300c19,
+       0x4805a407, 0x59300a19, 0x4805a207, 0x59a81010,
+       0x59300809, 0x58041802, 0x820c1d00, 0x00ffffff,
+       0x5930081e, 0x58040406, 0x82000580, 0x00000003,
+       0x04020004, 0x4809a008, 0x480da009, 0x0401f003,
+       0x480da008, 0x4809a009, 0x1c01f000, 0x4803c856,
+       0x0401fdf2, 0x0401f003, 0x4803c856, 0x0401fde8,
+       0x4a01a006, 0x01000000, 0x5930041a, 0x4801a407,
+       0x5930021a, 0x4801a207, 0x42000800, 0x00000002,
+       0x42001000, 0x0000dc00, 0x0401f1d6, 0x4803c856,
+       0x4d1c0000, 0x0401fdcc, 0x4a01a006, 0x14000000,
+       0x5932381e, 0x591c0019, 0x4801a005, 0x59300419,
+       0x4801a407, 0x59300219, 0x4801a207, 0x59300015,
+       0x4801a008, 0x59300216, 0x82000500, 0x000000ff,
+       0x840001c0, 0x4801a409, 0x42000800, 0x00000004,
+       0x42001000, 0x0000dc00, 0x5c023800, 0x0401f1bd,
+       0x4803c856, 0x0401f80b, 0x5930041a, 0x900001c0,
+       0x4801a005, 0x0401f9ec, 0x41780800, 0x42001000,
+       0x00005c00, 0x0401f9b3, 0x0201f000, 0x0010604d,
+       0x4803c856, 0x59300817, 0x82041c00, 0x00000005,
+       0x46034800, 0x00000021, 0x58040404, 0x82000500,
+       0x0000f000, 0x82000580, 0x00003000, 0x04000003,
+       0x46034800, 0x00000041, 0x81a5a000, 0x580c0001,
+       0x82000d00, 0x00ffffff, 0x82040d40, 0xc2000000,
+       0x4805a000, 0x580c0800, 0x82041500, 0x00ffffff,
+       0x82000500, 0xff000000, 0x80080540, 0x4801a001,
+       0x580c0002, 0x82000580, 0x00c00000, 0x82000500,
+       0x00fd0300, 0x4801a002, 0x580c0003, 0x4801a003,
+       0x580c0404, 0x4801a404, 0x580c0204, 0x4801a204,
+       0x1c01f000, 0x4803c856, 0x59a80026, 0x82000500,
+       0x00000028, 0x04020009, 0x59a80026, 0x82000500,
+       0x00000028, 0x04000003, 0x497a6a12, 0x0401f003,
+       0x4a026a12, 0x0000ff00, 0x42005000, 0x22000000,
+       0x42006000, 0x01380000, 0x41786800, 0x41787800,
+       0x0401f952, 0x59301008, 0x4a01a006, 0x54000000,
+       0x59a80010, 0x82000500, 0x00ffffff, 0x58080c0a,
+       0x800408f0, 0x80040540, 0x4801a007, 0x5808000a,
+       0x82000500, 0xff000000, 0x4801a008, 0x59a80002,
+       0x4801a009, 0x59a80003, 0x4801a00a, 0x59a80000,
+       0x4801a00b, 0x59a80001, 0x4801a00c, 0x5808000c,
+       0x9c0001c0, 0x4801a00d, 0x5808000d, 0x9c0001c0,
+       0x4801a00e, 0x5808000e, 0x9c0001c0, 0x4801a00f,
+       0x5808000f, 0x9c0001c0, 0x4801a010, 0x58080010,
+       0x9c0001c0, 0x4801a011, 0x58080011, 0x9c0001c0,
+       0x4801a012, 0x58080012, 0x9c0001c0, 0x4801a013,
+       0x58080013, 0x9c0001c0, 0x4801a014, 0x58080010,
+       0x9c0001c0, 0x4801a015, 0x58080011, 0x9c0001c0,
+       0x4801a016, 0x58080012, 0x9c0001c0, 0x4801a017,
+       0x58080013, 0x9c0001c0, 0x4801a018, 0x42000800,
+       0x00000013, 0x42001000, 0x0000dc00, 0x0401f135,
+       0x4803c856, 0x42005000, 0x22000000, 0x42006000,
+       0x01290000, 0x41786800, 0x41787800, 0x0401f90b,
+       0x59301008, 0x4a01a006, 0x55000000, 0x5808000b,
+       0x82000500, 0x00ffffff, 0x58080c0a, 0x800408f0,
+       0x80040540, 0x4801a007, 0x5808080a, 0x82040d00,
+       0xff000000, 0x59a80010, 0x82000500, 0x00ffffff,
+       0x80040540, 0x4801a008, 0x5808000c, 0x9c0001c0,
+       0x4801a009, 0x5808000d, 0x9c0001c0, 0x4801a00a,
+       0x5808000e, 0x9c0001c0, 0x4801a00b, 0x5808000f,
+       0x9c0001c0, 0x4801a00c, 0x59a80002, 0x4801a00d,
+       0x59a80003, 0x4801a00e, 0x59a80000, 0x4801a00f,
+       0x59a80001, 0x4801a010, 0x58080010, 0x4801a011,
+       0x58080011, 0x4801a012, 0x58080012, 0x4801a013,
+       0x58080013, 0x4801a014, 0x4979a015, 0x4979a016,
+       0x4979a017, 0x4979a018, 0x42000800, 0x00000013,
+       0x42001000, 0x0000dc00, 0x0401f0f6, 0x0401fd03,
+       0x5930001c, 0x800001c0, 0x04000008, 0x4a01a006,
+       0x01000000, 0x4a01a407, 0x00000003, 0x42000800,
+       0x00000002, 0x0401f028, 0x4a01a006, 0x02000000,
+       0x41780800, 0x836c0580, 0x00000004, 0x04020003,
+       0x84040d42, 0x0401f00d, 0x0201f800, 0x0010513b,
+       0x04020003, 0x84040d4a, 0x0401f002, 0x84040d48,
+       0x59a80026, 0x8c000506, 0x04020003, 0x8c00050a,
+       0x04000002, 0x84040d46, 0x4805a207, 0x59c40085,
+       0x48031004, 0x4c580000, 0x4c500000, 0x4c540000,
+       0x4200b000, 0x00000006, 0x8388a400, 0x00000000,
+       0x82d0ac00, 0x00000008, 0x0201f800, 0x0010ab17,
+       0x5c00a800, 0x5c00a000, 0x5c00b000, 0x42000800,
+       0x00000008, 0x42001000, 0x0000dc00, 0x0401f0c1,
+       0x0401fcc0, 0x4a01a006, 0x56000000, 0x59340006,
+       0x4801a007, 0x59340007, 0x4801a008, 0x42000800,
+       0x00000003, 0x42001000, 0x0000dc00, 0x0401f0b5,
+       0x4803c856, 0x0401fcc1, 0x5930081c, 0x800409c0,
+       0x0400000e, 0x82040580, 0x0000ffff, 0x04000004,
+       0x82040480, 0x00000007, 0x04021008, 0x4a01a006,
+       0x01000000, 0x4a01a407, 0x00000003, 0x42000800,
+       0x00000002, 0x0401f012, 0x4a01a006, 0x0200001c,
+       0x4a01a007, 0x00000001, 0x42001000, 0x0010b4f0,
+       0x50080000, 0x9c0001c0, 0x4801a009, 0x59a80010,
+       0x4801a00a, 0x59a80002, 0x59a80803, 0x4801a00b,
+       0x4805a00c, 0x42000800, 0x00000007, 0x42001000,
+       0x0000dc00, 0x0401f08f, 0x4d2c0000, 0x0401fc8d,
+       0x59325808, 0x592c0008, 0x82000500, 0x00ffffff,
+       0x4801a001, 0x4a01a006, 0x51000000, 0x5c025800,
+       0x0201f000, 0x00107344, 0x4803c856, 0x59a80810,
+       0x82040d00, 0x000000ff, 0x59325808, 0x59326809,
+       0x59a83026, 0x8c18350a, 0x04020008, 0x8c00050e,
+       0x04020006, 0x80001d80, 0x59a82010, 0x82102500,
+       0x000000ff, 0x0401f001, 0x59300406, 0x4803c857,
+       0x82000d80, 0x00000009, 0x04000006, 0x82000d80,
+       0x0000000a, 0x0400002e, 0x0201f800, 0x001005d8,
+       0x59300015, 0x8c00051e, 0x04020020, 0x42005000,
+       0x04000000, 0x42006000, 0x05000000, 0x592c040a,
+       0x82000500, 0x00000030, 0x800000e0, 0x80306540,
+       0x5934000a, 0x8c000508, 0x04000002, 0x84306546,
+       0x41786800, 0x41787800, 0x0401f831, 0x59300c14,
+       0x80040000, 0x48026414, 0x40040000, 0x800000d0,
+       0x82000540, 0x00000020, 0x4801a403, 0x83180d40,
+       0x00000038, 0x42001000, 0x0000c920, 0x0401f860,
+       0x0201f000, 0x00106052, 0x59a80026, 0x82000500,
+       0x00000028, 0x04000003, 0x497a6a12, 0x0401f7dc,
+       0x4a026a12, 0x0000ff00, 0x0401f7d9, 0x42005000,
+       0x02000000, 0x42006000, 0x20290000, 0x41786800,
+       0x41787800, 0x0401f812, 0x83180d40, 0x00000038,
+       0x42001000, 0x0000c9a0, 0x0401f849, 0x42000800,
+       0x000007d0, 0x59300011, 0x82000500, 0xfff00000,
+       0x80000540, 0x04000003, 0x42000800, 0x00001b58,
+       0x41781000, 0x0201f000, 0x00106054, 0x4201a000,
+       0x00000000, 0x0401f003, 0x4201a000, 0x00000011,
+       0x59340a12, 0x82040d00, 0x0000ff00, 0x59a80010,
+       0x82000500, 0x000000ff, 0x900001c0, 0x80040540,
+       0x80d00540, 0x44034800, 0x81a5a000, 0x59340002,
+       0x82000500, 0x00ffffff, 0x80280540, 0x4801a000,
+       0x59a80010, 0x4801a001, 0x4831a002, 0x82340540,
+       0x00000000, 0x4801a003, 0x59300402, 0x4801a404,
+       0x59300a02, 0x4805a204, 0x8c30652e, 0x04000003,
+       0x4805a404, 0x4801a204, 0x483da005, 0x1c01f000,
+       0x4803c856, 0x4c040000, 0x0401f822, 0x5c000800,
+       0x40040000, 0x80081540, 0x800000c4, 0x82000540,
+       0x00002000, 0x4803910a, 0x59b400f6, 0x82000500,
+       0x00000018, 0x040207fd, 0x4a0368f0, 0x0010b544,
+       0x4a0368f1, 0x0010b54b, 0x480b68f3, 0x4a0378e4,
+       0x00008000, 0x0201f000, 0x0010604d, 0x4807c857,
+       0x480a2800, 0x4c040000, 0x0401f80a, 0x5c000800,
+       0x59b400f6, 0x8c00050a, 0x040207fe, 0x49a768f2,
+       0x480768f4, 0x4a0378e4, 0x00008000, 0x1c01f000,
+       0x4a0378e4, 0x0000c000, 0x59bc00e4, 0x8c000520,
+       0x0400000c, 0x4a0378e4, 0x00008000, 0x42007000,
+       0x000003e8, 0x59bc00e4, 0x8c000520, 0x040007f5,
+       0x80387040, 0x02000800, 0x001005d8, 0x0401f7fa,
+       0x1c01f000, 0x82000500, 0xffff0000, 0x82000580,
+       0x01050000, 0x0402000d, 0x599c0818, 0x8c040d10,
+       0x0400000a, 0x59a80807, 0x8c040d0a, 0x04000007,
+       0x42001000, 0x0000804f, 0x41781800, 0x41782000,
+       0x0201f800, 0x00103a3e, 0x1c01f000, 0x41781000,
+       0x42026000, 0x0010d1c0, 0x59a8180e, 0x480a6402,
+       0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840,
+       0x04000004, 0x83326400, 0x00000024, 0x0401f7f8,
+       0x1c01f000, 0x4933c857, 0x59300203, 0x82000580,
+       0x00000000, 0x0400002c, 0x59300406, 0x4803c857,
+       0x82000d80, 0x00000004, 0x04000011, 0x82000d80,
+       0x00000001, 0x0400000e, 0x82000d80, 0x00000003,
+       0x04000006, 0x82000d80, 0x00000006, 0x04020011,
+       0x0201f800, 0x0010a5df, 0x5930001c, 0x800001c0,
+       0x02020800, 0x0010984e, 0x0401f00a, 0x5930081e,
+       0x4807c857, 0x800409c0, 0x04000006, 0x5804001c,
+       0x4803c857, 0x81300580, 0x04020002, 0x4978081c,
+       0x497a6008, 0x4a026004, 0x00004000, 0x59a80037,
+       0x82000c80, 0x00000051, 0x04001002, 0x80000102,
+       0x48026206, 0x497a6205, 0x497a6009, 0x4a026406,
+       0x00000007, 0x1c01f000, 0x8166c9c0, 0x0400001c,
+       0x41626000, 0x41580000, 0x59300a03, 0x82040d80,
+       0x00000000, 0x04000008, 0x83326400, 0x00000024,
+       0x81300c80, 0x040017f9, 0x42026000, 0x0010d1c0,
+       0x0401f7f6, 0x4933c857, 0x8166c840, 0x83300c00,
+       0x00000024, 0x80040480, 0x04021006, 0x4006c000,
+       0x4a026203, 0x00000008, 0x813261c0, 0x1c01f000,
+       0x4202c000, 0x0010d1c0, 0x0401f7fa, 0x42000000,
+       0x0010b854, 0x0201f800, 0x0010aa47, 0x4933c856,
+       0x417a6000, 0x0401f7f5, 0x4933c857, 0x83380580,
+       0x00000013, 0x0402000b, 0x59300004, 0x8c00053e,
+       0x04000007, 0x0201f800, 0x00106c55, 0x0201f800,
+       0x00106bbf, 0x0201f800, 0x00106c4b, 0x1c01f000,
+       0x4933c857, 0x59880052, 0x80000000, 0x48031052,
+       0x1c01f000, 0x4933c857, 0x59300203, 0x82003480,
+       0x0000000e, 0x02021800, 0x001005d8, 0x4d2c0000,
+       0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107991,
+       0x00107efd, 0x0010804a, 0x00107991, 0x001080b0,
+       0x00107af5, 0x00107991, 0x00107991, 0x00107e93,
+       0x00107991, 0x00107991, 0x00107991, 0x00107991,
+       0x00107991, 0x0201f800, 0x001005d8, 0x4933c857,
+       0x59300203, 0x82003480, 0x0000000e, 0x02021800,
+       0x001005d8, 0x0c01f001, 0x001079a8, 0x00108a3d,
+       0x001079a8, 0x001079a8, 0x001079a8, 0x001079a8,
+       0x001079a8, 0x001079a8, 0x001089e5, 0x00108a58,
+       0x00108ac6, 0x00108a58, 0x00108ac6, 0x001079a8,
+       0x0201f800, 0x001005d8, 0x0201f800, 0x001005d8,
+       0x4933c857, 0x4d2c0000, 0x59325808, 0x59300203,
+       0x82003480, 0x0000000e, 0x02021800, 0x001005d8,
+       0x0c01f803, 0x5c025800, 0x1c01f000, 0x001079c5,
+       0x001079c5, 0x001079c5, 0x001079e1, 0x00107a2d,
+       0x001079c5, 0x001079c5, 0x001079c5, 0x001079c7,
+       0x001079c5, 0x001079c5, 0x001079c5, 0x001079c5,
+       0x001079c5, 0x0201f800, 0x001005d8, 0x4933c857,
+       0x83380580, 0x00000040, 0x02020800, 0x001005d8,
+       0x4a026007, 0x00082000, 0x4a026203, 0x00000003,
+       0x493a6403, 0x4a025c08, 0x00000001, 0x592c000d,
+       0x48026011, 0x497a6013, 0x592c0208, 0x800000c2,
+       0x800010c4, 0x80081400, 0x480a6206, 0x0201f800,
+       0x00100f4e, 0x42000800, 0x80000060, 0x0201f000,
+       0x00106721, 0x4933c857, 0x83380480, 0x00000050,
+       0x02021800, 0x001005d8, 0x83380480, 0x00000049,
+       0x02001800, 0x001005d8, 0x0c01f001, 0x001079f4,
+       0x001079ff, 0x001079f2, 0x001079f2, 0x001079f2,
+       0x001079f2, 0x00107a0a, 0x0201f800, 0x001005d8,
+       0x4a026203, 0x00000004, 0x4a025c08, 0x00000002,
+       0x592c0207, 0x48025c09, 0x592c0209, 0x48025a07,
+       0x592c000c, 0x4802580d, 0x1c01f000, 0x0201f800,
+       0x00106b8a, 0x0201f800, 0x00109037, 0x04000005,
+       0x4a025a06, 0x00000006, 0x0201f800, 0x000202da,
+       0x0201f000, 0x0002077d, 0x0201f800, 0x00106b8a,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x5c027800, 0x42003000, 0x00000014, 0x41782800,
+       0x42002000, 0x00000002, 0x4d400000, 0x4d440000,
+       0x59368c03, 0x42028000, 0x00000029, 0x0201f800,
+       0x0010985e, 0x5c028800, 0x5c028000, 0x42000000,
+       0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800,
+       0x00109037, 0x02000000, 0x0002077d, 0x4a025a06,
+       0x00000029, 0x0201f800, 0x000202da, 0x0201f000,
+       0x0002077d, 0x4933c857, 0x83380580, 0x00000048,
+       0x04000005, 0x83380580, 0x00000053, 0x02020800,
+       0x001005d8, 0x592c0206, 0x82000580, 0x00000007,
+       0x04000009, 0x59300011, 0x80000540, 0x04000006,
+       0x592c080c, 0x80040480, 0x4802580c, 0x4a025a06,
+       0x00000015, 0x592c0206, 0x80000540, 0x04020003,
+       0x4a025a06, 0x00000000, 0x0201f800, 0x000202da,
+       0x0201f000, 0x0002077d, 0x4933c857, 0x4d2c0000,
+       0x4c500000, 0x4c540000, 0x4c580000, 0x0201f800,
+       0x001007e4, 0x02000800, 0x001005d8, 0x497a5a06,
+       0x59c80017, 0x82000500, 0x0000f000, 0x48025c07,
+       0x59a80816, 0x82040c00, 0x00000018, 0x48065a07,
+       0x412c7800, 0x4d2c0000, 0x41cca000, 0x42002800,
+       0x00000001, 0x42001000, 0x0000002c, 0x82040480,
+       0x0000002d, 0x04021006, 0x832cac00, 0x00000009,
+       0x0201f800, 0x00108b96, 0x0401f02e, 0x40043000,
+       0x42000800, 0x0000002c, 0x832cac00, 0x00000009,
+       0x0201f800, 0x00108b96, 0x82183480, 0x0000002c,
+       0x0201f800, 0x001007e4, 0x0400001a, 0x80142800,
+       0x4a025804, 0x00000110, 0x492c7801, 0x82180c80,
+       0x0000003d, 0x04021007, 0x40180800, 0x832cac00,
+       0x00000005, 0x0201f800, 0x00108b96, 0x0401f015,
+       0x82081400, 0x0000003c, 0x82183480, 0x0000003c,
+       0x42000800, 0x0000003c, 0x412c7800, 0x832cac00,
+       0x00000005, 0x0201f800, 0x00108b96, 0x0401f7e5,
+       0x5c025800, 0x592c0206, 0x8400055e, 0x48025a06,
+       0x592c0407, 0x80080540, 0x48025c07, 0x0401f002,
+       0x5c025800, 0x813669c0, 0x04000003, 0x59343403,
+       0x0401f003, 0x42003000, 0x0000ffff, 0x49325808,
+       0x481a5c06, 0x82100580, 0x00000054, 0x04020002,
+       0x491e5813, 0x841401c0, 0x80100540, 0x48025804,
+       0x592c0001, 0x497a5801, 0x4c000000, 0x0201f800,
+       0x000202da, 0x5c025800, 0x812e59c0, 0x040207f9,
+       0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800,
+       0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000,
+       0x4c500000, 0x4c540000, 0x4c580000, 0x412cb800,
+       0x592c040b, 0x8c000516, 0x04000003, 0x41cca000,
+       0x0401f003, 0x83cca400, 0x00000006, 0x4008b000,
+       0x41781000, 0x82580480, 0x00000012, 0x04001004,
+       0x4200b000, 0x00000012, 0x40001000, 0x4c080000,
+       0x4d2c0000, 0x0201f800, 0x001007e4, 0x04000023,
+       0x5c001800, 0x492c1801, 0x485a5800, 0x832cac00,
+       0x00000002, 0x0201f800, 0x0010ab28, 0x585c040b,
+       0x8c000500, 0x0400000e, 0x832c1400, 0x00000002,
+       0x8c000516, 0x04000003, 0x82081400, 0x00000006,
+       0x46001000, 0x00000001, 0x80081000, 0x46001000,
+       0x00000900, 0x84000500, 0x4800bc0b, 0x5c001000,
+       0x800811c0, 0x040207da, 0x82000540, 0x00000001,
+       0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800,
+       0x5c00b800, 0x1c01f000, 0x5c025800, 0x5c001000,
+       0x0401f7f8, 0x4933c857, 0x83380d80, 0x00000015,
+       0x04020003, 0x0201f000, 0x0002077d, 0x83380d80,
+       0x00000016, 0x02020800, 0x001005d8, 0x0201f000,
+       0x0002077d, 0x4933c857, 0x4d2c0000, 0x4c500000,
+       0x4c540000, 0x4c580000, 0x59325808, 0x83cca400,
+       0x00000006, 0x59cc1806, 0x820c0580, 0x01000000,
+       0x04020004, 0x4200b000, 0x00000002, 0x0401f00f,
+       0x4200b000, 0x00000008, 0x832cac00, 0x00000005,
+       0x0201f800, 0x0010ab17, 0x8c0c1d00, 0x0400000b,
+       0x4200b000, 0x00000008, 0x592e5801, 0x812e59c0,
+       0x02000800, 0x001005d8, 0x832cac00, 0x00000005,
+       0x0201f800, 0x0010ab17, 0x0401f816, 0x5c00b000,
+       0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000,
+       0x4933c857, 0x4c500000, 0x4c540000, 0x4c580000,
+       0x83cca400, 0x00000006, 0x5930a808, 0x8254ac00,
+       0x00000005, 0x4200b000, 0x00000007, 0x0201f800,
+       0x0010ab17, 0x5c00b000, 0x5c00a800, 0x5c00a000,
+       0x4933c857, 0x0201f800, 0x00109037, 0x02000000,
+       0x0002077d, 0x4d2c0000, 0x0201f800, 0x00109597,
+       0x0402000b, 0x41780800, 0x4d400000, 0x42028000,
+       0x00000000, 0x0201f800, 0x0010943b, 0x5c028000,
+       0x5c025800, 0x0201f000, 0x0002077d, 0x5931d821,
+       0x58ef400b, 0x58ee580d, 0x4a025a04, 0x00000103,
+       0x58ec0009, 0x0801f800, 0x5c025800, 0x0201f000,
+       0x0002077d, 0x4933c857, 0x59cc1806, 0x820c0580,
+       0x02000000, 0x04020014, 0x4a026802, 0x00fffffd,
+       0x5934000a, 0x84000504, 0x4802680a, 0x59300808,
+       0x800409c0, 0x02000000, 0x0002077d, 0x4a000a04,
+       0x00000103, 0x480c0805, 0x5931d821, 0x58ef400b,
+       0x58ee580d, 0x58ec0009, 0x0801f800, 0x0201f000,
+       0x0002077d, 0x42000000, 0x0010b86c, 0x0201f800,
+       0x0010aa47, 0x4c0c0000, 0x0401f804, 0x5c001800,
+       0x040207eb, 0x1c01f000, 0x4933c857, 0x4d2c0000,
+       0x59325808, 0x812e59c0, 0x04020009, 0x497a6206,
+       0x497a6205, 0x4d380000, 0x42027000, 0x00000022,
+       0x0401fb77, 0x5c027000, 0x80000580, 0x5c025800,
+       0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000,
+       0x4c540000, 0x4c580000, 0x59325808, 0x592e5801,
+       0x832cac00, 0x00000005, 0x83cca400, 0x00000006,
+       0x59c80817, 0x82040d00, 0x000003ff, 0x82041480,
+       0x0000000f, 0x0400101b, 0x4200b000, 0x0000000f,
+       0x0201f800, 0x0010ab17, 0x592e5801, 0x832cac00,
+       0x00000005, 0x82080c80, 0x0000000f, 0x0400100d,
+       0x4200b000, 0x0000000f, 0x0201f800, 0x0010ab17,
+       0x592e5801, 0x832cac00, 0x00000005, 0x82041480,
+       0x0000000f, 0x04001007, 0x42001000, 0x0000000f,
+       0x4008b000, 0x0201f800, 0x0010ab17, 0x0401f004,
+       0x4004b000, 0x0201f800, 0x0010ab17, 0x5931d821,
+       0x58ef400b, 0x58ee580d, 0x4a025a04, 0x00000103,
+       0x592e5801, 0x58ec0009, 0x0801f800, 0x0201f800,
+       0x0002077d, 0x5c00b000, 0x5c00a800, 0x5c00a000,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000,
+       0x4c500000, 0x4c540000, 0x4c580000, 0x59cc0006,
+       0x82000d80, 0x01000000, 0x0400002c, 0x59cc0007,
+       0x9000b1c0, 0x8258b500, 0x000000ff, 0x8058b104,
+       0x8258b400, 0x00000002, 0x82580c80, 0x00000007,
+       0x04001003, 0x4200b000, 0x00000006, 0x83cca400,
+       0x00000006, 0x59301008, 0x800811c0, 0x02000800,
+       0x001005d8, 0x8208ac00, 0x00000005, 0x0201f800,
+       0x0010ab17, 0x82000d00, 0xff000000, 0x800409c0,
+       0x04000019, 0x8200b500, 0x000000ff, 0x8058b104,
+       0x82580c80, 0x0000000e, 0x04001003, 0x4200b000,
+       0x0000000d, 0x58081001, 0x800811c0, 0x02000800,
+       0x001005d8, 0x8208ac00, 0x00000005, 0x0201f800,
+       0x0010ab17, 0x0401f008, 0x59301008, 0x800811c0,
+       0x02000800, 0x001005d8, 0x48001005, 0x59cc0007,
+       0x48001006, 0x0401ff3b, 0x5c00b000, 0x5c00a800,
+       0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857,
+       0x42000800, 0x00000000, 0x59cc0006, 0x82000580,
+       0x02000000, 0x04000003, 0x42000800, 0x00000001,
+       0x4d2c0000, 0x59325808, 0x812e59c0, 0x02000800,
+       0x001005d8, 0x48065a06, 0x0201f800, 0x000202da,
+       0x5c025800, 0x0201f000, 0x0002077d, 0x4933c857,
+       0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000,
+       0x4200b000, 0x00000002, 0x59cc0806, 0x82040580,
+       0x01000000, 0x04000004, 0x8204b500, 0x0000ffff,
+       0x8058b104, 0x83cca400, 0x00000006, 0x59300008,
+       0x8200ac00, 0x00000005, 0x0201f800, 0x0010ab17,
+       0x0401ff0c, 0x5c00b000, 0x5c00a800, 0x5c00a000,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857,
+       0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857,
+       0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000,
+       0x0201f800, 0x001007d3, 0x5c000000, 0x0400000f,
+       0x48025803, 0x5c000000, 0x4802580a, 0x4c000000,
+       0x481a5801, 0x48125809, 0x48065804, 0x480a5807,
+       0x480e5808, 0x412c1000, 0x0201f800, 0x00100858,
+       0x82000540, 0x00000001, 0x5c025800, 0x1c01f000,
+       0x4933c857, 0x4d1c0000, 0x59cc0001, 0x82000500,
+       0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff,
+       0x80080580, 0x0402001f, 0x497a6205, 0x4d380000,
+       0x42027000, 0x00000035, 0x0201f800, 0x001093ba,
+       0x5c027000, 0x04020012, 0x591c001c, 0x800001c0,
+       0x0400000f, 0x497a381c, 0x591c0414, 0x8c000502,
+       0x02000800, 0x001005d8, 0x84000502, 0x48023c14,
+       0x591c1406, 0x82080580, 0x00000003, 0x04000006,
+       0x82080580, 0x00000006, 0x04000005, 0x0401fc9e,
+       0x0401f004, 0x0401f805, 0x0401f002, 0x0401f8c0,
+       0x5c023800, 0x1c01f000, 0x4d2c0000, 0x591e5808,
+       0x4933c857, 0x491fc857, 0x493bc857, 0x492fc857,
+       0x83380580, 0x00000015, 0x040000b3, 0x83380580,
+       0x00000016, 0x040200ae, 0x4d300000, 0x411e6000,
+       0x59cc0207, 0x4803c857, 0x82000d00, 0x0000ff00,
+       0x82040580, 0x00001700, 0x04000004, 0x82040580,
+       0x00000300, 0x0402005b, 0x591c0203, 0x4803c857,
+       0x82000580, 0x0000000d, 0x0400003f, 0x812e59c0,
+       0x0400009a, 0x591c0202, 0x4803c857, 0x82000580,
+       0x0000ffff, 0x0402007e, 0x592c020a, 0x4803c857,
+       0x82000500, 0x00000003, 0x82000580, 0x00000002,
+       0x04020007, 0x592c080f, 0x591c0011, 0x4803c857,
+       0x4807c857, 0x80040580, 0x04020071, 0x591c0414,
+       0x4803c857, 0x8c000500, 0x0402006d, 0x41780800,
+       0x591c1206, 0x42000000, 0x0000000a, 0x0201f800,
+       0x001066a0, 0x592c0406, 0x4803c857, 0x800001c0,
+       0x0400000c, 0x80080c80, 0x04001004, 0x02020800,
+       0x001005d8, 0x80001040, 0x480a5c06, 0x800811c0,
+       0x04020004, 0x0201f800, 0x00108d88, 0x0401f06b,
+       0x0201f800, 0x0010912a, 0x591c0817, 0x591c0018,
+       0x48065808, 0x48025809, 0x59300007, 0x8c000500,
+       0x02020800, 0x00100e99, 0x497a3808, 0x0201f800,
+       0x000201ba, 0x0402004a, 0x411e6000, 0x0401fc3e,
+       0x0401f05a, 0x0401fc6d, 0x04000013, 0x49366009,
+       0x4a026406, 0x00000003, 0x492e6008, 0x591c0817,
+       0x591c1018, 0x48066017, 0x480a6018, 0x4d380000,
+       0x591e7403, 0x4d300000, 0x411e6000, 0x0401fc2e,
+       0x5c026000, 0x0201f800, 0x000207a1, 0x5c027000,
+       0x0401f046, 0x59a80039, 0x48023a05, 0x0401f043,
+       0x59cc0407, 0x82000580, 0x0000000b, 0x04020025,
+       0x59340a00, 0x84040d0e, 0x48066a00, 0x592c0a04,
+       0x82040d00, 0x000000ff, 0x82040d80, 0x00000014,
+       0x04000003, 0x4a02621d, 0x00000003, 0x59300007,
+       0x8c000500, 0x02020800, 0x00100e99, 0x4d400000,
+       0x42028000, 0x00000003, 0x592c0a08, 0x0201f800,
+       0x00104e70, 0x0201f800, 0x000202da, 0x5c028000,
+       0x497a6008, 0x4a026403, 0x00000085, 0x4a026203,
+       0x00000009, 0x4a026406, 0x00000002, 0x42000800,
+       0x8000404b, 0x0201f800, 0x00020721, 0x0401f01b,
+       0x59cc0207, 0x82000580, 0x00002a00, 0x04020004,
+       0x59a80039, 0x48023a05, 0x0401f014, 0x812e59c0,
+       0x02000800, 0x001005d8, 0x4a025a04, 0x00000103,
+       0x591c0007, 0x8c000500, 0x02020800, 0x00100e99,
+       0x591c0402, 0x48025c06, 0x4a025a06, 0x00000003,
+       0x0201f800, 0x000202c1, 0x0201f800, 0x00107911,
+       0x0201f800, 0x001049b2, 0x5c026000, 0x0201f800,
+       0x0002077d, 0x0401f002, 0x5c026000, 0x5c025800,
+       0x1c01f000, 0x0401f819, 0x0401f7fd, 0x4933c857,
+       0x83380580, 0x00000015, 0x04020004, 0x59a80039,
+       0x48023a05, 0x0401f00d, 0x83380580, 0x00000016,
+       0x0402000d, 0x4d300000, 0x411e6000, 0x0201f800,
+       0x0010a5df, 0x0201f800, 0x000206fd, 0x0201f800,
+       0x0002077d, 0x5c026000, 0x497a381c, 0x0201f800,
+       0x0002077d, 0x1c01f000, 0x591c0414, 0x84000540,
+       0x48023c14, 0x59cc100b, 0x4933c857, 0x491fc857,
+       0x492fc857, 0x4803c857, 0x480bc857, 0x8c08153c,
+       0x04000006, 0x59a80039, 0x48023a05, 0x497a381c,
+       0x0201f000, 0x0002077d, 0x4d300000, 0x411e6000,
+       0x0201f800, 0x00108bd7, 0x5c026000, 0x591c0406,
+       0x82000580, 0x00000000, 0x02000000, 0x0002077d,
+       0x591c0403, 0x82000580, 0x00000050, 0x0402000d,
+       0x4d300000, 0x411e6000, 0x4a026203, 0x00000001,
+       0x42000800, 0x80000043, 0x0201f800, 0x00020721,
+       0x5c026000, 0x497a381c, 0x0201f000, 0x0002077d,
+       0x591c0203, 0x82000580, 0x0000000d, 0x04000014,
+       0x812e59c0, 0x02000800, 0x001005d8, 0x591c0203,
+       0x82000580, 0x00000004, 0x04020011, 0x592c020a,
+       0x8c000502, 0x0400000e, 0x4a023812, 0x0fffffff,
+       0x592c0208, 0x8400051e, 0x48025a08, 0x42000000,
+       0x00000001, 0x48023a14, 0x0401f021, 0x42000000,
+       0x00000007, 0x48023a14, 0x0401f01d, 0x592c020a,
+       0x4803c857, 0x8c000500, 0x0402000b, 0x8c000502,
+       0x040007f7, 0x591c0414, 0x8c00051c, 0x040207eb,
+       0x591c0011, 0x4803c857, 0x800001c0, 0x040007f0,
+       0x0401f7e6, 0x8c08153a, 0x040207ed, 0x59cc000a,
+       0x592c180f, 0x4803c857, 0x480fc857, 0x800c0580,
+       0x040007e7, 0x59cc000a, 0x4803c857, 0x48023816,
+       0x42000000, 0x00000005, 0x48023a14, 0x0201f000,
+       0x00109259, 0x4933c857, 0x4d1c0000, 0x59cc0001,
+       0x59341002, 0x80080580, 0x82000500, 0x00ffffff,
+       0x04020041, 0x59301419, 0x0201f800, 0x00109410,
+       0x02000800, 0x001005d8, 0x591c1406, 0x82080580,
+       0x00000007, 0x04000038, 0x82080580, 0x00000002,
+       0x04000035, 0x82080580, 0x00000000, 0x04000032,
+       0x591c0202, 0x82000d80, 0x0000ffff, 0x04000004,
+       0x59301a19, 0x800c0580, 0x0402002b, 0x83380580,
+       0x00000015, 0x04000026, 0x4d300000, 0x4d2c0000,
+       0x411e6000, 0x59325808, 0x0201f800, 0x00109037,
+       0x02000800, 0x001005d8, 0x592c0204, 0x82000500,
+       0x000000ff, 0x82000580, 0x00000014, 0x04000003,
+       0x4a02621d, 0x00000003, 0x42028000, 0x00000003,
+       0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800,
+       0x000202da, 0x5c025800, 0x497a6008, 0x4a026403,
+       0x00000085, 0x4a026203, 0x00000009, 0x4a026406,
+       0x00000002, 0x42000800, 0x8000404b, 0x0201f800,
+       0x00020721, 0x5c026000, 0x0401f003, 0x59a80039,
+       0x48023a05, 0x497a381c, 0x0201f800, 0x0002077d,
+       0x5c023800, 0x1c01f000, 0x4933c857, 0x4c580000,
+       0x4d2c0000, 0x59325808, 0x83383580, 0x00000015,
+       0x04000010, 0x59342200, 0x84102502, 0x48126a00,
+       0x0201f800, 0x00109037, 0x04000066, 0x0201f800,
+       0x00109597, 0x04020005, 0x4200b000, 0x00000002,
+       0x0201f800, 0x0010957d, 0x0401fa0a, 0x0401f079,
+       0x83cc1400, 0x00000008, 0x4200b000, 0x00000002,
+       0x83341c00, 0x00000006, 0x0201f800, 0x0010855a,
+       0x04020015, 0x83cc1400, 0x0000000a, 0x4200b000,
+       0x00000002, 0x83341c00, 0x00000008, 0x0201f800,
+       0x0010855a, 0x0402000c, 0x0201f800, 0x00102074,
+       0x59342200, 0x59cc1007, 0x800811c0, 0x04000003,
+       0x480a6801, 0x84102542, 0x8410251a, 0x48126a00,
+       0x0401f05f, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42000000, 0x0010b864,
+       0x0201f800, 0x0010aa47, 0x59340200, 0x84000558,
+       0x48026a00, 0x4d300000, 0x0201f800, 0x0002075a,
+       0x02000800, 0x001005d8, 0x49366009, 0x497a6008,
+       0x4a026406, 0x00000001, 0x4a026403, 0x00000001,
+       0x42003000, 0x00000003, 0x0201f800, 0x0010a942,
+       0x0201f800, 0x00103b25, 0x04000011, 0x41782800,
+       0x42003000, 0x00000001, 0x4d400000, 0x42028000,
+       0x00000029, 0x0201f800, 0x0010a43e, 0x5c028000,
+       0x4a026406, 0x00000004, 0x4a026203, 0x00000007,
+       0x4a026420, 0x00000001, 0x0401f009, 0x4a026203,
+       0x00000001, 0x42000800, 0x0000000b, 0x0201f800,
+       0x00104571, 0x0201f800, 0x0010672b, 0x5c026000,
+       0x0201f800, 0x00109037, 0x04000022, 0x0201f800,
+       0x00109597, 0x04020022, 0x0401f9ae, 0x0401f01d,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x59340200, 0x84000558, 0x48026a00, 0x42003000,
+       0x00000003, 0x41782800, 0x42002000, 0x00000005,
+       0x4d400000, 0x4d440000, 0x59368c03, 0x42028000,
+       0x00000029, 0x0201f800, 0x0010985e, 0x5c028800,
+       0x5c028000, 0x5c027800, 0x0201f800, 0x00102074,
+       0x0201f800, 0x0002077d, 0x0401f002, 0x0401fca9,
+       0x5c025800, 0x5c00b000, 0x1c01f000, 0x4933c857,
+       0x41380000, 0x83383480, 0x00000056, 0x02021800,
+       0x001005d8, 0x0c01f001, 0x00107ef7, 0x00107ef2,
+       0x00107ef7, 0x00107ef7, 0x00107ef7, 0x00107ef7,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef7, 0x00107ef0, 0x00107ef7,
+       0x00107ef7, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef7, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef7, 0x00107ef7, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7,
+       0x00107ef0, 0x00107ef0, 0x00107ef7, 0x00107ef7,
+       0x00107ef0, 0x00107ef7, 0x00107ef7, 0x00107ef0,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7,
+       0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7,
+       0x0201f800, 0x001005d8, 0x4a026203, 0x00000001,
+       0x493a6403, 0x0201f000, 0x0010672b, 0x4933c857,
+       0x4a026203, 0x00000001, 0x493a6403, 0x0201f000,
+       0x0010672b, 0x4933c857, 0x59300403, 0x82003480,
+       0x00000056, 0x02021800, 0x001005d8, 0x83383580,
+       0x00000013, 0x04000093, 0x83383580, 0x00000027,
+       0x0402004b, 0x0201f800, 0x00106bbf, 0x0201f800,
+       0x00109134, 0x0400000b, 0x0201f800, 0x0010914e,
+       0x04000041, 0x59300403, 0x82000d80, 0x00000022,
+       0x04020038, 0x0401fc61, 0x0400003a, 0x0401f03a,
+       0x0201f800, 0x00102074, 0x42000800, 0x00000007,
+       0x0201f800, 0x00104571, 0x0401f8fe, 0x4d440000,
+       0x59368c03, 0x83440580, 0x000007fe, 0x04020008,
+       0x59a81026, 0x84081540, 0x0201f800, 0x0010513b,
+       0x04020002, 0x8408154a, 0x480b5026, 0x42028000,
+       0x00000029, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x836c0580, 0x00000003,
+       0x0400000c, 0x59326809, 0x59340008, 0x800001c0,
+       0x04020008, 0x59368c03, 0x4933c857, 0x4937c857,
+       0x4947c857, 0x0201f800, 0x001045fb, 0x0401f00c,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x42003000, 0x00000015, 0x41782800, 0x42002000,
+       0x00000003, 0x0201f800, 0x0010985e, 0x5c028800,
+       0x0201f800, 0x00109326, 0x0201f000, 0x0002077d,
+       0x1c01f000, 0x0401f8cb, 0x0401f7fa, 0x83380580,
+       0x00000014, 0x0400000b, 0x0201f800, 0x00106f60,
+       0x02020000, 0x00107974, 0x59300203, 0x82000580,
+       0x00000002, 0x040000ed, 0x0201f800, 0x001005d8,
+       0x0201f800, 0x00106bbf, 0x4d3c0000, 0x417a7800,
+       0x0201f800, 0x0010203c, 0x5c027800, 0x42003000,
+       0x00000016, 0x41782800, 0x4d400000, 0x4d440000,
+       0x59368c03, 0x42002000, 0x00000009, 0x42028000,
+       0x00000029, 0x0201f800, 0x0010985e, 0x5c028800,
+       0x5c028000, 0x42000000, 0x0010b864, 0x0201f800,
+       0x0010aa47, 0x0201f800, 0x00109134, 0x0402000c,
+       0x0201f800, 0x00102074, 0x0401f89e, 0x59340c03,
+       0x82040580, 0x000007fe, 0x040207ca, 0x59a80826,
+       0x84040d40, 0x48075026, 0x0401f7c6, 0x0201f800,
+       0x0010914e, 0x04020003, 0x0401f892, 0x0401f7c1,
+       0x59300403, 0x82000d80, 0x00000032, 0x04020004,
+       0x0201f800, 0x0010230c, 0x0401f7ba, 0x59300403,
+       0x82000d80, 0x00000022, 0x04000886, 0x0401f7b5,
+       0x4803c857, 0x0c01f001, 0x00108016, 0x00108016,
+       0x00108016, 0x00108016, 0x00108016, 0x00108016,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff9, 0x00108016, 0x00107ff0, 0x00108016,
+       0x00108016, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00108016, 0x00108016,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0,
+       0x00108007, 0x00108016, 0x00107ff0, 0x00108000,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108000,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016,
+       0x00108003, 0x00107ff0, 0x00107ff2, 0x00108016,
+       0x00107ff0, 0x00108016, 0x00108016, 0x00107ff0,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016,
+       0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016,
+       0x0201f800, 0x001005d8, 0x4d2c0000, 0x59325808,
+       0x0201f800, 0x000202da, 0x5c025800, 0x0201f000,
+       0x0002077d, 0x4a026203, 0x00000005, 0x59a80039,
+       0x48026205, 0x59a80037, 0x48026206, 0x1c01f000,
+       0x5930081e, 0x49780a05, 0x0401f014, 0x0201f800,
+       0x00109326, 0x0201f000, 0x0002077d, 0x0201f800,
+       0x0010230c, 0x0201f800, 0x00106c55, 0x04000005,
+       0x0201f800, 0x00106bbf, 0x0201f000, 0x0002077d,
+       0x0201f800, 0x00106bbf, 0x0201f800, 0x0002077d,
+       0x0201f000, 0x00106c4b, 0x4933c857, 0x4a026203,
+       0x00000002, 0x59a80037, 0x48026206, 0x1c01f000,
+       0x4933c857, 0x0201f800, 0x00109037, 0x0400002a,
+       0x4d2c0000, 0x0201f800, 0x00109597, 0x0402000a,
+       0x4d400000, 0x42028000, 0x00000031, 0x42000800,
+       0x00000004, 0x0201f800, 0x0010943b, 0x5c028000,
+       0x0401f01c, 0x59300c06, 0x82040580, 0x00000010,
+       0x04000004, 0x82040580, 0x00000011, 0x0402000a,
+       0x4a025a06, 0x00000031, 0x4a02580d, 0x00000004,
+       0x4a02580e, 0x000000ff, 0x0201f800, 0x000202da,
+       0x0401f00c, 0x592c0404, 0x8c00051e, 0x04000009,
+       0x4a025a04, 0x00000103, 0x4a025805, 0x01000000,
+       0x5931d821, 0x58ef400b, 0x58ec0009, 0x0801f800,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x59340400,
+       0x82000500, 0x000000ff, 0x82003480, 0x0000000c,
+       0x02021800, 0x001005d8, 0x59303403, 0x82180d80,
+       0x0000004d, 0x02000000, 0x0010938b, 0x82180d80,
+       0x00000033, 0x02000000, 0x00109349, 0x82180d80,
+       0x00000028, 0x02000000, 0x0010918f, 0x82180d80,
+       0x00000029, 0x02000000, 0x001091a3, 0x82180d80,
+       0x0000001f, 0x02000000, 0x00107b28, 0x82180d80,
+       0x00000055, 0x02000000, 0x00107b01, 0x82180d80,
+       0x00000000, 0x04000591, 0x82180d80, 0x00000022,
+       0x02000000, 0x00107b55, 0x82180d80, 0x00000035,
+       0x02000000, 0x00107c50, 0x82180d80, 0x00000039,
+       0x04000539, 0x82180d80, 0x0000003d, 0x02000000,
+       0x00107b85, 0x82180d80, 0x00000044, 0x02000000,
+       0x00107bc2, 0x82180d80, 0x00000049, 0x02000000,
+       0x00107c17, 0x82180d80, 0x00000041, 0x02000000,
+       0x00107c03, 0x82180d80, 0x00000043, 0x02000000,
+       0x001094dc, 0x82180d80, 0x00000051, 0x02000000,
+       0x00109542, 0x82180d80, 0x00000004, 0x04020003,
+       0x42000000, 0x00000001, 0x83380d80, 0x00000015,
+       0x04000006, 0x83380d80, 0x00000016, 0x02020000,
+       0x00107974, 0x0401f20f, 0x4d2c0000, 0x4d3c0000,
+       0x0c01f804, 0x5c027800, 0x5c025800, 0x1c01f000,
+       0x001080b8, 0x001080bc, 0x001080b8, 0x00108131,
+       0x001080b8, 0x00108226, 0x001082bf, 0x001080b8,
+       0x001080b8, 0x00108288, 0x001080b8, 0x0010829a,
+       0x4933c857, 0x497a6007, 0x59300808, 0x58040000,
+       0x4a000a04, 0x00000103, 0x0201f000, 0x0002077d,
+       0x4933c857, 0x40000000, 0x40000000, 0x1c01f000,
+       0x4933c857, 0x59a80016, 0x82000580, 0x00000074,
+       0x0402005c, 0x0201f800, 0x0010a2c8, 0x04020016,
+       0x0401f85c, 0x0201f800, 0x00109037, 0x0400000c,
+       0x0201f800, 0x00109597, 0x04020009, 0x41780800,
+       0x4d400000, 0x42028000, 0x00000000, 0x0201f800,
+       0x0010943b, 0x5c028000, 0x0401f003, 0x0201f800,
+       0x00102074, 0x0201f800, 0x001048c1, 0x0201f000,
+       0x0002077d, 0x0201f800, 0x00109037, 0x04000007,
+       0x0201f800, 0x00109597, 0x04020004, 0x0401ff3d,
+       0x0201f000, 0x0002077d, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x42000000, 0x0010b864, 0x0201f800,
+       0x0010aa47, 0x59340200, 0x84000558, 0x48026a00,
+       0x42003000, 0x00000003, 0x0201f800, 0x0010a942,
+       0x4d300000, 0x0201f800, 0x0002075a, 0x02000800,
+       0x001005d8, 0x49366009, 0x497a6008, 0x4a026406,
+       0x00000001, 0x4a026403, 0x00000001, 0x0201f800,
+       0x00103b25, 0x04000011, 0x4a026406, 0x00000004,
+       0x4a026203, 0x00000007, 0x4a026420, 0x00000001,
+       0x42003000, 0x00000001, 0x4d400000, 0x42028000,
+       0x00000029, 0x41782800, 0x0201f800, 0x0010a43e,
+       0x5c028000, 0x0401f009, 0x42000800, 0x0000000b,
+       0x0201f800, 0x00104571, 0x4a026203, 0x00000001,
+       0x0201f800, 0x0010672b, 0x5c026000, 0x0401ff05,
+       0x0201f800, 0x00102074, 0x0201f000, 0x0002077d,
+       0x0401ff00, 0x42000000, 0x00000001, 0x0401f0c7,
+       0x4933c857, 0x59340200, 0x8c000500, 0x0400000d,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x00104567,
+       0x5c027800, 0x0201f800, 0x00103b25, 0x04000005,
+       0x42000800, 0x00000006, 0x0201f800, 0x00104571,
+       0x1c01f000, 0x4933c857, 0x59a80816, 0x82040580,
+       0x00000074, 0x0400000e, 0x4807c857, 0x82040580,
+       0x00000100, 0x040200a0, 0x59cc0408, 0x4803c857,
+       0x8c000500, 0x0400009c, 0x59341403, 0x82080580,
+       0x000007fe, 0x04000006, 0x0401f097, 0x59341403,
+       0x82080580, 0x000007fe, 0x04020003, 0x0401fa9c,
+       0x0401f04c, 0x0201f800, 0x0010462a, 0x59341403,
+       0x82080580, 0x000007fc, 0x0402001f, 0x4a026802,
+       0x00fffffc, 0x0201f800, 0x00109037, 0x04000012,
+       0x0201f800, 0x00109597, 0x0402000f, 0x0401f8a9,
+       0x41780800, 0x4d400000, 0x42028000, 0x00000000,
+       0x0201f800, 0x0010943b, 0x5c028000, 0x42000800,
+       0x00000004, 0x0201f800, 0x00104571, 0x0201f000,
+       0x0002077d, 0x42000800, 0x00000004, 0x0201f800,
+       0x00104571, 0x0201f800, 0x00102074, 0x0201f000,
+       0x0002077d, 0x59a80005, 0x8c000514, 0x04000011,
+       0x0201f800, 0x0010513b, 0x42001000, 0x00000010,
+       0x04020009, 0x59340002, 0x82000500, 0x00ff0000,
+       0x82000580, 0x00ff0000, 0x04000006, 0x42001000,
+       0x00000008, 0x0201f800, 0x00104c6d, 0x0402005a,
+       0x0201f800, 0x00109037, 0x0400005b, 0x0201f800,
+       0x00109597, 0x04020005, 0x592c0404, 0x8c00051c,
+       0x040207c9, 0x0401f877, 0x42000800, 0x00000005,
+       0x0201f800, 0x00104571, 0x4a026203, 0x00000001,
+       0x4a026403, 0x00000003, 0x0201f000, 0x0010672b,
+       0x59cc0408, 0x8c000518, 0x04000010, 0x0201f800,
+       0x001092e5, 0x0201f800, 0x0010513b, 0x04000004,
+       0x59cc0408, 0x8c000516, 0x040207b3, 0x59a80026,
+       0x8400054a, 0x48035026, 0x59a80010, 0x84000570,
+       0x48038832, 0x0401f7ac, 0x42001000, 0x000000ef,
+       0x480b5010, 0x497b8830, 0x84081570, 0x480b8832,
+       0x59c40802, 0x84040d4c, 0x48078802, 0x0201f800,
+       0x0010930f, 0x59a80026, 0x84000548, 0x48035026,
+       0x0201f800, 0x0010a3da, 0x0402079b, 0x59a80026,
+       0x8400054c, 0x48035026, 0x42000800, 0x00000006,
+       0x0201f800, 0x00104571, 0x417a7800, 0x0201f800,
+       0x00104567, 0x42000000, 0x000000e8, 0x0201f800,
+       0x00105c9a, 0x02000800, 0x001045a6, 0x02020800,
+       0x001005d8, 0x49366009, 0x59340200, 0x8400051a,
+       0x48026a00, 0x42000800, 0x00000003, 0x0201f800,
+       0x00104571, 0x4a026406, 0x00000001, 0x4a026203,
+       0x00000001, 0x4a026403, 0x00000002, 0x0201f000,
+       0x0010672b, 0x0401fe43, 0x42000000, 0x00000001,
+       0x0401f00a, 0x599c0017, 0x8c00050a, 0x040007ab,
+       0x42000800, 0x00000004, 0x0201f800, 0x00104571,
+       0x0201f000, 0x0002077d, 0x4933c857, 0x80003540,
+       0x04000005, 0x42000800, 0x00000007, 0x0201f800,
+       0x00104571, 0x801831c0, 0x0402000e, 0x59302008,
+       0x801021c0, 0x04000004, 0x58100404, 0x8c00051e,
+       0x04020008, 0x59341c03, 0x42002000, 0x00000004,
+       0x42003000, 0x00000012, 0x0201f800, 0x00103aae,
+       0x0201f800, 0x00102074, 0x0201f000, 0x0002077d,
+       0x4c5c0000, 0x4d2c0000, 0x59325808, 0x0201f800,
+       0x00105755, 0x5c025800, 0x59cc0008, 0x48002805,
+       0x59cc0009, 0x48002806, 0x49782807, 0x49782808,
+       0x49782809, 0x4978280a, 0x59cc0013, 0x8c00053e,
+       0x04000009, 0x59cc0414, 0x900001c0, 0x59ccbc15,
+       0x805c0540, 0x48002807, 0x59cc0416, 0x900001c0,
+       0x48002808, 0x59cc0017, 0x8c00053e, 0x04000009,
+       0x59cc0418, 0x900001c0, 0x59ccbc19, 0x805c0540,
+       0x48002809, 0x59cc041a, 0x900001c0, 0x4800280a,
+       0x5c00b800, 0x1c01f000, 0x4933c857, 0x59a80016,
+       0x82000580, 0x00000014, 0x04020048, 0x59a80005,
+       0x8c000514, 0x04000015, 0x0201f800, 0x0010513b,
+       0x42001000, 0x00000010, 0x04020009, 0x59340002,
+       0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000,
+       0x0400000a, 0x42001000, 0x00000008, 0x0201f800,
+       0x00104c6d, 0x04000005, 0x59a80005, 0x84000556,
+       0x48035005, 0x0401f031, 0x836c0580, 0x00000003,
+       0x0402000b, 0x59300008, 0x80000540, 0x04020008,
+       0x59341c03, 0x42002000, 0x00000006, 0x42003000,
+       0x00000013, 0x0201f800, 0x00103aae, 0x0201f800,
+       0x0010468d, 0x0401fecf, 0x0401fa1d, 0x0402001f,
+       0x59340404, 0x80000540, 0x0400001c, 0x42000800,
+       0x00000006, 0x0201f800, 0x00104571, 0x0201f800,
+       0x00109037, 0x04000011, 0x0201f800, 0x00109597,
+       0x0402000a, 0x41780800, 0x4d400000, 0x42028000,
+       0x00000000, 0x0201f800, 0x0010943b, 0x5c028000,
+       0x0201f000, 0x0002077d, 0x4a025a04, 0x00000103,
+       0x4a025805, 0x02000000, 0x0201f800, 0x00102074,
+       0x0201f000, 0x0002077d, 0x0201f800, 0x00104c19,
+       0x0201f800, 0x00109037, 0x04000007, 0x0201f800,
+       0x00109597, 0x04020004, 0x0401fda2, 0x0201f000,
+       0x0002077d, 0x0401fd9f, 0x80000580, 0x59a80005,
+       0x8c000516, 0x04000005, 0x84000516, 0x48035005,
+       0x82000540, 0x00000001, 0x0401ff60, 0x1c01f000,
+       0x4933c857, 0x59a80016, 0x82000580, 0x00000014,
+       0x0402000b, 0x42000800, 0x0000000b, 0x0201f800,
+       0x00104571, 0x4a026203, 0x00000001, 0x4a026403,
+       0x00000001, 0x0201f000, 0x0010672b, 0x42000000,
+       0x00000001, 0x0401f74d, 0x4933c857, 0x40003000,
+       0x59a80016, 0x82000580, 0x00000004, 0x0402000a,
+       0x82183580, 0x0000000b, 0x04020005, 0x42000800,
+       0x00000007, 0x0201f800, 0x00104571, 0x0201f000,
+       0x0002077d, 0x42000000, 0x00000001, 0x0401f73b,
+       0x4803c857, 0x4d2c0000, 0x4d3c0000, 0x0c01f804,
+       0x5c027800, 0x5c025800, 0x1c01f000, 0x001080b8,
+       0x001082ce, 0x001080b8, 0x00108323, 0x001080b8,
+       0x00108391, 0x001082bf, 0x001080b8, 0x001080b8,
+       0x001083b1, 0x001080b8, 0x001083c1, 0x4933c857,
+       0x4d1c0000, 0x59301403, 0x82080580, 0x00000003,
+       0x04000008, 0x82081580, 0x0000001e, 0x04020003,
+       0x0201f800, 0x0002077d, 0x5c023800, 0x1c01f000,
+       0x0401ff5a, 0x0401f7fd, 0x4933c857, 0x0201f800,
+       0x00109037, 0x0400000b, 0x0201f800, 0x00109597,
+       0x04020008, 0x4200b000, 0x00000002, 0x0201f800,
+       0x0010957d, 0x0401fd43, 0x0201f000, 0x0002077d,
+       0x0401f8f5, 0x04020030, 0x417a7800, 0x0201f800,
+       0x00104567, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x59340200, 0x84000558, 0x48026a00, 0x4a026403,
+       0x00000002, 0x42003000, 0x00000003, 0x0201f800,
+       0x0010a942, 0x0201f800, 0x00103b25, 0x04000011,
+       0x4d400000, 0x41782800, 0x42003000, 0x00000005,
+       0x42028000, 0x00000029, 0x0201f800, 0x0010a43e,
+       0x5c028000, 0x4a026203, 0x00000007, 0x4a026406,
+       0x00000004, 0x4a026420, 0x00000001, 0x1c01f000,
+       0x42000800, 0x00000003, 0x0201f800, 0x00104571,
+       0x4a026203, 0x00000001, 0x0201f800, 0x0010672b,
+       0x0401f7f7, 0x59cc0407, 0x82000580, 0x00000009,
+       0x0402000a, 0x59340412, 0x82000500, 0x000000ff,
+       0x0400000c, 0x80000040, 0x48026c12, 0x4a026206,
+       0x0000000a, 0x0401f7ea, 0x59cc0207, 0x82000500,
+       0x0000ff00, 0x82000580, 0x00001900, 0x040007c2,
+       0x0401fcfc, 0x80000580, 0x0401f6c4, 0x4933c857,
+       0x59a80032, 0x80000540, 0x04000015, 0x59340403,
+       0x82000580, 0x000007fe, 0x04020011, 0x59a80010,
+       0x80000000, 0x48035010, 0x417a7800, 0x0201f800,
+       0x00104567, 0x42000800, 0x00000003, 0x0201f800,
+       0x00104571, 0x4a026203, 0x00000001, 0x4a026403,
+       0x00000002, 0x0201f000, 0x0010672b, 0x0201f800,
+       0x00109037, 0x04000011, 0x0201f800, 0x00109597,
+       0x0402000e, 0x4c580000, 0x4200b000, 0x00000002,
+       0x0201f800, 0x0010957d, 0x5c00b000, 0x0401fcd5,
+       0x42000800, 0x00000007, 0x0201f800, 0x00104571,
+       0x0201f000, 0x0002077d, 0x0401fcce, 0x59cc3407,
+       0x82183500, 0x000000ff, 0x82180580, 0x00000005,
+       0x0400001c, 0x82180580, 0x0000000b, 0x04000016,
+       0x59cc0207, 0x82000500, 0x0000ff00, 0x04020004,
+       0x82180580, 0x00000009, 0x04000012, 0x82000580,
+       0x00001900, 0x0402000c, 0x82180580, 0x00000009,
+       0x0400000c, 0x42000800, 0x00000004, 0x0201f800,
+       0x00104571, 0x0201f800, 0x00102074, 0x0201f000,
+       0x0002077d, 0x42000000, 0x00000001, 0x0401f677,
+       0x0201f800, 0x00109037, 0x59325808, 0x04000008,
+       0x592c0204, 0x82000580, 0x00000139, 0x040007f6,
+       0x592c0404, 0x8c00051e, 0x040207f3, 0x59340403,
+       0x82000580, 0x000007fe, 0x04020007, 0x59a80026,
+       0x84000540, 0x48035026, 0x0201f800, 0x00104229,
+       0x0401f7e9, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x42003000, 0x00000005, 0x0201f800, 0x0010a942,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x0401f7dd, 0x4933c857, 0x0401f84d, 0x0402000b,
+       0x42000800, 0x00000005, 0x0201f800, 0x00104571,
+       0x4a026203, 0x00000001, 0x4a026403, 0x00000003,
+       0x0201f000, 0x0010672b, 0x42000800, 0x00000004,
+       0x0201f800, 0x00104571, 0x0201f800, 0x00109597,
+       0x0402000a, 0x4c580000, 0x4200b000, 0x00000002,
+       0x0201f800, 0x0010957d, 0x5c00b000, 0x0401fc71,
+       0x0201f000, 0x0002077d, 0x0401fc6e, 0x80000580,
+       0x0401f636, 0x4933c857, 0x0401f82d, 0x0402000b,
+       0x42000800, 0x00000009, 0x0201f800, 0x00104571,
+       0x4a026203, 0x00000001, 0x4a026403, 0x00000005,
+       0x0201f000, 0x0010672b, 0x42000000, 0x00000001,
+       0x0401f626, 0x4933c857, 0x0401f81d, 0x0402000b,
+       0x42000800, 0x0000000b, 0x0201f800, 0x00104571,
+       0x4a026203, 0x00000001, 0x4a026403, 0x00000001,
+       0x0201f000, 0x0010672b, 0x42000000, 0x00000001,
+       0x0401f616, 0x4933c857, 0x59cc0407, 0x82000580,
+       0x00000003, 0x04020009, 0x59cc0207, 0x82000500,
+       0x0000ff00, 0x82000d80, 0x00002a00, 0x04000003,
+       0x82000d80, 0x00001e00, 0x1c01f000, 0x4933c857,
+       0x82000540, 0x00000001, 0x1c01f000, 0x4933c857,
+       0x4d400000, 0x4c580000, 0x59a80026, 0x82000540,
+       0x00000003, 0x48035026, 0x0401f85c, 0x04000038,
+       0x4d340000, 0x4d440000, 0x59a80026, 0x84000552,
+       0x48035026, 0x0201f800, 0x00103b25, 0x0400000c,
+       0x42028000, 0x0000002a, 0x42028800, 0x0000ffff,
+       0x42003000, 0x00000002, 0x0201f800, 0x0010a446,
+       0x59a80805, 0x84040d44, 0x48075005, 0x42028000,
+       0x0000002a, 0x4d3c0000, 0x42027800, 0x00000204,
+       0x0201f800, 0x00101fe5, 0x5c027800, 0x42000000,
+       0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800,
+       0x00101e45, 0x4200b000, 0x00000010, 0x42028800,
+       0x000007f0, 0x4d2c0000, 0x83440580, 0x000007fe,
+       0x04000003, 0x0201f800, 0x001045fb, 0x81468800,
+       0x8058b040, 0x040207f9, 0x5c025800, 0x59cc0408,
+       0x8c00051e, 0x04000004, 0x59a80026, 0x84000512,
+       0x48035026, 0x5c028800, 0x5c026800, 0x0201f800,
+       0x0010462a, 0x4a026802, 0x00fffffe, 0x59a80826,
+       0x84040d50, 0x59cc0013, 0x8c00053e, 0x04000003,
+       0x8c000536, 0x04000004, 0x59cc0017, 0x8c000536,
+       0x04020002, 0x84040d10, 0x48075026, 0x59cc0800,
+       0x82040d00, 0x00ffffff, 0x48075010, 0x80040110,
+       0x4803501d, 0x48038881, 0x0201f800, 0x0010513b,
+       0x04000007, 0x59cc0009, 0x48035035, 0x59cc000a,
+       0x48035036, 0x0201f800, 0x001092e5, 0x5c00b000,
+       0x5c028000, 0x1c01f000, 0x4933c857, 0x4c580000,
+       0x59a80010, 0x82000500, 0x00ffff00, 0x04000022,
+       0x59cc1000, 0x82081500, 0x00ffff00, 0x80080580,
+       0x04000004, 0x42000000, 0x0010b83b, 0x0401f016,
+       0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002,
+       0x83341c00, 0x00000006, 0x0401f900, 0x04000004,
+       0x42000000, 0x0010b83c, 0x0401f00b, 0x83cc1400,
+       0x0000000d, 0x4200b000, 0x00000002, 0x83341c00,
+       0x00000008, 0x0401f8f5, 0x04000007, 0x42000000,
+       0x0010b83d, 0x0201f800, 0x0010aa47, 0x82000540,
+       0x00000001, 0x5c00b000, 0x1c01f000, 0x4933c857,
+       0x59cc0206, 0x82000580, 0x00000014, 0x04020016,
+       0x59cc0407, 0x82000580, 0x00000800, 0x04020012,
+       0x59cc0207, 0x8c00051a, 0x0400000d, 0x82000500,
+       0x00000f00, 0x82000580, 0x00000100, 0x04020008,
+       0x59cc020a, 0x8c000508, 0x04020003, 0x8c00050a,
+       0x04000003, 0x80000580, 0x1c01f000, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4933c857, 0x4943c857,
+       0x493fc857, 0x4c5c0000, 0x4d300000, 0x4d340000,
+       0x4d2c0000, 0x4d380000, 0x4130b800, 0x42026000,
+       0x0010d1c0, 0x59a8000e, 0x81640480, 0x040210bd,
+       0x8d3e7d12, 0x04000004, 0x405c0000, 0x81300580,
+       0x040000b3, 0x59300406, 0x82000c80, 0x00000012,
+       0x04021015, 0x59326809, 0x0c01f001, 0x0010854f,
+       0x001084bc, 0x001084d3, 0x001084de, 0x001084b7,
+       0x001084ce, 0x00108507, 0x0010854f, 0x001084b5,
+       0x0010851b, 0x0010852a, 0x001084b5, 0x001084b5,
+       0x001084b5, 0x001084b5, 0x0010854f, 0x00108540,
+       0x00108538, 0x0201f800, 0x001005d8, 0x8d3e7d18,
+       0x04000004, 0x59300420, 0x8c000500, 0x04020094,
+       0x59300403, 0x82000580, 0x00000043, 0x04000090,
+       0x0201f800, 0x00109134, 0x02000800, 0x00102074,
+       0x0201f800, 0x0010914e, 0x02000800, 0x0010801c,
+       0x8d3e7d06, 0x04000084, 0x0201f800, 0x001092d7,
+       0x04000083, 0x0401f080, 0x8d3e7d16, 0x04000004,
+       0x59300420, 0x8c000500, 0x0402007d, 0x59325808,
+       0x0201f800, 0x00109037, 0x04000077, 0x49425a06,
+       0x497a5c09, 0x0201f800, 0x000202da, 0x0201f800,
+       0x0010912a, 0x0401f070, 0x813669c0, 0x02000800,
+       0x001005d8, 0x8d3e7d06, 0x04000004, 0x59340200,
+       0x8c00050e, 0x0402006a, 0x59300004, 0x8400055c,
+       0x48026004, 0x59300203, 0x82000580, 0x00000004,
+       0x02000800, 0x00100e99, 0x59325808, 0x0201f800,
+       0x00109037, 0x0400005c, 0x4a025a04, 0x00000103,
+       0x59300402, 0x48025c06, 0x592c0408, 0x8c000512,
+       0x04000006, 0x4d2c0000, 0x592e5809, 0x0201f800,
+       0x001007fd, 0x5c025800, 0x49425a06, 0x497a5c09,
+       0x0201f800, 0x0010959c, 0x0201f800, 0x000202da,
+       0x0201f800, 0x0010912a, 0x0401f047, 0x8c000518,
+       0x04000047, 0x59300203, 0x82000580, 0x00000004,
+       0x02000800, 0x00100e99, 0x59325808, 0x0201f800,
+       0x00109037, 0x0400003c, 0x49425a06, 0x497a5c09,
+       0x0201f800, 0x0010a693, 0x0201f800, 0x0010959c,
+       0x0201f800, 0x000202da, 0x0401f033, 0x0201f800,
+       0x001062d5, 0x04000032, 0x59300203, 0x82000580,
+       0x00000004, 0x04020004, 0x0201f800, 0x00100e99,
+       0x0401f02b, 0x42027000, 0x00000047, 0x0201f800,
+       0x000207a1, 0x0401f026, 0x59300203, 0x82000580,
+       0x00000004, 0x02000800, 0x00100e99, 0x59325808,
+       0x0201f800, 0x00109037, 0x0400001b, 0x49425a06,
+       0x497a5c09, 0x0201f800, 0x000202da, 0x0401f016,
+       0x833c0500, 0x00001800, 0x04000015, 0x8d3e7d16,
+       0x04020013, 0x59325817, 0x0201f800, 0x001007fd,
+       0x59300203, 0x82000580, 0x00000004, 0x02000800,
+       0x00100e99, 0x59325808, 0x0201f800, 0x00109037,
+       0x04000005, 0x49425a06, 0x497a5c09, 0x0201f800,
+       0x000202da, 0x0201f800, 0x00107911, 0x83326400,
+       0x00000024, 0x41580000, 0x81300480, 0x04001742,
+       0x5c027000, 0x5c025800, 0x5c026800, 0x5c026000,
+       0x5c00b800, 0x1c01f000, 0x5c000000, 0x4c000000,
+       0x4803c857, 0x480bc857, 0x480fc857, 0x485bc857,
+       0x50080800, 0x500c0000, 0x80042580, 0x04020007,
+       0x80081000, 0x800c1800, 0x8058b040, 0x040207f9,
+       0x80000580, 0x1c01f000, 0x4803c857, 0x4807c857,
+       0x480bc857, 0x480fc857, 0x80040480, 0x04001006,
+       0x42000000, 0x00000001, 0x82040d40, 0x00000001,
+       0x1c01f000, 0x41780000, 0x0401f7fc, 0x83380480,
+       0x00000053, 0x02021800, 0x001005d8, 0x83380480,
+       0x0000004b, 0x02001800, 0x001005d8, 0x0c01f001,
+       0x0010858a, 0x0010858a, 0x0010858a, 0x0010858a,
+       0x00108588, 0x00108588, 0x00108588, 0x0010858a,
+       0x0201f800, 0x001005d8, 0x493bc857, 0x4a026203,
+       0x0000000d, 0x493a6403, 0x42000800, 0x80000000,
+       0x0201f000, 0x00020721, 0x83380580, 0x00000013,
+       0x04020008, 0x59300403, 0x82000580, 0x00000050,
+       0x02020800, 0x001005d8, 0x0201f000, 0x0002077d,
+       0x4933c857, 0x83380580, 0x00000027, 0x04020030,
+       0x4933c857, 0x0201f800, 0x00106bbf, 0x4d3c0000,
+       0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037,
+       0x492fc857, 0x0400000d, 0x4a025a04, 0x00000103,
+       0x59300c02, 0x48065c06, 0x4a025a06, 0x00000029,
+       0x497a5c09, 0x592c0c08, 0x84040d50, 0x48065c08,
+       0x0201f800, 0x000202da, 0x5c025800, 0x42003000,
+       0x00000015, 0x41782800, 0x42002000, 0x00000003,
+       0x4d400000, 0x4d440000, 0x59368c03, 0x42028000,
+       0x00000029, 0x0201f800, 0x0010985e, 0x5c028800,
+       0x5c028000, 0x0201f000, 0x0002077d, 0x83380580,
+       0x00000014, 0x0402000c, 0x59300403, 0x82000c80,
+       0x00000053, 0x02021800, 0x001005d8, 0x82000480,
+       0x00000040, 0x02001800, 0x001005d8, 0x4803c857,
+       0x0c01f00e, 0x83380580, 0x00000053, 0x0400000a,
+       0x83380580, 0x00000048, 0x02020800, 0x001005d8,
+       0x59300403, 0x82000580, 0x00000050, 0x02020800,
+       0x001005d8, 0x1c01f000, 0x001085ff, 0x001085fd,
+       0x001085fd, 0x001085fd, 0x001085fd, 0x001085fd,
+       0x001085fd, 0x001085fd, 0x001085fd, 0x001085fd,
+       0x001085fd, 0x00108616, 0x00108616, 0x00108616,
+       0x00108616, 0x001085fd, 0x00108616, 0x001085fd,
+       0x00108616, 0x0201f800, 0x001005d8, 0x4933c857,
+       0x0201f800, 0x00106bbf, 0x0201f800, 0x00109037,
+       0x02000000, 0x0002077d, 0x4d2c0000, 0x59325808,
+       0x4a025a04, 0x00000103, 0x59300402, 0x48025c06,
+       0x4a025a06, 0x00000006, 0x497a5c09, 0x0201f800,
+       0x000202da, 0x5c025800, 0x0201f800, 0x0010912a,
+       0x0201f000, 0x0002077d, 0x4933c857, 0x0201f800,
+       0x00106bbf, 0x0201f000, 0x0002077d, 0x0201f800,
+       0x001005d8, 0x5930001c, 0x800001c0, 0x02020800,
+       0x0010984e, 0x59300004, 0x8c00053e, 0x04020029,
+       0x59325808, 0x592c0c08, 0x59cc2a08, 0x82141d00,
+       0x00000c00, 0x04000002, 0x59cc1809, 0x84040d58,
+       0x48065c08, 0x82143500, 0x00000fff, 0x04020027,
+       0x59340200, 0x8c00050e, 0x04020080, 0x0201f800,
+       0x0002082b, 0x04020006, 0x4a025a06, 0x00000000,
+       0x59300811, 0x800409c0, 0x0402094b, 0x4a025a04,
+       0x00000103, 0x48065807, 0x480e580a, 0x48165c09,
+       0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1,
+       0x0201f800, 0x001049b2, 0x59cc0208, 0x8c000518,
+       0x02020000, 0x001091d1, 0x0201f000, 0x0002077d,
+       0x0201f800, 0x00106f60, 0x040007d6, 0x4d3c0000,
+       0x42027800, 0x00000002, 0x0201f800, 0x00108be3,
+       0x5c027800, 0x0401f7cf, 0x4817c857, 0x480fc857,
+       0x82180500, 0x000000ff, 0x0400000e, 0x592c0204,
+       0x82000500, 0x000000ff, 0x82000580, 0x00000048,
+       0x04020008, 0x592c0407, 0x800001c0, 0x04000005,
+       0x0201f800, 0x0010973f, 0x0201f000, 0x00109787,
+       0x82180d00, 0x00000c00, 0x04000004, 0x59340200,
+       0x8c00050e, 0x04020032, 0x4a025a06, 0x00000000,
+       0x41782000, 0x8c183510, 0x04000007, 0x59cc000c,
+       0x82000500, 0x000000ff, 0x04000002, 0x4803c857,
+       0x59cc200b, 0x4812580c, 0x41780000, 0x8c183512,
+       0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00,
+       0x040007b8, 0x82041480, 0x0000001d, 0x04001006,
+       0x592c0404, 0x8c00051e, 0x0400000e, 0x42000800,
+       0x0000001c, 0x4c500000, 0x4c540000, 0x83cca400,
+       0x0000000c, 0x832cac00, 0x0000000d, 0x0201f800,
+       0x00108b9f, 0x5c00a800, 0x5c00a000, 0x0401f7a5,
+       0x59300011, 0x59301402, 0x480a5c06, 0x48025807,
+       0x480e580a, 0x48165c09, 0x0201f800, 0x00108b48,
+       0x0201f800, 0x00108b84, 0x0401f7a6, 0x592c020a,
+       0x8c000502, 0x040007cd, 0x592c0208, 0x8c00050e,
+       0x040207ca, 0x59300011, 0x800c0d80, 0x040007c7,
+       0x4803c857, 0x480fc857, 0x8c183514, 0x02000000,
+       0x0010920f, 0x80000540, 0x040007c0, 0x4807c856,
+       0x0201f000, 0x0010920f, 0x592c020a, 0x8c000502,
+       0x04000782, 0x59300011, 0x800001c0, 0x0400077f,
+       0x592c0208, 0x8c00050e, 0x0402077c, 0x0201f000,
+       0x0010920f, 0x59cc2006, 0x59cc2807, 0x0401f035,
+       0x0401f034, 0x1c01f000, 0x4933c857, 0x5930001c,
+       0x800001c0, 0x02020800, 0x0010984e, 0x59325808,
+       0x592c0c08, 0x41782800, 0x41781800, 0x84040d58,
+       0x48065c08, 0x41783000, 0x59340200, 0x8c00050e,
+       0x04020018, 0x0201f800, 0x0002082b, 0x04020007,
+       0x4a025a06, 0x00000000, 0x59300811, 0x4807c857,
+       0x800409c0, 0x040208ac, 0x4a025a04, 0x00000103,
+       0x48065807, 0x480e580a, 0x48165c09, 0x4933c857,
+       0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1,
+       0x0201f800, 0x001049b2, 0x0201f000, 0x0002077d,
+       0x592c020a, 0x8c000502, 0x040007ea, 0x59300011,
+       0x4803c857, 0x800001c0, 0x040007e6, 0x592c0208,
+       0x8c00050e, 0x040207e3, 0x0201f000, 0x0010920f,
+       0x5930001c, 0x800001c0, 0x4c100000, 0x4c140000,
+       0x02020800, 0x0010984e, 0x5c002800, 0x5c002000,
+       0x4a026203, 0x00000002, 0x4a026403, 0x00000043,
+       0x59325808, 0x592c020a, 0x8c000502, 0x04020018,
+       0x40100000, 0x592c080f, 0x80040c80, 0x40140000,
+       0x80040480, 0x04001014, 0x48126013, 0x48166011,
+       0x59300004, 0x8c00053e, 0x04020008, 0x497a6205,
+       0x0201f800, 0x00100f93, 0x04020009, 0x59300804,
+       0x0201f000, 0x00106721, 0x0201f800, 0x00106f60,
+       0x040007f7, 0x0201f000, 0x00107974, 0x4933c857,
+       0x1c01f000, 0x4807c857, 0x40042800, 0x0401f7eb,
+       0x83380480, 0x00000058, 0x04021005, 0x83380480,
+       0x00000040, 0x04001002, 0x0c01f002, 0x1c01f000,
+       0x00108740, 0x00108740, 0x00108740, 0x00108740,
+       0x00108740, 0x00108740, 0x00108740, 0x00108740,
+       0x00108740, 0x00108740, 0x00108742, 0x00108740,
+       0x00108740, 0x00108740, 0x00108740, 0x0010874f,
+       0x00108740, 0x00108740, 0x00108740, 0x00108740,
+       0x0010877d, 0x00108740, 0x00108740, 0x00108740,
+       0x0201f800, 0x001005d8, 0x4933c857, 0x0201f800,
+       0x00106dc3, 0x4a026203, 0x00000002, 0x59a80039,
+       0x48026205, 0x59300011, 0x59300815, 0x80040c80,
+       0x48066015, 0x0201f000, 0x00106b8a, 0x4933c857,
+       0x0201f800, 0x00106b8a, 0x4d3c0000, 0x417a7800,
+       0x0201f800, 0x0010203c, 0x5c027800, 0x42000000,
+       0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800,
+       0x00109037, 0x04000010, 0x4d2c0000, 0x59325808,
+       0x4a025a04, 0x00000103, 0x59300402, 0x48025c06,
+       0x4a025a06, 0x00000029, 0x497a5c09, 0x592c0c08,
+       0x84040d50, 0x48065c08, 0x0201f800, 0x000202da,
+       0x5c025800, 0x42003000, 0x00000014, 0x41782800,
+       0x4d400000, 0x4d440000, 0x59368c03, 0x42002000,
+       0x00000002, 0x42028000, 0x00000029, 0x0201f800,
+       0x0010985e, 0x5c028800, 0x5c028000, 0x0201f000,
+       0x0002077d, 0x4933c857, 0x59300808, 0x49780c09,
+       0x4978080a, 0x58041408, 0x84081558, 0x48080c08,
+       0x1c01f000, 0x4807c857, 0x8c040d3e, 0x04020023,
+       0x497a5a06, 0x5930001f, 0x80000540, 0x04000017,
+       0x497a5a06, 0x4c040000, 0x4c080000, 0x4c0c0000,
+       0x4c100000, 0x4c140000, 0x58f41003, 0x40040000,
+       0x80081480, 0x5930001f, 0x4809e803, 0x0201f800,
+       0x00100d56, 0x5c002800, 0x5c002000, 0x5c001800,
+       0x5c001000, 0x5c000800, 0x592c0206, 0x80000540,
+       0x04020009, 0x0401f005, 0x592c0408, 0x8c00051c,
+       0x04000002, 0x592c0803, 0x4807c857, 0x4a025a06,
+       0x00000015, 0x1c01f000, 0x5930001f, 0x80000540,
+       0x04000009, 0x4a025a06, 0x00000011, 0x5930001f,
+       0x4c040000, 0x0201f800, 0x00100d56, 0x5c000800,
+       0x0401f7f5, 0x4807c856, 0x4a025a06, 0x00000007,
+       0x1c01f000, 0x83380480, 0x00000058, 0x04021007,
+       0x83380480, 0x00000040, 0x04001004, 0x4d2c0000,
+       0x0c01f803, 0x5c025800, 0x1c01f000, 0x001087db,
+       0x001087db, 0x001087db, 0x001087db, 0x001087db,
+       0x001087dd, 0x001087db, 0x001087db, 0x00108860,
+       0x001087db, 0x001087db, 0x001087db, 0x001087db,
+       0x001087db, 0x001087db, 0x001087db, 0x001087db,
+       0x001087db, 0x001087db, 0x00108910, 0x00108939,
+       0x00108918, 0x001087db, 0x00108945, 0x0201f800,
+       0x001005d8, 0x5930001c, 0x800001c0, 0x02020800,
+       0x0010984e, 0x59300007, 0x8c00050e, 0x0400007c,
+       0x8c000500, 0x0400006e, 0x8c00051c, 0x04000009,
+       0x84000500, 0x48026007, 0x59325808, 0x592c3c08,
+       0x841c3d58, 0x481e5c08, 0x0201f000, 0x000207dd,
+       0x59325808, 0x592c3c08, 0x841c3d58, 0x59300007,
+       0x8c00051c, 0x040207f3, 0x481e5c08, 0x42000000,
+       0x00000005, 0x40000000, 0x80000040, 0x040207fe,
+       0x59300007, 0x8c00051c, 0x040207ea, 0x59cc0a08,
+       0x592c0204, 0x82000500, 0x000000ff, 0x82000580,
+       0x00000048, 0x0402000c, 0x497a580b, 0x82040500,
+       0x000000ff, 0x04000008, 0x592c0407, 0x800001c0,
+       0x04000005, 0x0201f800, 0x0010973f, 0x0201f000,
+       0x00100e56, 0x48065c09, 0x41782000, 0x82040500,
+       0x00000c00, 0x04000002, 0x59cc2009, 0x82043500,
+       0x00000fff, 0x04020027, 0x481e5c08, 0x4a025a06,
+       0x00000000, 0x801831c0, 0x02000000, 0x00100e56,
+       0x41782000, 0x8c183510, 0x04000002, 0x59cc200b,
+       0x4812580c, 0x41780000, 0x8c183512, 0x04000002,
+       0x59cc000a, 0x4802580b, 0x80100c00, 0x02001800,
+       0x001005d8, 0x02000000, 0x00100e56, 0x82041480,
+       0x0000001d, 0x0402100c, 0x4c500000, 0x4c540000,
+       0x83cca400, 0x0000000c, 0x832cac00, 0x0000000d,
+       0x0401fb67, 0x5c00a800, 0x5c00a000, 0x0201f000,
+       0x00100e56, 0x0401fb0b, 0x0201f000, 0x00100e56,
+       0x412c7800, 0x0201f800, 0x001007e4, 0x02000800,
+       0x001005d8, 0x492c7809, 0x841c3d52, 0x481c7c08,
+       0x4a025a04, 0x00000103, 0x4812580a, 0x48065c09,
+       0x583c0404, 0x583c1005, 0x583c2208, 0x48025c04,
+       0x480a5805, 0x48125a08, 0x0401f7c8, 0x8c000524,
+       0x04000794, 0x59325808, 0x4c000000, 0x592c0408,
+       0x8c00051c, 0x5c000000, 0x04020003, 0x4a026011,
+       0xffffffff, 0x84000524, 0x0401f78a, 0x1c01f000,
+       0x59a80039, 0x48026205, 0x59325808, 0x4a026203,
+       0x00000002, 0x592c2408, 0x59300807, 0x4933c857,
+       0x4807c857, 0x592c0204, 0x82000500, 0x000000ff,
+       0x82000580, 0x00000048, 0x04020004, 0x8c102500,
+       0x02020000, 0x00109787, 0x4a025a06, 0x00000000,
+       0x8c040d1e, 0x04000027, 0x41780800, 0x497a5c09,
+       0x592c1c09, 0x59300011, 0x59341200, 0x497a6205,
+       0x8c08150e, 0x0402006e, 0x4807c857, 0x4806580a,
+       0x80000d40, 0x04020f04, 0x59300402, 0x48025c06,
+       0x48065807, 0x4a025a04, 0x00000103, 0x4c040000,
+       0x4c0c0000, 0x4c100000, 0x0201f800, 0x0010959c,
+       0x5c002000, 0x5c001800, 0x5c000800, 0x8c102512,
+       0x0402001a, 0x4c0c0000, 0x0201f800, 0x000202c1,
+       0x0201f800, 0x001049b2, 0x5c001800, 0x8c0c1d18,
+       0x02000000, 0x0002077d, 0x0201f000, 0x001091d1,
+       0x4813c857, 0x8c102518, 0x0400004b, 0x41780800,
+       0x592c1c09, 0x820c0580, 0x00001000, 0x040007d6,
+       0x8c102512, 0x040007d4, 0x592c7809, 0x583c080a,
+       0x583c1c09, 0x0401f7d0, 0x4807c857, 0x592c7809,
+       0x59300402, 0x592c1404, 0x8c08151e, 0x0402000d,
+       0x592c1206, 0x48007c06, 0x48047807, 0x48087a06,
+       0x84102512, 0x48107c08, 0x4c0c0000, 0x0201f800,
+       0x001007fd, 0x403e5800, 0x0401faca, 0x0401f7d9,
+       0x48025c06, 0x48065807, 0x583c080c, 0x583c000b,
+       0x80040c00, 0x82041480, 0x0000001d, 0x04001006,
+       0x583c1001, 0x480a5801, 0x49787801, 0x42000800,
+       0x0000001c, 0x82040c00, 0x00000014, 0x4c0c0000,
+       0x4c500000, 0x4c540000, 0x823ca400, 0x00000008,
+       0x832cac00, 0x00000008, 0x4c100000, 0x4c3c0000,
+       0x0401facb, 0x5c007800, 0x5c002000, 0x5c00a800,
+       0x5c00a000, 0x84102512, 0x48125c08, 0x403e5800,
+       0x0201f800, 0x001007fd, 0x42034000, 0x0010b4a4,
+       0x59a1d81e, 0x80edd9c0, 0x02000800, 0x001005d8,
+       0x48efc857, 0x58ec0009, 0x4803c857, 0x0801f800,
+       0x0401f7ac, 0x4933c857, 0x1c01f000, 0x59301414,
+       0x480bc857, 0x8c08151c, 0x0402000e, 0x80000540,
+       0x4803c857, 0x0400078d, 0x80042c80, 0x0402178b,
+       0x8c081514, 0x04020005, 0x592c080f, 0x4807c857,
+       0x80040480, 0x48026016, 0x8408155c, 0x480a6414,
+       0x59301007, 0x8408151e, 0x480a6007, 0x4a025c09,
+       0x00000001, 0x0201f800, 0x0010959c, 0x497a5c09,
+       0x8c102512, 0x04000006, 0x4d2c0000, 0x403e5800,
+       0x0201f800, 0x001007fd, 0x5c025800, 0x82102500,
+       0xffffedff, 0x48125c08, 0x0201f000, 0x0010920f,
+       0x59325808, 0x592c0408, 0x8c000518, 0x04000004,
+       0x412df800, 0x0201f000, 0x00100e6f, 0x1c01f000,
+       0x4933c857, 0x59325808, 0x497a5c09, 0x4a025a06,
+       0x00000000, 0x4a025a04, 0x00000103, 0x59300811,
+       0x4807c857, 0x800409c0, 0x0402000a, 0x48065807,
+       0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1,
+       0x0201f800, 0x001049b2, 0x0201f000, 0x0002077d,
+       0x59340200, 0x8c00050e, 0x04020005, 0x59300811,
+       0x0401fe55, 0x48065807, 0x0401f7f2, 0x592c0208,
+       0x8c00050e, 0x040207fa, 0x4933c857, 0x0201f000,
+       0x0010920f, 0x4933c857, 0x59325808, 0x812e59c0,
+       0x02000800, 0x001005d8, 0x592c020a, 0x8c000502,
+       0x02000800, 0x001005d8, 0x4a026206, 0x00000002,
+       0x1c01f000, 0x5930001c, 0x800001c0, 0x02020800,
+       0x0010984e, 0x59300007, 0x4933c857, 0x4803c857,
+       0x8c00050e, 0x04000037, 0x8c000500, 0x04000029,
+       0x8c00051c, 0x0400000a, 0x84000500, 0x48026007,
+       0x59325808, 0x592c3c08, 0x481fc857, 0x841c3d58,
+       0x481e5c08, 0x0201f000, 0x000207dd, 0x59325808,
+       0x592c3c08, 0x841c3d58, 0x59300007, 0x8c00051c,
+       0x040207f2, 0x481e5c08, 0x42000000, 0x00000005,
+       0x40000000, 0x80000040, 0x040207fe, 0x59300007,
+       0x8c00051c, 0x040207e9, 0x592c0204, 0x82000500,
+       0x000000ff, 0x82000580, 0x00000048, 0x04020003,
+       0x497a580b, 0x0401f002, 0x497a5c09, 0x481e5c08,
+       0x4a025a06, 0x00000000, 0x0201f000, 0x00100e56,
+       0x8c000524, 0x040007d9, 0x59325808, 0x4c000000,
+       0x592c0408, 0x8c00051c, 0x5c000000, 0x04020003,
+       0x4a026011, 0xffffffff, 0x84000524, 0x0401f7cf,
+       0x1c01f000, 0x4933c857, 0x41780800, 0x83380480,
+       0x00000058, 0x0402100b, 0x83380480, 0x00000040,
+       0x04001008, 0x4d2c0000, 0x59325808, 0x812e59c0,
+       0x0c020806, 0x5c025800, 0x0201f000, 0x0002077d,
+       0x493bc857, 0x1c01f000, 0x001089ae, 0x001089ae,
+       0x001089ae, 0x001089ae, 0x001089ae, 0x001089b0,
+       0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae,
+       0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae,
+       0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae,
+       0x001089ae, 0x001089ae, 0x001089b5, 0x001089ae,
+       0x001089ae, 0x001089ae, 0x0201f800, 0x001005d8,
+       0x59cc0a08, 0x497a5807, 0x4807c857, 0x82040d00,
+       0x00000fff, 0x59300402, 0x48025c06, 0x4a025a04,
+       0x00000103, 0x48065c09, 0x4a025a06, 0x00000000,
+       0x800409c0, 0x02000000, 0x000202c1, 0x59cc0009,
+       0x4802580a, 0x82042500, 0x00000100, 0x04000002,
+       0x59cc200b, 0x4812580c, 0x82040500, 0x00000200,
+       0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00,
+       0x02001800, 0x001005d8, 0x02000000, 0x000202da,
+       0x82041480, 0x0000001d, 0x04001006, 0x592c0404,
+       0x8c00051e, 0x0400000e, 0x42000800, 0x0000001c,
+       0x4c500000, 0x4c540000, 0x83cca400, 0x0000000c,
+       0x832cac00, 0x0000000d, 0x0401f9c1, 0x5c00a800,
+       0x5c00a000, 0x0201f000, 0x000202da, 0x0401f965,
+       0x0401f1a0, 0x83380480, 0x00000093, 0x02021800,
+       0x001005d8, 0x83380480, 0x00000085, 0x02001800,
+       0x001005d8, 0x0c01f001, 0x001089fd, 0x001089fb,
+       0x001089fb, 0x00108a04, 0x001089fb, 0x001089fb,
+       0x001089fb, 0x001089fb, 0x001089fb, 0x001089fb,
+       0x001089fb, 0x001089fb, 0x001089fb, 0x0201f800,
+       0x001005d8, 0x4a026203, 0x00000001, 0x493a6403,
+       0x42000800, 0x80000040, 0x0201f000, 0x00020721,
+       0x4933c857, 0x59cc1204, 0x480a601c, 0x59cc1404,
+       0x0201f800, 0x00109410, 0x0400001b, 0x591c0203,
+       0x82000580, 0x00000000, 0x04000017, 0x591c0009,
+       0x81340580, 0x04020014, 0x4d300000, 0x4d1c0000,
+       0x411e6000, 0x0401f9c2, 0x5c023800, 0x5c026000,
+       0x0400000b, 0x59cc0005, 0x8c000500, 0x04020003,
+       0x0401f98c, 0x0401f003, 0x4a023a03, 0x00000002,
+       0x4a026403, 0x00000086, 0x0401f005, 0x0401f9a6,
+       0x040007f5, 0x4a026403, 0x00000087, 0x4a026203,
+       0x00000001, 0x42000800, 0x80000040, 0x0201f800,
+       0x00020721, 0x59340200, 0x8c00050e, 0x0400000d,
+       0x59cc1404, 0x0201f800, 0x00109410, 0x04000009,
+       0x591c0414, 0x8c00051a, 0x04000006, 0x4d300000,
+       0x411e6000, 0x0201f800, 0x0010921e, 0x5c026000,
+       0x1c01f000, 0x83380580, 0x00000013, 0x0402000a,
+       0x59300403, 0x82000d80, 0x00000086, 0x04000012,
+       0x82000d80, 0x00000087, 0x02020800, 0x001005d8,
+       0x0401f00d, 0x83380580, 0x00000027, 0x04000005,
+       0x83380580, 0x00000014, 0x02020800, 0x001005d8,
+       0x493bc857, 0x0201f800, 0x00106bbf, 0x0201f000,
+       0x00107911, 0x4933c857, 0x0201f000, 0x00107911,
+       0x83380580, 0x00000013, 0x04020005, 0x59300403,
+       0x82000480, 0x00000085, 0x0c01f04d, 0x83380580,
+       0x00000027, 0x04020041, 0x4933c857, 0x0201f800,
+       0x00106bbf, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42003000, 0x00000015,
+       0x41782800, 0x42002000, 0x00000003, 0x42028000,
+       0x00000029, 0x4d400000, 0x4d440000, 0x59368c03,
+       0x0201f800, 0x0010985e, 0x5c028800, 0x5c028000,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00109037, 0x0400000c, 0x4d2c0000,
+       0x59325808, 0x4a025a04, 0x00000103, 0x59300402,
+       0x48025c06, 0x497a5c09, 0x49425a06, 0x0201f800,
+       0x000202da, 0x5c025800, 0x0201f800, 0x0010912a,
+       0x0201f000, 0x0002077d, 0x83380580, 0x00000089,
+       0x04000005, 0x83380580, 0x0000008a, 0x02020000,
+       0x00107974, 0x0201f800, 0x00106f60, 0x02020000,
+       0x00107974, 0x59300a03, 0x82040580, 0x0000000a,
+       0x0400002a, 0x82040580, 0x0000000c, 0x04000027,
+       0x0201f800, 0x001005d8, 0x83380580, 0x00000014,
+       0x040207ea, 0x4933c857, 0x0201f800, 0x00106bbf,
+       0x42028000, 0x00000006, 0x0401f7d2, 0x00108aba,
+       0x00108ab8, 0x00108ab8, 0x00108ab8, 0x00108ab8,
+       0x00108ab8, 0x00108ac0, 0x00108ab8, 0x00108ab8,
+       0x00108ab8, 0x00108ab8, 0x00108ab8, 0x00108ab8,
+       0x0201f800, 0x001005d8, 0x4933c857, 0x59a80037,
+       0x48026206, 0x4a026203, 0x0000000a, 0x1c01f000,
+       0x4933c857, 0x59a80037, 0x48026206, 0x4a026203,
+       0x0000000c, 0x1c01f000, 0x83380580, 0x00000089,
+       0x04000008, 0x83380580, 0x0000008a, 0x04000032,
+       0x4933c857, 0x493bc857, 0x0201f000, 0x00107974,
+       0x4933c857, 0x59325808, 0x59300a1d, 0x82040580,
+       0x00000003, 0x04020004, 0x0201f800, 0x001049b2,
+       0x0401f00c, 0x5930021d, 0x82000580, 0x00000001,
+       0x04020008, 0x59300c16, 0x82040580, 0x00000039,
+       0x0400002c, 0x82040580, 0x00000035, 0x04000029,
+       0x4c340000, 0x41306800, 0x0201f800, 0x0002075a,
+       0x04000010, 0x4a026203, 0x00000001, 0x4a026403,
+       0x0000001e, 0x59cc0c07, 0x48066419, 0x59cc0a07,
+       0x48066219, 0x49366009, 0x4a026406, 0x00000001,
+       0x42000800, 0x80000040, 0x0201f800, 0x00020721,
+       0x40366000, 0x0201f800, 0x0002077d, 0x5c006800,
+       0x1c01f000, 0x4933c857, 0x5930021d, 0x82000580,
+       0x00000001, 0x04020040, 0x59300c16, 0x82040580,
+       0x00000035, 0x04000007, 0x82040580, 0x0000001e,
+       0x04000004, 0x82040580, 0x00000039, 0x04020036,
+       0x4933c857, 0x4c500000, 0x4d1c0000, 0x4130a000,
+       0x40067000, 0x0201f800, 0x001093ba, 0x04020029,
+       0x0201f800, 0x0002075a, 0x04000026, 0x491fc857,
+       0x4933c857, 0x83380580, 0x00000035, 0x04000004,
+       0x83380580, 0x00000039, 0x04020002, 0x4932381c,
+       0x493a6403, 0x4a026203, 0x00000001, 0x4a026406,
+       0x00000001, 0x58500809, 0x4807c857, 0x48066009,
+       0x58500c15, 0x4807c857, 0x48066415, 0x58500a15,
+       0x4807c857, 0x48066215, 0x58500a16, 0x4807c857,
+       0x48066216, 0x58500c19, 0x4807c857, 0x48066419,
+       0x58500a19, 0x4807c857, 0x48066219, 0x491e601e,
+       0x42000800, 0x80000040, 0x0201f800, 0x00020721,
+       0x40526000, 0x5c023800, 0x5c00a000, 0x0201f000,
+       0x0002077d, 0x5930021d, 0x82000580, 0x00000003,
+       0x02000800, 0x001049b2, 0x0201f000, 0x0002077d,
+       0x4803c856, 0x4c500000, 0x4c540000, 0x412c7800,
+       0x4c3c0000, 0x42002800, 0x00000001, 0x82040480,
+       0x00000101, 0x04001003, 0x42000800, 0x00000100,
+       0x40043000, 0x42000800, 0x0000001c, 0x83cca400,
+       0x0000000c, 0x832cac00, 0x0000000d, 0x0401f844,
+       0x82183480, 0x0000001c, 0x592e5801, 0x812e59c0,
+       0x02020800, 0x001007fd, 0x0201f800, 0x001007e4,
+       0x04000017, 0x80142800, 0x4a025a04, 0x00000110,
+       0x497a5c04, 0x492c7801, 0x82180c80, 0x0000003d,
+       0x04021006, 0x40180800, 0x832cac00, 0x00000005,
+       0x0401f82f, 0x0401f00a, 0x82183480, 0x0000003c,
+       0x42000800, 0x0000003c, 0x412c7800, 0x832cac00,
+       0x00000005, 0x0401f826, 0x0401f7e8, 0x5c007800,
+       0x841429c0, 0x82142d40, 0x00000003, 0x48147a04,
+       0x403e5800, 0x5c00a800, 0x5c00a000, 0x1c01f000,
+       0x492fc857, 0x812e59c0, 0x0400000f, 0x4d2c0000,
+       0x4c3c0000, 0x592c7801, 0x803c79c0, 0x04000006,
+       0x497a5801, 0x0201f800, 0x000202da, 0x403e5800,
+       0x0401f7f9, 0x5c007800, 0x0201f800, 0x000202da,
+       0x5c025800, 0x1c01f000, 0x4803c856, 0x4c580000,
+       0x82040c00, 0x00000003, 0x8004b104, 0x0201f800,
+       0x0010ab17, 0x5c00b000, 0x1c01f000, 0x4803c856,
+       0x4c580000, 0x82040c00, 0x00000003, 0x8004b104,
+       0x0201f800, 0x0010ab17, 0x5c00b000, 0x1c01f000,
+       0x591c0c06, 0x82040580, 0x00000003, 0x04000004,
+       0x82040580, 0x00000002, 0x0402001a, 0x4d300000,
+       0x4d2c0000, 0x411e6000, 0x59325808, 0x0201f800,
+       0x00109037, 0x0400000f, 0x4d400000, 0x42028000,
+       0x00000013, 0x592c0a08, 0x84040d54, 0x0201f800,
+       0x00104e70, 0x5c028000, 0x0201f800, 0x0010959c,
+       0x0201f800, 0x000202da, 0x0201f800, 0x0010912a,
+       0x0201f800, 0x00107911, 0x5c025800, 0x5c026000,
+       0x1c01f000, 0x59cc0005, 0x8c000500, 0x0402000b,
+       0x591c0406, 0x82000580, 0x00000002, 0x04020007,
+       0x591c0c03, 0x82040580, 0x00000085, 0x04000003,
+       0x82040580, 0x0000008b, 0x1c01f000, 0x4933c857,
+       0x4d3c0000, 0x42027800, 0x00000002, 0x59300406,
+       0x82000c80, 0x00000012, 0x02021800, 0x001005d8,
+       0x0c01f80a, 0x5c027800, 0x1c01f000, 0x4933c857,
+       0x59300406, 0x82000c80, 0x00000012, 0x02021800,
+       0x001005d8, 0x0c01f001, 0x00108c01, 0x00108bfe,
+       0x00108bfe, 0x00108c29, 0x00108bfc, 0x00108bfe,
+       0x00108c1a, 0x00108bfe, 0x00108bfc, 0x001065f4,
+       0x00108bfe, 0x00108bfe, 0x00108bfe, 0x00108bfc,
+       0x00108bfc, 0x00108bfc, 0x00108cf9, 0x00108bfe,
+       0x0201f800, 0x001005d8, 0x4803c856, 0x80000580,
+       0x1c01f000, 0x4803c856, 0x8d3e7d02, 0x04020016,
+       0x0201f800, 0x00109037, 0x0400000f, 0x59325808,
+       0x41780800, 0x4d400000, 0x42028000, 0x00000005,
+       0x0201f800, 0x00104e70, 0x5c028000, 0x0201f800,
+       0x0010959c, 0x0201f800, 0x001091cc, 0x0201f800,
+       0x000202da, 0x0201f800, 0x00107911, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4933c857, 0x0201f800,
+       0x001048d9, 0x0402000c, 0x4d400000, 0x42028000,
+       0x00000010, 0x0201f800, 0x0010a1d1, 0x4a026406,
+       0x00000006, 0x4a026203, 0x00000007, 0x5c028000,
+       0x1c01f000, 0x4933c857, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x0401f8b8, 0x82000c80, 0x0000000e,
+       0x02021800, 0x001005d8, 0x0c01f001, 0x00108c43,
+       0x00108cb0, 0x00108c5a, 0x00108cc3, 0x00108cab,
+       0x00108c41, 0x00108c43, 0x00108c43, 0x00108c47,
+       0x00108c43, 0x00108c43, 0x00108c43, 0x00108c43,
+       0x00108c5a, 0x0201f800, 0x001005d8, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x0401f7b8, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x59300406, 0x82000580,
+       0x00000003, 0x040207b4, 0x59300203, 0x82000580,
+       0x0000000d, 0x040007b0, 0x8d3e7d02, 0x040207ae,
+       0x4d340000, 0x59326809, 0x0201f800, 0x001049b2,
+       0x5c026800, 0x0401f7a8, 0x59300004, 0x8400055c,
+       0x48026004, 0x0201f800, 0x00106c4b, 0x59300406,
+       0x82000580, 0x00000006, 0x04000043, 0x8d3e7d02,
+       0x04020041, 0x497a621d, 0x59300203, 0x82000580,
+       0x0000000d, 0x04000003, 0x4a02621d, 0x00000003,
+       0x0401fbcb, 0x04000024, 0x4d2c0000, 0x4d400000,
+       0x59325808, 0x0201f800, 0x001091cc, 0x592c0408,
+       0x8c000512, 0x04000009, 0x4d2c0000, 0x84000512,
+       0x48025c08, 0x592c0809, 0x40065800, 0x0201f800,
+       0x001007fd, 0x5c025800, 0x4d400000, 0x42028000,
+       0x00000005, 0x592c0a08, 0x8c040d0e, 0x04000004,
+       0x42028000, 0x00000002, 0x0401f001, 0x0201f800,
+       0x00104e70, 0x5c028000, 0x0201f800, 0x0010959c,
+       0x0201f800, 0x000202da, 0x497a6008, 0x5c028000,
+       0x5c025800, 0x8d3e7d00, 0x04000009, 0x4d340000,
+       0x59326809, 0x0201f800, 0x001049b2, 0x5c026800,
+       0x0201f800, 0x00107911, 0x0401f00b, 0x4a026403,
+       0x00000085, 0x4a026203, 0x00000009, 0x4a026406,
+       0x00000002, 0x42000800, 0x8000404b, 0x0201f800,
+       0x00020721, 0x5c03e000, 0x02020800, 0x00106c55,
+       0x82000540, 0x00000001, 0x1c01f000, 0x0201f800,
+       0x00106c4b, 0x0201f800, 0x00100e99, 0x0401f7ab,
+       0x598c000d, 0x81300580, 0x04020004, 0x0201f800,
+       0x00106e8e, 0x0402001b, 0x0201f800, 0x001068d3,
+       0x04020006, 0x59300c03, 0x82040580, 0x00000040,
+       0x0400078b, 0x0401f79d, 0x0201f800, 0x00106b6c,
+       0x04000010, 0x0201f800, 0x001005d8, 0x0401f813,
+       0x04020004, 0x0201f800, 0x00106e62, 0x04020009,
+       0x0201f800, 0x001067ae, 0x040207f4, 0x59300c03,
+       0x82040580, 0x00000040, 0x04000779, 0x0401f78b,
+       0x59300203, 0x82000c80, 0x0000000e, 0x02021800,
+       0x001005d8, 0x0c01f75e, 0x417a3000, 0x42032000,
+       0x0000bf32, 0x59900004, 0x81300580, 0x04000009,
+       0x83932400, 0x00000010, 0x811a3000, 0x83180480,
+       0x00000005, 0x040017f8, 0x82000540, 0x00000001,
+       0x1c01f000, 0x59300004, 0x8c00053e, 0x04000010,
+       0x8c00050c, 0x0402000e, 0x8c000516, 0x04020006,
+       0x82000d00, 0x0000001f, 0x82040580, 0x00000005,
+       0x04020004, 0x42000000, 0x00000003, 0x0401f005,
+       0x42000000, 0x00000001, 0x0401f002, 0x59300203,
+       0x1c01f000, 0x4933c857, 0x0201f800, 0x00106c55,
+       0x4df00000, 0x59300203, 0x82000c80, 0x0000000e,
+       0x02021800, 0x001005d8, 0x0c01f001, 0x00108d13,
+       0x00108d30, 0x00108d17, 0x00108d11, 0x00108d11,
+       0x00108d11, 0x00108d11, 0x00108d11, 0x00108d11,
+       0x00108d11, 0x00108d11, 0x00108d11, 0x00108d11,
+       0x00108d11, 0x0201f800, 0x001005d8, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x0401f6e8, 0x5c03e000,
+       0x02000800, 0x00106c4b, 0x4d2c0000, 0x59325808,
+       0x59300403, 0x82000580, 0x00000052, 0x02000800,
+       0x00101231, 0x0401fb16, 0x02000800, 0x001005d8,
+       0x4a025a06, 0x00000005, 0x0201f800, 0x000202da,
+       0x0201f800, 0x00104c19, 0x0201f800, 0x00107911,
+       0x5c025800, 0x82000540, 0x00000001, 0x1c01f000,
+       0x598c000d, 0x81300580, 0x0402001a, 0x59300004,
+       0x8c000520, 0x04000004, 0x84000520, 0x48026004,
+       0x0401f01a, 0x42001000, 0x0010b7f6, 0x50081000,
+       0x58080002, 0x82000580, 0x00000100, 0x0400000a,
+       0x5808000c, 0x81300580, 0x02020800, 0x001005d8,
+       0x0201f800, 0x001068d3, 0x02020800, 0x001005d8,
+       0x0401f7cf, 0x0201f800, 0x00106e8e, 0x0402000c,
+       0x59300004, 0x8c000520, 0x04000004, 0x84000520,
+       0x48026004, 0x0401f7c6, 0x0201f800, 0x001068d3,
+       0x040007c3, 0x0201f800, 0x001005d8, 0x59300203,
+       0x82000c80, 0x0000000e, 0x02021800, 0x001005d8,
+       0x0c01f7a7, 0x59300406, 0x4933c857, 0x4803c857,
+       0x82000c80, 0x00000012, 0x02021800, 0x001005d8,
+       0x0c01f001, 0x00108d7c, 0x00108e41, 0x00108f79,
+       0x00108d88, 0x00107911, 0x00108d7c, 0x0010a1c0,
+       0x0002077d, 0x00108e41, 0x001065ce, 0x00108fda,
+       0x00108d77, 0x00108d77, 0x00108d77, 0x00108d77,
+       0x00108d77, 0x001096eb, 0x001096eb, 0x0201f800,
+       0x001005d8, 0x0401fbd5, 0x02000000, 0x0010801c,
+       0x1c01f000, 0x0201f800, 0x00106c55, 0x0201f800,
+       0x00106bbf, 0x0201f800, 0x00106c4b, 0x0201f000,
+       0x0002077d, 0x4a026206, 0x00000001, 0x1c01f000,
+       0x42000000, 0x0010b872, 0x0201f800, 0x0010aa47,
+       0x4d2c0000, 0x4d400000, 0x417a5800, 0x0401faa8,
+       0x04000007, 0x59325808, 0x592c0208, 0x8400054c,
+       0x48025a08, 0x42028000, 0x00000006, 0x0201f800,
+       0x00106c55, 0x0401ff4c, 0x4803c857, 0x82000c80,
+       0x0000000e, 0x02021800, 0x001005d8, 0x0c01f806,
+       0x0201f800, 0x00106c4b, 0x5c028000, 0x5c025800,
+       0x1c01f000, 0x00108e40, 0x00108db5, 0x00108dc3,
+       0x00108de5, 0x00108e11, 0x00108db3, 0x00108d7c,
+       0x00108d7c, 0x00108d7c, 0x00108db3, 0x00108db3,
+       0x00108db3, 0x00108db3, 0x00108dc3, 0x0201f800,
+       0x001005d8, 0x598c000d, 0x81300580, 0x04020004,
+       0x0201f800, 0x00106e8e, 0x04020038, 0x0201f800,
+       0x001068d3, 0x0400003b, 0x0201f800, 0x00106b6c,
+       0x04000032, 0x0201f800, 0x001005d8, 0x497a621d,
+       0x812e59c0, 0x02000800, 0x001005d8, 0x592c0204,
+       0x82000500, 0x000000ff, 0x82000580, 0x00000014,
+       0x04000003, 0x4a02621d, 0x00000003, 0x592c0a08,
+       0x0201f800, 0x00104e70, 0x0201f800, 0x0010959c,
+       0x0201f800, 0x000202da, 0x497a6008, 0x4a026403,
+       0x00000085, 0x4a026203, 0x00000009, 0x4a026406,
+       0x00000002, 0x4a026004, 0x8000404b, 0x0201f800,
+       0x00106c4b, 0x42000800, 0x8000404b, 0x0201f000,
+       0x00020721, 0x0401fef1, 0x04020004, 0x0201f800,
+       0x00106e62, 0x04020009, 0x0201f800, 0x001067ae,
+       0x040207d2, 0x59300c03, 0x82040580, 0x00000040,
+       0x04000008, 0x0401f7d2, 0x59300203, 0x82000c80,
+       0x0000000e, 0x02021800, 0x001005d8, 0x0c01f7ae,
+       0x0201f800, 0x00106c4b, 0x812e59c0, 0x04000013,
+       0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800,
+       0x0010959c, 0x0201f800, 0x000202da, 0x59300203,
+       0x82000580, 0x0000000d, 0x04000008, 0x0201f800,
+       0x00106c4b, 0x4d340000, 0x59326809, 0x0201f800,
+       0x001049b2, 0x5c026800, 0x0201f800, 0x00107911,
+       0x0401f030, 0x812e59c0, 0x02000800, 0x001005d8,
+       0x0201f800, 0x0010940a, 0x04020004, 0x0201f800,
+       0x00100e99, 0x0401f7aa, 0x0201f800, 0x00106c4b,
+       0x592c0208, 0x8400050c, 0x48025a08, 0x592c0406,
+       0x800000c2, 0x800008c4, 0x80040c00, 0x48066206,
+       0x42000000, 0x10000000, 0x41300800, 0x0201f800,
+       0x00100b94, 0x0400000d, 0x592c0208, 0x8c00051c,
+       0x04020006, 0x8400055c, 0x48025a08, 0x4a026206,
+       0x00000002, 0x0401f00f, 0x4d300000, 0x0201f800,
+       0x001012e5, 0x5c026000, 0x59300203, 0x82000580,
+       0x00000004, 0x04020007, 0x4d380000, 0x42027000,
+       0x00000048, 0x0201f800, 0x000207a1, 0x5c027000,
+       0x1c01f000, 0x42000000, 0x0010b86e, 0x0201f800,
+       0x0010aa47, 0x59300203, 0x82000c80, 0x0000000e,
+       0x02021800, 0x001005d8, 0x4803c857, 0x0c01f001,
+       0x00108e5a, 0x00108d85, 0x00108e5c, 0x00108e5a,
+       0x00108e5c, 0x00108e5c, 0x00108d7d, 0x00108e5a,
+       0x00108d79, 0x00108e5a, 0x00108e5a, 0x00108e5a,
+       0x00108e5a, 0x00108e5a, 0x0201f800, 0x001005d8,
+       0x4d340000, 0x4d2c0000, 0x59326809, 0x59340400,
+       0x82000500, 0x000000ff, 0x82000c80, 0x0000000c,
+       0x02021800, 0x001005d8, 0x59303403, 0x82180d80,
+       0x00000004, 0x04020004, 0x42000000, 0x00000001,
+       0x0401f006, 0x82180d80, 0x00000000, 0x04020003,
+       0x42000000, 0x00000001, 0x4803c857, 0x0c01f804,
+       0x5c025800, 0x5c026800, 0x1c01f000, 0x00108e83,
+       0x00108f22, 0x00108e85, 0x00108eba, 0x00108e85,
+       0x00108f3f, 0x00108e85, 0x00108e8f, 0x00108e83,
+       0x00108f3f, 0x00108e83, 0x00108e9e, 0x0201f800,
+       0x001005d8, 0x59300403, 0x82000d80, 0x00000016,
+       0x0400002e, 0x82000d80, 0x00000004, 0x0400002b,
+       0x82000d80, 0x00000002, 0x04000028, 0x0401fabf,
+       0x04000079, 0x59300403, 0x82000d80, 0x00000022,
+       0x040000ae, 0x82000d80, 0x00000039, 0x040000b3,
+       0x82000d80, 0x00000035, 0x040000b0, 0x82000d80,
+       0x0000001e, 0x0400001b, 0x0401f999, 0x04000007,
+       0x0201f800, 0x00109597, 0x04020004, 0x0201f800,
+       0x00104a14, 0x0401f011, 0x59300403, 0x82000d80,
+       0x00000001, 0x04020004, 0x0201f800, 0x001049e7,
+       0x0400000a, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42000000, 0x0010b864,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x0010801c,
+       0x0201f000, 0x00107911, 0x0401f97d, 0x04000004,
+       0x0201f800, 0x00109597, 0x040000a9, 0x59300c03,
+       0x82040580, 0x00000016, 0x04000056, 0x82040580,
+       0x00000002, 0x04020034, 0x59a80026, 0x8c000502,
+       0x04020013, 0x0201f800, 0x0010513b, 0x04020010,
+       0x0201f800, 0x00105151, 0x04020006, 0x42000000,
+       0x00000001, 0x0201f800, 0x00105113, 0x0401f094,
+       0x4a035033, 0x00000001, 0x4202d800, 0x00000001,
+       0x0201f800, 0x001050a2, 0x0401f08d, 0x59340403,
+       0x82000580, 0x000007fc, 0x04000008, 0x59a80026,
+       0x8c00050a, 0x04020084, 0x59340212, 0x82000500,
+       0x0000ff00, 0x04000082, 0x59340412, 0x82000500,
+       0x000000ff, 0x04000010, 0x80000040, 0x48026c12,
+       0x497a6008, 0x4a026406, 0x00000007, 0x4a026206,
+       0x00000398, 0x497a6205, 0x0201f800, 0x0002075a,
+       0x04000005, 0x49366009, 0x4a026406, 0x00000001,
+       0x0401f020, 0x59300403, 0x82000d80, 0x00000002,
+       0x0402000d, 0x59340403, 0x82000580, 0x000007fe,
+       0x04020009, 0x59a80026, 0x84000540, 0x48035026,
+       0x0201f800, 0x00104237, 0x0201f800, 0x0010801c,
+       0x0401f00c, 0x0201f800, 0x0010801c, 0x4d3c0000,
+       0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800,
+       0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47,
+       0x0201f800, 0x00102074, 0x0201f000, 0x00107911,
+       0x42000800, 0x00000003, 0x0201f800, 0x00104571,
+       0x4a026203, 0x00000001, 0x4a026403, 0x00000002,
+       0x0201f000, 0x0010672b, 0x0401f915, 0x04020793,
+       0x0201f800, 0x00102074, 0x4d3c0000, 0x417a7800,
+       0x0201f800, 0x0010203c, 0x5c027800, 0x42000000,
+       0x0010b864, 0x0201f800, 0x0010aa47, 0x42003000,
+       0x00000018, 0x41782800, 0x42002000, 0x00000000,
+       0x4d400000, 0x4d440000, 0x59368c03, 0x42028000,
+       0x00000029, 0x0201f800, 0x0010985e, 0x5c028800,
+       0x5c028000, 0x0201f000, 0x00107911, 0x0201f800,
+       0x00104a14, 0x0401f7c8, 0x42000000, 0x0010b86d,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x00107b76,
+       0x040207c1, 0x1c01f000, 0x4d380000, 0x59327403,
+       0x0201f800, 0x001093ba, 0x5c027000, 0x02020000,
+       0x0002077d, 0x836c0580, 0x00000003, 0x04000004,
+       0x4a026206, 0x00000002, 0x1c01f000, 0x59300403,
+       0x48026416, 0x4a02621d, 0x00000001, 0x4a026403,
+       0x00000085, 0x4a026203, 0x00000009, 0x4a026406,
+       0x00000002, 0x42000800, 0x8000004b, 0x0201f000,
+       0x00020721, 0x0201f800, 0x00102074, 0x0201f800,
+       0x0010801c, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42000000, 0x0010b864,
+       0x0201f800, 0x0010aa47, 0x497a6008, 0x4a026406,
+       0x00000007, 0x4a026206, 0x00000398, 0x497a6205,
+       0x1c01f000, 0x42000000, 0x0010b870, 0x0201f800,
+       0x0010aa47, 0x4d340000, 0x59326809, 0x59300203,
+       0x82000c80, 0x0000000e, 0x02021800, 0x001005d8,
+       0x4803c857, 0x0c01f803, 0x5c026800, 0x1c01f000,
+       0x00108f96, 0x00108d85, 0x00108f96, 0x00108f96,
+       0x00108f96, 0x00108f96, 0x00108f96, 0x00108f96,
+       0x00108f96, 0x00108d85, 0x00108f98, 0x00108d85,
+       0x00108fa0, 0x00108f96, 0x0201f800, 0x001005d8,
+       0x4a026403, 0x0000008b, 0x4a026203, 0x0000000b,
+       0x42000800, 0x8000404b, 0x0201f000, 0x00020721,
+       0x59300a1d, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42003000, 0x00000011,
+       0x0201f800, 0x0010a942, 0x42000000, 0x0010b864,
+       0x0201f800, 0x0010aa47, 0x41306800, 0x0201f800,
+       0x0002075a, 0x04000008, 0x49366009, 0x4d300000,
+       0x40366000, 0x0201f800, 0x00107911, 0x5c026000,
+       0x0401f002, 0x40366000, 0x497a6008, 0x4a026406,
+       0x00000001, 0x4a026403, 0x00000001, 0x0201f800,
+       0x00103b25, 0x04000011, 0x4a026406, 0x00000004,
+       0x4a026203, 0x00000007, 0x4a026420, 0x00000001,
+       0x42003000, 0x00000004, 0x4d400000, 0x42028000,
+       0x00000029, 0x41782800, 0x0201f800, 0x0010a43e,
+       0x5c028000, 0x1c01f000, 0x42000800, 0x0000000b,
+       0x0201f800, 0x00104571, 0x4a026203, 0x00000001,
+       0x0201f000, 0x0010672b, 0x42000000, 0x0010b876,
+       0x0201f800, 0x0010aa47, 0x59300203, 0x82000c80,
+       0x0000000e, 0x02021800, 0x001005d8, 0x4803c857,
+       0x0c01f001, 0x0010900b, 0x00108ff3, 0x00108ff7,
+       0x0010900c, 0x00108ff5, 0x00108ff3, 0x00108ff3,
+       0x00108ff3, 0x00108ff3, 0x00108ff3, 0x00108ff3,
+       0x00108ff3, 0x00108ff3, 0x00108ff3, 0x0201f800,
+       0x001005d8, 0x0201f800, 0x00100e99, 0x4d2c0000,
+       0x59325808, 0x4a025a06, 0x00000006, 0x0201f800,
+       0x000202da, 0x5c025800, 0x497a6008, 0x4a02621d,
+       0x0000000a, 0x4a026403, 0x00000085, 0x4a026203,
+       0x00000009, 0x4a026406, 0x00000002, 0x42000800,
+       0x8000404b, 0x0201f000, 0x00020721, 0x1c01f000,
+       0x0201f800, 0x00106c55, 0x4df00000, 0x0401fcc7,
+       0x04020004, 0x0201f800, 0x00106e62, 0x0402000c,
+       0x0201f800, 0x001067ae, 0x04020005, 0x5c03e000,
+       0x0201f800, 0x00106c4b, 0x0401f7dd, 0x0201f800,
+       0x00106b6c, 0x02020800, 0x001005d8, 0x5c03e000,
+       0x0201f800, 0x00106c4b, 0x59300203, 0x82000d80,
+       0x00000003, 0x02000800, 0x001005d8, 0x82000c80,
+       0x0000000e, 0x02021800, 0x001005d8, 0x0c01f7ba,
+       0x4803c856, 0x59a8000e, 0x59a80867, 0x80040400,
+       0x80080480, 0x04021004, 0x82000540, 0x00000001,
+       0x1c01f000, 0x80000580, 0x1c01f000, 0x4803c856,
+       0x4c080000, 0x59301008, 0x82081500, 0xfff00000,
+       0x5c001000, 0x1c01f000, 0x4803c856, 0x4d300000,
+       0x0201f800, 0x0002075a, 0x0400000a, 0x0401f82f,
+       0x4d380000, 0x42027000, 0x0000004b, 0x0201f800,
+       0x000207a1, 0x5c027000, 0x82000540, 0x00000001,
+       0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000,
+       0x0201f800, 0x00107942, 0x0400001b, 0x0401f81f,
+       0x4d300000, 0x0201f800, 0x00106c55, 0x4d3c0000,
+       0x417a7800, 0x0201f800, 0x00106ab4, 0x0201f800,
+       0x001067fd, 0x5c027800, 0x0201f800, 0x0010a2ff,
+       0x0201f800, 0x00106c4b, 0x5c026000, 0x8d3e7d3e,
+       0x0402000b, 0x4d380000, 0x42027000, 0x0000004c,
+       0x0201f800, 0x000207a1, 0x5c027000, 0x82000540,
+       0x00000001, 0x5c026000, 0x1c01f000, 0x0201f800,
+       0x0002077d, 0x0401f7fa, 0x592c0407, 0x494a6017,
+       0x494e6018, 0x49366009, 0x492e6008, 0x4a026406,
+       0x00000003, 0x800000c2, 0x800008c4, 0x80040400,
+       0x48026206, 0x1c01f000, 0x493bc857, 0x4d300000,
+       0x0201f800, 0x0002075a, 0x0400000d, 0x0401ffef,
+       0x4d400000, 0x42028000, 0x00000005, 0x0401f80d,
+       0x5c028000, 0x8d3e7d3e, 0x04020007, 0x0201f800,
+       0x000207a1, 0x82000540, 0x00000001, 0x5c026000,
+       0x1c01f000, 0x0201f800, 0x0002077d, 0x0401f7fa,
+       0x4803c856, 0x0201f800, 0x00106c55, 0x4d3c0000,
+       0x4d440000, 0x59368c03, 0x42027800, 0x00000001,
+       0x0201f800, 0x001069b6, 0x0201f800, 0x0010692e,
+       0x0201f800, 0x001067fd, 0x0201f800, 0x0010a2ff,
+       0x5c028800, 0x5c027800, 0x0201f000, 0x00106c4b,
+       0x4803c856, 0x4d300000, 0x0201f800, 0x0002075a,
+       0x0400000f, 0x481a601c, 0x48ee6021, 0x49366009,
+       0x4a026406, 0x00000001, 0x492e6008, 0x4d380000,
+       0x42027000, 0x0000001f, 0x0201f800, 0x000207a1,
+       0x5c027000, 0x82000540, 0x00000001, 0x5c026000,
+       0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800,
+       0x0002075a, 0x0400000e, 0x48ee6021, 0x49366009,
+       0x4a026406, 0x00000001, 0x492e6008, 0x4d380000,
+       0x42027000, 0x00000055, 0x0201f800, 0x000207a1,
+       0x5c027000, 0x82000540, 0x00000001, 0x5c026000,
+       0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800,
+       0x0002075a, 0x0400000f, 0x481a601c, 0x48ee6021,
+       0x49366009, 0x4a026406, 0x00000001, 0x492e6008,
+       0x4d380000, 0x42027000, 0x0000003d, 0x0201f800,
+       0x000207a1, 0x5c027000, 0x82000540, 0x00000001,
+       0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000,
+       0x0201f800, 0x00107942, 0x04000014, 0x49366009,
+       0x492fc857, 0x4933c857, 0x592c0404, 0x8c00051e,
+       0x04000003, 0x48efc857, 0x48ee6021, 0x4a026406,
+       0x00000001, 0x492e6008, 0x4d380000, 0x42027000,
+       0x00000000, 0x0201f800, 0x000207a1, 0x5c027000,
+       0x82000540, 0x00000001, 0x5c026000, 0x1c01f000,
+       0x4803c856, 0x4d300000, 0x0201f800, 0x0002075a,
+       0x0400000f, 0x48ee6021, 0x481a601c, 0x49366009,
+       0x4a026406, 0x00000001, 0x492e6008, 0x4d380000,
+       0x42027000, 0x00000044, 0x0201f800, 0x000207a1,
+       0x5c027000, 0x82000540, 0x00000001, 0x5c026000,
+       0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800,
+       0x0002075a, 0x0400000f, 0x481a601c, 0x48ee6021,
+       0x49366009, 0x4a026406, 0x00000001, 0x492e6008,
+       0x4d380000, 0x42027000, 0x00000049, 0x0201f800,
+       0x000207a1, 0x5c027000, 0x82000540, 0x00000001,
+       0x5c026000, 0x1c01f000, 0x59300009, 0x80001540,
+       0x02000800, 0x001005d8, 0x5808040b, 0x4803c856,
+       0x80000040, 0x04001002, 0x4800140b, 0x1c01f000,
+       0x4803c856, 0x59300403, 0x82000d80, 0x00000002,
+       0x04000015, 0x82000d80, 0x00000003, 0x04000012,
+       0x82000d80, 0x00000004, 0x0400000f, 0x82000d80,
+       0x00000008, 0x0400000c, 0x82000d80, 0x0000000a,
+       0x04000009, 0x599c0819, 0x8c040d0e, 0x04000004,
+       0x82000d80, 0x00000000, 0x04000003, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4803c856, 0x4c000000,
+       0x4d2c0000, 0x59300406, 0x82000580, 0x00000004,
+       0x0400001d, 0x59300008, 0x80025d40, 0x800001c0,
+       0x04000019, 0x0201f800, 0x00109597, 0x04000014,
+       0x59300406, 0x82004580, 0x00000010, 0x04000010,
+       0x82004580, 0x00000011, 0x0400000d, 0x82004580,
+       0x00000003, 0x0400000c, 0x82004580, 0x00000002,
+       0x04000009, 0x82004580, 0x0000000a, 0x04000006,
+       0x592c0404, 0x8c00051e, 0x04000003, 0x80000580,
+       0x0401f003, 0x82000540, 0x00000001, 0x5c025800,
+       0x5c000000, 0x1c01f000, 0x4803c856, 0x4d300000,
+       0x0201f800, 0x00107942, 0x04000013, 0x49366009,
+       0x48ee6021, 0x4a026406, 0x00000001, 0x492e6008,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x5c027800, 0x4d380000, 0x42027000, 0x00000028,
+       0x0201f800, 0x000207a1, 0x5c027000, 0x82000540,
+       0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856,
+       0x83380580, 0x00000015, 0x0402000d, 0x59a80016,
+       0x82000580, 0x00000074, 0x04020009, 0x0201f800,
+       0x0010462a, 0x4a026203, 0x00000001, 0x4a026403,
+       0x00000029, 0x0201f000, 0x0010672b, 0x0201f800,
+       0x0010801c, 0x0201f000, 0x0002077d, 0x4803c856,
+       0x83380580, 0x00000016, 0x04020007, 0x42000800,
+       0x00000004, 0x0201f800, 0x00104571, 0x0201f000,
+       0x00107b38, 0x83380580, 0x00000015, 0x04020013,
+       0x59a80016, 0x82000580, 0x00000014, 0x0402000f,
+       0x0201f800, 0x0010468d, 0x0201f800, 0x0010846f,
+       0x0402000a, 0x59340404, 0x80000540, 0x04000007,
+       0x42000800, 0x00000006, 0x0201f800, 0x00104571,
+       0x0201f000, 0x00107b38, 0x0201f800, 0x0010801c,
+       0x0201f000, 0x0002077d, 0x4803c856, 0x592c0206,
+       0x82000580, 0x00000005, 0x04000002, 0x1c01f000,
+       0x4803c856, 0x592c0208, 0x8400054a, 0x48025a08,
+       0x1c01f000, 0x497a6205, 0x497a6008, 0x4a026203,
+       0x00000001, 0x4a026403, 0x00000050, 0x42000800,
+       0x80000043, 0x0201f000, 0x00020721, 0x4933c857,
+       0x4d340000, 0x59326809, 0x59340200, 0x8c00050e,
+       0x04000006, 0x59300406, 0x82000c80, 0x00000012,
+       0x04021004, 0x0c01f806, 0x5c026800, 0x1c01f000,
+       0x0201f800, 0x00108d7c, 0x0401f7fc, 0x00108d7c,
+       0x001091fd, 0x00109201, 0x00109204, 0x0010a49b,
+       0x0010a4b8, 0x0010a4bc, 0x00108d7c, 0x00108d7c,
+       0x00108d7c, 0x00108d7c, 0x00108d7c, 0x00108d7c,
+       0x00108d7c, 0x00108d7c, 0x00108d7c, 0x00108d7c,
+       0x00108d7c, 0x4803c856, 0x40000000, 0x40000000,
+       0x1c01f000, 0x40000000, 0x40000000, 0x1c01f000,
+       0x5930001c, 0x4803c857, 0x59300414, 0x4933c857,
+       0x4803c857, 0x8c000502, 0x04000005, 0x84000502,
+       0x84000540, 0x48026414, 0x1c01f000, 0x42000000,
+       0xd0000000, 0x41300800, 0x0201f800, 0x00100b94,
+       0x0401f80a, 0x04020008, 0x59a80037, 0x82000400,
+       0x0000000a, 0x48026205, 0x59300414, 0x84000542,
+       0x48026414, 0x1c01f000, 0x4933c857, 0x4d340000,
+       0x59326809, 0x59340200, 0x8c00050e, 0x02000800,
+       0x001005d8, 0x5930001c, 0x80000540, 0x0402002f,
+       0x59a80021, 0x80000540, 0x0402002a, 0x4d1c0000,
+       0x41323800, 0x0201f800, 0x0002075a, 0x04000023,
+       0x4932381c, 0x591c0414, 0x84000542, 0x48023c14,
+       0x49366009, 0x591c0406, 0x82000580, 0x00000003,
+       0x04000006, 0x591c0202, 0x48026419, 0x591c0402,
+       0x48026219, 0x0401f005, 0x591c0202, 0x48026219,
+       0x591c0402, 0x48026419, 0x491e601e, 0x4a026406,
+       0x00000001, 0x4a026403, 0x00000035, 0x4a026203,
+       0x00000001, 0x42000800, 0x80000040, 0x0201f800,
+       0x00020721, 0x411e6000, 0x5c023800, 0x80000580,
+       0x5c026800, 0x1c01f000, 0x411e6000, 0x5c023800,
+       0x59a80039, 0x48026205, 0x82000540, 0x00000001,
+       0x0401f7f8, 0x4933c857, 0x4d2c0000, 0x4932381c,
+       0x4a026202, 0x0000ffff, 0x591e5808, 0x591c0007,
+       0x8c00051e, 0x04000005, 0x8400051e, 0x48023807,
+       0x497a5c09, 0x0401f014, 0x592c0408, 0x8c000518,
+       0x04000011, 0x84000518, 0x48025c08, 0x4a025c09,
+       0x00000001, 0x0401fb2f, 0x497a5c09, 0x592c0408,
+       0x8c000512, 0x04000008, 0x4d2c0000, 0x84000512,
+       0x48025c08, 0x592e5809, 0x0201f800, 0x001007fd,
+       0x5c025800, 0x59a80039, 0x48026205, 0x591c0214,
+       0x48026216, 0x82000d80, 0x00000001, 0x04000008,
+       0x4a023a03, 0x00000002, 0x82000580, 0x00000005,
+       0x04000008, 0x497a6015, 0x0401f01e, 0x591c0007,
+       0x84000540, 0x48023807, 0x4a023a03, 0x00000004,
+       0x591c0414, 0x4803c857, 0x8400051c, 0x84000554,
+       0x48023c14, 0x592c000f, 0x40001000, 0x591c0816,
+       0x80040480, 0x040217f0, 0x591c0016, 0x82000500,
+       0xfffffffc, 0x48026015, 0x48023816, 0x591c0a14,
+       0x4807c857, 0x82040d80, 0x00000005, 0x04020005,
+       0x480bc857, 0x4803c857, 0x4a023812, 0xffffffff,
+       0x591c0402, 0x48026419, 0x591c0202, 0x48026219,
+       0x591e6809, 0x49366009, 0x4a026406, 0x00000001,
+       0x4a026403, 0x00000039, 0x4a026203, 0x00000001,
+       0x42000800, 0x80000040, 0x0201f800, 0x00020721,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x59300414,
+       0x8c000514, 0x04000015, 0x8c00051c, 0x04020012,
+       0x59300016, 0x80100480, 0x04001006, 0x04000005,
+       0x59300414, 0x84000514, 0x8400055c, 0x0401f009,
+       0x48126016, 0x48126012, 0x40100000, 0x592c180f,
+       0x800c0480, 0x48026011, 0x59300414, 0x84000514,
+       0x48026414, 0x1c01f000, 0x4933c857, 0x8c00051c,
+       0x04020006, 0x59300012, 0x48026016, 0x59300414,
+       0x8400055c, 0x48026414, 0x1c01f000, 0x59300c03,
+       0x4933c857, 0x4807c857, 0x82040480, 0x00000034,
+       0x04001006, 0x82040480, 0x0000003c, 0x04021003,
+       0x80000580, 0x1c01f000, 0x82000540, 0x00000001,
+       0x0401f7fd, 0x41780800, 0x59a81035, 0x42000000,
+       0x00000032, 0x0201f800, 0x001066a0, 0x800811c0,
+       0x04020003, 0x42001000, 0x00000014, 0x480b5037,
+       0x59a81036, 0x480b502d, 0x41780800, 0x42000000,
+       0x00000064, 0x0201f800, 0x001066a0, 0x800811c0,
+       0x04020003, 0x42001000, 0x00000014, 0x480b5038,
+       0x82081400, 0x0000000a, 0x480b5039, 0x42000800,
+       0x00000001, 0x0201f800, 0x00106c78, 0x42000000,
+       0x30000000, 0x40080800, 0x0201f800, 0x00100b68,
+       0x42000800, 0x00000003, 0x59a81010, 0x0201f800,
+       0x00106c78, 0x0201f000, 0x00104906, 0x4a035037,
+       0x00000028, 0x4a035038, 0x00000014, 0x4a03502d,
+       0x000007d0, 0x42001000, 0x0000001e, 0x480b5039,
+       0x42000800, 0x00000001, 0x0201f800, 0x00106c78,
+       0x42000000, 0x30000000, 0x40080800, 0x0201f800,
+       0x00100b68, 0x42000800, 0x00000003, 0x59a81010,
+       0x0201f000, 0x00106c78, 0x4933c857, 0x4d2c0000,
+       0x59300403, 0x82000580, 0x0000003e, 0x04020005,
+       0x59325817, 0x812e59c0, 0x02020800, 0x001007f4,
+       0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000,
+       0x0201f800, 0x0002075a, 0x04000011, 0x49366009,
+       0x4a026406, 0x00000001, 0x492e6008, 0x42000800,
+       0x00000009, 0x0201f800, 0x00104571, 0x4d380000,
+       0x42027000, 0x00000033, 0x0201f800, 0x000207a1,
+       0x5c027000, 0x82000540, 0x00000001, 0x5c026000,
+       0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c580000,
+       0x4d3c0000, 0x59325808, 0x83380580, 0x00000015,
+       0x04020022, 0x59a8b016, 0x82580c80, 0x00000019,
+       0x04001003, 0x4200b000, 0x00000018, 0x8058b104,
+       0x0401fa07, 0x80000580, 0x0401fa17, 0x832cac00,
+       0x00000009, 0x83cca400, 0x00000006, 0x0201f800,
+       0x0010ab17, 0x42027800, 0x00000001, 0x592c100a,
+       0x8c081518, 0x04020006, 0x59a80010, 0x592c100d,
+       0x80080580, 0x04020006, 0x417a7800, 0x59301009,
+       0x58081403, 0x0201f800, 0x001020a1, 0x0201f800,
+       0x00107b38, 0x0401f008, 0x4200b000, 0x00000002,
+       0x0401fa09, 0x0201f800, 0x0010801c, 0x0201f800,
+       0x0002077d, 0x5c027800, 0x5c00b000, 0x5c025800,
+       0x1c01f000, 0x4933c856, 0x49366009, 0x4a026406,
+       0x00000001, 0x492e6008, 0x4d380000, 0x42027000,
+       0x0000004d, 0x0201f800, 0x000207a1, 0x5c027000,
+       0x82000540, 0x00000001, 0x1c01f000, 0x4803c856,
+       0x4d2c0000, 0x83380580, 0x00000015, 0x04020027,
+       0x59a80816, 0x59325808, 0x5930040b, 0x800000c4,
+       0x80040580, 0x04020021, 0x4c500000, 0x4c540000,
+       0x4c580000, 0x83cca400, 0x00000006, 0x4050a800,
+       0x5930b40b, 0x0201f800, 0x0010ab28, 0x83cca400,
+       0x00000006, 0x592cb205, 0x832cac00, 0x00000006,
+       0x0201f800, 0x0010ab17, 0x592e5801, 0x812e59c0,
+       0x040207f9, 0x5931d821, 0x58ef400b, 0x58ee580d,
+       0x4a025a04, 0x00000103, 0x58ec0009, 0x0801f800,
+       0x59300402, 0x5c00b000, 0x5c00a800, 0x5c00a000,
+       0x5c025800, 0x1c01f000, 0x0201f800, 0x0010801c,
+       0x5c025800, 0x1c01f000, 0x4933c857, 0x83380580,
+       0x00000035, 0x04000005, 0x59301419, 0x0401f851,
+       0x04000027, 0x0401f006, 0x4d300000, 0x5932601e,
+       0x0401f856, 0x5c026000, 0x04000020, 0x591c0c06,
+       0x82040580, 0x00000003, 0x04000004, 0x82040580,
+       0x00000006, 0x0402001c, 0x591c0c02, 0x59300419,
+       0x80040580, 0x04000009, 0x59300219, 0x80040580,
+       0x04020015, 0x591c0a02, 0x59300419, 0x80040580,
+       0x04020011, 0x0401f009, 0x59300a19, 0x82040580,
+       0x0000ffff, 0x04000005, 0x591c0202, 0x59300a19,
+       0x80040580, 0x04020008, 0x591c0009, 0x59300809,
+       0x80040580, 0x1c01f000, 0x417a3800, 0x82000540,
+       0x00000001, 0x1c01f000, 0x4803c856, 0x59b800e4,
+       0x8c000538, 0x02020800, 0x001005d8, 0x42000800,
+       0x0000012c, 0x4a0370e4, 0x20000000, 0x59b800e4,
+       0x80040840, 0x02000800, 0x001005d8, 0x8c00053c,
+       0x040207f9, 0x4a0370e4, 0x30000000, 0x40000000,
+       0x40000000, 0x40000000, 0x59b800e4, 0x8c00053c,
+       0x040207f1, 0x1c01f000, 0x4803c856, 0x4a0370e4,
+       0x20000000, 0x40000000, 0x59b800e4, 0x8c000538,
+       0x040207fb, 0x1c01f000, 0x59300807, 0x8c040d1e,
+       0x592c0c08, 0x04020002, 0x8c040d18, 0x1c01f000,
+       0x0401fc1c, 0x04000008, 0x42000800, 0x00000024,
+       0x0201f800, 0x00106681, 0x82063c00, 0x0010d1c0,
+       0x491fc857, 0x1c01f000, 0x83300480, 0x0010d1c0,
+       0x0400100a, 0x59a8000b, 0x81300480, 0x04021007,
+       0x59301402, 0x0401ffef, 0x04000007, 0x411c0000,
+       0x81300580, 0x04000003, 0x81780500, 0x0401f002,
+       0x81300540, 0x1c01f000, 0x4947c857, 0x4d300000,
+       0x0201f800, 0x00020245, 0x0402000a, 0x42026000,
+       0x0010bde9, 0x49366009, 0x492e6008, 0x0201f800,
+       0x0010203c, 0x80000580, 0x5c026000, 0x1c01f000,
+       0x82000540, 0x00000001, 0x0401f7fc, 0x4933c857,
+       0x0201f800, 0x00109037, 0x02000800, 0x001005d8,
+       0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000,
+       0x59325808, 0x59326809, 0x49425a06, 0x0201f800,
+       0x00105755, 0x592e8c06, 0x592c4207, 0x82200500,
+       0x0000000f, 0x0c01f806, 0x5c00b000, 0x5c028800,
+       0x5c026800, 0x5c025800, 0x1c01f000, 0x00109466,
+       0x00109488, 0x0010948f, 0x00109493, 0x0010949c,
+       0x00109463, 0x00109463, 0x00109463, 0x001094a0,
+       0x001094ac, 0x001094ac, 0x00109463, 0x00109463,
+       0x00109463, 0x00109463, 0x00109463, 0x4803c857,
+       0x0201f800, 0x001005d8, 0x814281c0, 0x04020012,
+       0x41785800, 0x592c0404, 0x8c00051c, 0x04020002,
+       0x59345c05, 0x442c2800, 0x59340008, 0x48002802,
+       0x59340009, 0x48002801, 0x59340006, 0x48002804,
+       0x59340007, 0x48002803, 0x4200b000, 0x0000000b,
+       0x0401f037, 0x592c0207, 0x8c00051e, 0x4200b000,
+       0x00000002, 0x04020032, 0x8204b540, 0x00000000,
+       0x0400002f, 0x44042800, 0x59326809, 0x59340400,
+       0x48002801, 0x4200b000, 0x00000002, 0x0401f028,
+       0x814281c0, 0x04020030, 0x59345c05, 0x442c2800,
+       0x4200b000, 0x00000001, 0x0401f021, 0x8340b540,
+       0x00000000, 0x0400001e, 0x0401f027, 0x814281c0,
+       0x04020025, 0x59340200, 0x44002800, 0x59340001,
+       0x48002801, 0x4200b000, 0x00000002, 0x0401f014,
+       0x8340b540, 0x00000000, 0x0402001b, 0x0401f010,
+       0x8340b540, 0x00000000, 0x0400000d, 0x0201f800,
+       0x00104a1f, 0x04000014, 0x8c20450e, 0x04000002,
+       0x497a6009, 0x4178b000, 0x497a5a06, 0x0401f004,
+       0x8340b540, 0x00000000, 0x0402000b, 0x592c0404,
+       0x8400051c, 0x48025c04, 0x592c0207, 0x8400051e,
+       0x48025a07, 0x0401f8aa, 0x497a6008, 0x0201f000,
+       0x000202da, 0x592c0207, 0x8c00051e, 0x4200b000,
+       0x00000002, 0x040207f2, 0x8204b540, 0x00000000,
+       0x040007ef, 0x44042800, 0x4200b000, 0x00000001,
+       0x0401f7eb, 0x4937c857, 0x4d300000, 0x0201f800,
+       0x0002075a, 0x04000011, 0x49366009, 0x4a026406,
+       0x00000001, 0x492e6008, 0x42000800, 0x0000000b,
+       0x0201f800, 0x00104571, 0x4d380000, 0x42027000,
+       0x00000043, 0x0201f800, 0x000207a1, 0x5c027000,
+       0x82000540, 0x00000001, 0x5c026000, 0x1c01f000,
+       0x4937c857, 0x4d2c0000, 0x59325808, 0x83380580,
+       0x00000015, 0x04020025, 0x59a80016, 0x82000580,
+       0x00000004, 0x04020021, 0x59a80010, 0x592c1009,
+       0x80080580, 0x04020010, 0x4d440000, 0x592e8c06,
+       0x592c0207, 0x4803c856, 0x82000500, 0x00000080,
+       0x84000548, 0x4d3c0000, 0x42027800, 0x00001000,
+       0x0201f800, 0x001049bb, 0x5c027800, 0x5c028800,
+       0x0401f004, 0x4803c856, 0x0201f800, 0x00104a1f,
+       0x0201f800, 0x00109037, 0x04000017, 0x4d400000,
+       0x42028000, 0x00000000, 0x41780800, 0x0401ff38,
+       0x5c028000, 0x0401f00e, 0x0201f800, 0x00104a1f,
+       0x040207f4, 0x0201f800, 0x00109037, 0x0400000a,
+       0x4c580000, 0x4200b000, 0x00000002, 0x0401f86e,
+       0x5c00b000, 0x0201f800, 0x0010801c, 0x0201f800,
+       0x0002077d, 0x5c025800, 0x1c01f000, 0x4937c857,
+       0x4d300000, 0x0201f800, 0x0002075a, 0x04000012,
+       0x49366009, 0x4a026406, 0x00000001, 0x4d3c0000,
+       0x4d380000, 0x417a7800, 0x0201f800, 0x00104567,
+       0x492e6008, 0x42027000, 0x00000004, 0x0201f800,
+       0x000207a1, 0x5c027000, 0x5c027800, 0x82000540,
+       0x00000001, 0x5c026000, 0x1c01f000, 0x4937c857,
+       0x4d300000, 0x0201f800, 0x00107942, 0x0400000d,
+       0x49366009, 0x4a026406, 0x00000001, 0x492e6008,
+       0x4d380000, 0x42027000, 0x00000051, 0x0201f800,
+       0x000207a1, 0x5c027000, 0x82000540, 0x00000001,
+       0x5c026000, 0x1c01f000, 0x4933c857, 0x4c580000,
+       0x59325808, 0x83383580, 0x00000015, 0x04020011,
+       0x592c0008, 0x82000500, 0x00ffffff, 0x0402000a,
+       0x0201f800, 0x00105755, 0x59cc0000, 0x82000500,
+       0x00ffffff, 0x44002800, 0x4200b000, 0x00000001,
+       0x0401f80b, 0x0201f800, 0x00107b38, 0x0401f006,
+       0x4200b000, 0x00000002, 0x0401f823, 0x0201f800,
+       0x0010801c, 0x5c00b000, 0x1c01f000, 0x492fc857,
+       0x4c580000, 0x4c000000, 0x8058b1c0, 0x0400000b,
+       0x82580500, 0xfffffff0, 0x02020800, 0x001005d8,
+       0x8058b0d0, 0x592c0408, 0x82000500, 0xfffff0ff,
+       0x80580540, 0x48025c08, 0x5c000000, 0x5c00b000,
+       0x1c01f000, 0x492fc857, 0x4c000000, 0x4c040000,
+       0x800000d8, 0x592c0c08, 0x82040d00, 0xffff0fff,
+       0x80040540, 0x48025c08, 0x5c000800, 0x5c000000,
+       0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325808,
+       0x592c0207, 0x8400055e, 0x48025a07, 0x4c500000,
+       0x4c540000, 0x4c580000, 0x0401ffd9, 0x0201f800,
+       0x00105755, 0x46002800, 0x00000018, 0x80142800,
+       0x8058b040, 0x83cca400, 0x00000007, 0x4014a800,
+       0x0201f800, 0x0010ab17, 0x5c00b000, 0x5c00a800,
+       0x5c00a000, 0x5c025800, 0x1c01f000, 0x59325808,
+       0x592c0204, 0x82000580, 0x00000152, 0x1c01f000,
+       0x5930001f, 0x80000540, 0x02020800, 0x00100d56,
+       0x1c01f000, 0x4d2c0000, 0x59325808, 0x59300203,
+       0x4933c857, 0x492fc857, 0x493bc857, 0x4803c857,
+       0x82003480, 0x0000000e, 0x02021800, 0x001005d8,
+       0x0c01f803, 0x5c025800, 0x1c01f000, 0x001095bd,
+       0x001095c8, 0x00109603, 0x001095bd, 0x001095bd,
+       0x001095bd, 0x001095bd, 0x001095bd, 0x001095bf,
+       0x001095bd, 0x001095bd, 0x001095bd, 0x001095bd,
+       0x001095bd, 0x0201f800, 0x001005d8, 0x83383480,
+       0x00000056, 0x02021800, 0x001005d8, 0x493a6403,
+       0x4a026203, 0x00000001, 0x0201f000, 0x0010672b,
+       0x83380580, 0x00000013, 0x0402000f, 0x592c000c,
+       0x800001c0, 0x04000006, 0x4a026203, 0x00000002,
+       0x59a80037, 0x48026206, 0x1c01f000, 0x4a025a06,
+       0x00000000, 0x0201f800, 0x000202da, 0x0201f000,
+       0x0002077d, 0x83380580, 0x00000027, 0x0400001a,
+       0x83380580, 0x00000014, 0x04000012, 0x83380580,
+       0x00000015, 0x04000005, 0x83380580, 0x00000016,
+       0x02020800, 0x001005d8, 0x0201f800, 0x00106f60,
+       0x02020000, 0x00107974, 0x59300203, 0x82000580,
+       0x00000002, 0x02020800, 0x001005d8, 0x0401f014,
+       0x0201f800, 0x00106bbf, 0x4a02580e, 0x00000011,
+       0x0401f005, 0x0201f800, 0x00106bbf, 0x4a02580e,
+       0x00000010, 0x4a025a06, 0x00000031, 0x4a02580d,
+       0x00000004, 0x0201f800, 0x000202da, 0x0201f800,
+       0x00104c19, 0x0201f000, 0x00107911, 0x59341400,
+       0x82081d00, 0x000000ff, 0x59300c03, 0x480bc857,
+       0x4807c857, 0x82040580, 0x00000053, 0x0400002e,
+       0x82040580, 0x00000002, 0x04000016, 0x82040580,
+       0x00000001, 0x04000017, 0x82040580, 0x00000003,
+       0x0400001c, 0x82040580, 0x00000005, 0x0400001d,
+       0x82040580, 0x00000033, 0x0400001a, 0x82040580,
+       0x00000000, 0x0400001b, 0x82040580, 0x00000004,
+       0x02020800, 0x001005d8, 0x0401f8a1, 0x0401f016,
+       0x820c0580, 0x00000003, 0x0400084c, 0x0401f012,
+       0x820c0580, 0x0000000b, 0x0402000f, 0x42000800,
+       0x00000007, 0x0201f800, 0x00104571, 0x0401f00a,
+       0x820c0580, 0x00000005, 0x04000864, 0x0401f006,
+       0x820c0580, 0x00000009, 0x04000889, 0x0401f002,
+       0x0401f893, 0x4a026403, 0x00000052, 0x59a81016,
+       0x592c040b, 0x8c000500, 0x04000003, 0x42001000,
+       0x00000008, 0x592c040b, 0x8c000516, 0x04000003,
+       0x82081400, 0x00000018, 0x592c000c, 0x497a580d,
+       0x497a580e, 0x80080c80, 0x04000009, 0x04001005,
+       0x4a025a06, 0x00000007, 0x40001000, 0x0401f006,
+       0x4a025a06, 0x00000015, 0x0401f003, 0x4a025a06,
+       0x00000000, 0x480a580c, 0x82081400, 0x00000003,
+       0x80081104, 0x0201f800, 0x00107ab5, 0x04000010,
+       0x592c1001, 0x480a600b, 0x58080800, 0x82080400,
+       0x00000002, 0x592c1011, 0x592c1812, 0x42003000,
+       0x00000000, 0x42002000, 0x00101200, 0x0201f800,
+       0x00107c32, 0x04000002, 0x1c01f000, 0x4a025a06,
+       0x0000002c, 0x497a580c, 0x0201f800, 0x000202da,
+       0x0201f000, 0x0002077d, 0x83380580, 0x00000015,
+       0x0402000a, 0x59a80005, 0x8c000514, 0x0402000b,
+       0x0201f800, 0x0010462a, 0x42000800, 0x00000004,
+       0x0201f000, 0x00104571, 0x42000800, 0x00000007,
+       0x0201f000, 0x00104571, 0x0201f800, 0x0010513b,
+       0x42001000, 0x00000010, 0x04020009, 0x59340002,
+       0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000,
+       0x040007ec, 0x42001000, 0x00000008, 0x0201f800,
+       0x00104c6d, 0x040007e7, 0x592c040b, 0x84000540,
+       0x48025c0b, 0x0401f7e9, 0x83380580, 0x00000015,
+       0x0402000f, 0x59a80005, 0x8c000514, 0x04020010,
+       0x0201f800, 0x0010468d, 0x4d3c0000, 0x417a7800,
+       0x0201f800, 0x00104567, 0x5c027800, 0x42000800,
+       0x00000006, 0x0201f000, 0x00104571, 0x42000800,
+       0x00000004, 0x0201f000, 0x00104571, 0x0201f800,
+       0x0010513b, 0x42001000, 0x00000010, 0x04020009,
+       0x59340002, 0x82000500, 0x00ff0000, 0x82000580,
+       0x00ff0000, 0x040007e7, 0x42001000, 0x00000008,
+       0x0201f800, 0x00104c6d, 0x040007e2, 0x592c040b,
+       0x84000540, 0x48025c0b, 0x0401f7e9, 0x42000800,
+       0x00000004, 0x0201f000, 0x00104571, 0x83380580,
+       0x00000015, 0x04020005, 0x0201f800, 0x0010a2c8,
+       0x02000800, 0x001048c1, 0x1c01f000, 0x83380580,
+       0x00000015, 0x0402001d, 0x4c580000, 0x83cc1400,
+       0x00000008, 0x4200b000, 0x00000002, 0x83341c00,
+       0x00000006, 0x0201f800, 0x0010855a, 0x04020012,
+       0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002,
+       0x83341c00, 0x00000008, 0x0201f800, 0x0010855a,
+       0x04020009, 0x59342200, 0x59cc1007, 0x800811c0,
+       0x04000003, 0x480a6801, 0x84102542, 0x8410251a,
+       0x48126a00, 0x5c00b000, 0x1c01f000, 0x42000000,
+       0x0010b87b, 0x0201f800, 0x0010aa47, 0x0201f800,
+       0x00106c55, 0x59300203, 0x4933c857, 0x4803c857,
+       0x82000c80, 0x0000000e, 0x02021800, 0x001005d8,
+       0x0c01f803, 0x0201f000, 0x00106c4b, 0x0010970b,
+       0x0010971a, 0x0010970c, 0x00109709, 0x00109709,
+       0x00109709, 0x00109709, 0x00109709, 0x00109709,
+       0x00109709, 0x00109709, 0x00109709, 0x00109709,
+       0x00109709, 0x0201f800, 0x001005d8, 0x1c01f000,
+       0x59300403, 0x82000580, 0x00000052, 0x02000000,
+       0x00108d85, 0x0201f800, 0x00104c19, 0x59325808,
+       0x4a025a06, 0x00000006, 0x0201f800, 0x000202da,
+       0x0201f000, 0x00107911, 0x59301804, 0x840c0520,
+       0x48026004, 0x598c000d, 0x81300580, 0x04020010,
+       0x8c0c1d20, 0x04020010, 0x42001000, 0x0010b7f6,
+       0x50081000, 0x58080002, 0x82000580, 0x00000100,
+       0x0400000e, 0x5808000c, 0x81300580, 0x02020800,
+       0x001005d8, 0x4978100c, 0x0401f003, 0x8c0c1d20,
+       0x040207dc, 0x0201f800, 0x001068d3, 0x040007d9,
+       0x0201f800, 0x001005d8, 0x0201f800, 0x00106e8e,
+       0x040007f9, 0x59300203, 0x82000c80, 0x0000000e,
+       0x02021800, 0x001005d8, 0x0c01f7bd, 0x4933c857,
+       0x4c500000, 0x4c540000, 0x4c580000, 0x592c0c07,
+       0x4806580a, 0x59cc0809, 0x48065807, 0x59cc0a08,
+       0x4806580b, 0x59c80817, 0x82040500, 0x000003ff,
+       0x800010c4, 0x8c040d14, 0x04000005, 0x59cc0002,
+       0x82000500, 0x00000003, 0x80081480, 0x82080480,
+       0x000000f1, 0x02021800, 0x001005d8, 0x480a621a,
+       0x412c0800, 0x0201f800, 0x001007d3, 0x02000800,
+       0x001005d8, 0x492c0809, 0x58040408, 0x84000552,
+       0x84000540, 0x48000c08, 0x82081400, 0x00000003,
+       0x80081104, 0x83cca400, 0x00000006, 0x832cac00,
+       0x00000004, 0x42000800, 0x00000010, 0x82080480,
+       0x00000010, 0x04021003, 0x40080800, 0x80000580,
+       0x4004b000, 0x4c000000, 0x0201f800, 0x0010ab28,
+       0x5c000000, 0x800001c0, 0x0400000d, 0x412c1000,
+       0x4c000000, 0x0201f800, 0x001007d3, 0x02000800,
+       0x001005d8, 0x492c1001, 0x832cac00, 0x00000004,
+       0x5c000000, 0x40001000, 0x0401f7e9, 0x5c00b000,
+       0x5c00a800, 0x5c00a000, 0x1c01f000, 0x4933c857,
+       0x4d2c0000, 0x4c380000, 0x59325808, 0x5930021a,
+       0x48025a08, 0x59301011, 0x800811c0, 0x04020008,
+       0x4a025a06, 0x00000000, 0x592c000b, 0x82000500,
+       0x00000c00, 0x0400000b, 0x0401f00b, 0x8c08153e,
+       0x04000006, 0x4a025a06, 0x00000007, 0x80081080,
+       0x80081000, 0x0401f003, 0x4a025a06, 0x00000015,
+       0x480a5807, 0x42000000, 0x0010bed9, 0x50007000,
+       0x5838000b, 0x80000540, 0x04020008, 0x4930700c,
+       0x4930700b, 0x58380002, 0x82000580, 0x00000000,
+       0x04020809, 0x0401f005, 0x82001400, 0x00000000,
+       0x45301000, 0x4930700b, 0x5c007000, 0x5c025800,
+       0x1c01f000, 0x4933c857, 0x592c0009, 0x40001000,
+       0x4800700a, 0x82080400, 0x00000004, 0x48007003,
+       0x592c000d, 0x592c100e, 0x48007007, 0x48087008,
+       0x592c000a, 0x592c1208, 0x80080c80, 0x04001002,
+       0x40001000, 0x82081400, 0x00000003, 0x80081104,
+       0x82080480, 0x00000010, 0x04021003, 0x80000580,
+       0x0401f003, 0x42001000, 0x00000010, 0x4800700d,
+       0x48087004, 0x800810c4, 0x48087005, 0x40381000,
+       0x0201f800, 0x00100858, 0x1c01f000, 0x4d2c0000,
+       0x0201f800, 0x001007d3, 0x02000800, 0x001005d8,
+       0x42000800, 0x0010bed9, 0x452c0800, 0x497a580b,
+       0x497a580c, 0x497a580d, 0x4a025809, 0x001097ea,
+       0x4a025802, 0x00000100, 0x4a025801, 0x00000000,
+       0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000,
+       0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c000a,
+       0x80025d40, 0x04020004, 0x585c000c, 0x4c000000,
+       0x0401f044, 0x585c0002, 0x82000580, 0x00000100,
+       0x04020022, 0x592c0801, 0x4c040000, 0x0201f800,
+       0x001007f4, 0x5c000800, 0x800409c0, 0x0400001c,
+       0x4804b80a, 0x585c100d, 0x800811c0, 0x04020005,
+       0x40065800, 0x0201f800, 0x001007fd, 0x0401f014,
+       0x82080480, 0x00000010, 0x04021003, 0x80000580,
+       0x0401f003, 0x42001000, 0x00000010, 0x4800b80d,
+       0x4808b804, 0x800810c4, 0x4808b805, 0x82040400,
+       0x00000004, 0x4800b803, 0x405c1000, 0x0201f800,
+       0x00100858, 0x0401f025, 0x0401f828, 0x585c000c,
+       0x80026540, 0x59300000, 0x80000d40, 0x04020002,
+       0x4800b80b, 0x4800b80c, 0x497a6000, 0x4c000000,
+       0x4978b80a, 0x59325808, 0x4a025a04, 0x00000103,
+       0x59300402, 0x48025c06, 0x592c100b, 0x4c080000,
+       0x0201f800, 0x000202c1, 0x0201f800, 0x0010912a,
+       0x5c001000, 0x8c081518, 0x04000004, 0x0201f800,
+       0x001091d1, 0x0401f003, 0x0201f800, 0x0002077d,
+       0x405c7000, 0x5c000000, 0x80026540, 0x04000003,
+       0x59325808, 0x0401ff78, 0x5c00b800, 0x5c025800,
+       0x5c026000, 0x1c01f000, 0x483bc857, 0x5838000a,
+       0x40025800, 0x0201f800, 0x001007fd, 0x5838000c,
+       0x80026540, 0x59300008, 0x80025d40, 0x4a025a06,
+       0x00000002, 0x1c01f000, 0x4803c857, 0x4d1c0000,
+       0x497a601c, 0x41323800, 0x40026000, 0x4d3c0000,
+       0x42027800, 0x00000005, 0x0401f83c, 0x5c027800,
+       0x411e6000, 0x59300414, 0x84000502, 0x48026414,
+       0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857,
+       0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000,
+       0x0201f800, 0x0010a942, 0x0201f800, 0x00103b25,
+       0x04000008, 0x40602800, 0x405c3000, 0x0201f800,
+       0x0010a446, 0x82000540, 0x00000001, 0x0401f002,
+       0x80000580, 0x5c00c000, 0x5c00b800, 0x1c01f000,
+       0x4803c856, 0x4d300000, 0x42026000, 0x0010d1c0,
+       0x59a8000e, 0x81640580, 0x04000016, 0x59300c06,
+       0x82040580, 0x00000001, 0x04000009, 0x82040580,
+       0x00000004, 0x04000006, 0x82040580, 0x00000010,
+       0x02000800, 0x00108cf9, 0x0401f005, 0x4807c857,
+       0x0201f800, 0x001092d7, 0x04020808, 0x83326400,
+       0x00000024, 0x41580000, 0x81300480, 0x040017e9,
+       0x5c026000, 0x1c01f000, 0x4933c857, 0x59300403,
+       0x4803c857, 0x0201f800, 0x00106c55, 0x4df00000,
+       0x59300406, 0x4803c857, 0x82000d80, 0x00000002,
+       0x04000018, 0x82000d80, 0x00000001, 0x04000009,
+       0x82000d80, 0x00000004, 0x04000006, 0x4933c856,
+       0x5c03e000, 0x02000800, 0x00106c4b, 0x0401f03c,
+       0x59300203, 0x82000d80, 0x00000001, 0x04000018,
+       0x82000d80, 0x00000002, 0x04000026, 0x82000d80,
+       0x00000005, 0x04000023, 0x0201f800, 0x001005d8,
+       0x59300203, 0x82000d80, 0x00000009, 0x0400000c,
+       0x82000d80, 0x0000000b, 0x04000009, 0x82000d80,
+       0x0000000a, 0x04000017, 0x82000d80, 0x0000000c,
+       0x04000014, 0x0201f800, 0x001005d8, 0x598c000d,
+       0x81300580, 0x04020004, 0x0201f800, 0x00106e8e,
+       0x0402000c, 0x59300004, 0x4803c857, 0x8c000520,
+       0x04000004, 0x84000520, 0x48026004, 0x0401f005,
+       0x0201f800, 0x001068d3, 0x02020800, 0x001005d8,
+       0x5c03e000, 0x02000800, 0x00106c4b, 0x59300406,
+       0x82000d80, 0x00000002, 0x04000009, 0x0201f800,
+       0x00104c19, 0x0201f800, 0x0010914e, 0x02000800,
+       0x0010801c, 0x8d3e7d00, 0x04000003, 0x0201f000,
+       0x00107911, 0x4a02621d, 0x00000001, 0x4a026403,
+       0x00000085, 0x4a026203, 0x00000009, 0x4a026406,
+       0x00000002, 0x42000800, 0x8000004b, 0x0201f000,
+       0x00020721, 0x4933c857, 0x59368c03, 0x4c180000,
+       0x59300203, 0x82003480, 0x0000000e, 0x02021800,
+       0x001005d8, 0x0c01f803, 0x5c003000, 0x1c01f000,
+       0x0010990a, 0x00109dcf, 0x00109edb, 0x0010990a,
+       0x0010990a, 0x0010990a, 0x0010990a, 0x0010990a,
+       0x0010992d, 0x0010990a, 0x0010990a, 0x0010990a,
+       0x0010990a, 0x0010990a, 0x0201f800, 0x001005d8,
+       0x4933c857, 0x42028800, 0x0000ffff, 0x813669c0,
+       0x04000002, 0x59368c03, 0x4c180000, 0x59300203,
+       0x82003480, 0x0000000e, 0x02021800, 0x001005d8,
+       0x0c01f803, 0x5c003000, 0x1c01f000, 0x00109929,
+       0x0010a180, 0x00109929, 0x00109929, 0x00109929,
+       0x00109929, 0x00109929, 0x0010a952, 0x0010a0ed,
+       0x0010a52c, 0x0010a562, 0x0010a52c, 0x0010a562,
+       0x00109929, 0x0201f800, 0x001005d8, 0x0201f800,
+       0x001005d8, 0x83383480, 0x00000051, 0x02021800,
+       0x001005d8, 0x41380000, 0x493bc857, 0x4d1c0000,
+       0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800,
+       0x1c01f000, 0x0010998a, 0x00109b69, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x00109b74, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a,
+       0x001099ac, 0x001099f5, 0x00109a0c, 0x00109a62,
+       0x00109ac6, 0x00109b04, 0x00109b34, 0x0010998a,
+       0x0010998a, 0x00109b7c, 0x0010998a, 0x0010998a,
+       0x00109b8a, 0x00109b93, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x00109c15,
+       0x0010998a, 0x0010998a, 0x00109a9a, 0x0010998a,
+       0x0010998a, 0x00109bec, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x00109c23, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x00109c6c, 0x0010998a, 0x0010998a,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a,
+       0x00109cb9, 0x0010998a, 0x00109ce5, 0x00109cf0,
+       0x0010998a, 0x0010998a, 0x0010998c, 0x00109cfb,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x0010999b,
+       0x0010998a, 0x0010998a, 0x0010998a, 0x00109d02,
+       0x00109d0a, 0x00109d28, 0x0201f800, 0x001005d8,
+       0x4933c857, 0x0201f800, 0x0010a592, 0x040203a4,
+       0x0201f800, 0x0010210a, 0x040203a1, 0x59cc0407,
+       0x4802601c, 0x4a026403, 0x00000045, 0x4a026203,
+       0x00000001, 0x0201f000, 0x0010672b, 0x4933c857,
+       0x0201f800, 0x0010a592, 0x04020395, 0x0201f800,
+       0x0010210a, 0x04020392, 0x0401fbce, 0x040201a0,
+       0x59cc0007, 0x4802601c, 0x4a026403, 0x0000004a,
+       0x4a026203, 0x00000001, 0x0201f000, 0x0010672b,
+       0x4933c857, 0x0201f800, 0x0010210a, 0x04020009,
+       0x0201f800, 0x001048ec, 0x04020006, 0x82000500,
+       0x00000009, 0x82000580, 0x00000008, 0x04020008,
+       0x4a026403, 0x00000009, 0x4a02641a, 0x00000009,
+       0x4a02621a, 0x00000000, 0x0401f1b2, 0x0201f800,
+       0x001048c1, 0x0201f800, 0x00104a09, 0x04000021,
+       0x0201f800, 0x001049ed, 0x0400001e, 0x0201f800,
+       0x0010a252, 0x04020025, 0x42028000, 0x00000029,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x5c027800, 0x0201f800, 0x0010462a, 0x836c0580,
+       0x00000002, 0x04020004, 0x59a8001b, 0x80000000,
+       0x4803501b, 0x4a026403, 0x00000008, 0x42003000,
+       0x00000003, 0x0201f800, 0x00103b25, 0x04000191,
+       0x4a026203, 0x00000007, 0x41782800, 0x0401f180,
+       0x0201f800, 0x0010a3da, 0x040207e1, 0x4a026403,
+       0x00000009, 0x4a02641a, 0x0000000e, 0x4a02621a,
+       0x00001900, 0x0401f183, 0x4a026403, 0x00000009,
+       0x4a02641a, 0x00000003, 0x4a02621a, 0x00000f00,
+       0x0401f17c, 0x4933c857, 0x0201f800, 0x0010210a,
+       0x0402033b, 0x0201f800, 0x001048ec, 0x04020338,
+       0x493a6403, 0x0201f800, 0x0010a22d, 0x04020006,
+       0x42003000, 0x00000005, 0x4a026403, 0x00000006,
+       0x0401f7d9, 0x4a026403, 0x00000007, 0x4a02641a,
+       0x00000009, 0x4a02621a, 0x00000000, 0x0401f165,
+       0x4933c857, 0x0201f800, 0x001048ec, 0x04020324,
+       0x0201f800, 0x0010a592, 0x02000800, 0x0010210a,
+       0x0402031f, 0x0201f800, 0x00104a09, 0x04020005,
+       0x42027800, 0x00000001, 0x0201f800, 0x00104567,
+       0x0201f800, 0x001049fc, 0x0402002b, 0x59cc0206,
+       0x82003500, 0x00000003, 0x0402002e, 0x82003480,
+       0x00000014, 0x0400102b, 0x5934300a, 0x84183516,
+       0x82000580, 0x00000014, 0x04020002, 0x84183556,
+       0x481a680a, 0x59cc0406, 0x82000500, 0x00000003,
+       0x04020020, 0x0201f800, 0x0010a29f, 0x04020028,
+       0x0201f800, 0x001049e7, 0x0402000c, 0x417a7800,
+       0x0201f800, 0x001020a1, 0x42003000, 0x00000006,
+       0x0201f800, 0x0010a93a, 0x42000000, 0x0010b865,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x0010468d,
+       0x4a026403, 0x0000000a, 0x42003000, 0x00000020,
+       0x0401f795, 0x4a026403, 0x0000000b, 0x4a02641a,
+       0x00000009, 0x4a02621a, 0x00001e00, 0x0401f121,
+       0x42000000, 0x0010b860, 0x0201f800, 0x0010aa47,
+       0x4a026403, 0x0000000b, 0x4a02641a, 0x00000007,
+       0x4a02621a, 0x00000000, 0x0401f116, 0x4a026403,
+       0x0000000b, 0x4a02641a, 0x00000003, 0x4a02621a,
+       0x00000000, 0x0401f10f, 0x4933c857, 0x0201f800,
+       0x001048ec, 0x040202ce, 0x0201f800, 0x0010a592,
+       0x040202cb, 0x0201f800, 0x0010210a, 0x040202c8,
+       0x59cc0206, 0x82003500, 0x00000003, 0x0402001d,
+       0x82003480, 0x00000014, 0x0400101a, 0x59cc0406,
+       0x82000500, 0x00000003, 0x04020016, 0x59340400,
+       0x82000580, 0x00000707, 0x04000019, 0x417a7800,
+       0x0201f800, 0x001020a1, 0x42003000, 0x0000000a,
+       0x0201f800, 0x0010a93a, 0x42000000, 0x0010b862,
+       0x0201f800, 0x0010aa47, 0x4a026403, 0x0000000c,
+       0x41782800, 0x42003000, 0x00000021, 0x0401f752,
+       0x4a026403, 0x0000000d, 0x4a02641a, 0x00000007,
+       0x4a02621a, 0x00000000, 0x0401f0de, 0x4a026403,
+       0x0000000d, 0x4a02641a, 0x00000009, 0x4a02621a,
+       0x00001e00, 0x0401f0d7, 0x4933c857, 0x0201f800,
+       0x001048ec, 0x04020296, 0x0201f800, 0x0010a592,
+       0x04020293, 0x0201f800, 0x0010210a, 0x04020290,
+       0x0401facc, 0x0402001a, 0x493a6403, 0x4c5c0000,
+       0x0401fad2, 0x0402000e, 0x4a026403, 0x0000002e,
+       0x405c2800, 0x42003000, 0x00000024, 0x0201f800,
+       0x00103b25, 0x0400000c, 0x4a026203, 0x00000007,
+       0x405c2800, 0x5c00b800, 0x0401f0ad, 0x4a026403,
+       0x0000000d, 0x4a02641a, 0x00000007, 0x4a02621a,
+       0x00000000, 0x5c00b800, 0x0401f0b2, 0x4a026403,
+       0x0000000d, 0x4a02641a, 0x00000009, 0x4a02621a,
+       0x00001e00, 0x0401f0ab, 0x4933c857, 0x0201f800,
+       0x001048ec, 0x040206ef, 0x59a80026, 0x82000500,
+       0x00000009, 0x82000580, 0x00000008, 0x040006e9,
+       0x0201f800, 0x001049fc, 0x0402002d, 0x0201f800,
+       0x0010a2a7, 0x04020007, 0x4a026403, 0x0000000e,
+       0x41782800, 0x42003000, 0x00000052, 0x0401f702,
+       0x4933c857, 0x42003000, 0x00000003, 0x0201f800,
+       0x0010a942, 0x4d3c0000, 0x417a7800, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42000000, 0x0010b864,
+       0x0201f800, 0x0010aa47, 0x59340200, 0x84000558,
+       0x48026a00, 0x42000800, 0x0000000b, 0x0201f800,
+       0x00104571, 0x0201f800, 0x00103b25, 0x04000076,
+       0x42003000, 0x00000007, 0x0401f062, 0x4933c857,
+       0x4a026403, 0x0000000f, 0x4a02641a, 0x00000003,
+       0x4a02621a, 0x00001e00, 0x0401f072, 0x59340400,
+       0x82000580, 0x00000703, 0x040007f5, 0x0401f040,
+       0x4933c857, 0x0201f800, 0x001048ec, 0x0402022c,
+       0x59a80026, 0x82000500, 0x00000009, 0x82000580,
+       0x00000008, 0x04000226, 0x0201f800, 0x001049f3,
+       0x0402002f, 0x0201f800, 0x0010a2c8, 0x02000800,
+       0x0010a252, 0x04020007, 0x4a026403, 0x00000010,
+       0x41782800, 0x42003000, 0x00000050, 0x0401f6c2,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x5c027800, 0x42003000, 0x00000003, 0x0201f800,
+       0x0010a942, 0x42000000, 0x0010b864, 0x0201f800,
+       0x0010aa47, 0x59340200, 0x84000558, 0x48026a00,
+       0x0401f7c5, 0x4a026403, 0x00000011, 0x4a02641a,
+       0x00000003, 0x4a02621a, 0x00001e00, 0x0401f03d,
+       0x4933c857, 0x0201f800, 0x0010210a, 0x02000800,
+       0x0010a592, 0x040201fa, 0x0401fa36, 0x04020008,
+       0x4a026403, 0x00000012, 0x0401f032, 0x59340400,
+       0x82000580, 0x00000703, 0x040007eb, 0x4d3c0000,
+       0x417a7800, 0x42028000, 0x00000029, 0x0201f800,
+       0x0010203c, 0x5c027800, 0x42003000, 0x00000017,
+       0x0201f800, 0x0010a942, 0x42000000, 0x0010b864,
+       0x0201f800, 0x0010aa47, 0x0201f800, 0x00103b25,
+       0x04000015, 0x42003000, 0x00000006, 0x41782800,
+       0x42028000, 0x00000029, 0x4933c857, 0x4a026403,
+       0x00000001, 0x4a026203, 0x00000007, 0x0201f800,
+       0x0010a974, 0x0201f000, 0x0010a43e, 0x42028000,
+       0x00000046, 0x0201f800, 0x0010a974, 0x0201f000,
+       0x0010a43e, 0x4933c857, 0x4a026403, 0x00000001,
+       0x42000800, 0x0000000b, 0x0201f800, 0x00104571,
+       0x4a026203, 0x00000001, 0x0201f000, 0x0010672b,
+       0x4933c857, 0x42000800, 0x00000009, 0x0201f800,
+       0x00104571, 0x4a026403, 0x00000005, 0x0401f7f5,
+       0x0201f800, 0x0010a592, 0x040201b5, 0x0201f800,
+       0x0010210a, 0x040201b2, 0x0401f9ee, 0x040207c0,
+       0x4a026403, 0x00000020, 0x4a026203, 0x00000001,
+       0x0201f000, 0x0010672b, 0x0201f800, 0x0010210a,
+       0x040201a7, 0x4a026403, 0x00000023, 0x4a026203,
+       0x00000001, 0x0201f000, 0x0010672b, 0x0201f800,
+       0x0010a592, 0x02000800, 0x0010210a, 0x0402019c,
+       0x0401f9d8, 0x040207aa, 0x40300800, 0x59a81010,
+       0x59cc0007, 0x82000500, 0x00ffffff, 0x80080580,
+       0x04000019, 0x59cc1408, 0x0201f800, 0x0010902c,
+       0x0400002d, 0x59cc0c08, 0x4d300000, 0x0201f800,
+       0x00105dd7, 0x41323800, 0x5c026000, 0x04000026,
+       0x591c0202, 0x82000580, 0x0000ffff, 0x04000005,
+       0x59cc1208, 0x591c0202, 0x80080580, 0x0402001e,
+       0x591c0406, 0x82000580, 0x00000007, 0x0402001a,
+       0x0401f02c, 0x59cc1208, 0x82080580, 0x0000ffff,
+       0x0400000c, 0x0201f800, 0x00109410, 0x04000012,
+       0x59cc1408, 0x591c0202, 0x80080580, 0x0402000e,
+       0x591c0009, 0x81340580, 0x04000016, 0x0401f00a,
+       0x59cc1408, 0x417a7800, 0x0201f800, 0x0010a405,
+       0x04020010, 0x59cc1208, 0x82080580, 0x0000ffff,
+       0x04000019, 0x4a026403, 0x00000026, 0x4a02621a,
+       0x00001700, 0x59cc1204, 0x82081580, 0x0000ffff,
+       0x04020798, 0x4a026403, 0x00000025, 0x0401f795,
+       0x591c0406, 0x82000580, 0x00000007, 0x040207f2,
+       0x591c0403, 0x82000580, 0x00000024, 0x04020006,
+       0x4d300000, 0x411e6000, 0x0201f800, 0x0002077d,
+       0x5c026000, 0x4a026403, 0x00000025, 0x0401f785,
+       0x4933c857, 0x4d3c0000, 0x42027800, 0x00000001,
+       0x0201f800, 0x00104567, 0x5c027800, 0x4c580000,
+       0x4200b000, 0x00000002, 0x83a81c00, 0x00000002,
+       0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a,
+       0x5c00b000, 0x04000004, 0x4a026403, 0x00000031,
+       0x0401f770, 0x0201f800, 0x00107911, 0x0201f800,
+       0x0010513b, 0x0402000f, 0x0201f800, 0x00105149,
+       0x04020008, 0x4a035033, 0x00000001, 0x4202d800,
+       0x00000001, 0x0201f800, 0x001050a2, 0x0401f005,
+       0x42000000, 0x00000001, 0x0201f800, 0x00105113,
+       0x1c01f000, 0x0201f800, 0x0010210a, 0x0402011c,
+       0x0401f958, 0x0402072a, 0x493a6403, 0x0401f996,
+       0x04020004, 0x4a026403, 0x0000002b, 0x0401f751,
+       0x4a026403, 0x0000002c, 0x0401f74e, 0x4933c857,
+       0x0201f800, 0x0010210a, 0x0402010d, 0x0201f800,
+       0x001049e7, 0x04020740, 0x0201f800, 0x001048d9,
+       0x0400003c, 0x59cc0408, 0x48026419, 0x59cc0208,
+       0x48026219, 0x59cc0807, 0x59340002, 0x82000500,
+       0x00ffffff, 0x80040580, 0x04000012, 0x59a80010,
+       0x80040580, 0x04020021, 0x59cc1408, 0x0201f800,
+       0x00109410, 0x04000023, 0x0201f800, 0x0010a4ca,
+       0x04000020, 0x0201f800, 0x0010a921, 0x0400001d,
+       0x491e601e, 0x4a026403, 0x00000036, 0x0401f0e6,
+       0x59cc1208, 0x82080580, 0x0000ffff, 0x04000009,
+       0x0201f800, 0x00109410, 0x04000012, 0x591c0202,
+       0x59cc0c08, 0x80040580, 0x0402000e, 0x0401f7eb,
+       0x59cc1408, 0x41327800, 0x0201f800, 0x0010a405,
+       0x04000008, 0x0401f7e5, 0x4803c856, 0x4a02641a,
+       0x00000009, 0x4a02621a, 0x00001500, 0x0401f006,
+       0x4803c856, 0x4a02641a, 0x00000003, 0x4a02621a,
+       0x00001700, 0x4a026403, 0x00000037, 0x0401f0c6,
+       0x4803c856, 0x4a026403, 0x00000012, 0x0401f0c2,
+       0x4933c857, 0x0201f800, 0x0010210a, 0x040200c4,
+       0x0201f800, 0x001049e7, 0x040206f7, 0x0201f800,
+       0x001048d9, 0x0400003e, 0x59cc0407, 0x48026419,
+       0x59cc1207, 0x480a6219, 0x82080580, 0x0000ffff,
+       0x04000005, 0x0201f800, 0x00109410, 0x0400002c,
+       0x0401f006, 0x59cc1407, 0x41327800, 0x0201f800,
+       0x0010a405, 0x04000026, 0x59cc0c07, 0x591c0202,
+       0x80040580, 0x04020022, 0x4d300000, 0x411e6000,
+       0x0201f800, 0x00108bd7, 0x5c026000, 0x59cc0c09,
+       0x82040d00, 0x0000ff00, 0x840409c0, 0x0201f800,
+       0x0010a921, 0x04000016, 0x82040580, 0x00000001,
+       0x0400000a, 0x82040580, 0x00000005, 0x04000004,
+       0x82040580, 0x00000007, 0x04020007, 0x591c0008,
+       0x80000540, 0x04000004, 0x59cc2808, 0x0201f000,
+       0x0010a4de, 0x4803c856, 0x4a02641a, 0x00000009,
+       0x4a02621a, 0x00002a00, 0x0401f006, 0x4803c856,
+       0x4a02641a, 0x00000003, 0x4a02621a, 0x00000300,
+       0x4a026403, 0x0000003b, 0x0401f07b, 0x4803c856,
+       0x4a02641a, 0x0000000b, 0x4a02621a, 0x00000000,
+       0x0401f7f8, 0x4c080000, 0x0201f800, 0x001048ec,
+       0x04000026, 0x0201f800, 0x001048c1, 0x0201f800,
+       0x0010a601, 0x0402001e, 0x59a80026, 0x82000540,
+       0x00000003, 0x48035026, 0x59a8001d, 0x800000d0,
+       0x59a80810, 0x82040d00, 0x000000ff, 0x80041540,
+       0x480b5010, 0x42000800, 0x00000003, 0x0201f800,
+       0x00106c78, 0x497b5028, 0x0201f800, 0x00103b25,
+       0x04000003, 0x4a032804, 0x000007d0, 0x8c00050a,
+       0x0402000a, 0x0201f800, 0x0002077d, 0x0201f800,
+       0x00101e45, 0x5c001000, 0x1c01f000, 0x0201f800,
+       0x0010a623, 0x0401f7fc, 0x5c001000, 0x0201f000,
+       0x0002077d, 0x0201f800, 0x0010210a, 0x0402004c,
+       0x0201f800, 0x0010a628, 0x4a026403, 0x00000047,
+       0x4a026203, 0x00000001, 0x0201f000, 0x0010672b,
+       0x0201f800, 0x0010210a, 0x04020041, 0x0201f800,
+       0x0010a628, 0x4a026403, 0x00000047, 0x4a026203,
+       0x00000001, 0x0201f000, 0x0010672b, 0x0201f800,
+       0x0010210a, 0x04020036, 0x0201f800, 0x0010a628,
+       0x0201f000, 0x0002077d, 0x0401f834, 0x04000030,
+       0x4a026403, 0x0000004e, 0x4a026203, 0x00000001,
+       0x0201f000, 0x0010672b, 0x4a026403, 0x0000004f,
+       0x497a601c, 0x59cc0a06, 0x82040d00, 0x000000ff,
+       0x800409c0, 0x0400065f, 0x82040580, 0x00000001,
+       0x04020005, 0x59cc0808, 0x59a80005, 0x80040580,
+       0x04000658, 0x82040580, 0x00000002, 0x0402000a,
+       0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002,
+       0x83341c00, 0x00000006, 0x0201f800, 0x0010855a,
+       0x0400064c, 0x4a02601c, 0x00000001, 0x0401f649,
+       0x4a026403, 0x00000050, 0x59cc0207, 0x4802601c,
+       0x0401f644, 0x4a026203, 0x00000001, 0x42000800,
+       0x80000040, 0x0201f000, 0x00020721, 0x4803c857,
+       0x0201f000, 0x0002077d, 0x4d2c0000, 0x4c500000,
+       0x4c580000, 0x4c540000, 0x59a80016, 0x82000c80,
+       0x00000829, 0x04021029, 0x0201f800, 0x001007d3,
+       0x04000026, 0x492e6008, 0x59a80016, 0x80000104,
+       0x48025802, 0x83cca400, 0x00000006, 0x82000c80,
+       0x0000000b, 0x04001013, 0x4a025811, 0x0000000b,
+       0x4200b000, 0x0000000b, 0x832c0400, 0x00000005,
+       0x4000a800, 0x0201f800, 0x0010ab17, 0x412c7000,
+       0x0201f800, 0x001007d3, 0x04000010, 0x492c7001,
+       0x40040000, 0x800409c0, 0x04000009, 0x0401f7ec,
+       0x48025811, 0x4000b000, 0x832c0400, 0x00000005,
+       0x4000a800, 0x0201f800, 0x0010ab17, 0x82000540,
+       0x00000001, 0x0401f006, 0x497b5016, 0x59325808,
+       0x0201f800, 0x001007fd, 0x80000580, 0x5c00a800,
+       0x5c00b000, 0x5c00a000, 0x5c025800, 0x1c01f000,
+       0x4d340000, 0x59326809, 0x59343400, 0x4933c857,
+       0x4937c857, 0x481bc857, 0x0201f800, 0x001049f3,
+       0x5c026800, 0x1c01f000, 0x4933c857, 0x4c5c0000,
+       0x4d3c0000, 0x0401f840, 0x0402002c, 0x59cc0207,
+       0x82000d00, 0x0000ff00, 0x900411c0, 0x59cc000a,
+       0x82000500, 0x00ffffff, 0x80081540, 0x480a601c,
+       0x8c040d18, 0x0400000e, 0x42003000, 0x00000008,
+       0x0201f800, 0x0010a932, 0x42000000, 0x0010b863,
+       0x0201f800, 0x0010aa47, 0x4200b800, 0x00000002,
+       0x42027800, 0x00000001, 0x0401f011, 0x4178b800,
+       0x8c040d1a, 0x04000011, 0x59cc000a, 0x0201f800,
+       0x00105c9a, 0x0402000d, 0x42003000, 0x00000009,
+       0x0201f800, 0x0010a93a, 0x42000000, 0x0010b863,
+       0x0201f800, 0x0010aa47, 0x417a7800, 0x0201f800,
+       0x001020a1, 0x0401f004, 0x82000540, 0x00000001,
+       0x0401f002, 0x80000580, 0x5c027800, 0x5c00b800,
+       0x1c01f000, 0x4933c857, 0x59cc0206, 0x82000480,
+       0x00000010, 0x04021006, 0x4a02621a, 0x00000000,
+       0x82000540, 0x00000001, 0x0401f002, 0x80000580,
+       0x1c01f000, 0x4933c857, 0x4a02621a, 0x00000000,
+       0x59cc0407, 0x82000500, 0x0000ff00, 0x82000580,
+       0x00000800, 0x04020009, 0x59cc0006, 0x82000500,
+       0x00ff0000, 0x82000d80, 0x00140000, 0x04000003,
+       0x82000d80, 0x00100000, 0x1c01f000, 0x4933c857,
+       0x59300403, 0x82003480, 0x00000051, 0x02021800,
+       0x001005d8, 0x83383580, 0x00000013, 0x04020003,
+       0x4803c857, 0x0c01f012, 0x83383580, 0x00000027,
+       0x04000005, 0x83383580, 0x00000014, 0x02020800,
+       0x001005d8, 0x0201f800, 0x001048c1, 0x42000800,
+       0x00000007, 0x0201f800, 0x00104571, 0x0201f800,
+       0x00106bbf, 0x0201f000, 0x00107911, 0x00109e3c,
+       0x00109e45, 0x00109e3c, 0x00109e3c, 0x00109e3c,
+       0x00109e45, 0x00109e50, 0x00109ecd, 0x00109e95,
+       0x00109ecd, 0x00109ead, 0x00109ecd, 0x00109ebe,
+       0x00109ecd, 0x00109ec6, 0x00109ecd, 0x00109ec6,
+       0x00109ecd, 0x00109ecd, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109e45, 0x00109e3c, 0x00109ecd,
+       0x00109e3c, 0x00109e3c, 0x00109ecd, 0x00109e3c,
+       0x00109eca, 0x00109ecd, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109e3c, 0x00109ecd, 0x00109ecd,
+       0x00109e3c, 0x00109ec3, 0x00109ecd, 0x00109e3c,
+       0x00109e4a, 0x00109e3c, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109ec9, 0x00109ecd, 0x00109e3c,
+       0x00109e3c, 0x00109ecd, 0x00109ecd, 0x00109e3c,
+       0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c,
+       0x00109e3e, 0x00109e3c, 0x00109e3e, 0x00109e3c,
+       0x00109e3c, 0x00109e3e, 0x00109e3c, 0x00109e3c,
+       0x00109e3c, 0x00109e3e, 0x00109e3e, 0x00109e3e,
+       0x0201f800, 0x001005d8, 0x4d2c0000, 0x59325808,
+       0x0201f800, 0x001007fd, 0x5c025800, 0x0201f000,
+       0x0002077d, 0x59a80037, 0x48026206, 0x4a026203,
+       0x00000002, 0x1c01f000, 0x4d3c0000, 0x417a7800,
+       0x0201f800, 0x00104567, 0x5c027800, 0x0401f07e,
+       0x42000800, 0x00000007, 0x0201f800, 0x00104571,
+       0x59a80026, 0x8c000508, 0x04000012, 0x59326809,
+       0x4c580000, 0x4200b000, 0x00000002, 0x83a81c00,
+       0x00000002, 0x83341400, 0x00000006, 0x0201f800,
+       0x0010855a, 0x80000540, 0x5c00b000, 0x0402006a,
+       0x59340200, 0x8400051a, 0x48026a00, 0x0401f01b,
+       0x599c0017, 0x8c00050a, 0x04020063, 0x4d3c0000,
+       0x417a7800, 0x0201f800, 0x00104567, 0x5c027800,
+       0x42000800, 0x00000007, 0x0201f800, 0x00104571,
+       0x59340212, 0x82000500, 0x0000ff00, 0x04000056,
+       0x599c0019, 0x8c00050e, 0x04020053, 0x416c0000,
+       0x82000580, 0x00000002, 0x04020004, 0x59a8001b,
+       0x80000000, 0x4803501b, 0x42000800, 0x00000003,
+       0x0201f800, 0x00104571, 0x4a026406, 0x00000001,
+       0x4a026203, 0x00000001, 0x4a026403, 0x00000002,
+       0x0201f800, 0x0010672b, 0x4ce80000, 0x4201d000,
+       0x00000001, 0x0201f800, 0x00105fae, 0x5c01d000,
+       0x1c01f000, 0x0201f800, 0x001049f3, 0x04000036,
+       0x0201f800, 0x0010645e, 0x42000800, 0x00000004,
+       0x0201f800, 0x00104571, 0x0201f800, 0x0010a96a,
+       0x0402002d, 0x42000800, 0x00000005, 0x0201f800,
+       0x00104571, 0x4a026406, 0x00000001, 0x4a026203,
+       0x00000001, 0x4a026403, 0x00000003, 0x0201f000,
+       0x0010672b, 0x42000800, 0x00000006, 0x0401f820,
+       0x59303009, 0x599c0017, 0x8c00050a, 0x0402001a,
+       0x59a80026, 0x8c000508, 0x04000017, 0x0201f800,
+       0x001049e7, 0x04000014, 0x59a8001b, 0x80000000,
+       0x4803501b, 0x0401f7c5, 0x42000800, 0x00000004,
+       0x0201f800, 0x00104571, 0x0401f792, 0x42000800,
+       0x00000004, 0x0401f006, 0x0201f800, 0x001048c1,
+       0x0401f005, 0x0401f004, 0x0401f003, 0x0201f800,
+       0x00104571, 0x0201f000, 0x0002077d, 0x4933c857,
+       0x4807c857, 0x0201f800, 0x00104571, 0x4d3c0000,
+       0x417a7800, 0x0201f800, 0x00104567, 0x5c027800,
+       0x0201f800, 0x00102074, 0x1c01f000, 0x4933c857,
+       0x59340400, 0x80000110, 0x82003480, 0x0000000c,
+       0x02021800, 0x001005d8, 0x83383580, 0x00000015,
+       0x04020002, 0x0c01f006, 0x83383580, 0x00000016,
+       0x02020800, 0x001005d8, 0x0c01f00d, 0x001080b8,
+       0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8,
+       0x001080b8, 0x00109f30, 0x00109f03, 0x001080b8,
+       0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8,
+       0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8,
+       0x001080b8, 0x00109f30, 0x00109f37, 0x001080b8,
+       0x001080b8, 0x001080b8, 0x001080b8, 0x4933c857,
+       0x599c0017, 0x8c00050a, 0x0402001b, 0x813669c0,
+       0x04000019, 0x59340212, 0x82000500, 0x0000ff00,
+       0x04000015, 0x599c0019, 0x8c00050e, 0x04020012,
+       0x4d3c0000, 0x417a7800, 0x0201f800, 0x00104567,
+       0x5c027800, 0x42000800, 0x00000003, 0x0201f800,
+       0x00104571, 0x4a026406, 0x00000001, 0x4a026203,
+       0x00000001, 0x4a026403, 0x00000002, 0x0201f000,
+       0x0010672b, 0x59cc0001, 0x0201f800, 0x00105c9a,
+       0x0402000b, 0x0201f800, 0x00020245, 0x02020000,
+       0x0002077d, 0x59345002, 0x0201f800, 0x001042b4,
+       0x482a6802, 0x0201f000, 0x0002077d, 0x1c01f000,
+       0x4933c857, 0x59303403, 0x82183580, 0x0000001e,
+       0x02000000, 0x0002077d, 0x1c01f000, 0x4933c857,
+       0x0201f800, 0x001083df, 0x02020000, 0x0002077d,
+       0x4a026203, 0x00000001, 0x4a026403, 0x00000001,
+       0x0201f000, 0x0010672b, 0x493bc857, 0x83380580,
+       0x00000051, 0x0402000b, 0x0201f800, 0x00106f60,
+       0x02020000, 0x00107974, 0x59300203, 0x82000580,
+       0x00000002, 0x0400006d, 0x0201f800, 0x001005d8,
+       0x83380580, 0x00000027, 0x04000014, 0x83380580,
+       0x00000048, 0x04000006, 0x83380580, 0x00000014,
+       0x0400000e, 0x02020800, 0x001005d8, 0x0201f800,
+       0x00106f60, 0x02020000, 0x00107974, 0x59300203,
+       0x82000580, 0x00000004, 0x02000000, 0x0002086e,
+       0x0201f800, 0x001005d8, 0x59300403, 0x82000c80,
+       0x00000044, 0x02021800, 0x001005d8, 0x82000480,
+       0x00000040, 0x02001800, 0x001005d8, 0x40027000,
+       0x4803c857, 0x0c01f001, 0x00109f76, 0x00109f78,
+       0x00109f78, 0x00109f93, 0x0201f800, 0x001005d8,
+       0x0201f800, 0x00106bbf, 0x59325808, 0x812e59c0,
+       0x04000016, 0x832c0500, 0x00ff0000, 0x04000013,
+       0x4a026203, 0x00000002, 0x59326809, 0x59340200,
+       0x8c00050e, 0x0402000d, 0x42028000, 0x00000004,
+       0x0201f800, 0x0010a3ef, 0x497a6008, 0x59300206,
+       0x80000540, 0x04020003, 0x59a80038, 0x48026206,
+       0x4a026203, 0x00000007, 0x1c01f000, 0x0201f800,
+       0x00106bbf, 0x0201f800, 0x00109037, 0x02000000,
+       0x00107911, 0x59325808, 0x0201f800, 0x001007f4,
+       0x0201f000, 0x00107911, 0x0201f800, 0x001005d8,
+       0x59325808, 0x592c040a, 0x8c000502, 0x04000007,
+       0x4a026203, 0x00000007, 0x42027000, 0x00000043,
+       0x0201f000, 0x000207a1, 0x4a026203, 0x00000004,
+       0x1c01f000, 0x0201f800, 0x0010a597, 0x02000000,
+       0x0002086c, 0x1c01f000, 0x4a026203, 0x00000001,
+       0x4a026403, 0x00000041, 0x42027800, 0x80002042,
+       0x0201f000, 0x00020721, 0x83380580, 0x00000051,
+       0x04000006, 0x83380580, 0x00000041, 0x02020800,
+       0x001005d8, 0x1c01f000, 0x0201f800, 0x000206fd,
+       0x0201f800, 0x0010a5df, 0x0201f000, 0x0002077d,
+       0x83380480, 0x00000050, 0x02021800, 0x001005d8,
+       0x83380480, 0x00000049, 0x02001800, 0x001005d8,
+       0x0c01f001, 0x00109fda, 0x00109ffb, 0x00109fd8,
+       0x00109fd8, 0x00109fd8, 0x00109fd8, 0x00109ffb,
+       0x0201f800, 0x001005d8, 0x59325808, 0x592c040a,
+       0x8c00051e, 0x0400000d, 0x82000d00, 0x000000c0,
+       0x82040d80, 0x00000080, 0x0400000d, 0x59300804,
+       0x8c040d18, 0x0402000a, 0x42027000, 0x00000041,
+       0x0201f000, 0x0002088d, 0x4a026203, 0x00000007,
+       0x497a6206, 0x0201f000, 0x000206fd, 0x59325808,
+       0x592c0c0a, 0x8c040d1a, 0x04020005, 0x0201f800,
+       0x000206fd, 0x0201f000, 0x0002077d, 0x0201f800,
+       0x0010a597, 0x040007fa, 0x1c01f000, 0x0201f800,
+       0x00106b8a, 0x59325808, 0x59326809, 0x59340200,
+       0x8c00050e, 0x0400000e, 0x592c040a, 0x82000500,
+       0x000000c0, 0x82000580, 0x00000080, 0x04000005,
+       0x592c000f, 0x59301815, 0x800c1c80, 0x480e6015,
+       0x4a026203, 0x00000002, 0x0401f00d, 0x42028000,
+       0x00000004, 0x0401fbde, 0x59300206, 0x80000540,
+       0x04020004, 0x59a80038, 0x800000c2, 0x48026206,
+       0x497a6008, 0x4a026203, 0x00000007, 0x1c01f000,
+       0x4a026203, 0x00000007, 0x497a6206, 0x0201f000,
+       0x000206fd, 0x4a026203, 0x00000007, 0x497a6206,
+       0x0201f000, 0x000206f8, 0x59300414, 0x8c00051c,
+       0x02020000, 0x0002087e, 0x59325808, 0x592c200f,
+       0x40080000, 0x80102480, 0x59300015, 0x80102400,
+       0x48126015, 0x0201f000, 0x0002087e, 0x8c040d0e,
+       0x0402000a, 0x4a026203, 0x00000006, 0x0401f823,
+       0x5930001f, 0x80000540, 0x02020800, 0x00100d7c,
+       0x0201f000, 0x000206f8, 0x4a026203, 0x00000002,
+       0x1c01f000, 0x42000800, 0x00000001, 0x0201f800,
+       0x00100d7c, 0x82040580, 0x00000001, 0x02000000,
+       0x00020885, 0x0401f7d8, 0x59300414, 0x8c00051c,
+       0x04000006, 0x0201f800, 0x00100b63, 0x02000000,
+       0x00020877, 0x1c01f000, 0x59300011, 0x80000540,
+       0x04020005, 0x0201f800, 0x00100b63, 0x02000000,
+       0x00020877, 0x1c01f000, 0x492fc857, 0x480bc857,
+       0x8c08153e, 0x04000006, 0x80081080, 0x80081000,
+       0x42000800, 0x00000009, 0x0401f003, 0x42000800,
+       0x00000015, 0x480a580b, 0x1c01f000, 0x83380580,
+       0x00000013, 0x04000005, 0x83380580, 0x00000014,
+       0x02020800, 0x001005d8, 0x59300414, 0x8c000516,
+       0x02000800, 0x001005d8, 0x1c01f000, 0x0201f800,
+       0x001005d8, 0x59300008, 0x80000540, 0x02020800,
+       0x001005d8, 0x1c01f000, 0x59300414, 0x8c000516,
+       0x02000800, 0x001005d8, 0x1c01f000, 0x4a026203,
+       0x00000004, 0x493a6403, 0x42000800, 0x80002001,
+       0x0201f000, 0x00020721, 0x4a026203, 0x00000003,
+       0x493a6403, 0x0201f800, 0x000200c9, 0x59325808,
+       0x592c040a, 0x8c00051e, 0x04000012, 0x82000500,
+       0x000000c0, 0x82000580, 0x00000080, 0x04000011,
+       0x59300414, 0x8c000512, 0x0402000a, 0x8c000510,
+       0x04020008, 0x592c040c, 0x80000540, 0x04020005,
+       0x82080d40, 0x80003065, 0x0201f000, 0x00106721,
+       0x82080d40, 0x80002065, 0x0201f000, 0x00106721,
+       0x82080d40, 0x80002042, 0x0201f000, 0x00106721,
+       0x4933c857, 0x493bc857, 0x83380480, 0x00000044,
+       0x02021800, 0x001005d8, 0x83380480, 0x00000041,
+       0x02001800, 0x001005d8, 0x0c01f001, 0x0010a0b6,
+       0x0010a0c6, 0x0010a0db, 0x59325808, 0x592c040a,
+       0x8c00051e, 0x0400001d, 0x82001d00, 0x000000c0,
+       0x820c1d80, 0x000000c0, 0x04000018, 0x4a026203,
+       0x00000001, 0x493a6403, 0x42000800, 0x80002042,
+       0x0201f000, 0x00020721, 0x59325808, 0x592c040a,
+       0x8c00051e, 0x0400000d, 0x82001d00, 0x000000c0,
+       0x820c1d80, 0x000000c0, 0x04000008, 0x4a026203,
+       0x00000001, 0x493a6403, 0x42000800, 0x80002001,
+       0x0201f000, 0x00020721, 0x497a6008, 0x497a6206,
+       0x42028000, 0x00000004, 0x0401f315, 0x59325808,
+       0x592c040a, 0x8c00051e, 0x040007f8, 0x82001d00,
+       0x000000c0, 0x820c1d80, 0x000000c0, 0x040007f3,
+       0x4a026203, 0x00000003, 0x493a6403, 0x0201f800,
+       0x000200c9, 0x82080d40, 0x80002065, 0x0201f000,
+       0x00106721, 0x4933c857, 0x493bc857, 0x83380580,
+       0x00000085, 0x04000006, 0x83380580, 0x00000088,
+       0x0400000a, 0x0201f800, 0x001005d8, 0x4a026203,
+       0x00000009, 0x493a6403, 0x42000800, 0x8000004b,
+       0x0201f000, 0x00020721, 0x4d1c0000, 0x813669c0,
+       0x04000004, 0x0201f800, 0x0010a592, 0x04020044,
+       0x59cc1404, 0x0401f846, 0x04000018, 0x591c0406,
+       0x82000500, 0x0000001f, 0x82002580, 0x00000006,
+       0x04000007, 0x82002580, 0x00000004, 0x0400002e,
+       0x82002580, 0x00000011, 0x0402000c, 0x497a3a05,
+       0x42002000, 0x00000054, 0x0201f800, 0x00107a4a,
+       0x4a026203, 0x00000007, 0x493a6403, 0x0201f800,
+       0x0010a974, 0x0401f02c, 0x0201f800, 0x00103b25,
+       0x04000004, 0x42023800, 0xffffffff, 0x0401f7f1,
+       0x813669c0, 0x04020009, 0x59cc0001, 0x0201f800,
+       0x00105c9a, 0x0402001e, 0x0201f800, 0x001045a6,
+       0x0402001b, 0x49366009, 0x4a026403, 0x00000087,
+       0x59cc1204, 0x82081580, 0x0000ffff, 0x04020003,
+       0x4a026403, 0x00000086, 0x4a026203, 0x00000001,
+       0x42000800, 0x80000040, 0x0201f800, 0x00020721,
+       0x0401f00d, 0x591c0203, 0x82000580, 0x00000007,
+       0x040207de, 0x4d300000, 0x411e6000, 0x0201f800,
+       0x00107911, 0x5c026000, 0x0401f7d8, 0x0201f800,
+       0x00107911, 0x5c023800, 0x1c01f000, 0x4933c857,
+       0x480bc857, 0x42002800, 0x0010d1c0, 0x41300000,
+       0x80140580, 0x04000017, 0x58140203, 0x82000580,
+       0x00000000, 0x04000013, 0x58140202, 0x80080580,
+       0x04020010, 0x58141c06, 0x820c0580, 0x00000005,
+       0x0400000c, 0x820c0580, 0x00000009, 0x0400001d,
+       0x59302009, 0x58140009, 0x800001c0, 0x0400000b,
+       0x801021c0, 0x04000003, 0x80100580, 0x04000010,
+       0x82142c00, 0x00000024, 0x41540000, 0x80140480,
+       0x0402100e, 0x0401f7e2, 0x5814001e, 0x801021c0,
+       0x04000005, 0x58102002, 0x82102500, 0x00ffffff,
+       0x0401f7f2, 0x5810201e, 0x0401f7f0, 0x40163800,
+       0x81300540, 0x0401f002, 0x80000580, 0x1c01f000,
+       0x58141807, 0x8c0c1d10, 0x040207ea, 0x0401f7e1,
+       0x4933c857, 0x493bc857, 0x83380580, 0x00000013,
+       0x0402000e, 0x59300403, 0x82000c80, 0x00000085,
+       0x02001800, 0x001005d8, 0x82000c80, 0x00000093,
+       0x02021800, 0x001005d8, 0x82000480, 0x00000085,
+       0x4803c857, 0x0c01f018, 0x83380580, 0x00000027,
+       0x04000005, 0x83380580, 0x00000014, 0x02020000,
+       0x00107974, 0x0201f800, 0x00106bbf, 0x59325808,
+       0x812e59c0, 0x02000000, 0x00107911, 0x4a025a06,
+       0x00000031, 0x4a025811, 0x00000004, 0x4a025812,
+       0x000000ff, 0x0201f800, 0x000202da, 0x0201f000,
+       0x00107911, 0x0010a1b7, 0x0010a1be, 0x0010a1be,
+       0x0010a1b7, 0x0010a1b7, 0x0010a1b7, 0x0010a1b7,
+       0x0010a1b7, 0x0010a1b7, 0x0010a1b7, 0x0010a1b7,
+       0x0010a1b7, 0x0010a1b7, 0x0010a1b9, 0x0201f800,
+       0x001005d8, 0x59325808, 0x4a025a06, 0x00000000,
+       0x0201f800, 0x000202da, 0x0201f000, 0x00107911,
+       0x4933c857, 0x42000000, 0x0010b873, 0x0201f800,
+       0x0010aa47, 0x0201f800, 0x0010a5df, 0x497a6205,
+       0x42028000, 0x0000000b, 0x0401f807, 0x4a026406,
+       0x00000006, 0x4a026203, 0x00000007, 0x497a6206,
+       0x1c01f000, 0x4933c857, 0x4943c857, 0x59300406,
+       0x82000580, 0x00000007, 0x04020002, 0x1c01f000,
+       0x0201f800, 0x00106c55, 0x4df00000, 0x0201f800,
+       0x00108ce5, 0x82000c80, 0x0000000e, 0x02021800,
+       0x001005d8, 0x0c01f001, 0x0010a205, 0x0010a209,
+       0x0010a1f0, 0x0010a217, 0x0010a22a, 0x0010a1f0,
+       0x0010a1f0, 0x0010a1f0, 0x0010a1f0, 0x0010a1f0,
+       0x0010a1f0, 0x0010a1f0, 0x0010a1f0, 0x0010a1f0,
+       0x4d400000, 0x5930001f, 0x80000540, 0x04000005,
+       0x41400800, 0x0201f800, 0x00100d7c, 0x40068000,
+       0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037,
+       0x040209f3, 0x4c5c0000, 0x5930b809, 0x0201f800,
+       0x00107911, 0x485e6009, 0x5c00b800, 0x5c025800,
+       0x5c028000, 0x5c03e000, 0x02000000, 0x00106c4b,
+       0x1c01f000, 0x598c000d, 0x81300580, 0x04020004,
+       0x0201f800, 0x00106e8e, 0x04020016, 0x0201f800,
+       0x001068d3, 0x040007df, 0x0201f800, 0x00106b6c,
+       0x04000010, 0x0201f800, 0x001005d8, 0x0201f800,
+       0x00108cd6, 0x04020004, 0x0201f800, 0x00106e62,
+       0x04020008, 0x0201f800, 0x001067ae, 0x040007d1,
+       0x0201f800, 0x00106b6c, 0x02020800, 0x001005d8,
+       0x59300203, 0x82000c80, 0x0000000e, 0x02021800,
+       0x001005d8, 0x0c01f7b9, 0x0201f800, 0x00100e99,
+       0x0401f7c4, 0x4933c857, 0x4d440000, 0x4d340000,
+       0x59cc0007, 0x0201f800, 0x00105c9a, 0x02000800,
+       0x00020245, 0x0402001a, 0x59300009, 0x4c000000,
+       0x49366009, 0x42003000, 0x0000000b, 0x0201f800,
+       0x0010a942, 0x42000000, 0x0010b861, 0x0201f800,
+       0x0010aa47, 0x4d3c0000, 0x4d400000, 0x42028000,
+       0x00000029, 0x417a7800, 0x0201f800, 0x0010203c,
+       0x5c028000, 0x5c027800, 0x5c000000, 0x48026009,
+       0x59cc0007, 0x48026802, 0x80000580, 0x5c026800,
+       0x5c028800, 0x1c01f000, 0x4933c857, 0x4c040000,
+       0x59a80016, 0x82000580, 0x00000074, 0x04020040,
+       0x59cc0a08, 0x82040480, 0x00000100, 0x04001033,
+       0x59cc0c08, 0x82040500, 0x00008000, 0x04000035,
+       0x59a80032, 0x80000540, 0x04020009, 0x59301009,
+       0x58080212, 0x82000500, 0x0000ff00, 0x04000004,
+       0x82040500, 0x00000800, 0x0400002a, 0x59cc0c09,
+       0x80040840, 0x04001024, 0x59a80826, 0x8c040d06,
+       0x04000004, 0x59cc0c0f, 0x8c040d1e, 0x04020012,
+       0x59cc0a17, 0x800409c0, 0x04020012, 0x59cc0a18,
+       0x82040480, 0x00000100, 0x04001014, 0x59cc0c18,
+       0x800409c0, 0x0402000e, 0x59cc0c19, 0x80040840,
+       0x04001011, 0x59cc0c1a, 0x80040840, 0x04001011,
+       0x0401f018, 0x4a02621a, 0x00000100, 0x0401f012,
+       0x4a02621a, 0x00000300, 0x0401f00f, 0x4a02621a,
+       0x00000500, 0x0401f00c, 0x4a02621a, 0x00000700,
+       0x0401f009, 0x4a02621a, 0x00000900, 0x0401f006,
+       0x4a02621a, 0x00000f00, 0x0401f003, 0x4a02621a,
+       0x00002d00, 0x82000540, 0x00000001, 0x0401f002,
+       0x80000580, 0x5c000800, 0x1c01f000, 0x59cc0407,
+       0x4803c857, 0x82000580, 0x00000800, 0x04000003,
+       0x4a02621a, 0x00000000, 0x1c01f000, 0x4933c857,
+       0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c580000,
+       0x59cc000c, 0x0201f800, 0x00105c9a, 0x02000800,
+       0x00020245, 0x04020012, 0x83cc1400, 0x00000008,
+       0x4200b000, 0x00000002, 0x83341c00, 0x00000006,
+       0x0201f800, 0x0010855a, 0x04020009, 0x83cc1400,
+       0x0000000a, 0x4200b000, 0x00000002, 0x83341c00,
+       0x00000008, 0x0201f800, 0x0010855a, 0x5c00b000,
+       0x5c001800, 0x5c001000, 0x5c000800, 0x1c01f000,
+       0x4933c857, 0x4c000000, 0x4c040000, 0x4c080000,
+       0x4c0c0000, 0x4c580000, 0x59cc0001, 0x0201f800,
+       0x00105c9a, 0x02000800, 0x00020245, 0x04020014,
+       0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002,
+       0x83341c00, 0x00000006, 0x0201f800, 0x0010855a,
+       0x0402000c, 0x83cc1400, 0x0000000d, 0x4200b000,
+       0x00000002, 0x83341c00, 0x00000008, 0x0201f800,
+       0x0010855a, 0x04000014, 0x4933c856, 0x4933c856,
+       0x4933c857, 0x59340009, 0x4803c857, 0x5934000e,
+       0x4803c857, 0x59340008, 0x4803c857, 0x5934000d,
+       0x4803c857, 0x59340007, 0x4803c857, 0x5934000c,
+       0x4803c857, 0x59340006, 0x4803c857, 0x5934000b,
+       0x4803c857, 0x5c00b000, 0x5c001800, 0x5c001000,
+       0x5c000800, 0x5c000000, 0x1c01f000, 0x4933c857,
+       0x4947c857, 0x4943c857, 0x4c600000, 0x0201f800,
+       0x00106c55, 0x4df00000, 0x4d2c0000, 0x4d300000,
+       0x4d340000, 0x4130c000, 0x42026000, 0x0010d1c0,
+       0x59a8000e, 0x8060c1c0, 0x04000005, 0x82601580,
+       0x0010bde9, 0x04000002, 0x80000040, 0x81640480,
+       0x040210be, 0x40600000, 0x81300580, 0x040000b6,
+       0x0401f97a, 0x040200b4, 0x59326809, 0x59300406,
+       0x82000c80, 0x00000012, 0x02021800, 0x001005d8,
+       0x0c01f001, 0x0010a3cd, 0x0010a338, 0x0010a351,
+       0x0010a35c, 0x0010a335, 0x0010a34c, 0x0010a387,
+       0x0010a3cd, 0x0010a333, 0x0010a39a, 0x0010a3ae,
+       0x0010a333, 0x0010a333, 0x0010a333, 0x0010a333,
+       0x0010a3cd, 0x0010a3c4, 0x0010a3bc, 0x0201f800,
+       0x001005d8, 0x59300420, 0x8c000500, 0x04020096,
+       0x59300403, 0x82000580, 0x00000043, 0x04000092,
+       0x0201f800, 0x00109134, 0x04000007, 0x0201f800,
+       0x0010914e, 0x0402008a, 0x0201f800, 0x0010801c,
+       0x0401f087, 0x0201f800, 0x00102074, 0x0201f800,
+       0x0010914e, 0x02000800, 0x0010801c, 0x0401f080,
+       0x8d3e7d18, 0x04000004, 0x59300420, 0x8c000500,
+       0x0402007d, 0x59325808, 0x0201f800, 0x00109037,
+       0x04000077, 0x49425a06, 0x497a5c09, 0x0201f800,
+       0x000202da, 0x0201f800, 0x0010912a, 0x0401f070,
+       0x8d3e7d00, 0x04000007, 0x59300017, 0x81480580,
+       0x0402006d, 0x59300018, 0x814c0580, 0x0402006a,
+       0x59300203, 0x82000580, 0x00000004, 0x02000800,
+       0x00100e99, 0x59325808, 0x0201f800, 0x00109037,
+       0x0400005f, 0x4a025a04, 0x00000103, 0x59300004,
+       0x8400055c, 0x48026004, 0x592c0408, 0x8c000512,
+       0x04000007, 0x4d2c0000, 0x592c0009, 0x40025800,
+       0x0201f800, 0x001007fd, 0x5c025800, 0x49425a06,
+       0x497a5c09, 0x0401fb16, 0x0201f800, 0x0010959c,
+       0x0201f800, 0x001091c6, 0x0201f800, 0x000202da,
+       0x0201f800, 0x0010912a, 0x0401f045, 0x8d3e7d18,
+       0x04000045, 0x59300203, 0x82000580, 0x00000004,
+       0x02000800, 0x00100e99, 0x59325808, 0x0201f800,
+       0x00109037, 0x0400003a, 0x49425a06, 0x497a5c09,
+       0x0401faff, 0x0201f800, 0x0010959c, 0x0201f800,
+       0x000202da, 0x0401f032, 0x0201f800, 0x001062d5,
+       0x04000031, 0x59300203, 0x82000580, 0x00000004,
+       0x0400002d, 0x59300203, 0x82000580, 0x00000003,
+       0x04020029, 0x0201f800, 0x00106b8a, 0x59325808,
+       0x0201f800, 0x00109037, 0x04000021, 0x0201f800,
+       0x000202da, 0x0401f01e, 0x59300203, 0x82000580,
+       0x00000004, 0x02000800, 0x00100e99, 0x59325808,
+       0x0201f800, 0x00109037, 0x04000015, 0x49425a06,
+       0x497a5c09, 0x0201f800, 0x000202da, 0x0401f010,
+       0x833c0500, 0x00001800, 0x0400000f, 0x8d3e7d16,
+       0x0402000d, 0x59325817, 0x0201f800, 0x001007fd,
+       0x59325808, 0x0201f800, 0x00109037, 0x04000004,
+       0x49425a06, 0x0201f800, 0x000202da, 0x0201f800,
+       0x00107911, 0x83326400, 0x00000024, 0x41580000,
+       0x81300480, 0x0400173b, 0x5c026800, 0x5c026000,
+       0x5c025800, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x5c00c000, 0x1c01f000, 0x5c000000, 0x4c000000,
+       0x4803c857, 0x4d3c0000, 0x42027800, 0x00000001,
+       0x0201f800, 0x00104567, 0x5c027800, 0x4c580000,
+       0x4200b000, 0x00000002, 0x83a81c00, 0x00000002,
+       0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a,
+       0x5c00b000, 0x80000540, 0x1c01f000, 0x492fc857,
+       0x4943c857, 0x59a8000c, 0x812c0480, 0x04001011,
+       0x59a8000d, 0x812c0480, 0x0402100e, 0x592c0000,
+       0x80005d40, 0x04000008, 0x497a5800, 0x49425a06,
+       0x4c2c0000, 0x0201f800, 0x000202da, 0x5c025800,
+       0x0401f7f7, 0x49425a06, 0x0201f000, 0x000202da,
+       0x1c01f000, 0x493fc857, 0x4933c857, 0x480bc857,
+       0x0201f800, 0x00103b25, 0x0400002e, 0x41502800,
+       0x813e79c0, 0x04020006, 0x59a80066, 0x80000000,
+       0x59a8086a, 0x80040580, 0x04000026, 0x41300000,
+       0x80140580, 0x0400001a, 0x58140203, 0x82000580,
+       0x00000000, 0x04000016, 0x58140202, 0x80080580,
+       0x04020013, 0x58141c06, 0x820c0580, 0x00000005,
+       0x0400000f, 0x820c0580, 0x00000009, 0x04000017,
+       0x59300009, 0x58142009, 0x801021c0, 0x04020006,
+       0x5814201e, 0x59301809, 0x580c0002, 0x82000500,
+       0x00ffffff, 0x80100580, 0x04000007, 0x82142c00,
+       0x00000024, 0x41540000, 0x80140480, 0x04021005,
+       0x0401f7df, 0x40163800, 0x81300540, 0x0401f002,
+       0x80000580, 0x1c01f000, 0x58141807, 0x8c0c1d10,
+       0x040207f3, 0x0401f7e7, 0x42002000, 0x0000ffff,
+       0x59301009, 0x800811c0, 0x04000002, 0x58082403,
+       0x41301000, 0x0401f007, 0x41781000, 0x41442000,
+       0x0401f004, 0x41781000, 0x42002000, 0x0000ffff,
+       0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857,
+       0x4813c857, 0x492fc857, 0x4943c857, 0x4d2c0000,
+       0x0201f800, 0x001007e4, 0x02000800, 0x001005d8,
+       0x4a025a04, 0x0000010d, 0x800811c0, 0x04000017,
+       0x83400580, 0x00000029, 0x04020010, 0x82180580,
+       0x00000002, 0x0400000a, 0x82180580, 0x00000003,
+       0x04000007, 0x82180580, 0x00000008, 0x04000004,
+       0x82180580, 0x00000009, 0x04020004, 0x4a025809,
+       0xffffffff, 0x0401f002, 0x480a5809, 0x58080202,
+       0x48025c13, 0x0401f005, 0x4a025809, 0xffffffff,
+       0x4a025c13, 0x0000ffff, 0x49425a08, 0x48125a06,
+       0x82100580, 0x0000ffff, 0x0400000e, 0x4d440000,
+       0x4d340000, 0x40128800, 0x0201f800, 0x00020245,
+       0x02020800, 0x001005d8, 0x59340002, 0x82000500,
+       0x00ffffff, 0x48025812, 0x5c026800, 0x5c028800,
+       0x497a5800, 0x497a5c04, 0x83400580, 0x00000046,
+       0x04020002, 0x48165a07, 0x481a5c08, 0x0401fbed,
+       0x5c025800, 0x1c01f000, 0x59300809, 0x800409c0,
+       0x04000004, 0x58040403, 0x81440580, 0x1c01f000,
+       0x82000540, 0x00000001, 0x0401f7fd, 0x4933c857,
+       0x4c040000, 0x59300403, 0x82000d80, 0x0000001e,
+       0x04020016, 0x800000d0, 0x59300a16, 0x82040d00,
+       0x000000ff, 0x80040540, 0x4803c857, 0x48026416,
+       0x4a026403, 0x00000085, 0x4a026203, 0x00000009,
+       0x4a026406, 0x00000005, 0x4a02621d, 0x00000004,
+       0x59a80038, 0x48026206, 0x42000800, 0x8000004b,
+       0x0201f800, 0x00020721, 0x5c000800, 0x1c01f000,
+       0x4933c857, 0x40000000, 0x40000000, 0x1c01f000,
+       0x59300414, 0x4933c857, 0x4803c857, 0x8c000518,
+       0x04000009, 0x8c000512, 0x02020000, 0x0010921e,
+       0x0401f91b, 0x0201f800, 0x000206fd, 0x0201f800,
+       0x0002077d, 0x1c01f000, 0x591c0406, 0x4803c857,
+       0x82000c80, 0x00000009, 0x0402100b, 0x0c01f001,
+       0x0010a4d9, 0x0010a4d9, 0x0010a4d9, 0x0010a4db,
+       0x0010a4d9, 0x0010a4db, 0x0010a4db, 0x0010a4d9,
+       0x0010a4db, 0x80000580, 0x1c01f000, 0x82000540,
+       0x00000001, 0x1c01f000, 0x591c0406, 0x82000500,
+       0x0000001f, 0x82000580, 0x00000006, 0x0400000e,
+       0x4803c857, 0x4a026403, 0x0000003b, 0x4a02641a,
+       0x00000009, 0x4a02621a, 0x00002a00, 0x4a026203,
+       0x00000001, 0x42000800, 0x80000040, 0x0201f000,
+       0x00020721, 0x4803c856, 0x4c040000, 0x4c140000,
+       0x4d300000, 0x411e6000, 0x0401f8e9, 0x497a6205,
+       0x59300414, 0x4803c857, 0x82000500, 0xffffadff,
+       0x48026414, 0x497a6405, 0x5c026000, 0x0201f800,
+       0x001007e4, 0x02000800, 0x001005d8, 0x5c002800,
+       0x5c000800, 0x4a025a04, 0x0000010d, 0x497a5800,
+       0x497a5c04, 0x4a025a08, 0x00000045, 0x491e5809,
+       0x59300402, 0x48025c07, 0x59300419, 0x48025c0b,
+       0x591c0414, 0x84000556, 0x48023c14, 0x591c1809,
+       0x580c0403, 0x48025a06, 0x4816580a, 0x48065a0b,
+       0x0401f99d, 0x4d400000, 0x42028000, 0x00000045,
+       0x591c0202, 0x4c000000, 0x4d300000, 0x411e6000,
+       0x0401fcb1, 0x5c026000, 0x5c000000, 0x48023a02,
+       0x5c028000, 0x4a023c06, 0x00000006, 0x4a023a03,
+       0x00000007, 0x497a3a06, 0x497a3a05, 0x1c01f000,
+       0x4933c857, 0x83380580, 0x00000013, 0x0402000b,
+       0x59300403, 0x4803c857, 0x82000d80, 0x00000085,
+       0x0400002b, 0x82000d80, 0x0000008b, 0x04000028,
+       0x0201f800, 0x001005d8, 0x83380580, 0x00000027,
+       0x0402000c, 0x0201f800, 0x00106bbf, 0x4d2c0000,
+       0x4d400000, 0x59325808, 0x42028000, 0x00000004,
+       0x0401feab, 0x5c028000, 0x5c025800, 0x1c01f000,
+       0x83380580, 0x00000014, 0x040007f3, 0x83380580,
+       0x00000089, 0x04000005, 0x83380580, 0x0000008a,
+       0x02020000, 0x00107974, 0x0201f800, 0x00106f60,
+       0x02020000, 0x00107974, 0x59300a03, 0x82040580,
+       0x0000000a, 0x04000009, 0x82040580, 0x0000000c,
+       0x04000006, 0x0201f800, 0x001005d8, 0x4a026203,
+       0x0000000a, 0x1c01f000, 0x83380480, 0x00000093,
+       0x0402100c, 0x83380480, 0x00000085, 0x04001009,
+       0x83380580, 0x00000089, 0x0400000a, 0x83380580,
+       0x0000008a, 0x04000022, 0x0201f800, 0x001005d8,
+       0x493bc857, 0x4933c857, 0x0201f000, 0x00107974,
+       0x4933c857, 0x4c340000, 0x41306800, 0x0201f800,
+       0x0002075a, 0x04000011, 0x4a026203, 0x00000001,
+       0x4a026403, 0x0000001e, 0x59cc0c07, 0x48066419,
+       0x59cc0a07, 0x48066219, 0x58340809, 0x48066009,
+       0x4a026406, 0x00000004, 0x42000800, 0x80000040,
+       0x0201f800, 0x00020721, 0x40366000, 0x0201f800,
+       0x0002077d, 0x5c006800, 0x1c01f000, 0x4933c857,
+       0x0201f000, 0x0002077d, 0x4933c857, 0x59300809,
+       0x58040200, 0x8c00051a, 0x1c01f000, 0x0201f800,
+       0x001048df, 0x0400001e, 0x4a026203, 0x00000002,
+       0x59300414, 0x84000558, 0x48026414, 0x8c000512,
+       0x04000004, 0x59a80039, 0x48026205, 0x0401f007,
+       0x59a80839, 0x59a80037, 0x80040400, 0x82000400,
+       0x0000000a, 0x48026205, 0x59300009, 0x82000c00,
+       0x00000011, 0x50040000, 0x80000540, 0x04000004,
+       0x82000c00, 0x00000000, 0x0401f7fb, 0x45300800,
+       0x497a6000, 0x82000540, 0x00000001, 0x1c01f000,
+       0x82100500, 0xfffffeef, 0x04020020, 0x4d2c0000,
+       0x4937c857, 0x59340811, 0x83341400, 0x00000011,
+       0x800409c0, 0x0400000e, 0x40040000, 0x81300580,
+       0x04000005, 0x58040800, 0x82041400, 0x00000000,
+       0x0401f7f8, 0x59300800, 0x497a6000, 0x44041000,
+       0x0201f800, 0x000206fd, 0x0401f002, 0x4933c857,
+       0x592c0000, 0x80000540, 0x02020800, 0x001005d8,
+       0x5c025800, 0x492e6008, 0x0201f800, 0x000206fd,
+       0x0201f000, 0x0002077d, 0x492fc857, 0x4a025a06,
+       0x00000006, 0x0201f000, 0x000202da, 0x4c340000,
+       0x59300009, 0x800001c0, 0x04000010, 0x82006c00,
+       0x00000011, 0x50340000, 0x80000540, 0x04000009,
+       0x81300580, 0x04000005, 0x50340000, 0x82006c00,
+       0x00000000, 0x0401f7f8, 0x59300000, 0x44006800,
+       0x5c006800, 0x1c01f000, 0x59300c06, 0x82040580,
+       0x00000005, 0x040007fb, 0x82040580, 0x00000011,
+       0x040007f8, 0x82040580, 0x00000006, 0x040007f5,
+       0x82040580, 0x00000001, 0x040007f2, 0x0201f800,
+       0x001005d8, 0x4933c857, 0x4c080000, 0x4c0c0000,
+       0x4c580000, 0x59a8101d, 0x59cc1807, 0x820c1d00,
+       0x00ffffff, 0x800c0110, 0x80083580, 0x04020014,
+       0x83cc1400, 0x00000008, 0x4200b000, 0x00000002,
+       0x59300009, 0x82001c00, 0x00000006, 0x0201f800,
+       0x0010855a, 0x0402000a, 0x83cc1400, 0x0000000a,
+       0x4200b000, 0x00000002, 0x59300009, 0x82001c00,
+       0x00000008, 0x0201f800, 0x0010855a, 0x5c00b000,
+       0x5c001800, 0x5c001000, 0x1c01f000, 0x4933c856,
+       0x0201f800, 0x0010421b, 0x0201f000, 0x00101e45,
+       0x493bc857, 0x4d2c0000, 0x0201f800, 0x001007e4,
+       0x02000800, 0x001005d8, 0x832cac00, 0x00000005,
+       0x4c580000, 0x4c540000, 0x4200b000, 0x00000006,
+       0x4578a800, 0x8054a800, 0x8058b040, 0x040207fd,
+       0x83380580, 0x00000046, 0x04020004, 0x4a025a04,
+       0x00000144, 0x0401f008, 0x4a025a04, 0x00000146,
+       0x83380580, 0x00000041, 0x04000003, 0x4a025a06,
+       0x00000001, 0x59cc0007, 0x82000500, 0xff000000,
+       0x80000110, 0x59cc1008, 0x82081500, 0xff000000,
+       0x80081540, 0x480a580a, 0x83380580, 0x00000046,
+       0x04020006, 0x59cc0007, 0x82000500, 0x00ffffff,
+       0x4802580b, 0x0401f005, 0x59cc0008, 0x82000500,
+       0x00ffffff, 0x4802580b, 0x83380580, 0x00000046,
+       0x04020004, 0x83cc1400, 0x00000009, 0x0401f003,
+       0x83cc1400, 0x0000000d, 0x50080000, 0x9c0001c0,
+       0x4802580c, 0x80081000, 0x50080000, 0x9c0001c0,
+       0x4802580d, 0x83380580, 0x00000046, 0x04020008,
+       0x59cc000b, 0x9c0001c0, 0x4802580e, 0x59cc000c,
+       0x9c0001c0, 0x4802580f, 0x0401f007, 0x59cc000f,
+       0x9c0001c0, 0x4802580e, 0x59cc0010, 0x9c0001c0,
+       0x4802580f, 0x83380580, 0x00000046, 0x04020004,
+       0x83cc1400, 0x00000011, 0x0401f003, 0x83cc1400,
+       0x00000015, 0x412c3000, 0x82183400, 0x00000010,
+       0x4200b000, 0x00000004, 0x50080000, 0x9c0001c0,
+       0x44003000, 0x80081000, 0x80183000, 0x8058b040,
+       0x040207fa, 0x5c00a800, 0x5c00b000, 0x0201f800,
+       0x000202da, 0x5c025800, 0x1c01f000, 0x4933c857,
+       0x492fc857, 0x59300809, 0x58040200, 0x8c00051e,
+       0x04000004, 0x592c0208, 0x84000558, 0x48025a08,
+       0x1c01f000, 0x59e0180f, 0x599c0413, 0x800c1000,
+       0x80080580, 0x04020002, 0x41781000, 0x59e00010,
+       0x59e00810, 0x80040d80, 0x040207fd, 0x80080580,
+       0x0400000b, 0x4c080000, 0x599c0814, 0x599c1015,
+       0x800c00cc, 0x80040c00, 0x82081440, 0x00000000,
+       0x5c001800, 0x82000540, 0x00000001, 0x4803c857,
+       0x1c01f000, 0x492fc857, 0x42007000, 0x0010b7f8,
+       0x58380807, 0x800409c0, 0x04020005, 0x492c7008,
+       0x492c7007, 0x0201f000, 0x00100875, 0x492c0800,
+       0x492c7007, 0x1c01f000, 0x59300203, 0x4933c857,
+       0x4937c857, 0x493bc857, 0x4803c857, 0x82003480,
+       0x0000000e, 0x02021800, 0x001005d8, 0x0c01f001,
+       0x0010a6da, 0x0010a82c, 0x0010a6da, 0x0010a6da,
+       0x0010a6da, 0x0010a6da, 0x0010a6da, 0x0010a791,
+       0x0010a6dc, 0x0010a6da, 0x0010a6da, 0x0010a6da,
+       0x0010a6da, 0x0010a6da, 0x0201f800, 0x001005d8,
+       0x83380580, 0x0000004c, 0x02020800, 0x001005d8,
+       0x0201f800, 0x001048ec, 0x04020020, 0x59a80826,
+       0x82040500, 0x00000009, 0x82000580, 0x00000008,
+       0x0400001a, 0x8c040d12, 0x0400003d, 0x59cc0806,
+       0x82040d00, 0xff000000, 0x82040580, 0x03000000,
+       0x0400001f, 0x82040580, 0x50000000, 0x04000005,
+       0x82040580, 0x52000000, 0x02020000, 0x0002077d,
+       0x813669c0, 0x04000006, 0x4d3c0000, 0x417a7800,
+       0x0201f800, 0x0010203c, 0x5c027800, 0x4a026403,
+       0x00000001, 0x0401f014, 0x59cc0806, 0x82040d00,
+       0xff000000, 0x82040580, 0x03000000, 0x04000008,
+       0x82040580, 0x50000000, 0x04000005, 0x82040580,
+       0x52000000, 0x02020000, 0x0002077d, 0x4a026403,
+       0x00000009, 0x4a02641a, 0x00000009, 0x4a02621a,
+       0x00000000, 0x813669c0, 0x0402000b, 0x59cc0001,
+       0x0201f800, 0x00105c9a, 0x02020000, 0x0002077d,
+       0x0201f800, 0x001045a6, 0x02020000, 0x0002077d,
+       0x49366009, 0x4a026406, 0x00000004, 0x4a026203,
+       0x00000001, 0x0201f000, 0x0010672b, 0x0201f800,
+       0x00103b25, 0x04000023, 0x59cc0806, 0x4807c857,
+       0x82040d00, 0xff000000, 0x82040580, 0x03000000,
+       0x04000033, 0x82040580, 0x20000000, 0x04000041,
+       0x82040580, 0x21000000, 0x04000052, 0x82040580,
+       0x24000000, 0x0400004f, 0x82040580, 0x50000000,
+       0x0400004c, 0x82040580, 0x52000000, 0x04000049,
+       0x82040580, 0x05000000, 0x0402000d, 0x59cc0806,
+       0x82040d00, 0xff000000, 0x9c0431c0, 0x42028000,
+       0x00000046, 0x42002800, 0x00000001, 0x0401fcf3,
+       0x0401f93c, 0x02000800, 0x001005d8, 0x42002000,
+       0x00000051, 0x0201f800, 0x00107a4a, 0x59cc0000,
+       0x82000500, 0x00ffffff, 0x82000580, 0x00ffffff,
+       0x04000005, 0x4a026203, 0x00000007, 0x493a6403,
+       0x1c01f000, 0x59325817, 0x812e59c0, 0x02020800,
+       0x001007fd, 0x0201f000, 0x0002077d, 0x813669c0,
+       0x040007df, 0x59340400, 0x82000500, 0x000000ff,
+       0x82000580, 0x00000003, 0x040207d9, 0x0401fc6f,
+       0x040207d7, 0x4a026403, 0x00000009, 0x4a02641a,
+       0x0000000e, 0x4a02621a, 0x00001900, 0x0401f7a2,
+       0x813669c0, 0x0400000c, 0x59340c00, 0x82040500,
+       0x000000ff, 0x82000580, 0x00000009, 0x04000794,
+       0x82040500, 0x0000ff00, 0x82000580, 0x00000700,
+       0x040207c3, 0x4a026403, 0x00000009, 0x4a02641a,
+       0x00000009, 0x4a02621a, 0x00001e00, 0x0401f78e,
+       0x813669c0, 0x040007f8, 0x59340c00, 0x82040500,
+       0x0000ff00, 0x82000580, 0x00000700, 0x040007f2,
+       0x0401f7b3, 0x4d2c0000, 0x4c580000, 0x4c500000,
+       0x4c540000, 0x41385000, 0x83380580, 0x00000054,
+       0x02020800, 0x001005d8, 0x59325808, 0x592c0c0b,
+       0x82040d00, 0x0000e000, 0x82040580, 0x00002000,
+       0x04020076, 0x59300817, 0x800409c0, 0x04000014,
+       0x58041404, 0x41cca800, 0x8204a400, 0x00000005,
+       0x82080480, 0x00000010, 0x04021004, 0x4008b000,
+       0x0401fb6b, 0x0401f00a, 0x40001000, 0x4200b000,
+       0x0000000f, 0x0401fb66, 0x58040801, 0x800409c0,
+       0x040207f2, 0x0201f800, 0x001005d8, 0x813669c0,
+       0x0400005e, 0x59344c00, 0x592c0c09, 0x4807c857,
+       0x4827c857, 0x82040d00, 0x000000ff, 0x82040580,
+       0x00000003, 0x0400002a, 0x82040580, 0x00000005,
+       0x04000032, 0x82040580, 0x00000020, 0x04000036,
+       0x82040580, 0x00000052, 0x04000042, 0x82040580,
+       0x00000050, 0x04000042, 0x82040580, 0x00000021,
+       0x04000004, 0x82040580, 0x00000024, 0x04020043,
+       0x82240500, 0x0000ff00, 0x82000580, 0x00000007,
+       0x04000008, 0x42000800, 0x00000009, 0x0201f800,
+       0x00104571, 0x42005000, 0x0000000c, 0x0401f037,
+       0x4a025a06, 0x00000031, 0x4a02580d, 0x00000009,
+       0x59340400, 0x4802580e, 0x0201f800, 0x000202da,
+       0x0201f800, 0x00107911, 0x0401f03d, 0x0201f800,
+       0x001042b4, 0x0201f800, 0x0010462a, 0x42000800,
+       0x00000003, 0x0201f800, 0x00104571, 0x42005000,
+       0x00000008, 0x0401f021, 0x59cc0007, 0x0201f800,
+       0x00105eec, 0x0402001d, 0x0201f800, 0x001042b4,
+       0x0401f01a, 0x82240500, 0x0000ff00, 0x82000580,
+       0x00000007, 0x040007df, 0x82240500, 0x000000ff,
+       0x82000580, 0x00000009, 0x040007da, 0x0201f800,
+       0x0010468d, 0x42005000, 0x0000000a, 0x0401f00b,
+       0x42005000, 0x0000000e, 0x0401f003, 0x42005000,
+       0x00000010, 0x82240500, 0x0000ff00, 0x82000580,
+       0x00000007, 0x040007cb, 0x482a6403, 0x4a026203,
+       0x00000001, 0x592c000d, 0x48026011, 0x497a6013,
+       0x59a80038, 0x48026206, 0x417a7800, 0x0201f800,
+       0x0010672b, 0x59325817, 0x812e59c0, 0x04000004,
+       0x0201f800, 0x001007fd, 0x497a6017, 0x5c00a800,
+       0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000,
+       0x4d2c0000, 0x59325808, 0x83380580, 0x00000013,
+       0x04020029, 0x59300c03, 0x82040580, 0x00000054,
+       0x0400001e, 0x82040580, 0x00000010, 0x04000018,
+       0x82040580, 0x0000000e, 0x04000015, 0x82040580,
+       0x00000008, 0x0400000d, 0x82040580, 0x0000000c,
+       0x0400000a, 0x82040580, 0x0000000a, 0x02020800,
+       0x001005d8, 0x42000800, 0x00000006, 0x0201f800,
+       0x00104571, 0x0401f009, 0x42000800, 0x00000004,
+       0x0201f800, 0x00104571, 0x0401f004, 0x59340200,
+       0x8400051a, 0x48026a00, 0x4a025a06, 0x00000000,
+       0x0201f800, 0x000202da, 0x0201f800, 0x0002077d,
+       0x0401f022, 0x83380580, 0x00000027, 0x0400000e,
+       0x83380580, 0x00000014, 0x02020800, 0x001005d8,
+       0x0201f800, 0x00106bbf, 0x42028000, 0x00000031,
+       0x42000800, 0x00000004, 0x42001000, 0x000000ff,
+       0x0401f009, 0x0201f800, 0x00106bbf, 0x42028000,
+       0x00000031, 0x42000800, 0x00000004, 0x42001000,
+       0x00000010, 0x49425a06, 0x4806580d, 0x480a580e,
+       0x0201f800, 0x000202da, 0x0201f800, 0x00104c19,
+       0x0201f800, 0x00107911, 0x5c025800, 0x1c01f000,
+       0x42007000, 0x0010b7f8, 0x58380807, 0x800409c0,
+       0x04020005, 0x492c7008, 0x492c7007, 0x0201f000,
+       0x00100875, 0x492c0800, 0x492c7007, 0x1c01f000,
+       0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000,
+       0x4933c857, 0x4937c857, 0x59cc0806, 0x4807c857,
+       0x82040d00, 0xff000000, 0x82040580, 0x03000000,
+       0x0400000d, 0x82040580, 0x05000000, 0x0400000a,
+       0x82040580, 0x21000000, 0x04000030, 0x82040580,
+       0x24000000, 0x0400002d, 0x82040580, 0x20000000,
+       0x0402002f, 0x0201f800, 0x001007e4, 0x0400002c,
+       0x492fc857, 0x492e6017, 0x59a8b016, 0x8258b400,
+       0x0000001b, 0x8258b500, 0xfffffffc, 0x8058b104,
+       0x485a5c04, 0x412c7800, 0x41cca000, 0x82580480,
+       0x00000010, 0x04021005, 0x832cac00, 0x00000005,
+       0x0401fa63, 0x0401f015, 0x40580800, 0x4200b000,
+       0x0000000f, 0x832cac00, 0x00000005, 0x0401fa5c,
+       0x8204b480, 0x0000000f, 0x0201f800, 0x001007e4,
+       0x04000004, 0x492c7801, 0x412c7800, 0x0401f7ec,
+       0x59325817, 0x0201f800, 0x001007fd, 0x497a6017,
+       0x80000580, 0x0401f006, 0x59340200, 0x84000554,
+       0x48026a00, 0x82000540, 0x00000001, 0x5c00a800,
+       0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000,
+       0x4933c857, 0x492fc857, 0x4d2c0000, 0x59300a03,
+       0x82040580, 0x00000007, 0x04000036, 0x82040580,
+       0x00000001, 0x02020800, 0x001005d8, 0x0201f800,
+       0x00106c55, 0x4df00000, 0x598c000d, 0x81300580,
+       0x04020016, 0x59300004, 0x8c000520, 0x04000004,
+       0x84000520, 0x48026004, 0x0401f016, 0x42001000,
+       0x0010b7f6, 0x50081000, 0x58080002, 0x82000580,
+       0x00000100, 0x04000006, 0x5808000c, 0x81300580,
+       0x02020800, 0x001005d8, 0x0401f00a, 0x0201f800,
+       0x00106e8e, 0x04020020, 0x59300004, 0x8c000520,
+       0x04000004, 0x84000520, 0x48026004, 0x0401f003,
+       0x0201f800, 0x001068d3, 0x5c03e000, 0x02000800,
+       0x00106c4b, 0x0201f800, 0x00109037, 0x02000800,
+       0x001005d8, 0x59325808, 0x4a025a06, 0x00000005,
+       0x0201f800, 0x000202da, 0x0201f800, 0x00104c19,
+       0x59325817, 0x812e59c0, 0x02020800, 0x001007fd,
+       0x0201f800, 0x00107911, 0x80000580, 0x5c025800,
+       0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c4b,
+       0x59300406, 0x82000580, 0x00000011, 0x040007b8,
+       0x0401f7f7, 0x4c040000, 0x59340200, 0x4803c857,
+       0x8c00051c, 0x04000009, 0x59cc0805, 0x591c0019,
+       0x4803c857, 0x80040580, 0x04000004, 0x80000580,
+       0x4803c856, 0x0401f003, 0x82000540, 0x00000001,
+       0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000,
+       0x4c100000, 0x42001800, 0x0000ffff, 0x42002000,
+       0x00000004, 0x0401f010, 0x4c000000, 0x4c0c0000,
+       0x4c100000, 0x59302009, 0x58101c03, 0x42002000,
+       0x00000004, 0x0401f008, 0x4c000000, 0x4c0c0000,
+       0x4c100000, 0x59302009, 0x58101c03, 0x42002000,
+       0x00000007, 0x480fc857, 0x4813c857, 0x481bc857,
+       0x0201f800, 0x00103aae, 0x5c002000, 0x5c001800,
+       0x5c000000, 0x1c01f000, 0x83380580, 0x00000092,
+       0x02020800, 0x001005d8, 0x42000800, 0x80000040,
+       0x4a026203, 0x00000001, 0x493a6403, 0x0201f000,
+       0x00020721, 0x4d400000, 0x0201f800, 0x00103b25,
+       0x04000008, 0x59a80005, 0x84000544, 0x48035005,
+       0x42028000, 0x0000002a, 0x0201f800, 0x0010a449,
+       0x5c028000, 0x1c01f000, 0x59a80026, 0x8c000508,
+       0x04000005, 0x599c0017, 0x8c00050a, 0x04020002,
+       0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000,
+       0x59300420, 0x84000540, 0x48026420, 0x1c01f000,
+       0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a,
+       0x04000004, 0x598800b8, 0x80000000, 0x480310b8,
+       0x8c142d2e, 0x04000004, 0x598800b9, 0x80000000,
+       0x480310b9, 0x8c142d2c, 0x04000013, 0x40140000,
+       0x82000500, 0x00070000, 0x82000d80, 0x00030000,
+       0x0400000d, 0x82000d80, 0x00040000, 0x0400000a,
+       0x82000d80, 0x00050000, 0x04000007, 0x59880005,
+       0x80000000, 0x48031005, 0x598800ba, 0x80000000,
+       0x480310ba, 0x5c000800, 0x5c000000, 0x1c01f000,
+       0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a,
+       0x04000004, 0x598800bb, 0x80000000, 0x480310bb,
+       0x8c142d2e, 0x04000004, 0x598800bc, 0x80000000,
+       0x480310bc, 0x8c142d2c, 0x04000013, 0x40140000,
+       0x82000500, 0x00070000, 0x82000d80, 0x00030000,
+       0x0400000d, 0x82000d80, 0x00040000, 0x0400000a,
+       0x82000d80, 0x00050000, 0x04000007, 0x59880005,
+       0x80000000, 0x48031005, 0x598800bd, 0x80000000,
+       0x480310bd, 0x5c000800, 0x5c000000, 0x1c01f000,
+       0x4c000000, 0x59880001, 0x80000000, 0x4803c857,
+       0x48031001, 0x5c000000, 0x1c01f000, 0x4c000000,
+       0x59880000, 0x80000000, 0x4803c857, 0x48031000,
+       0x5c000000, 0x1c01f000, 0x4c000000, 0x59880002,
+       0x80000000, 0x4803c857, 0x48031002, 0x5c000000,
+       0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d2c,
+       0x04000004, 0x598800a6, 0x80000000, 0x480310a6,
+       0x8c040d2a, 0x04000004, 0x598800a7, 0x80000000,
+       0x480310a7, 0x8c040d28, 0x04000004, 0x598800a8,
+       0x80000000, 0x480310a8, 0x8c040d26, 0x04000004,
+       0x598800a9, 0x80000000, 0x480310a9, 0x8c040d24,
+       0x04000004, 0x598800aa, 0x80000000, 0x480310aa,
+       0x8c040d22, 0x04000004, 0x598800ab, 0x80000000,
+       0x480310ab, 0x8c040d20, 0x04000004, 0x598800ac,
+       0x80000000, 0x480310ac, 0x5c000000, 0x1c01f000,
+       0x4807c857, 0x4c000000, 0x598800ad, 0x80000000,
+       0x480310ad, 0x5c000000, 0x1c01f000, 0x4807c857,
+       0x4c000000, 0x8c040d1c, 0x04000004, 0x598800ae,
+       0x80000000, 0x480310ae, 0x8c040d1a, 0x04000004,
+       0x598800af, 0x80000000, 0x480310af, 0x5c000000,
+       0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d18,
+       0x04000004, 0x598800b0, 0x80000000, 0x480310b0,
+       0x8c040d16, 0x04000004, 0x598800b1, 0x80000000,
+       0x480310b1, 0x8c040d14, 0x04000004, 0x598800b2,
+       0x80000000, 0x480310b2, 0x5c000000, 0x1c01f000,
+       0x4807c857, 0x4c000000, 0x8c040d10, 0x04000004,
+       0x598800b3, 0x80000000, 0x480310b3, 0x8c040d0c,
+       0x04000004, 0x598800b4, 0x80000000, 0x480310b4,
+       0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000,
+       0x8c040d08, 0x04000004, 0x598800b5, 0x80000000,
+       0x480310b5, 0x8c040d04, 0x04000004, 0x598800b6,
+       0x80000000, 0x480310b6, 0x5c000000, 0x1c01f000,
+       0x4807c856, 0x4c000000, 0x5988007f, 0x80000000,
+       0x4803107f, 0x5c000000, 0x1c01f000, 0x4803c857,
+       0x4c040000, 0x50000800, 0x80040800, 0x4807c857,
+       0x44040000, 0x5c000800, 0x1c01f000, 0x480fc857,
+       0x4c000000, 0x820c0580, 0x00000000, 0x04020004,
+       0x42000000, 0x0010b819, 0x0401f014, 0x820c0580,
+       0x00001001, 0x04020004, 0x42000000, 0x0010b81a,
+       0x0401f00e, 0x820c0580, 0x00001002, 0x04020004,
+       0x42000000, 0x0010b81b, 0x0401f008, 0x820c0c80,
+       0x0000201c, 0x02021800, 0x001005d8, 0x820c0500,
+       0x0000001f, 0x0c01f804, 0x0401ffdd, 0x5c000000,
+       0x1c01f000, 0x0010aa89, 0x0010aa8c, 0x0010aa8f,
+       0x0010aa92, 0x0010aa95, 0x0010aa98, 0x0010aa9b,
+       0x0010aa9e, 0x0010aaa1, 0x0010aaa4, 0x0010aaa7,
+       0x0010aaaa, 0x0010aaad, 0x0010aab0, 0x0010aab3,
+       0x0010aab6, 0x0010aab9, 0x0010aabc, 0x0010aabf,
+       0x0010aac2, 0x0010aac5, 0x0010aac8, 0x0010aacb,
+       0x0010aace, 0x0010aad1, 0x0010aad4, 0x0010aad7,
+       0x0010aada, 0x42000000, 0x0010b81c, 0x1c01f000,
+       0x42000000, 0x0010b81d, 0x1c01f000, 0x42000000,
+       0x0010b81e, 0x1c01f000, 0x42000000, 0x0010b81f,
+       0x1c01f000, 0x42000000, 0x0010b820, 0x1c01f000,
+       0x42000000, 0x0010b821, 0x1c01f000, 0x42000000,
+       0x0010b822, 0x1c01f000, 0x42000000, 0x0010b823,
+       0x1c01f000, 0x42000000, 0x0010b824, 0x1c01f000,
+       0x42000000, 0x0010b825, 0x1c01f000, 0x42000000,
+       0x0010b826, 0x1c01f000, 0x42000000, 0x0010b827,
+       0x1c01f000, 0x42000000, 0x0010b828, 0x1c01f000,
+       0x42000000, 0x0010b829, 0x1c01f000, 0x42000000,
+       0x0010b82a, 0x1c01f000, 0x42000000, 0x0010b82b,
+       0x1c01f000, 0x42000000, 0x0010b82c, 0x1c01f000,
+       0x42000000, 0x0010b82d, 0x1c01f000, 0x42000000,
+       0x0010b82e, 0x1c01f000, 0x42000000, 0x0010b82f,
+       0x1c01f000, 0x42000000, 0x0010b830, 0x1c01f000,
+       0x42000000, 0x0010b831, 0x1c01f000, 0x42000000,
+       0x0010b832, 0x1c01f000, 0x42000000, 0x0010b833,
+       0x1c01f000, 0x42000000, 0x0010b834, 0x1c01f000,
+       0x42000000, 0x0010b835, 0x1c01f000, 0x42000000,
+       0x0010b836, 0x1c01f000, 0x42000000, 0x0010b837,
+       0x1c01f000, 0x480fc857, 0x4c000000, 0x820c0580,
+       0x00000001, 0x04020004, 0x42000000, 0x0010b80e,
+       0x0401f012, 0x820c0580, 0x00000002, 0x04020004,
+       0x42000000, 0x0010b80f, 0x0401f00c, 0x820c0580,
+       0x00000003, 0x04020004, 0x42000000, 0x0010b810,
+       0x0401f006, 0x820c0580, 0x00000004, 0x04020004,
+       0x42000000, 0x0010b811, 0x0401ff51, 0x5c000000,
+       0x1c01f000, 0x4c000000, 0x59a80026, 0x4803c857,
+       0x8c000502, 0x04000010, 0x8c000506, 0x04000004,
+       0x42000000, 0x0010b841, 0x0401f012, 0x8c00050a,
+       0x04000004, 0x42000000, 0x0010b840, 0x0401f00d,
+       0x8c000508, 0x04000004, 0x42000000, 0x0010b843,
+       0x0401f008, 0x0201f800, 0x0010513b, 0x04000006,
+       0x8c000506, 0x04020004, 0x42000000, 0x0010b842,
+       0x0401ff33, 0x5c000000, 0x1c01f000, 0x8058b1c0,
+       0x02000800, 0x001005d8, 0x5450a800, 0x8050a000,
+       0x8054a800, 0x8058b040, 0x040207fc, 0x1c01f000,
+       0x8058b1c0, 0x02000800, 0x001005d8, 0x4450a800,
+       0x8054a800, 0x8058b040, 0x040207fd, 0x1c01f000,
+       0x8058b1c0, 0x02000800, 0x001005d8, 0x50500000,
+       0x9c0001c0, 0x4400a800, 0x8050a000, 0x8054a800,
+       0x8058b040, 0x040207fa, 0x1c01f000, 0x4c000000,
+       0x59a80008, 0x8c00051c, 0x5c000000, 0x1c01f000,
+       0x00000001, 0x00000002, 0x00000004, 0x00000008,
+       0x00000010, 0x00000020, 0x00000040, 0x00000080,
+       0x00000100, 0x00000200, 0x00000400, 0x00000800,
+       0x00001000, 0x00002000, 0x00004000, 0x00008000,
+       0x00010000, 0xa5f2b3ac
+};
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_length01 = 0x0000ab4a ;
+#else
+uint32_t risc_code_length01 = 0x0000ab4a ;
+#endif
+
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_addr02 = 0x0010e000  ;
+#else
+uint32_t risc_code_addr02 = 0x0010e000 ;
+#endif
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_code02[] = {
+#else
+uint32_t risc_code02[] = {
+#endif
+       0x00000000, 0x00000000, 0x0010e000, 0x000014ff,
+       0x00000000, 0x00000000, 0x00020000, 0x000008c0,
+       0x836c0580, 0x00000003, 0x02020000, 0x001002e3,
+       0x42000000, 0x0010b4bb, 0x50000000, 0x800001c0,
+       0x04020956, 0x0401f923, 0x0401fbe3, 0x0401fb5c,
+       0x0201f800, 0x00020718, 0x0201f800, 0x0002057b,
+       0x0401f7f0, 0x59b800ea, 0x82000d00, 0xf0000038,
+       0x02020000, 0x00100a7a, 0x8c000510, 0x02000000,
+       0x00100a79, 0x59ba60e0, 0x81300182, 0x0402104e,
+       0x04002030, 0x8532653e, 0x59300406, 0x82000580,
+       0x00000003, 0x04020028, 0x59300203, 0x82000580,
+       0x00000004, 0x04020024, 0x59325808, 0x59300402,
+       0x4a025a04, 0x00000103, 0x900001c0, 0x48025806,
+       0x497a5807, 0x497a5c09, 0x5930001f, 0x80000540,
+       0x02020800, 0x00100d56, 0x59300004, 0x8c00053e,
+       0x04020010, 0x0401fa88, 0x59326809, 0x0201f800,
+       0x0002077d, 0x5934000f, 0x5934140b, 0x80081040,
+       0x04001002, 0x480a6c0b, 0x80000540, 0x04020a10,
+       0x59b800ea, 0x8c000510, 0x040207d7, 0x1c01f000,
+       0x0201f800, 0x00106f60, 0x040007ef, 0x0201f000,
+       0x00100a65, 0x42027000, 0x00000055, 0x0401f027,
+       0x83326500, 0x3fffffff, 0x59300406, 0x82000580,
+       0x00000003, 0x04020015, 0x59325808, 0x59326809,
+       0x59301402, 0x4a025a04, 0x00000103, 0x900811c0,
+       0x480a5806, 0x497a5c09, 0x497a5807, 0x0401fa62,
+       0x0201f800, 0x0002077d, 0x5934000f, 0x5934140b,
+       0x80081040, 0x04001002, 0x480a6c0b, 0x80000540,
+       0x040209eb, 0x0401f7db, 0x42027000, 0x00000054,
+       0x0401f00a, 0x83300500, 0x60000000, 0x02000000,
+       0x00100a68, 0x81326580, 0x8000013a, 0x82000400,
+       0x00100a80, 0x50027000, 0x59300c06, 0x82040580,
+       0x00000002, 0x02000000, 0x00100a65, 0x59300004,
+       0x8c00053e, 0x04020004, 0x0201f800, 0x000207a1,
+       0x0401f7c4, 0x0201f800, 0x00106f60, 0x040007fb,
+       0x0201f000, 0x00100a65, 0x59325808, 0x412c7000,
+       0x58380a04, 0x82040500, 0x0000000f, 0x82000c00,
+       0x001010bd, 0x50044000, 0x0c01f001, 0x00100dd9,
+       0x00100dd9, 0x0002009f, 0x00100dd9, 0x00100dd9,
+       0x00100dd9, 0x00100dd9, 0x00100dd9, 0x000200af,
+       0x00100ded, 0x00100dd9, 0x00100dd9, 0x00100ddb,
+       0x00100dd9, 0x00100dd9, 0x00100dd9, 0x5838040a,
+       0x8c000500, 0x02000800, 0x001005d8, 0x50200000,
+       0x80387c00, 0x583c1002, 0x583c2800, 0x583c2001,
+       0x58380a07, 0x5838300f, 0x59303807, 0x58384c08,
+       0x5838000d, 0x48026012, 0x0401f010, 0x5838020a,
+       0x8c000502, 0x02000000, 0x00100dd9, 0x50200000,
+       0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002,
+       0x592c0a07, 0x592c4c08, 0x592c300f, 0x59303807,
+       0x497a6012, 0x497a6013, 0x4816600e, 0x4812600f,
+       0x480a6010, 0x481a6011, 0x80040840, 0x4806600d,
+       0x02020000, 0x00100e1a, 0x841c3d40, 0x481e6007,
+       0x1c01f000, 0x41787800, 0x59325808, 0x592c0c0a,
+       0x8c040d02, 0x02000000, 0x00100f8c, 0x592c000d,
+       0x592c100f, 0x592c0a04, 0x480a6011, 0x48026012,
+       0x48026013, 0x412c3000, 0x82040500, 0x0000000f,
+       0x82000400, 0x001010bd, 0x50003800, 0x501c0000,
+       0x401c1000, 0x592c1a07, 0x4802600a, 0x481a600b,
+       0x480a600c, 0x480e600d, 0x843c7d4a, 0x403c1000,
+       0x1c01f000, 0x41787800, 0x497a6012, 0x592c0a04,
+       0x412c3000, 0x592c1a07, 0x82040500, 0x0000000f,
+       0x82000400, 0x001010bd, 0x50004000, 0x50200000,
+       0x40201000, 0x4802600a, 0x481a600b, 0x480a600c,
+       0x480e600d, 0x80000580, 0x483e6004, 0x1c01f000,
+       0x4c000000, 0x4df00000, 0x0201f800, 0x00020729,
+       0x0401f005, 0x4c000000, 0x4df00000, 0x0401ff16,
+       0x0401f001, 0x5c03e000, 0x5c000000, 0x1801f000,
+       0x4203e000, 0xb0100000, 0x41fc0000, 0x82000500,
+       0x00000011, 0x0c01f001, 0x0002012a, 0x00020697,
+       0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a,
+       0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a,
+       0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a,
+       0x0002012a, 0x0002012a, 0x0010115a, 0x0002012c,
+       0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a,
+       0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a,
+       0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a,
+       0x0002012a, 0x0002012a, 0x0201f800, 0x001005d8,
+       0x0201f800, 0x00020697, 0x0201f000, 0x0010115a,
+       0x42000000, 0x0010b4c1, 0x50000000, 0x8c000504,
+       0x04000014, 0x42000000, 0x0010b4c1, 0x50000000,
+       0x8c000502, 0x04020002, 0x1c01f000, 0x4df00000,
+       0x4203e000, 0x50000000, 0x42034000, 0x0010b4a4,
+       0x59a0001d, 0x59a1d81e, 0x84000502, 0x4803401d,
+       0x58ec0009, 0x0801f800, 0x5c03e000, 0x1c01f000,
+       0x04027002, 0x04026002, 0x1c01f000, 0x4df00000,
+       0x4203e000, 0x50000000, 0x0201f800, 0x001007e4,
+       0x04000010, 0x412dd800, 0x48efc857, 0x0201f800,
+       0x00103b28, 0x42034000, 0x0010b4a4, 0x49a1d80b,
+       0x48ef401e, 0x59a0001d, 0x84000544, 0x4803401d,
+       0x0201f800, 0x00102214, 0x0201f800, 0x00102233,
+       0x5c03e000, 0x1c01f000, 0x4da00000, 0x4df00000,
+       0x4203e000, 0x50000000, 0x04006051, 0x40001000,
+       0x42034000, 0x0010b4a4, 0x59a01818, 0x800c19c0,
+       0x04020008, 0x59a0381b, 0x801c39c0, 0x02000800,
+       0x001005d8, 0x59a0041c, 0x801c3c00, 0x0401f00c,
+       0x59a00419, 0x82000400, 0x00000002, 0x48034419,
+       0x82000c80, 0x00000013, 0x04001003, 0x497b4419,
+       0x41780000, 0x59a03816, 0x801c3c00, 0x80081040,
+       0x480b4017, 0x581c0200, 0x4803c021, 0x581c0401,
+       0x4803c022, 0x581c0201, 0x4803c023, 0x581c0400,
+       0x4803c020, 0x900001c0, 0x82000540, 0x00000012,
+       0x4803c011, 0x59e00017, 0x8c000508, 0x04000003,
+       0x4a03c017, 0x00000002, 0x4203e000, 0x30000001,
+       0x800c19c0, 0x04000007, 0x800c1840, 0x480f4018,
+       0x0402001f, 0x497b4419, 0x497b4219, 0x0401f01c,
+       0x800811c0, 0x0402000b, 0x4d2c0000, 0x59a2581b,
+       0x0201f800, 0x001007f4, 0x5c025800, 0x497b401b,
+       0x497b401a, 0x497b441c, 0x497b421c, 0x0401f010,
+       0x59a0041c, 0x82000400, 0x00000002, 0x82000c80,
+       0x00000012, 0x4803441c, 0x04001009, 0x4d2c0000,
+       0x59a2581b, 0x592c3813, 0x481f401b, 0x497b441c,
+       0x0201f800, 0x001007f4, 0x5c025800, 0x5c03e000,
+       0x5c034000, 0x1c01f000, 0x59a80005, 0x82000500,
+       0x00000003, 0x02020000, 0x00104315, 0x59340400,
+       0x82000580, 0x00000606, 0x02020000, 0x001042e6,
+       0x5934000d, 0x80027d40, 0x02020000, 0x00104321,
+       0x0401f803, 0x80000580, 0x1c01f000, 0x5934000f,
+       0x59341203, 0x80080540, 0x0402006f, 0x5934020b,
+       0x5934140b, 0x80080480, 0x0402106b, 0x0201f800,
+       0x0002075a, 0x04000064, 0x80081000, 0x592c0406,
+       0x480a6c0b, 0x49366009, 0x492e6008, 0x4a026406,
+       0x00000003, 0x4a026403, 0x00000040, 0x800000c2,
+       0x800018c4, 0x800c0400, 0x48026206, 0x592c0808,
+       0x592c1809, 0x592c020a, 0x48066017, 0x480e6018,
+       0x8c000502, 0x04000030, 0x4a026203, 0x00000004,
+       0x592c0207, 0x80000040, 0x04020020, 0x59a80005,
+       0x8c000514, 0x42000000, 0x00000055, 0x04020003,
+       0x42000000, 0x00000033, 0x80000040, 0x040207ff,
+       0x592c0204, 0x82000500, 0x000000ff, 0x82000580,
+       0x00000018, 0x04020011, 0x592c180f, 0x59300007,
+       0x82000540, 0x00000091, 0x480e6011, 0x48026007,
+       0x42000000, 0x80000004, 0x48026004, 0x59bc00ea,
+       0x8c000516, 0x040207fe, 0x83300400, 0x20000000,
+       0x480378e1, 0x1c01f000, 0x0401fe78, 0x59300007,
+       0x8400054e, 0x48026007, 0x592c1a04, 0x820c1d00,
+       0x000000ff, 0x820c0580, 0x00000048, 0x04000017,
+       0x0401f7ec, 0x8c000500, 0x04020ecb, 0x4a026203,
+       0x00000002, 0x59a80805, 0x82040500, 0x00000600,
+       0x04020012, 0x42000000, 0x00000030, 0x80000040,
+       0x040207ff, 0x592c1a04, 0x820c1d00, 0x000000ff,
+       0x820c0580, 0x00000018, 0x040007da, 0x820c0580,
+       0x00000048, 0x040207d7, 0x42000800, 0x80000804,
+       0x0201f000, 0x00106721, 0x8c040d12, 0x42000000,
+       0x00000010, 0x040207ee, 0x42000000, 0x00000051,
+       0x0401f7eb, 0x800811c0, 0x04020003, 0x4a026a03,
+       0x00000001, 0x59340010, 0x492e6810, 0x80000d40,
+       0x04020003, 0x492e680f, 0x1c01f000, 0x492c0800,
+       0x1c01f000, 0x83440c80, 0x00000800, 0x04021009,
+       0x83440400, 0x0010ac00, 0x50000000, 0x80000540,
+       0x04000004, 0x40026800, 0x80000580, 0x1c01f000,
+       0x82000540, 0x00000001, 0x1c01f000, 0x59340203,
+       0x80000540, 0x0402004b, 0x4d300000, 0x4d2c0000,
+       0x5934000f, 0x80025d40, 0x04000044, 0x0201f800,
+       0x0002075a, 0x0400003f, 0x592c0000, 0x4802680f,
+       0x80000540, 0x04020002, 0x48026810, 0x592c2a04,
+       0x80081000, 0x480a6c0b, 0x49366009, 0x492e6008,
+       0x82142d00, 0x000000ff, 0x82140580, 0x00000012,
+       0x04000035, 0x4a026406, 0x00000003, 0x4a026403,
+       0x00000040, 0x592c0406, 0x800000c2, 0x800018c4,
+       0x800c0400, 0x48026206, 0x592c0808, 0x592c1809,
+       0x592c020a, 0x48066017, 0x480e6018, 0x8c000502,
+       0x02000000, 0x0010474d, 0x4a026203, 0x00000004,
+       0x592c0207, 0x80000040, 0x02020000, 0x00104740,
+       0x82140580, 0x00000018, 0x02020000, 0x00104740,
+       0x592c180f, 0x59300007, 0x82000540, 0x00000091,
+       0x480e6011, 0x48026007, 0x42000000, 0x80000004,
+       0x48026004, 0x59bc00ea, 0x8c000516, 0x040207fe,
+       0x83300400, 0x20000000, 0x480378e1, 0x5934020b,
+       0x5934140b, 0x80080480, 0x040017be, 0x0401f003,
+       0x4a026a03, 0x00000001, 0x5c025800, 0x5c026000,
+       0x1c01f000, 0x497a5800, 0x49325809, 0x4a026406,
+       0x00000006, 0x4a026203, 0x00000007, 0x0401f802,
+       0x0401f7ef, 0x59a80021, 0x800001c0, 0x02020000,
+       0x0010476f, 0x59a80005, 0x8c000504, 0x02020000,
+       0x0010476b, 0x59340200, 0x8c000518, 0x02020000,
+       0x00104767, 0x592c0a0c, 0x48066202, 0x4a025a06,
+       0x00000000, 0x8c000508, 0x02020000, 0x00104763,
+       0x4d3c0000, 0x417a7800, 0x0401fbdf, 0x5c027800,
+       0x1c01f000, 0x592c0404, 0x8c00051e, 0x02020000,
+       0x00104ce4, 0x59980022, 0x80000540, 0x04000017,
+       0x592c0a06, 0x592c0409, 0x80040540, 0x04020013,
+       0x0201f000, 0x00104cfa, 0x592c0404, 0x8c00051e,
+       0x02020000, 0x00104cf3, 0x59980022, 0x80000540,
+       0x0400000a, 0x82040580, 0x00000001, 0x04020007,
+       0x0201f000, 0x00104cfa, 0x592c0404, 0x8c00051e,
+       0x02020000, 0x00104dca, 0x59980026, 0x497a5800,
+       0x80000540, 0x02020000, 0x00104e1d, 0x59d80105,
+       0x82000d00, 0x00018780, 0x02020000, 0x00104edb,
+       0x80000106, 0x82000500, 0x00000003, 0x0c01f001,
+       0x000202f0, 0x00104e1d, 0x000202f6, 0x00020341,
+       0x592c0001, 0x492fb107, 0x80000d40, 0x02020000,
+       0x00104ddb, 0x1c01f000, 0x592c0001, 0x492fb107,
+       0x80000d40, 0x02020000, 0x00104de8, 0x59da5908,
+       0x835c0480, 0x00000020, 0x0400102c, 0x0402b034,
+       0x492fb007, 0x0400e7fa, 0x59d80105, 0x82000500,
+       0x00018780, 0x02020000, 0x00104edb, 0x0400601f,
+       0x59d8010a, 0x59d8090a, 0x80040580, 0x040207fd,
+       0x800408e0, 0x599c1017, 0x8c081508, 0x04020028,
+       0x82040d40, 0x00000013, 0x5998002b, 0x4807c011,
+       0x84000500, 0x4803302b, 0x59e00017, 0x8c000508,
+       0x04020004, 0x4203e000, 0x30000001, 0x1c01f000,
+       0x4a03c017, 0x00000003, 0x82040500, 0x000000ff,
+       0x82000580, 0x0000001d, 0x040207f7, 0x4a03c017,
+       0x0000000d, 0x0401f7f4, 0x5998082b, 0x84040d40,
+       0x4807302b, 0x1c01f000, 0x496a5800, 0x412ed000,
+       0x815eb800, 0x59c80000, 0x82000540, 0x00001200,
+       0x48039000, 0x0400e7ca, 0x0401f7d0, 0x0402f7f7,
+       0x492fa807, 0x0400e7c6, 0x0401f7cc, 0x59e0000f,
+       0x59e0100f, 0x80081580, 0x040207fd, 0x81281580,
+       0x040007d4, 0x40025000, 0x82040d40, 0x0000001d,
+       0x0401f7d2, 0x59d80908, 0x45680800, 0x4006d000,
+       0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540,
+       0x00001200, 0x48039000, 0x02006000, 0x00104df8,
+       0x59d8010a, 0x59d8090a, 0x80040d80, 0x040207fd,
+       0x900001c0, 0x82000540, 0x00000013, 0x4803c011,
+       0x5998002b, 0x84000500, 0x4803302b, 0x59e00017,
+       0x8c000508, 0x04000003, 0x4a03c017, 0x00000003,
+       0x4203e000, 0x30000001, 0x59d80105, 0x82000500,
+       0x00018780, 0x02020000, 0x00104edb, 0x0202d000,
+       0x00104dfd, 0x592c0001, 0x492fb107, 0x80000d40,
+       0x02020000, 0x00104e10, 0x1c01f000, 0x59980020,
+       0x0c01f001, 0x00020370, 0x00020371, 0x00104e88,
+       0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000,
+       0x0402681e, 0x04006004, 0x599c0017, 0x8c000508,
+       0x04020865, 0x59980029, 0x80025d40, 0x0400000a,
+       0x0402d00b, 0x59980026, 0x80000040, 0x48033026,
+       0x592c0000, 0x492fb107, 0x48033029, 0x04020002,
+       0x48033028, 0x5c03e000, 0x1c01f000, 0x59d80105,
+       0x82000500, 0x00018780, 0x02020000, 0x00104edb,
+       0x42000000, 0x0010b855, 0x0201f800, 0x0010aa47,
+       0x5c03e000, 0x1c01f000, 0x5998002b, 0x8c000500,
+       0x0402003b, 0x0400e007, 0x59d80105, 0x82000500,
+       0x00018780, 0x02020000, 0x00104edb, 0x1c01f000,
+       0x59da5908, 0x835c0c80, 0x00000020, 0x04001003,
+       0x0400b029, 0x0400f02b, 0x496a5800, 0x412ed000,
+       0x815eb800, 0x59c80000, 0x82000540, 0x00001200,
+       0x48039000, 0x0400e7f3, 0x59d8010a, 0x59d8090a,
+       0x80040580, 0x040207fd, 0x800408e0, 0x599c1017,
+       0x8c081508, 0x04020022, 0x82040d40, 0x00000013,
+       0x4807c011, 0x59e00017, 0x8c000508, 0x0400000a,
+       0x4a03c017, 0x00000003, 0x82040500, 0x000000ff,
+       0x82000580, 0x0000001d, 0x04020003, 0x4a03c017,
+       0x0000000d, 0x4203e000, 0x30000001, 0x59d80105,
+       0x82000500, 0x00018780, 0x02020000, 0x00104edb,
+       0x1c01f000, 0x492fb007, 0x0400e7d2, 0x0401f7df,
+       0x492fa807, 0x0400e7cf, 0x0401f7dc, 0x84000500,
+       0x4803302b, 0x0400e7cb, 0x0401f7d8, 0x59e0000f,
+       0x59e0100f, 0x80081580, 0x040207fd, 0x81281580,
+       0x040007da, 0x40025000, 0x82040d40, 0x0000001d,
+       0x0401f7d8, 0x59e0000f, 0x59e0100f, 0x80080d80,
+       0x040207fd, 0x81280580, 0x04020002, 0x1c01f000,
+       0x400a5000, 0x900811c0, 0x82081540, 0x0000001c,
+       0x480bc011, 0x59e00017, 0x8c000508, 0x04000003,
+       0x4a03c017, 0x0000000c, 0x4203e000, 0x30000001,
+       0x1c01f000, 0x41700000, 0x0c01f001, 0x00105420,
+       0x000203fc, 0x00105420, 0x00105421, 0x0010541e,
+       0x0010541e, 0x0010541e, 0x0010541e, 0x001058b0,
+       0x04010037, 0x59980006, 0x80000540, 0x0402003c,
+       0x0402c01c, 0x4202f800, 0x00000010, 0x4df00000,
+       0x4203e000, 0x50000000, 0x49db3005, 0x59da5808,
+       0x592c0204, 0x497a5800, 0x497a5801, 0x82000500,
+       0x000000ff, 0x82000c80, 0x00000079, 0x04021036,
+       0x0c01f839, 0x5c03e000, 0x817ef840, 0x04000009,
+       0x836c0580, 0x00000003, 0x04020006, 0x83700580,
+       0x00000001, 0x04020010, 0x0401001b, 0x0400c7e8,
+       0x0400f94a, 0x0400b134, 0x59d40005, 0x82000500,
+       0x43018780, 0x02020000, 0x0010583f, 0x59d80005,
+       0x82000500, 0x43018780, 0x02020000, 0x00105846,
+       0x1c01f000, 0x83700580, 0x00000003, 0x02000800,
+       0x00105421, 0x83700580, 0x00000001, 0x040207ed,
+       0x04010005, 0x0400c7d2, 0x0401f7ea, 0x4202f800,
+       0x00000010, 0x4df00000, 0x4203e000, 0x50000000,
+       0x49d73005, 0x59d65808, 0x0401f7ce, 0x4df00000,
+       0x4203e000, 0x50000000, 0x40025800, 0x592c0204,
+       0x497b3005, 0x497b3006, 0x4202f800, 0x00000010,
+       0x0401f7c7, 0x0201f800, 0x00105491, 0x5c03e000,
+       0x0401f7d4, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105527, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x001054a1,
+       0x00105491, 0x00105491, 0x00105491, 0x00105551,
+       0x00105491, 0x00105491, 0x00105491, 0x000204ef,
+       0x00105491, 0x001056b4, 0x00105491, 0x00105491,
+       0x00105491, 0x000204c2, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x001054c9, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x001057d3, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x0010581e, 0x00105491,
+       0x001054bb, 0x00105491, 0x00105797, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105765, 0x00105491,
+       0x00105765, 0x00105872, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105725,
+       0x00105855, 0x00105491, 0x00105865, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x00105491, 0x00105491,
+       0x00105491, 0x00105491, 0x592c0204, 0x80000110,
+       0x02000000, 0x00105499, 0x80000040, 0x04000009,
+       0x48033002, 0x492f3003, 0x492f3004, 0x4a033008,
+       0x000204d0, 0x4202e000, 0x00000003, 0x1c01f000,
+       0x592c0406, 0x82000c80, 0x0000199a, 0x02021000,
+       0x001054a9, 0x59a80021, 0x80000540, 0x02020000,
+       0x001054d7, 0x592e8a06, 0x83440c80, 0x000007f0,
+       0x02021000, 0x001054a9, 0x83440400, 0x0010ac00,
+       0x50000000, 0x80026d40, 0x02000000, 0x001054db,
+       0x59340002, 0x592c0810, 0x80040580, 0x82000500,
+       0x00ffffff, 0x02020000, 0x001054a9, 0x0401fccf,
+       0x02020000, 0x001054de, 0x1c01f000, 0x592c0204,
+       0x80000110, 0x02000000, 0x00105499, 0x80000040,
+       0x0402000b, 0x592c040a, 0x8c000504, 0x04000010,
+       0x592c0207, 0x82000c80, 0x00001001, 0x02021000,
+       0x001054a9, 0x0201f000, 0x0010588a, 0x48033002,
+       0x492f3003, 0x492f3004, 0x4a033008, 0x00020507,
+       0x4202e000, 0x00000003, 0x1c01f000, 0x592c0406,
+       0x82000c80, 0x0000199a, 0x02021000, 0x001054a9,
+       0x592e8a06, 0x417a7800, 0x0401fd37, 0x02020000,
+       0x00105658, 0x59340002, 0x592c0808, 0x80040580,
+       0x82000500, 0x00ffffff, 0x02020000, 0x001054a9,
+       0x497a5808, 0x592e6009, 0x83300580, 0xffffffff,
+       0x02000000, 0x00105618, 0x83300480, 0x0010d1c0,
+       0x02001000, 0x00105675, 0x59a8000b, 0x81300480,
+       0x02021000, 0x00105675, 0x592c240a, 0x49366009,
+       0x8c10251c, 0x02020000, 0x00105606, 0x59a80068,
+       0x8c000510, 0x02020000, 0x0010568e, 0x59a80821,
+       0x800409c0, 0x02020000, 0x001055ec, 0x59a80805,
+       0x8c040d04, 0x02020000, 0x0010567f, 0x59340200,
+       0x8c000518, 0x02020000, 0x00105670, 0x59300c06,
+       0x82040580, 0x00000006, 0x02020000, 0x00105610,
+       0x59300414, 0x8c000516, 0x02020000, 0x0010567a,
+       0x8c102508, 0x02020000, 0x0010a5b8, 0x59300808,
+       0x4a025a06, 0x00000000, 0x800409c0, 0x02020000,
+       0x001055e7, 0x592c0a0c, 0x48066202, 0x492e6008,
+       0x0401f14d, 0x4df00000, 0x4203e000, 0x50000000,
+       0x0402b00b, 0x835c0480, 0x00000020, 0x0400100d,
+       0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007,
+       0x497a5800, 0x497a5801, 0x0400b7f7, 0x59d80005,
+       0x82000500, 0x43018780, 0x02020000, 0x00105846,
+       0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000,
+       0x50000000, 0x0402f00b, 0x835c0480, 0x00000020,
+       0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000,
+       0x492fa807, 0x497a5800, 0x497a5801, 0x0400f7f7,
+       0x59d40005, 0x82000500, 0x43018780, 0x02020000,
+       0x0010583f, 0x5c03e000, 0x1c01f000, 0x4df00000,
+       0x4203e000, 0x50000000, 0x59940024, 0x80000540,
+       0x04000112, 0x4c000000, 0x42000000, 0x00001000,
+       0x50000000, 0x82000480, 0x24320001, 0x04020015,
+       0x42000800, 0x00000064, 0x80040840, 0x04000007,
+       0x4a030000, 0x00000001, 0x40000000, 0x59800000,
+       0x8c000500, 0x040007f9, 0x04000008, 0x42000800,
+       0x00007a01, 0x50040000, 0x8c000510, 0x04000003,
+       0x84000510, 0x44000800, 0x4a030000, 0x00000000,
+       0x59e00002, 0x8c00051e, 0x0402001b, 0x42000000,
+       0x00001000, 0x50000000, 0x82000480, 0x24320002,
+       0x04020015, 0x42000800, 0x00000064, 0x80040840,
+       0x04000007, 0x4a030000, 0x00000001, 0x40000000,
+       0x59800000, 0x8c000500, 0x040007f9, 0x04000008,
+       0x42000800, 0x00007a17, 0x50040000, 0x8c00050e,
+       0x04020003, 0x8400054e, 0x44000800, 0x4a030000,
+       0x00000000, 0x5c000000, 0x5994781a, 0x48032825,
+       0x803c0480, 0x04001004, 0x04000003, 0x4803281a,
+       0x0401f022, 0x41787800, 0x803c7800, 0x82000400,
+       0x000003e8, 0x040027fd, 0x4803281a, 0x59a80024,
+       0x803c1400, 0x480b5024, 0x803c0040, 0x04000002,
+       0x483fc857, 0x59e40852, 0x59a80025, 0x80040580,
+       0x04000004, 0x480bc857, 0x59e40052, 0x48035025,
+       0x59940026, 0x803c0400, 0x48032826, 0x0201f800,
+       0x00106021, 0x59940000, 0x82000580, 0x00000000,
+       0x04020006, 0x59940026, 0x48032827, 0x497b2826,
+       0x4a032800, 0x00000001, 0x4c0c0000, 0x59940007,
+       0x80000d40, 0x0400001d, 0x59941006, 0x59940025,
+       0x80081c80, 0x04001004, 0x04000003, 0x480f2806,
+       0x0401f016, 0x80040840, 0x48072807, 0x82040580,
+       0x000003e8, 0x04020007, 0x4c040000, 0x4c0c0000,
+       0x59940008, 0x0801f800, 0x5c001800, 0x5c000800,
+       0x800409c0, 0x04020004, 0x59940008, 0x0801f800,
+       0x0401f006, 0x400c0000, 0x820c1c00, 0x0000000a,
+       0x040027ed, 0x480f2806, 0x5c001800, 0x4d180000,
+       0x59c40008, 0x8c000534, 0x04020025, 0x417a3000,
+       0x83947c00, 0x00000009, 0x583c0001, 0x80000d40,
+       0x04020008, 0x823c7c00, 0x00000003, 0x811a3000,
+       0x83180580, 0x00000005, 0x040207f8, 0x0401f018,
+       0x583c1000, 0x59940025, 0x80080480, 0x04001005,
+       0x04000004, 0x48007800, 0x80000040, 0x04021010,
+       0x80040840, 0x48047801, 0x04000008, 0x82000400,
+       0x0000000a, 0x48007800, 0x040027fa, 0x82040500,
+       0x0000007f, 0x0401f7e8, 0x583c0002, 0x4c3c0000,
+       0x0801f800, 0x5c007800, 0x0401f7e3, 0x5c023000,
+       0x59940019, 0x80001540, 0x04000008, 0x04002007,
+       0x59940025, 0x80080480, 0x497b2819, 0x04001003,
+       0x04000002, 0x48032819, 0x59940004, 0x80000d40,
+       0x0400002a, 0x4c040000, 0x5994001c, 0x80000d40,
+       0x04000013, 0x5994101b, 0x59940025, 0x80080480,
+       0x04001005, 0x04000004, 0x4803281b, 0x80000040,
+       0x0402100b, 0x80040840, 0x4807281c, 0x04020004,
+       0x5994001d, 0x0801f800, 0x0401f005, 0x82000400,
+       0x0000000a, 0x4803281b, 0x040027f7, 0x5c000800,
+       0x59941003, 0x59940025, 0x80080480, 0x04001005,
+       0x04000004, 0x48032803, 0x80000040, 0x0402100b,
+       0x80040840, 0x48072804, 0x04020004, 0x59940005,
+       0x0801f800, 0x0401f005, 0x82000400, 0x0000000a,
+       0x48032803, 0x040027f7, 0x5994001f, 0x80000d40,
+       0x04000013, 0x5994101e, 0x59940025, 0x80080480,
+       0x04001005, 0x04000004, 0x4803281e, 0x80000040,
+       0x0402100b, 0x80040840, 0x4807281f, 0x04020004,
+       0x59940020, 0x0801f800, 0x0401f005, 0x82000400,
+       0x00000001, 0x4803281e, 0x040027f7, 0x59940022,
+       0x80000d40, 0x04000013, 0x59941021, 0x59940025,
+       0x80080480, 0x04001005, 0x04000004, 0x48032821,
+       0x80000040, 0x0402100b, 0x80040840, 0x48072822,
+       0x04020004, 0x59940023, 0x0801f800, 0x0401f005,
+       0x82000400, 0x0000000a, 0x48032821, 0x040027f7,
+       0x59940824, 0x59940025, 0x80040480, 0x02001800,
+       0x001005d8, 0x48032824, 0x59940000, 0x0c01f001,
+       0x00105fb5, 0x00105fb7, 0x00105fdd, 0x59940024,
+       0x80000000, 0x48032824, 0x4203e000, 0x70000000,
+       0x1c01f000, 0x592c0406, 0x800000c2, 0x800008c4,
+       0x80040c00, 0x592c040a, 0x48066206, 0x82000d00,
+       0x00000003, 0x02000000, 0x0010615e, 0x8c000500,
+       0x04020029, 0x8c00051e, 0x02000000, 0x00106139,
+       0x82000d00, 0x000000c0, 0x02020000, 0x0010612f,
+       0x82000d00, 0x00002020, 0x02020000, 0x0010612c,
+       0x813e79c0, 0x02020000, 0x0010612c, 0x592c0c0c,
+       0x800409c0, 0x02020000, 0x0010612c, 0x59300a03,
+       0x82040d80, 0x00000007, 0x02020000, 0x0010612c,
+       0x4a026203, 0x00000003, 0x4a026403, 0x00000043,
+       0x0201f800, 0x000200c9, 0x82080d40, 0x80003465,
+       0x48066004, 0x497a6000, 0x59bc00ea, 0x8c000516,
+       0x040207fe, 0x83300400, 0xa0000000, 0x480378e1,
+       0x1c01f000, 0x8c000502, 0x02020000, 0x00106181,
+       0x8c00051e, 0x0400000e, 0x82000d00, 0x000000c0,
+       0x04000005, 0x82040d80, 0x000000c0, 0x02020000,
+       0x00106186, 0x82000d00, 0x00002020, 0x82040d80,
+       0x00002020, 0x02000000, 0x0010614d, 0x592c0207,
+       0x80000040, 0x02020000, 0x00106157, 0x592c180d,
+       0x800c19c0, 0x02020000, 0x00106157, 0x592c180f,
+       0x59300007, 0x82000540, 0x00000011, 0x480e6011,
+       0x48026007, 0x4a026203, 0x00000004, 0x4a026403,
+       0x00000042, 0x42000800, 0x80002001, 0x0401f02a,
+       0x5c000000, 0x4c000000, 0x4803c857, 0x4807c857,
+       0x0401f003, 0x42000800, 0x00000001, 0x59325808,
+       0x832c0500, 0x00ff0000, 0x0400000d, 0x592c0000,
+       0x48065a06, 0x48026008, 0x592c040a, 0x8c000510,
+       0x04020008, 0x0201f800, 0x000202ce, 0x417a7800,
+       0x59300008, 0x80025d40, 0x0402078f, 0x1c01f000,
+       0x456a5800, 0x412ed000, 0x815eb800, 0x59c80000,
+       0x82000540, 0x00001200, 0x48039000, 0x0401f7f4,
+       0x59840000, 0x80000540, 0x04020002, 0x1c01f000,
+       0x59840003, 0x80000540, 0x02020000, 0x001061fe,
+       0x1c01f000, 0x48066004, 0x59bc00ea, 0x8c000516,
+       0x040207fe, 0x83300400, 0x40000000, 0x480378e1,
+       0x1c01f000, 0x59bc00ea, 0x82001500, 0xb0000018,
+       0x02020000, 0x00106c81, 0x8c000510, 0x0400002a,
+       0x59bc10e0, 0x82080500, 0xfffff000, 0x0402000a,
+       0x80080108, 0x820a3500, 0x0000000f, 0x4803c857,
+       0x1201f000, 0x00106c87, 0x84000510, 0x48026004,
+       0x0401f016, 0x840a653e, 0x59300004, 0x8c000520,
+       0x040007fa, 0x82000500, 0xfffefeff, 0x48026004,
+       0x8c08153e, 0x04020005, 0x42027000, 0x00000013,
+       0x0401f859, 0x0401f009, 0x59300004, 0x8c000514,
+       0x04000003, 0x0401ffb0, 0x0401f02f, 0x42027000,
+       0x00000049, 0x0401f850, 0x59bc00ea, 0x82001500,
+       0xb0000018, 0x02020000, 0x00106c81, 0x8c000510,
+       0x040207d8, 0x1c01f000, 0x83640480, 0x00000010,
+       0x0400101a, 0x41626000, 0x41580000, 0x59300a03,
+       0x82040d80, 0x00000000, 0x04000008, 0x83326400,
+       0x00000024, 0x81300c80, 0x040017f9, 0x42026000,
+       0x0010d1c0, 0x0401f7f6, 0x8166c840, 0x83300c00,
+       0x00000024, 0x80040480, 0x04021005, 0x4006c000,
+       0x4a026203, 0x00000008, 0x1c01f000, 0x837ac540,
+       0x0010d1c0, 0x0401f7fb, 0x42000000, 0x0010b854,
+       0x0201f800, 0x0010aa47, 0x4967c857, 0x80026580,
+       0x1c01f000, 0x83300480, 0x0010d1c0, 0x02001800,
+       0x001005d8, 0x41580000, 0x81300480, 0x0402100c,
+       0x04011000, 0x457a6000, 0x4a026202, 0x0000ffff,
+       0x83300400, 0x00000003, 0x4803c840, 0x4a03c842,
+       0x00000021, 0x8166c800, 0x1c01f000, 0x41540000,
+       0x81300480, 0x02021800, 0x001005d8, 0x04011000,
+       0x457a6000, 0x4a026202, 0x0000ffff, 0x83300400,
+       0x00000003, 0x4803c840, 0x4a03c842, 0x00000021,
+       0x59a80066, 0x49335065, 0x80000000, 0x48035066,
+       0x1c01f000, 0x4d340000, 0x59326809, 0x59300406,
+       0x82000500, 0x0000001f, 0x0c01f803, 0x5c026800,
+       0x1c01f000, 0x00107966, 0x00107979, 0x00107993,
+       0x000207c9, 0x001098f1, 0x0010990c, 0x0002083e,
+       0x00107966, 0x00107979, 0x001064ee, 0x001079ac,
+       0x00107966, 0x00107966, 0x00107966, 0x00107966,
+       0x00107966, 0x001095a1, 0x0010a6c2, 0x00107966,
+       0x00107966, 0x00107966, 0x00107966, 0x00107966,
+       0x00107966, 0x00107966, 0x00107966, 0x00107966,
+       0x00107966, 0x00107966, 0x00107966, 0x00107966,
+       0x00107966, 0x59300203, 0x82000c80, 0x0000000e,
+       0x02021800, 0x001005d8, 0x0c01f001, 0x001079aa,
+       0x00108592, 0x000207dd, 0x00108720, 0x001087b9,
+       0x001079aa, 0x001079aa, 0x001079aa, 0x00108577,
+       0x001079aa, 0x001079aa, 0x001079aa, 0x001079aa,
+       0x00108985, 0x83380480, 0x00000058, 0x04021007,
+       0x83380480, 0x00000040, 0x04001004, 0x4d2c0000,
+       0x0c01f803, 0x5c025800, 0x1c01f000, 0x0010861b,
+       0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b,
+       0x0010861d, 0x001086bd, 0x0010861b, 0x0010861b,
+       0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b,
+       0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b,
+       0x0010861b, 0x0010861b, 0x001086c1, 0x000207ff,
+       0x0010861b, 0x001086c0, 0x001086c2, 0x59325808,
+       0x59300811, 0x59301402, 0x59340200, 0x8c00050e,
+       0x0402001c, 0x0401f826, 0x04000005, 0x4a025a04,
+       0x00000103, 0x497a5c09, 0x0401f009, 0x4a025a04,
+       0x00000103, 0x4a025a06, 0x00000000, 0x497a5c09,
+       0x800409c0, 0x02020800, 0x00108785, 0x48065807,
+       0x480a5c06, 0x0201f800, 0x000202c1, 0x5934000f,
+       0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b,
+       0x80000540, 0x02020800, 0x00020253, 0x0401f75e,
+       0x592c020a, 0x8c000502, 0x040007e9, 0x800409c0,
+       0x040007e7, 0x592c0208, 0x8c00050e, 0x040207e4,
+       0x4933c857, 0x0201f000, 0x0010920f, 0x592c020a,
+       0x8c000500, 0x04000010, 0x59300015, 0x592c380f,
+       0x801c3c80, 0x0400000c, 0x4a025a06, 0x00000015,
+       0x8c1c3d3e, 0x04000005, 0x4a025a06, 0x00000007,
+       0x801c3880, 0x801c3800, 0x481fc857, 0x821c0d40,
+       0x00000000, 0x1c01f000, 0x59300203, 0x82003480,
+       0x0000000e, 0x02021800, 0x001005d8, 0x0c01f001,
+       0x0010992b, 0x00020852, 0x00109fba, 0x00109fc8,
+       0x0002086e, 0x0010992b, 0x0010a0a8, 0x0002088d,
+       0x0010992b, 0x0010992b, 0x0010992b, 0x0010992b,
+       0x0010992b, 0x0010992b, 0x83380580, 0x00000013,
+       0x02020000, 0x00109f42, 0x59300403, 0x82027480,
+       0x00000044, 0x02021800, 0x001005d8, 0x82000480,
+       0x00000040, 0x02001800, 0x001005d8, 0x0c01f001,
+       0x00109f9e, 0x00020864, 0x00109fa0, 0x00109fb2,
+       0x59325808, 0x832c0500, 0x00ff0000, 0x04000005,
+       0x592c0c0a, 0x8c040d1a, 0x02020000, 0x00109fad,
+       0x0401fe91, 0x0401f710, 0x83380580, 0x00000048,
+       0x04000007, 0x83380580, 0x00000053, 0x02000000,
+       0x0010a04a, 0x0201f800, 0x001005d8, 0x5930001f,
+       0x59301011, 0x59300809, 0x58040a00, 0x8c040d0e,
+       0x02020000, 0x0010a026, 0x800811c0, 0x02020000,
+       0x0010a033, 0x5930001f, 0x80000540, 0x02020000,
+       0x0010a041, 0x59325808, 0x592c040a, 0x8c00051e,
+       0x02000000, 0x0010a01c, 0x42027000, 0x00000041,
+       0x0401f001, 0x83380480, 0x00000054, 0x02021800,
+       0x001005d8, 0x83380480, 0x00000040, 0x02001000,
+       0x0010a067, 0x0c01f001, 0x0010a073, 0x000208aa,
+       0x0010a07f, 0x0010a086, 0x0010a073, 0x0010a073,
+       0x0010a073, 0x0010a073, 0x0010a075, 0x0010a07a,
+       0x0010a07a, 0x0010a073, 0x0010a073, 0x0010a073,
+       0x0010a073, 0x0010a07a, 0x0010a073, 0x0010a07a,
+       0x0010a073, 0x0010a075, 0x4a026203, 0x00000001,
+       0x493a6403, 0x42000800, 0x80002042, 0x0401f672,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x14aa62b1,
+       0x00000000, 0x00000000, 0x00000000, 0x00000005,
+       0xfffffffb, 0x02800004, 0x00000000, 0x0000c000,
+       0x0000071d, 0x073fca5a, 0x0705a5a5, 0x01928009,
+       0x070ff0e1, 0x03800006, 0x04958010, 0x05308000,
+       0x05008000, 0x0600902f, 0x04a004dc, 0x0202f051,
+       0x042e4020, 0x018f021b, 0x033e5000, 0x03020000,
+       0x078d0018, 0x0493041a, 0x0092041c, 0x038a0305,
+       0x078b0303, 0x048e8010, 0x0678aae5, 0x06000001,
+       0x07818174, 0x040010e6, 0x0448e0e6, 0x04818010,
+       0x002fb008, 0x0448e0e6, 0x04818010, 0x060ff0e6,
+       0x00580401, 0x054880ff, 0x04818010, 0x022a5001,
+       0x030430d4, 0x06780043, 0x030e0000, 0x030450ff,
+       0x06780043, 0x03019000, 0x058185c6, 0x027c0045,
+       0x03020000, 0x06810037, 0x027c0045, 0x03040000,
+       0x068100c7, 0x027c0045, 0x03080000, 0x0781061e,
+       0x04908037, 0x029105c4, 0x010410a6, 0x0379ff41,
+       0x037fffff, 0x072d6000, 0x07601241, 0x050f80ff,
+       0x032fa009, 0x05600400, 0x050f80ff, 0x056c04ff,
+       0x068105dc, 0x073fa009, 0x06000001, 0x0279ff02,
+       0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff,
+       0x045c0402, 0x048185dc, 0x060ff0d0, 0x0179feff,
+       0x0700ffff, 0x057dfeff, 0x0700ffff, 0x078105be,
+       0x05600e41, 0x050f80ff, 0x032fa069, 0x07480000,
+       0x068105d0, 0x06780043, 0x070000f0, 0x0781005f,
+       0x037c00ff, 0x06000010, 0x0781005f, 0x038005cc,
+       0x0379ff00, 0x070fffff, 0x06780043, 0x07f00000,
+       0x075a0000, 0x020ef001, 0x028605ce, 0x05484000,
+       0x02a1819e, 0x062d6001, 0x002fb001, 0x070ff069,
+       0x01868072, 0x060ff079, 0x055c0441, 0x06810010,
+       0x012fb000, 0x060560fb, 0x03800078, 0x060ff079,
+       0x02868198, 0x070ff069, 0x055c0441, 0x06810010,
+       0x060560fb, 0x0400d0d0, 0x062d6002, 0x0648300d,
+       0x06810086, 0x070ff0d1, 0x062d6001, 0x045c040b,
+       0x06810089, 0x05488000, 0x04818086, 0x072e500c,
+       0x00208001, 0x05a004e1, 0x02800010, 0x062d6001,
+       0x07f00000, 0x07f00000, 0x070ff0d1, 0x0179feff,
+       0x070000ff, 0x055c040c, 0x058180bb, 0x0007b001,
+       0x03079041, 0x0307a000, 0x06600a79, 0x050f80ff,
+       0x053fa80a, 0x06000010, 0x072d5003, 0x078d0096,
+       0x0307c003, 0x0007d004, 0x0107e005, 0x0307f006,
+       0x02080007, 0x00081008, 0x01082009, 0x0308300a,
+       0x0008400b, 0x0308500c, 0x068d00a1, 0x0678007a,
+       0x07f00000, 0x010880ff, 0x03386000, 0x03010000,
+       0x072e6300, 0x020ef07f, 0x02860010, 0x070ff07d,
+       0x0450047c, 0x050f80ff, 0x002fa819, 0x068d00ae,
+       0x02080001, 0x00081002, 0x0448807a, 0x068100b5,
+       0x0379ff03, 0x070000ff, 0x01082003, 0x068d00b6,
+       0x02386004, 0x03010000, 0x072e6c00, 0x02800010,
+       0x06780043, 0x070000f0, 0x078105d7, 0x050020ff,
+       0x027c0002, 0x06000010, 0x078100c3, 0x038005d7,
+       0x0700c0d1, 0x0379ff0c, 0x070000ff, 0x0380008e,
+       0x0204a051, 0x06780043, 0x070000f0, 0x037c00ff,
+       0x06000010, 0x0781816a, 0x072d6000, 0x019485c0,
+       0x050fb056, 0x044880e6, 0x04818010, 0x060ff0d0,
+       0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff,
+       0x078105be, 0x05a00212, 0x0349c0e4, 0x0781811d,
+       0x070ff093, 0x050010ff, 0x070ff093, 0x045c0401,
+       0x058180db, 0x02046092, 0x04002046, 0x04600202,
+       0x00540401, 0x048280e6, 0x04500425, 0x070060ff,
+       0x0730ffff, 0x0700000f, 0x0742000f, 0x05810190,
+       0x07a005a6, 0x0648a002, 0x048180e9, 0x00047089,
+       0x070ff047, 0x045c0443, 0x077800ff, 0x07f00000,
+       0x0781818e, 0x07780047, 0x0500e000, 0x048185ad,
+       0x070ff006, 0x01860117, 0x0179fe47, 0x0700000f,
+       0x010480ff, 0x056c7048, 0x06818102, 0x007a0d4a,
+       0x04003801, 0x0220f001, 0x0180010f, 0x07608e48,
+       0x034a60ff, 0x0700f0ff, 0x074b88ff, 0x037000ff,
+       0x07000600, 0x05500448, 0x074d00ff, 0x045a044a,
+       0x0304a0ff, 0x070ff00f, 0x01540406, 0x05820117,
+       0x04950120, 0x05a001bd, 0x02868123, 0x0134bfff,
+       0x070fffff, 0x0104102e, 0x050fd041, 0x00800126,
+       0x0595011d, 0x05a001bd, 0x0186011d, 0x0202f00e,
+       0x052e4030, 0x040fd02f, 0x070fc0ff, 0x05a00218,
+       0x02800010, 0x0400e02f, 0x042e4020, 0x0202f051,
+       0x0004100e, 0x0004b00e, 0x050fd041, 0x024a6c46,
+       0x04500423, 0x050070ff, 0x03620024, 0x050080ff,
+       0x04004046, 0x0700500f, 0x03206000, 0x05601048,
+       0x0700a0ff, 0x0700900a, 0x070ff005, 0x04500446,
+       0x00540425, 0x04820157, 0x05601622, 0x050f80ff,
+       0x063fa032, 0x06000002, 0x03203000, 0x01204000,
+       0x03205000, 0x0120b000, 0x0320c000, 0x07601441,
+       0x050f80ff, 0x043fa852, 0x06000001, 0x070ff056,
+       0x056c02ff, 0x050fb0ff, 0x070560ff, 0x03079041,
+       0x05600e41, 0x050f80ff, 0x073fa011, 0x0600003d,
+       0x06780043, 0x07f00000, 0x065a007a, 0x010880ff,
+       0x04a001b6, 0x058d0150, 0x0208a04a, 0x0108b04b,
+       0x02386001, 0x03010000, 0x072e6300, 0x028000a8,
+       0x0500d00a, 0x05500405, 0x014a68ff, 0x070090ff,
+       0x0154040a, 0x0700c0ff, 0x0600a023, 0x0500b024,
+       0x02206001, 0x05601622, 0x050f80ff, 0x063fa04a,
+       0x06000002, 0x05601022, 0x050f80ff, 0x043fa819,
+       0x06000001, 0x0600a00d, 0x0180013c, 0x06780043,
+       0x070000f0, 0x050010ff, 0x027c0001, 0x07000030,
+       0x078105b4, 0x027c0001, 0x06000020, 0x078105b4,
+       0x038005cc, 0x054880ff, 0x06810010, 0x070ff056,
+       0x050fb0ff, 0x044880e5, 0x0581017d, 0x044880e6,
+       0x04818010, 0x00800183, 0x056c02ff, 0x050fb0ff,
+       0x070560ff, 0x072e5300, 0x044880e6, 0x04818010,
+       0x072d5003, 0x06780043, 0x07f00000, 0x010880ff,
+       0x058d0187, 0x03386005, 0x03010000, 0x033e6000,
+       0x0700000c, 0x052e5200, 0x02800010, 0x0120918e,
+       0x018004e4, 0x01209190, 0x018004e4, 0x00209192,
+       0x018004e4, 0x03209000, 0x018004e4, 0x01209196,
+       0x018004e4, 0x00209198, 0x018004e4, 0x02493075,
+       0x06810510, 0x0120919a, 0x018004e4, 0x06601e01,
+       0x050f80ff, 0x063fa029, 0x06000008, 0x02015010,
+       0x02016051, 0x00017051, 0x00011051, 0x05601a41,
+       0x050f80ff, 0x053fa83a, 0x06000008, 0x05600e41,
+       0x050f80ff, 0x01464000, 0x032fa00a, 0x07006011,
+       0x05007012, 0x04008013, 0x07009014, 0x0600a015,
+       0x0400b016, 0x0700c017, 0x07c00000, 0x072d5003,
+       0x06601479, 0x050f80ff, 0x048d01b9, 0x063fa051,
+       0x0600003e, 0x07c00000, 0x06005051, 0x0400e02c,
+       0x0660060e, 0x050f80ff, 0x032fa009, 0x0379ff00,
+       0x070000ff, 0x076c0000, 0x058101dd, 0x0660480e,
+       0x0500e0ff, 0x034000ff, 0x01540427, 0x0582020a,
+       0x03400005, 0x070ff005, 0x055c0428, 0x0481020e,
+       0x01680e05, 0x056c0405, 0x068181bf, 0x040f8029,
+       0x053fa809, 0x07000024, 0x06600649, 0x050f80ff,
+       0x032fa009, 0x0379ff00, 0x070000ff, 0x076c0000,
+       0x068181bf, 0x0400e049, 0x0340002d, 0x050f802b,
+       0x053fa80a, 0x06000016, 0x0660480e, 0x0302c0ff,
+       0x034000ff, 0x01540427, 0x0582020c, 0x072d6000,
+       0x0460040e, 0x050f80ff, 0x0104e0d1, 0x0379ff4e,
+       0x0700ffff, 0x062d6002, 0x032fa009, 0x0004d0d0,
+       0x074b004d, 0x07780000, 0x07ffff00, 0x055a044d,
+       0x070000ff, 0x00201008, 0x04002051, 0x06003051,
+       0x05304000, 0x07000060, 0x03205009, 0x07006022,
+       0x0460040e, 0x050f80ff, 0x032fa03a, 0x06603c0e,
+       0x050f80ff, 0x073fa00a, 0x07000027, 0x050010d1,
+       0x0460320e, 0x050f80ff, 0x012fa80a, 0x060ff00e,
+       0x055c042e, 0x04810210, 0x07c00000, 0x0400e026,
+       0x008001cb, 0x0202c026, 0x008001e6, 0x0500e02e,
+       0x008001e6, 0x0400e051, 0x01800209, 0x0349c0e4,
+       0x04810215, 0x07c00000, 0x013e4000, 0x070c0000,
+       0x07c00000, 0x013e4000, 0x03080000, 0x07c00000,
+       0x009702f4, 0x022a5002, 0x0790821d, 0x00910291,
+       0x030400a6, 0x0678aae5, 0x06000001, 0x00a1860e,
+       0x06600c40, 0x050f80ff, 0x032fa021, 0x074b0000,
+       0x076c0600, 0x07818293, 0x05600403, 0x050f80ff,
+       0x073fa009, 0x06000002, 0x0279ff04, 0x0700ffff,
+       0x010440d7, 0x0179fe44, 0x0700ffff, 0x045c0404,
+       0x07818295, 0x0349f044, 0x0681829e, 0x02495001,
+       0x06818297, 0x060ff079, 0x045c0440, 0x0781823c,
+       0x0644f07a, 0x002fb008, 0x060ff079, 0x045c0440,
+       0x07818241, 0x0644f07a, 0x002fb008, 0x0648f001,
+       0x07818288, 0x04600e40, 0x050f80ff, 0x06480001,
+       0x04810257, 0x0448e001, 0x04810273, 0x02460001,
+       0x0644f001, 0x012fa80a, 0x04008040, 0x05a004ee,
+       0x0286828c, 0x05a004d8, 0x062da001, 0x013e4000,
+       0x06000080, 0x06930013, 0x02920013, 0x02800010,
+       0x0644f001, 0x012fa80a, 0x020ef002, 0x00860275,
+       0x04600840, 0x050f80ff, 0x053fa809, 0x06000002,
+       0x05780105, 0x00800440, 0x017c0105, 0x05000400,
+       0x06818275, 0x06601e02, 0x050f80ff, 0x053fa809,
+       0x06000002, 0x04602a40, 0x050f80ff, 0x070ff005,
+       0x053fa809, 0x06000002, 0x055c0405, 0x06818275,
+       0x04008040, 0x0045e008, 0x05a004d8, 0x00800251,
+       0x0644f001, 0x012fa80a, 0x050020d8, 0x04600440,
+       0x050f80ff, 0x073fa00a, 0x06000001, 0x06480001,
+       0x07818281, 0x05308000, 0x03040000, 0x06009040,
+       0x04a004dc, 0x00800251, 0x06a0060e, 0x054b0800,
+       0x056a0700, 0x06600c40, 0x050f80ff, 0x032fa00a,
+       0x00800251, 0x013e4000, 0x06000080, 0x01209288,
+       0x018004e4, 0x06009008, 0x05308000, 0x05004000,
+       0x04a004dc, 0x00800251, 0x02209002, 0x008002e5,
+       0x03209000, 0x008002e5, 0x02209004, 0x008002e5,
+       0x04a002fd, 0x062da001, 0x05308000, 0x05002000,
+       0x06009040, 0x04a004dc, 0x02800013, 0x013e4000,
+       0x06000080, 0x02495001, 0x078182db, 0x04600840,
+       0x050f80ff, 0x053fa809, 0x06000001, 0x0721f000,
+       0x0349f003, 0x058102aa, 0x0245f01f, 0x06000002,
+       0x018602db, 0x07601400, 0x050f80ff, 0x012fa809,
+       0x06480001, 0x058102db, 0x06602440, 0x050f80ff,
+       0x012fa809, 0x020ef001, 0x038682db, 0x019b02db,
+       0x050020d8, 0x062da001, 0x06303002, 0x05000430,
+       0x04600440, 0x050f80ff, 0x073fa012, 0x06000001,
+       0x028f82bf, 0x050040d8, 0x062da001, 0x07601e00,
+       0x050f80ff, 0x073fa009, 0x06000001, 0x060ff004,
+       0x00540402, 0x048202d9, 0x06005051, 0x06006051,
+       0x06602240, 0x050f80ff, 0x063fa01a, 0x06000002,
+       0x06600a40, 0x050f80ff, 0x073fa00a, 0x07000003,
+       0x060ff040, 0x045a041f, 0x010eb0ff, 0x06930013,
+       0x02920013, 0x02800010, 0x04004002, 0x018002c9,
+       0x04a002fd, 0x062da001, 0x05308000, 0x07005000,
+       0x06009040, 0x04a004dc, 0x050080d8, 0x05a004e1,
+       0x062da001, 0x02800013, 0x050fd009, 0x050fd041,
+       0x013e4000, 0x06000080, 0x05308000, 0x03013000,
+       0x04a004dc, 0x010440d7, 0x0349f044, 0x048102f2,
+       0x062da001, 0x008f02f2, 0x03e00000, 0x062da001,
+       0x02800013, 0x0249c0e5, 0x06810013, 0x062da001,
+       0x07f00000, 0x07f00000, 0x033e5000, 0x070c0000,
+       0x018f02f6, 0x03800011, 0x050020d8, 0x04600440,
+       0x050f80ff, 0x073fa00a, 0x06000001, 0x07c00000,
+       0x002fb001, 0x03800306, 0x012fb000, 0x03075087,
+       0x068d0307, 0x03386000, 0x03020000, 0x04482075,
+       0x06810352, 0x0648a0e6, 0x07810347, 0x0642007f,
+       0x06810345, 0x0340007e, 0x060ff038, 0x0154047e,
+       0x02d00334, 0x0560027d, 0x050f80ff, 0x032fa009,
+       0x030ef000, 0x02860504, 0x0107d000, 0x05600800,
+       0x050f80ff, 0x032fa009, 0x03681e00, 0x04500420,
+       0x050f80ff, 0x073fa009, 0x0700003f, 0x03800311,
+       0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819,
+       0x078d0327, 0x02080001, 0x00081002, 0x0448807a,
+       0x0781032e, 0x0379ff03, 0x070000ff, 0x01082003,
+       0x068d032f, 0x02386004, 0x03010000, 0x072e6c00,
+       0x02800352, 0x0380033a, 0x0380033c, 0x0280033e,
+       0x02800340, 0x03800342, 0x03800344, 0x0727c005,
+       0x02800323, 0x0627c008, 0x02800323, 0x0627c00b,
+       0x02800323, 0x0627c00e, 0x02800323, 0x0727c011,
+       0x02800323, 0x03800314, 0x052e6800, 0x02800352,
+       0x044880e6, 0x07810533, 0x052e6200, 0x070ff088,
+       0x0179feff, 0x070fffff, 0x04818501, 0x060ff083,
+       0x0086836d, 0x033e6000, 0x07000003, 0x068d0352,
+       0x07286000, 0x07f00000, 0x078d0355, 0x038c0306,
+       0x0648c0e6, 0x05818372, 0x0448e0e6, 0x0781036a,
+       0x004920e6, 0x07810365, 0x07a0056f, 0x05001088,
+       0x00700101, 0x03100000, 0x00088001, 0x033e6000,
+       0x07000088, 0x03800560, 0x02386001, 0x07030000,
+       0x033e6000, 0x06000008, 0x028003f1, 0x02799075,
+       0x0500040f, 0x06810010, 0x06601479, 0x050080ff,
+       0x06309052, 0x0600003e, 0x02800376, 0x06602279,
+       0x050080ff, 0x05309812, 0x07000041, 0x0648007a,
+       0x0781037e, 0x04488075, 0x0581837e, 0x040f8008,
+       0x070fa009, 0x0049107a, 0x01a183f3, 0x00798075,
+       0x06000507, 0x05818521, 0x0448b075, 0x06810385,
+       0x02493075, 0x0681050e, 0x0249c0e6, 0x048183e0,
+       0x0648c0e6, 0x0581839a, 0x068d0389, 0x02386001,
+       0x07030000, 0x0049107a, 0x07810390, 0x020ef083,
+       0x0386039a, 0x06483075, 0x068103ef, 0x0678007a,
+       0x07000035, 0x03a184cf, 0x05308000, 0x07060000,
+       0x06009079, 0x04a004dc, 0x028003ef, 0x0448807a,
+       0x0681039e, 0x06483075, 0x058104f9, 0x0448d07a,
+       0x068103a2, 0x06483075, 0x058104f9, 0x068d03a2,
+       0x02386001, 0x07030000, 0x0444e07a, 0x0648307a,
+       0x048183c7, 0x0448707a, 0x068103ea, 0x0648f07a,
+       0x078103b2, 0x05a004cf, 0x04008079, 0x05a004ee,
+       0x008683c2, 0x05a004d8, 0x028003ef, 0x0560107b,
+       0x050f80ff, 0x032fa009, 0x0349c000, 0x058183c0,
+       0x04600e79, 0x050f80ff, 0x073fa00a, 0x0600003d,
+       0x06600a79, 0x050f80ff, 0x053fa80a, 0x06000010,
+       0x028003ef, 0x0046e07a, 0x028003ea, 0x06009008,
+       0x05308000, 0x05004000, 0x04a004dc, 0x028003ef,
+       0x0560167b, 0x050f80ff, 0x032fa011, 0x070ff000,
+       0x04500401, 0x030460ff, 0x060ff025, 0x00540446,
+       0x078203d1, 0x030460ff, 0x04092046, 0x05a00218,
+       0x06600679, 0x050f80ff, 0x00201007, 0x012fa80a,
+       0x0046047a, 0x034630ff, 0x050020ff, 0x06003051,
+       0x04600e79, 0x050f80ff, 0x073fa012, 0x06000001,
+       0x028003ef, 0x033e6a00, 0x0202000e, 0x02079051,
+       0x07000088, 0x078d03e4, 0x0744c000, 0x01088000,
+       0x03386006, 0x03010000, 0x02800010, 0x05a004cf,
+       0x05308000, 0x03020000, 0x06009079, 0x04a004dc,
+       0x033e6a00, 0x0302000a, 0x02079051, 0x02800010,
+       0x04603e79, 0x050f80ff, 0x032fa009, 0x070ff000,
+       0x0186040c, 0x057dfeff, 0x07ffffff, 0x0581040c,
+       0x050f8000, 0x012fa811, 0x0079fe02, 0x070000ff,
+       0x077d66ff, 0x060000dc, 0x0781840c, 0x060ff001,
+       0x0286840d, 0x064b0002, 0x06420002, 0x060ff002,
+       0x05500400, 0x050f80ff, 0x05004084, 0x073fa00a,
+       0x06000002, 0x07c00000, 0x04600201, 0x050f80ff,
+       0x073fa009, 0x06000001, 0x0079fe02, 0x070000ff,
+       0x077d72ff, 0x070000dd, 0x0781840c, 0x064b0002,
+       0x06420002, 0x06000001, 0x01800406, 0x0605004c,
+       0x0180041e, 0x0493041a, 0x04a004d5, 0x054bc450,
+       0x05810421, 0x01d00422, 0x01800421, 0x00800432,
+       0x00800434, 0x00800432, 0x008004a7, 0x0180043f,
+       0x00800434, 0x01800471, 0x00800432, 0x00800432,
+       0x008004ab, 0x00800432, 0x018004af, 0x008004c4,
+       0x01800488, 0x00800432, 0x00800432, 0x00209432,
+       0x018004e4, 0x0379ff50, 0x070fffff, 0x060ff079,
+       0x055c0450, 0x048104a4, 0x002fb008, 0x060ff079,
+       0x055c0450, 0x058104a3, 0x04a004c7, 0x0180049c,
+       0x0179fe50, 0x070fffff, 0x070050ff, 0x060ff079,
+       0x055c0405, 0x04810449, 0x002fb008, 0x060ff079,
+       0x055c0405, 0x078184a0, 0x070ff087, 0x017980ff,
+       0x06000507, 0x06818451, 0x02203040, 0x05002087,
+       0x0049d002, 0x0481046b, 0x04930458, 0x01257000,
+       0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030,
+       0x0304c050, 0x02400057, 0x06740057, 0x06000002,
+       0x06820016, 0x04002083, 0x07003084, 0x04004085,
+       0x06602279, 0x050f80ff, 0x063fa01a, 0x06000001,
+       0x05a004cf, 0x07a00578, 0x033e6a00, 0x0302000a,
+       0x062e5020, 0x003e4002, 0x07000a00, 0x028003f1,
+       0x07420003, 0x0781844e, 0x00798002, 0x06000507,
+       0x06818451, 0x0180045c, 0x05930478, 0x01257000,
+       0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030,
+       0x0304c050, 0x067800e6, 0x07000041, 0x0581047d,
+       0x07a00581, 0x04818016, 0x002fb008, 0x067800e6,
+       0x07000041, 0x04810483, 0x07a00581, 0x04818016,
+       0x062e5020, 0x003e4002, 0x07000a00, 0x03e00000,
+       0x02800010, 0x0379ff50, 0x070fffff, 0x060ff079,
+       0x055c0450, 0x0781848e, 0x0245507a, 0x002fb008,
+       0x060ff079, 0x055c0450, 0x07818493, 0x0245507a,
+       0x002fb008, 0x05600e50, 0x050f80ff, 0x012fa809,
+       0x02455001, 0x05600e50, 0x050f80ff, 0x012fa80a,
+       0x0080049d, 0x002fb008, 0x003e4002, 0x07000a00,
+       0x02800016, 0x079384a3, 0x062e5020, 0x042e4002,
+       0x002fb008, 0x013e4000, 0x05000e00, 0x02800016,
+       0x0179fe50, 0x070fffff, 0x010210ff, 0x02800016,
+       0x0179fe50, 0x070fffff, 0x050340ff, 0x0080049d,
+       0x0179fe50, 0x070fffff, 0x0102e0ff, 0x0760282e,
+       0x050f80ff, 0x05222000, 0x07223000, 0x05224000,
+       0x07225000, 0x07226000, 0x05227000, 0x05228000,
+       0x07229000, 0x0722a000, 0x0522b000, 0x063fa051,
+       0x07000011, 0x0202c026, 0x0522d000, 0x052e400c,
+       0x02800016, 0x030430d4, 0x062e5008, 0x00800176,
+       0x05600e50, 0x050f80ff, 0x032fa009, 0x03460000,
+       0x018004d2, 0x0246007a, 0x0045207a, 0x008004d0,
+       0x0246007a, 0x0600007a, 0x04600e79, 0x050f80ff,
+       0x032fa00a, 0x07c00000, 0x029284d5, 0x070500e1,
+       0x07c00000, 0x0245f008, 0x048404d9, 0x020e0008,
+       0x07c00000, 0x070ff009, 0x065a0008, 0x058404de,
+       0x020e0008, 0x07c00000, 0x058404e1, 0x020e0008,
+       0x07c00000, 0x05308000, 0x0500d000, 0x04a004dc,
+       0x04a004e9, 0x02800010, 0x052e4300, 0x072e500c,
+       0x073c3fff, 0x0700000f, 0x07c00000, 0x06602208,
+       0x050f80ff, 0x032fa011, 0x076a0000, 0x068184f7,
+       0x066a0001, 0x048104f7, 0x04002051, 0x07c00000,
+       0x00202001, 0x07c00000, 0x0648307a, 0x00a18608,
+       0x05a004cc, 0x05308000, 0x05001000, 0x06009079,
+       0x04a004dc, 0x03800560, 0x0249c0e6, 0x058104f9,
+       0x0280036d, 0x0648307a, 0x07818196, 0x05a004cf,
+       0x05308000, 0x03013000, 0x03209006, 0x04a004dc,
+       0x033e6000, 0x07030000, 0x02800345, 0x02490075,
+       0x0781051e, 0x04002089, 0x04780102, 0x07f00000,
+       0x05001088, 0x07a0056f, 0x04740101, 0x03100000,
+       0x060ff002, 0x045c0401, 0x0481851f, 0x00088001,
+       0x033e6000, 0x070000c0, 0x0380055c, 0x07f00000,
+       0x0220951f, 0x018004e4, 0x0648307a, 0x07810527,
+       0x06780075, 0x06000007, 0x0581852e, 0x06a00608,
+       0x06486075, 0x06818194, 0x02490075, 0x0781819a,
+       0x04487075, 0x05818536, 0x0280053d, 0x05308000,
+       0x03010000, 0x06009079, 0x04a004dc, 0x02800010,
+       0x0448e0e6, 0x04818352, 0x00800192, 0x05308000,
+       0x0500e000, 0x06009079, 0x04a004dc, 0x04008089,
+       0x05a004e1, 0x0380055c, 0x05a004cc, 0x05308000,
+       0x0700f000, 0x06009079, 0x07000088, 0x06a00545,
+       0x04a004dc, 0x02800010, 0x03386000, 0x07030000,
+       0x07f00000, 0x078d0548, 0x033e6a00, 0x0202000e,
+       0x02079051, 0x0448b075, 0x07810553, 0x02493075,
+       0x07810553, 0x05301005, 0x03010000, 0x03800555,
+       0x05301006, 0x03010000, 0x05002087, 0x06485002,
+       0x05818555, 0x0744c000, 0x01088000, 0x02086001,
+       0x07c00000, 0x05001088, 0x07a0056f, 0x0644c001,
+       0x00088001, 0x033e6a00, 0x0202000e, 0x004920e6,
+       0x05818565, 0x02079051, 0x078d0565, 0x060ff089,
+       0x034990ff, 0x0781056c, 0x03386005, 0x03010000,
+       0x02800010, 0x03386006, 0x03010000, 0x02800010,
+       0x078d056f, 0x03386000, 0x07030000, 0x07f00000,
+       0x068d0573, 0x070ff087, 0x074850ff, 0x05818574,
+       0x07c00000, 0x078d0578, 0x02386001, 0x07030000,
+       0x07f00000, 0x068d057c, 0x070ff087, 0x074850ff,
+       0x0581857d, 0x07c00000, 0x05002087, 0x0049d002,
+       0x05818590, 0x002fb008, 0x067800e6, 0x07000041,
+       0x002fb008, 0x05818590, 0x07a005a6, 0x0448e002,
+       0x07810593, 0x0648a002, 0x0481859d, 0x06486002,
+       0x06810597, 0x02400057, 0x056a02ff, 0x07c00000,
+       0x07a005a6, 0x06788102, 0x06000004, 0x05818590,
+       0x04002089, 0x070ff0d4, 0x045c0402, 0x077800ff,
+       0x07f00000, 0x05818590, 0x00202010, 0x038c0590,
+       0x07f00000, 0x06420002, 0x0481859e, 0x07a00578,
+       0x033e6a00, 0x0302000a, 0x07c00000, 0x07f00000,
+       0x060ff0a2, 0x050020ff, 0x060ff0a2, 0x045c0402,
+       0x048185a7, 0x07c00000, 0x05a00218, 0x03495047,
+       0x078105b2, 0x0320901d, 0x02800604, 0x0220901f,
+       0x02800604, 0x014980e4, 0x04818010, 0x013e4000,
+       0x07003000, 0x05600e35, 0x050f80ff, 0x07a006fc,
+       0x01208003, 0x05a004e1, 0x038005cc, 0x03209009,
+       0x02800604, 0x03209011, 0x02800604, 0x02209007,
+       0x02800604, 0x03209003, 0x02800604, 0x00498043,
+       0x058185be, 0x00497043, 0x048185c2, 0x02209001,
+       0x02800604, 0x0220900d, 0x02800604, 0x0320900f,
+       0x02800604, 0x03493000, 0x068105d5, 0x027c0045,
+       0x070a0000, 0x078105de, 0x0220900b, 0x02800604,
+       0x02209013, 0x05308000, 0x01012000, 0x04a004dc,
+       0x00800183, 0x03209005, 0x02800604, 0x072e500c,
+       0x00208002, 0x05a004e1, 0x02800010, 0x02209015,
+       0x02800604, 0x072d6000, 0x05308000, 0x05007000,
+       0x07f00000, 0x070090d1, 0x0379ff09, 0x0700ffff,
+       0x04a004dc, 0x03209017, 0x02800604, 0x033e5000,
+       0x06000080, 0x02209019, 0x02800604, 0x072d6000,
+       0x033e5000, 0x06000080, 0x07f00000, 0x060ff0d0,
+       0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff,
+       0x04818010, 0x02400058, 0x00642058, 0x06820010,
+       0x033e5000, 0x06000080, 0x04058051, 0x0320901b,
+       0x02800604, 0x05308000, 0x01012000, 0x04a004dc,
+       0x00800176, 0x05a00218, 0x05308000, 0x05008000,
+       0x06009079, 0x04a004dc, 0x07c00000, 0x034900e4,
+       0x05818618, 0x013e4000, 0x070000c0, 0x07f00000,
+       0x034900e4, 0x04818616, 0x07c00000, 0x013e4000,
+       0x06000080, 0x07f00000, 0x07f00000, 0x07f00000,
+       0x034900e4, 0x06810610, 0x03800618, 0x072d6000,
+       0x00498043, 0x06810632, 0x060ff0d0, 0x0179feff,
+       0x0700ffff, 0x057dfeff, 0x0700ffff, 0x058185e2,
+       0x050f8030, 0x032fa009, 0x0379ff00, 0x0700ffff,
+       0x070ff0d1, 0x0179feff, 0x0700ffff, 0x055c0400,
+       0x078105e2, 0x04004051, 0x0280067a, 0x06a006dc,
+       0x062d6001, 0x020ef004, 0x038605e4, 0x06600004,
+       0x050f80ff, 0x032fa009, 0x074b0000, 0x05002000,
+       0x0769ff00, 0x01640800, 0x078205e4, 0x01640e00,
+       0x058285e4, 0x070ff036, 0x045c0404, 0x0581864d,
+       0x072d6000, 0x050f8030, 0x032fa009, 0x0379ff00,
+       0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff,
+       0x055c0400, 0x078105e2, 0x04482034, 0x078105ff,
+       0x06483034, 0x058185ff, 0x070ff0d4, 0x077800ff,
+       0x070000f0, 0x037c00ff, 0x06000010, 0x0681067a,
+       0x06a006d6, 0x024900e5, 0x0681065d, 0x033e5000,
+       0x06000080, 0x02800010, 0x04601c04, 0x050f80ff,
+       0x053fa809, 0x06000020, 0x030ef041, 0x038605ee,
+       0x062d6002, 0x05602a41, 0x050f80ff, 0x012fa809,
+       0x060ff0d0, 0x074b00ff, 0x045c0401, 0x05818678,
+       0x062d6001, 0x07602841, 0x050f80ff, 0x053fa809,
+       0x06000001, 0x070ff0d1, 0x054b80ff, 0x074b0003,
+       0x055c0403, 0x05818678, 0x033e5000, 0x06000080,
+       0x0080070e, 0x07600041, 0x0280065e, 0x06a006d6,
+       0x024900e5, 0x06810680, 0x033e5000, 0x06000080,
+       0x02800010, 0x06a006c2, 0x030ef041, 0x028605f2,
+       0x04058051, 0x072d6000, 0x05601041, 0x050f80ff,
+       0x012fa809, 0x0600a0d0, 0x0500b0d1, 0x062d6001,
+       0x07f00000, 0x07f00000, 0x0600c0d0, 0x0500d0d1,
+       0x062d6002, 0x0279ff0d, 0x07ff0000, 0x044d800d,
+       0x060ff0d0, 0x074b00ff, 0x065a000d, 0x06601201,
+       0x050f80ff, 0x073fa022, 0x07000005, 0x0079fe0d,
+       0x070000ff, 0x050020ff, 0x05602a41, 0x050f80ff,
+       0x073fa00a, 0x06000001, 0x020ef004, 0x028606bf,
+       0x04601c04, 0x050f80ff, 0x053fa809, 0x06000001,
+       0x050f80ff, 0x053fa80a, 0x06000020, 0x07602841,
+       0x050f80ff, 0x073fa009, 0x06000001, 0x0279ff02,
+       0x070000ff, 0x0678000d, 0x0700ff00, 0x065a0002,
+       0x07602841, 0x050f80ff, 0x073fa00a, 0x06000001,
+       0x07600041, 0x050f80ff, 0x053fa80a, 0x06000001,
+       0x07601241, 0x050f80ff, 0x073fa00a, 0x06000002,
+       0x033e5000, 0x06000080, 0x0080070e, 0x040f8032,
+       0x073fa011, 0x06000001, 0x060ff002, 0x055c0403,
+       0x058186ca, 0x00041051, 0x07c00000, 0x04600402,
+       0x04500432, 0x050f80ff, 0x053fa809, 0x06000020,
+       0x00400402, 0x01680eff, 0x070030ff, 0x040f8032,
+       0x053fa80a, 0x06000001, 0x07c00000, 0x024900e5,
+       0x068106d9, 0x07c00000, 0x033e5000, 0x070000c0,
+       0x07c00000, 0x05004036, 0x060000d0, 0x0179fe00,
+       0x0700ffff, 0x057dfeff, 0x0700ffff, 0x068106fb,
+       0x070000d1, 0x0379ff00, 0x0700ffff, 0x06005051,
+       0x060ff031, 0x05500405, 0x050f80ff, 0x073fa009,
+       0x06000002, 0x020ef004, 0x038606f5, 0x04600404,
+       0x050f80ff, 0x012fa809, 0x0079fe01, 0x0700ffff,
+       0x055c0400, 0x068106fb, 0x01400405, 0x070050ff,
+       0x057de0ff, 0x06000007, 0x058186e7, 0x04004051,
+       0x07c00000, 0x072d6000, 0x07f00000, 0x07f00000,
+       0x000110d0, 0x010120d1, 0x062d6001, 0x07f00000,
+       0x07f00000, 0x020130d0, 0x010140d1, 0x062d6002,
+       0x010170d4, 0x07f00000, 0x020150d0, 0x030160d1,
+       0x053fa83a, 0x06000008, 0x07c00000, 0x07600c41,
+       0x050f80ff, 0x073fa009, 0x06000001, 0x04780102,
+       0x07ffff00, 0x046a0702, 0x050f80ff, 0x073fa00a,
+       0x06000001, 0x05600e41, 0x050f80ff, 0x032fa069,
+       0x03800053, 0xba6b4e34, 0x02800004, 0x00000000,
+       0x00008000, 0x00000518, 0x040f801f, 0x012fa8c9,
+       0x040f801f, 0x073fa081, 0x06000010, 0x03200005,
+       0x07420000, 0x050fb000, 0x040f801f, 0x073fa011,
+       0x06000038, 0x040f801f, 0x053fa859, 0x0700003a,
+       0x050fe000, 0x0581800a, 0x0684003d, 0x04958019,
+       0x030e0011, 0x072e4200, 0x03800014, 0x0291001f,
+       0x050010c0, 0x04482001, 0x058180e8, 0x06483001,
+       0x0781814b, 0x02920029, 0x068b0029, 0x018a0150,
+       0x050010c0, 0x06780001, 0x050007c0, 0x06818223,
+       0x06780001, 0x0500f800, 0x07818263, 0x03910030,
+       0x040fe029, 0x03860030, 0x076c001d, 0x04810294,
+       0x076c0a1d, 0x048102b9, 0x0292003d, 0x040fe02f,
+       0x0286003d, 0x06000013, 0x050fb000, 0x066c0073,
+       0x068103c2, 0x0297003d, 0x014920e4, 0x0481803d,
+       0x03400000, 0x076c0a00, 0x04818034, 0x0796003f,
+       0x03b900b8, 0x05908014, 0x010170e1, 0x07780017,
+       0x03e00000, 0x06810092, 0x050010ff, 0x0179fe17,
+       0x031fffff, 0x070000ff, 0x05600800, 0x050f80ff,
+       0x073fa009, 0x06000001, 0x06780002, 0x02800040,
+       0x037c00ff, 0x03800000, 0x0681005e, 0x0249f002,
+       0x068100ab, 0x0448e002, 0x0681005e, 0x07600c00,
+       0x050f80ff, 0x073fa009, 0x06000001, 0x06780002,
+       0x07ffff00, 0x037c00ff, 0x05000200, 0x048180ab,
+       0x064bd401, 0x03d00060, 0x038000a9, 0x02800068,
+       0x03800072, 0x0280007c, 0x02800086, 0x03800090,
+       0x038000a9, 0x038000a9, 0x050fe027, 0x0186806c,
+       0x01028000, 0x0380006f, 0x07600027, 0x050f80ff,
+       0x032fa00a, 0x01027000, 0x02400029, 0x028000ab,
+       0x040fe025, 0x00868076, 0x03026000, 0x02800079,
+       0x06600025, 0x050f80ff, 0x032fa00a, 0x03025000,
+       0x02400029, 0x028000ab, 0x050fe021, 0x00868080,
+       0x01022000, 0x02800083, 0x07600021, 0x050f80ff,
+       0x032fa00a, 0x01021000, 0x02400029, 0x028000ab,
+       0x040fe023, 0x0086808a, 0x01024000, 0x0380008d,
+       0x06600023, 0x050f80ff, 0x032fa00a, 0x03023000,
+       0x02400029, 0x028000ab, 0x06a000c8, 0x028000ab,
+       0x01640817, 0x058280a9, 0x070ff017, 0x03d00096,
+       0x0280009e, 0x038000a0, 0x038000a3, 0x038000a6,
+       0x038000a9, 0x038000a9, 0x038000a9, 0x038000a9,
+       0x03e00000, 0x03800014, 0x059080a0, 0x030160e1,
+       0x028000ab, 0x059080a3, 0x030150e1, 0x028000ab,
+       0x059080a6, 0x010140e1, 0x028000ab, 0x060fc013,
+       0x06a00510, 0x03800014, 0x072e4800, 0x07000012,
+       0x038000bb, 0x0747f000, 0x05600800, 0x050f80ff,
+       0x012fa809, 0x0249f001, 0x078100bb, 0x01012000,
+       0x052e4c00, 0x07c00000, 0x070000eb, 0x0349f000,
+       0x058180af, 0x05600800, 0x050f80ff, 0x012fa809,
+       0x0448e001, 0x068100c1, 0x07c00000, 0x0079c101,
+       0x07ffffff, 0x027a4b01, 0x03800000, 0x05600800,
+       0x050f80ff, 0x012fa80a, 0x07600c00, 0x050f80ff,
+       0x012fa821, 0x06780001, 0x07ffff00, 0x037c00ff,
+       0x05000700, 0x078100dd, 0x06601804, 0x070030ff,
+       0x050f80ff, 0x012fa809, 0x05002000, 0x050f8003,
+       0x073fa00a, 0x06000001, 0x040fe001, 0x038600de,
+       0x04600201, 0x050f80ff, 0x032fa00a, 0x07c00000,
+       0x050fe02e, 0x008680e3, 0x0102e000, 0x0302f000,
+       0x038000e7, 0x0760002e, 0x050f80ff, 0x032fa00a,
+       0x0102e000, 0x07c00000, 0x022c0004, 0x056c041d,
+       0x078100fc, 0x056c021d, 0x04810113, 0x056c081d,
+       0x04810125, 0x076c061d, 0x0581013f, 0x0521d000,
+       0x0202c013, 0x0202a013, 0x02020013, 0x0460021a,
+       0x050f80ff, 0x053fa80a, 0x07000009, 0x03b600ac,
+       0x0484801f, 0x0280003d, 0x040fe02a, 0x028600f2,
+       0x06000013, 0x04001013, 0x0560102b, 0x050f80ff,
+       0x032fa012, 0x06420029, 0x0660002a, 0x050f80ff,
+       0x053fa809, 0x06000001, 0x050fe003, 0x00860110,
+       0x01028003, 0x0660002a, 0x050f80ff, 0x053fa80a,
+       0x07000009, 0x00800140, 0x00028013, 0x00027013,
+       0x00800140, 0x040fe02a, 0x028600f1, 0x06420029,
+       0x0660002a, 0x050f80ff, 0x053fa809, 0x06000001,
+       0x050fe003, 0x01860122, 0x03026003, 0x0660002a,
+       0x050f80ff, 0x053fa80a, 0x07000009, 0x00800140,
+       0x02026013, 0x02025013, 0x00800140, 0x040fe02a,
+       0x028600f1, 0x06420029, 0x0660002a, 0x050f80ff,
+       0x053fa809, 0x06000001, 0x050fe003, 0x00860134,
+       0x01022003, 0x0660002a, 0x050f80ff, 0x053fa80a,
+       0x07000009, 0x01800136, 0x00022013, 0x00021013,
+       0x0647f020, 0x007a0120, 0x04000101, 0x04a00285,
+       0x0400802a, 0x05a004f5, 0x009480f1, 0x0521d005,
+       0x028000f2, 0x038000fa, 0x0647f020, 0x06486020,
+       0x06818145, 0x04a00285, 0x028000f1, 0x007a0120,
+       0x04000101, 0x04a00285, 0x0400802a, 0x05a004f5,
+       0x028000f1, 0x040fd02a, 0x052e4003, 0x00208010,
+       0x05a004f5, 0x038000fa, 0x00018098, 0x07480018,
+       0x06818161, 0x05481018, 0x0781815f, 0x05482018,
+       0x0681815d, 0x07483018, 0x0681815b, 0x002fb004,
+       0x00800162, 0x012fb003, 0x00800162, 0x002fb002,
+       0x00800162, 0x002fb001, 0x00800162, 0x012fb000,
+       0x0179fe78, 0x070000ff, 0x030190ff, 0x00017086,
+       0x058b0166, 0x03385000, 0x03020000, 0x07780017,
+       0x00430407, 0x078181ee, 0x046c0419, 0x048101a2,
+       0x046c0219, 0x05810172, 0x07219000, 0x00800186,
+       0x07219000, 0x07483017, 0x0481018c, 0x05482017,
+       0x05810193, 0x0448b075, 0x06818186, 0x06601476,
+       0x050f80ff, 0x073fa022, 0x0600003e, 0x06000080,
+       0x05001081, 0x05002082, 0x06003083, 0x05004084,
+       0x04601c76, 0x050f80ff, 0x022fa02a, 0x07219000,
+       0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff,
+       0x0484801f, 0x0280003d, 0x040fe07f, 0x0086019b,
+       0x05a001bb, 0x00920186, 0x040fe07f, 0x07a681bb,
+       0x00800186, 0x0560107b, 0x050f80ff, 0x032fa009,
+       0x0744f000, 0x0560107b, 0x050f80ff, 0x032fa00a,
+       0x00800179, 0x052e400c, 0x040080fb, 0x046aa108,
+       0x06009076, 0x04002075, 0x05a004fc, 0x00800186,
+       0x06219001, 0x05482017, 0x058101af, 0x058b01a5,
+       0x060ff086, 0x0349f0ff, 0x07818165, 0x07483017,
+       0x058101ac, 0x050fd0ff, 0x040fe07f, 0x07a681bb,
+       0x00800186, 0x05004084, 0x05a00205, 0x00920186,
+       0x070ff07d, 0x0450047c, 0x056004ff, 0x050f80ff,
+       0x032fa009, 0x070ff000, 0x00540479, 0x030790ff,
+       0x01800193, 0x060ff079, 0x0054047a, 0x058201e7,
+       0x058101e7, 0x070ff07d, 0x0450047c, 0x050f80ff,
+       0x002fa819, 0x058b01c3, 0x02080001, 0x00081002,
+       0x01082003, 0x048b01c7, 0x03385000, 0x03010000,
+       0x02400019, 0x070ff003, 0x04500479, 0x030790ff,
+       0x0340007e, 0x0642007f, 0x058101e7, 0x070ff07e,
+       0x050f80ff, 0x032fa009, 0x050fe000, 0x028681e6,
+       0x070ff07d, 0x056002ff, 0x050f80ff, 0x032fa009,
+       0x0107d000, 0x018601e8, 0x0560087d, 0x050f80ff,
+       0x032fa009, 0x0569fe00, 0x0550041b, 0x050f80ff,
+       0x032fa009, 0x0107e000, 0x070ff07e, 0x018001d2,
+       0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb,
+       0x046aa108, 0x06009076, 0x04002075, 0x018004fc,
+       0x040fd076, 0x050fd017, 0x060ff086, 0x077800ff,
+       0x07000060, 0x037c00ff, 0x07000060, 0x078181f0,
+       0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff,
+       0x06601476, 0x050f80ff, 0x073fa022, 0x0600003e,
+       0x052e400c, 0x040080fb, 0x066a8108, 0x06009076,
+       0x04002075, 0x05a004fc, 0x02800029, 0x0240007f,
+       0x0742007e, 0x050f807e, 0x032fa009, 0x050fe000,
+       0x0286821f, 0x070ff07d, 0x055c047b, 0x05810214,
+       0x0760007d, 0x050f80ff, 0x032fa009, 0x050fe000,
+       0x03868214, 0x070ff07b, 0x0107d0ff, 0x0560087d,
+       0x050f80ff, 0x032fa009, 0x03681e00, 0x0450041c,
+       0x0107e0ff, 0x050f80ff, 0x032fa009, 0x050fe000,
+       0x01860221, 0x0307c000, 0x07c00000, 0x040fd076,
+       0x02800510, 0x010180c0, 0x0548e018, 0x0781823c,
+       0x0748f018, 0x06818238, 0x03490018, 0x06818234,
+       0x01491018, 0x07818230, 0x073c0000, 0x06000040,
+       0x02200004, 0x0180023f, 0x073c0000, 0x06000020,
+       0x03200003, 0x0180023f, 0x073c0000, 0x06000010,
+       0x02200002, 0x0180023f, 0x073c0000, 0x06000008,
+       0x02200001, 0x0180023f, 0x073c0000, 0x06000004,
+       0x06000013, 0x050fb000, 0x040fe076, 0x00860258,
+       0x046c0273, 0x04810268, 0x066c0073, 0x04810249,
+       0x040fd076, 0x06a00510, 0x03800014, 0x040fd076,
+       0x0080024c, 0x00452075, 0x00077013, 0x0647f075,
+       0x06486075, 0x06818252, 0x05a0028b, 0x00800258,
+       0x007a0175, 0x04000101, 0x05a0028b, 0x04008076,
+       0x0245f008, 0x05a004f5, 0x07273000, 0x05600272,
+       0x050f80ff, 0x053fa80a, 0x07000009, 0x0379ff78,
+       0x070000ff, 0x02076013, 0x02075013, 0x0484801f,
+       0x0280003d, 0x070fc0ff, 0x052e400c, 0x00208020,
+       0x05a004f5, 0x00800261, 0x04600276, 0x050010ff,
+       0x040f8001, 0x032fa009, 0x040f8001, 0x053fa80a,
+       0x07000009, 0x070ff000, 0x0286827a, 0x06601276,
+       0x050f80ff, 0x073fa009, 0x0700000c, 0x07601818,
+       0x050f80ff, 0x053fa80a, 0x07000009, 0x0180027b,
+       0x07a000de, 0x0448b075, 0x0581024b, 0x06000013,
+       0x04001013, 0x0560107b, 0x050f80ff, 0x032fa012,
+       0x0046b075, 0x03b600ac, 0x0080024c, 0x06000020,
+       0x04001016, 0x0460082a, 0x050f80ff, 0x032fa012,
+       0x07c00000, 0x06000075, 0x040010a2, 0x044b0801,
+       0x060ff016, 0x065a0001, 0x04600876, 0x050f80ff,
+       0x032fa012, 0x07c00000, 0x050fe022, 0x0186029a,
+       0x0421d004, 0x0302a022, 0x04a002c1, 0x018002b1,
+       0x040fe026, 0x008602b3, 0x0421d001, 0x0202a026,
+       0x04a002c1, 0x0202c013, 0x00683e20, 0x070060ff,
+       0x056c0206, 0x048102f4, 0x056c0406, 0x0781030a,
+       0x076c0606, 0x06810379, 0x056c1606, 0x078182b1,
+       0x04488020, 0x07810387, 0x040fd02a, 0x0521d000,
+       0x0202a013, 0x02020013, 0x008002b3, 0x04a004ec,
+       0x008002bf, 0x050fe028, 0x008602bf, 0x0302a028,
+       0x0421d002, 0x04a002c1, 0x008002c8, 0x050fe022,
+       0x008602bf, 0x0421d004, 0x0302a022, 0x04a002c1,
+       0x04a004ec, 0x05848030, 0x0280003d, 0x0460082a,
+       0x050f80ff, 0x022fa031, 0x03020000, 0x0002b004,
+       0x01018005, 0x07c00000, 0x0400702a, 0x06a003ba,
+       0x007a0101, 0x07060000, 0x07303000, 0x07008290,
+       0x07600018, 0x050f80ff, 0x053fa809, 0x07000003,
+       0x0448e007, 0x068182d6, 0x06006013, 0x018002dd,
+       0x02400010, 0x048102d6, 0x06006010, 0x0460322a,
+       0x050f80ff, 0x073fa00a, 0x07000003, 0x050f801e,
+       0x032fa03a, 0x063aa020, 0x06000002, 0x013e4000,
+       0x07000030, 0x009802e3, 0x070ff0f6, 0x036830ff,
+       0x078182e4, 0x070f001e, 0x0560102b, 0x050f10ff,
+       0x063f3c08, 0x0600000d, 0x013e4000, 0x06000020,
+       0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012,
+       0x0202c013, 0x008002bf, 0x04007013, 0x06a003ba,
+       0x007a0101, 0x07050000, 0x07303000, 0x07008890,
+       0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a,
+       0x05601a2b, 0x050f80ff, 0x022fa019, 0x04001002,
+       0x04002013, 0x040f801f, 0x022fa01a, 0x073aa00c,
+       0x06000002, 0x07300c03, 0x0600000d, 0x028003a7,
+       0x04007013, 0x06a003ba, 0x007a0101, 0x03070000,
+       0x0660282a, 0x050f80ff, 0x073fa009, 0x06000004,
+       0x02499008, 0x07810317, 0x07303000, 0x07008890,
+       0x02800319, 0x07303000, 0x04008980, 0x05007003,
+       0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a,
+       0x0760142b, 0x050f80ff, 0x032fa021, 0x064b0002,
+       0x02499008, 0x06810325, 0x0644c002, 0x054b0400,
+       0x050040ff, 0x06698104, 0x0581833a, 0x06000013,
+       0x04001013, 0x04780102, 0x06000010, 0x06003013,
+       0x04004013, 0x06005013, 0x06006013, 0x04007013,
+       0x00644015, 0x07820336, 0x04448002, 0x02205008,
+       0x040f801f, 0x032fa042, 0x04008015, 0x03800371,
+       0x046c8004, 0x05818348, 0x01208018, 0x06780002,
+       0x07000003, 0x0581834b, 0x06003001, 0x06000013,
+       0x04001013, 0x04004013, 0x06005013, 0x040f801f,
+       0x022fa032, 0x03800371, 0x040fd02a, 0x06a00510,
+       0x03800014, 0x04488002, 0x07810350, 0x070ff003,
+       0x04500408, 0x050080ff, 0x06489002, 0x06810357,
+       0x0379ff00, 0x070000ff, 0x070ff000, 0x04500408,
+       0x050080ff, 0x07005003, 0x05004000, 0x06003001,
+       0x06000013, 0x04001013, 0x040f801f, 0x022fa032,
+       0x05601c2b, 0x050f80ff, 0x022fa031, 0x06600c1f,
+       0x050f80ff, 0x022fa032, 0x02680608, 0x07810371,
+       0x016408ff, 0x057dfeff, 0x07ffffff, 0x034000ff,
+       0x045a0407, 0x070000ff, 0x0760061e, 0x050f80ff,
+       0x032fa00a, 0x06600908, 0x0669f908, 0x027a0008,
+       0x06000020, 0x070aa0ff, 0x014a20ff, 0x037a00ff,
+       0x060000dc, 0x070000ff, 0x028003a7, 0x04007013,
+       0x06a003ba, 0x007a0101, 0x07030000, 0x07303000,
+       0x07008190, 0x06006013, 0x050f801e, 0x032fa03a,
+       0x073aa000, 0x06000002, 0x07300c00, 0x07000005,
+       0x028003a7, 0x04007013, 0x06a003ba, 0x007a0101,
+       0x07810000, 0x07303000, 0x07000090, 0x06006013,
+       0x06600c2a, 0x050f80ff, 0x053fa809, 0x07000003,
+       0x04780107, 0x07ffff00, 0x007c0107, 0x07000500,
+       0x0581839a, 0x07303000, 0x05000890, 0x074d0005,
+       0x0660282a, 0x050f80ff, 0x053fa809, 0x07000003,
+       0x0049d007, 0x068103a1, 0x02206001, 0x050f801e,
+       0x032fa03a, 0x073aa000, 0x06000002, 0x07300c00,
+       0x07000005, 0x013e4000, 0x07000030, 0x039803a9,
+       0x070ff0f6, 0x036830ff, 0x058183aa, 0x070f001e,
+       0x040f101f, 0x070f3000, 0x013e4000, 0x06000020,
+       0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012,
+       0x008002bf, 0x03200000, 0x06006076, 0x028003bc,
+       0x03200011, 0x0600602a, 0x05a00441, 0x05600406,
+       0x050f80ff, 0x053fa809, 0x06000002, 0x07c00000,
+       0x0207602f, 0x04600876, 0x050f80ff, 0x022fa031,
+       0x03075000, 0x0007b004, 0x01018005, 0x06600076,
+       0x050020ff, 0x050f80ff, 0x012fa809, 0x0202f001,
+       0x008683d0, 0x0002e013, 0x040f8002, 0x053fa80a,
+       0x07000009, 0x06273001, 0x0448b075, 0x048183da,
+       0x04602076, 0x050f80ff, 0x053fa811, 0x0700003c,
+       0x0179fe78, 0x070000ff, 0x030190ff, 0x018683e2,
+       0x07a003f6, 0x00078019, 0x039203f5, 0x0180043a,
+       0x040fd076, 0x040fd019, 0x04600276, 0x050020ff,
+       0x050f80ff, 0x032fa009, 0x040f8002, 0x053fa80a,
+       0x07000009, 0x050fe000, 0x008683f2, 0x07601818,
+       0x050f80ff, 0x053fa80a, 0x07000009, 0x038003f3,
+       0x07a000de, 0x07273000, 0x02076013, 0x0280003d,
+       0x078b03f6, 0x03385000, 0x07030000, 0x05600818,
+       0x050f80ff, 0x032fa009, 0x054b0400, 0x0308a0ff,
+       0x0179fe00, 0x070000ff, 0x010880ff, 0x0448b075,
+       0x04810410, 0x0760147b, 0x050f80ff, 0x002fa819,
+       0x064b0001, 0x02080002, 0x01081003, 0x00082001,
+       0x02083001, 0x02079001, 0x0207a001, 0x00084013,
+       0x0207f013, 0x00800432, 0x06485075, 0x05810428,
+       0x02465075, 0x06601476, 0x050f80ff, 0x073fa021,
+       0x0600003e, 0x070ff07d, 0x0450047c, 0x050f80ff,
+       0x002fa819, 0x058b041b, 0x02080001, 0x00081002,
+       0x01082003, 0x03079003, 0x0208307a, 0x0340007e,
+       0x0642007f, 0x0581042d, 0x070ff07e, 0x05a001d2,
+       0x0392842d, 0x01800439, 0x058b0428, 0x06601476,
+       0x050f80ff, 0x073fa041, 0x0600003e, 0x06602476,
+       0x050f80ff, 0x073fa009, 0x06000007, 0x0008400e,
+       0x048b0432, 0x03385000, 0x03010000, 0x06219001,
+       0x040fe07f, 0x01860439, 0x018001bb, 0x07c00000,
+       0x00683e75, 0x0581043f, 0x0448d075, 0x05810465,
+       0x01800493, 0x05a004f0, 0x038003f5, 0x0297844c,
+       0x07602418, 0x050f80ff, 0x012fa809, 0x06780001,
+       0x070000ff, 0x075a0000, 0x070ff014, 0x0569feff,
+       0x054b08ff, 0x075a0000, 0x05600418, 0x050f80ff,
+       0x012fa809, 0x040fe007, 0x03868453, 0x01204000,
+       0x00800461, 0x00700101, 0x03010000, 0x06780001,
+       0x07ff0000, 0x076c00ff, 0x0681845b, 0x00700101,
+       0x03010000, 0x05600418, 0x050f80ff, 0x012fa80a,
+       0x06780001, 0x07ff0000, 0x050040ff, 0x0279ff01,
+       0x0700ffff, 0x05002014, 0x07c00000, 0x04007076,
+       0x0448b075, 0x0481047f, 0x03200011, 0x06006076,
+       0x06a003bc, 0x007a0101, 0x07060000, 0x07303000,
+       0x07008290, 0x07600018, 0x050f80ff, 0x053fa809,
+       0x07000003, 0x0448e007, 0x07818477, 0x06006013,
+       0x0180048e, 0x02400010, 0x05810477, 0x06006010,
+       0x04603276, 0x050f80ff, 0x073fa00a, 0x07000003,
+       0x0180048e, 0x04602a76, 0x050f80ff, 0x032fa009,
+       0x060ff07a, 0x05500400, 0x070000ff, 0x04602a76,
+       0x050f80ff, 0x032fa00a, 0x07a003b7, 0x007a0101,
+       0x03010000, 0x06303008, 0x05008000, 0x0600600e,
+       0x050f8074, 0x032fa03a, 0x053079a0, 0x0700000c,
+       0x008004d3, 0x00683e75, 0x076c0aff, 0x058104b2,
+       0x04007013, 0x03200011, 0x06006076, 0x06a003bc,
+       0x007a0101, 0x03070000, 0x06602876, 0x050f80ff,
+       0x053fa809, 0x06000001, 0x03499003, 0x048104a7,
+       0x07303000, 0x07008890, 0x053079a0, 0x0700000c,
+       0x008004ab, 0x07303000, 0x04008980, 0x04307920,
+       0x0700000c, 0x074d0005, 0x06006013, 0x050f8074,
+       0x032fa03a, 0x04307920, 0x0700000c, 0x008004d3,
+       0x04602a76, 0x050f80ff, 0x032fa009, 0x060ff07a,
+       0x05500400, 0x070000ff, 0x04602a76, 0x050f80ff,
+       0x032fa00a, 0x04007076, 0x07a003b7, 0x007a0101,
+       0x03010000, 0x06303008, 0x07008800, 0x074d0005,
+       0x06600a76, 0x050f80ff, 0x073fa009, 0x07000003,
+       0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e,
+       0x050f8074, 0x032fa03a, 0x0648c075, 0x058104d1,
+       0x06307d20, 0x0700000c, 0x008004d3, 0x04307920,
+       0x0700000c, 0x013e4000, 0x07000030, 0x009804d5,
+       0x070ff0f6, 0x074850ff, 0x068184d6, 0x050f2074,
+       0x060a0007, 0x040070fb, 0x046a7007, 0x050f40ff,
+       0x013e4000, 0x06000020, 0x0678007a, 0x07fff000,
+       0x068184e6, 0x0320000a, 0x022017d0, 0x008004e9,
+       0x0320000a, 0x06301b58, 0x06000001, 0x050f8072,
+       0x032fa012, 0x038003f5, 0x01208060, 0x0600902a,
+       0x04002020, 0x018004fc, 0x040080fb, 0x066ae108,
+       0x06009076, 0x04002075, 0x018004fc, 0x03201100,
+       0x078484fa, 0x06420001, 0x078184f6, 0x02800513,
+       0x020e0008, 0x07c00000, 0x050fd009, 0x040fd008,
+       0x03201100, 0x05848503, 0x06420001, 0x078184ff,
+       0x02800513, 0x007a0102, 0x04000101, 0x05600809,
+       0x050f80ff, 0x073fa00a, 0x06000001, 0x020e0008,
+       0x0684050d, 0x030e0009, 0x07c00000, 0x01011009,
+       0x052e4300, 0x07c00000, 0x052e400f, 0x01208090,
+       0x018004f5, 0x070fc0ff, 0x040f8013, 0x032fa009,
+       0x02800516, 0x15416ea9, 0xffef0b01
+};
+
+#ifdef UNIQUE_FW_NAME
+uint32_t fw2400_length02 = 0x000014ff ;
+#else
+uint32_t risc_code_length02 = 0x000014ff ;
+#endif
+
index 48e460eef05a8818bd5003323b9d242cde141a6e..2efca52dff50c45629b82c6a9d3c3a2ea137d497 100644 (file)
@@ -232,7 +232,7 @@ static ssize_t
 qla2x00_isp_name_show(struct class_device *cdev, char *buf)
 {
        scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
-       return snprintf(buf, PAGE_SIZE, "%s\n", ha->brd_info->isp_name);
+       return snprintf(buf, PAGE_SIZE, "ISP%04X\n", ha->pdev->device);
 }
 
 static ssize_t
index 7096945ea2344be3f9ace82ef02618b99585cc39..79d8a914f9d0f4ddb213fd1bd9d5b63f68c39138 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/completion.h>
 #include <linux/interrupt.h>
 #include <linux/workqueue.h>
+#include <linux/firmware.h>
 #include <asm/semaphore.h>
 
 #include <scsi/scsi.h>
@@ -29,6 +30,7 @@
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_cmnd.h>
 
+#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
 #if defined(CONFIG_SCSI_QLA21XX) || defined(CONFIG_SCSI_QLA21XX_MODULE)
 #define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100)
 #else
 #define IS_QLA2522(ha) 0
 #endif
 
+#else  /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */
+
+#define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100)
+#define IS_QLA2200(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2200)
+#define IS_QLA2300(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2300)
+#define IS_QLA2312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2312)
+#define IS_QLA2322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322)
+#define IS_QLA6312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6312)
+#define IS_QLA6322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6322)
+#define IS_QLA2422(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422)
+#define IS_QLA2432(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432)
+#define IS_QLA2512(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2512)
+#define IS_QLA2522(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2522)
+#endif
+
 #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \
                         IS_QLA6312(ha) || IS_QLA6322(ha))
-
 #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha))
 #define IS_QLA25XX(ha) (IS_QLA2512(ha) || IS_QLA2522(ha))
 
@@ -2124,6 +2140,12 @@ struct qla_board_info {
        struct scsi_host_template *sht;
 };
 
+struct fw_blob {
+       char *name;
+       uint32_t segs[4];
+       const struct firmware *fw;
+};
+
 /* Return data from MBC_GET_ID_LIST call. */
 struct gid_list_info {
        uint8_t al_pa;
@@ -2476,17 +2498,9 @@ typedef struct scsi_qla_host {
  */
 #define LOOP_TRANSITION(ha) \
        (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
-        test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
-
-#define LOOP_NOT_READY(ha) \
-       ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
-         test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || \
-         test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \
-         test_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags)) || \
+        test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \
         atomic_read(&ha->loop_state) == LOOP_DOWN)
 
-#define LOOP_RDY(ha)   (!LOOP_NOT_READY(ha))
-
 #define TGT_Q(ha, t) (ha->otgt[t])
 
 #define to_qla_host(x)         ((scsi_qla_host_t *) (x)->hostdata)
index fedcb0d3fc72a3f08af716db0ee828030907a7f4..bec81adcf4fd7938f07417b39c26ce4c1d921c47 100644 (file)
@@ -33,8 +33,8 @@ extern int qla24xx_nvram_config(struct scsi_qla_host *);
 extern void qla2x00_update_fw_options(struct scsi_qla_host *);
 extern void qla24xx_update_fw_options(scsi_qla_host_t *);
 extern int qla2x00_load_risc(struct scsi_qla_host *, uint32_t *);
+extern int qla24xx_load_risc(scsi_qla_host_t *, uint32_t *);
 extern int qla24xx_load_risc_flash(scsi_qla_host_t *, uint32_t *);
-extern int qla24xx_load_risc_hotplug(scsi_qla_host_t *, uint32_t *);
 
 extern fc_port_t *qla2x00_alloc_fcport(scsi_qla_host_t *, gfp_t);
 
@@ -76,6 +76,8 @@ extern void qla2x00_blink_led(scsi_qla_host_t *);
 
 extern int qla2x00_down_timeout(struct semaphore *, unsigned long);
 
+extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *);
+
 /*
  * Global Function Prototypes in qla_iocb.c source file.
  */
index 2d720121a0d36fea181edc21dbc701349dab6731..7d973bd9022bb84773a11aa490ed39df1608133a 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <linux/delay.h>
 #include <linux/vmalloc.h>
-#include <linux/firmware.h>
 #include <scsi/scsi_transport_fc.h>
 
 #include "qla_devtbl.h"
@@ -1259,7 +1258,7 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
        rval = qla2x00_get_adapter_id(ha,
            &loop_id, &al_pa, &area, &domain, &topo);
        if (rval != QLA_SUCCESS) {
-               if (LOOP_NOT_READY(ha) || atomic_read(&ha->loop_down_timer) ||
+               if (LOOP_TRANSITION(ha) || atomic_read(&ha->loop_down_timer) ||
                    (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
                        DEBUG2(printk("%s(%ld) Loop is in a transition state\n",
                            __func__, ha->host_no));
@@ -1796,7 +1795,7 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
        }
 
        if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
-               if (LOOP_NOT_READY(ha)) {
+               if (LOOP_TRANSITION(ha)) {
                        rval = QLA_FUNCTION_FAILED;
                } else {
                        rval = qla2x00_configure_fabric(ha);
@@ -2369,7 +2368,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports)
                if (qla2x00_is_reserved_id(ha, loop_id))
                        continue;
 
-               if (atomic_read(&ha->loop_down_timer) || LOOP_NOT_READY(ha))
+               if (atomic_read(&ha->loop_down_timer) || LOOP_TRANSITION(ha))
                        break;
 
                if (swl != NULL) {
@@ -3484,17 +3483,16 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        return (rval);
 }
 
+#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
+
 int
 qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
 {
-       int             rval;
-       uint16_t        cnt;
-       uint16_t        *risc_code;
-       unsigned long   risc_address;
-       unsigned long   risc_code_size;
-       int             num;
-       int             i;
-       uint16_t        *req_ring;
+       int     rval, num, i;
+       uint32_t cnt;
+       uint16_t *risc_code;
+       uint32_t risc_addr, risc_size;
+       uint16_t *req_ring;
        struct qla_fw_info *fw_iter;
 
        rval = QLA_SUCCESS;
@@ -3504,37 +3502,29 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        *srisc_addr = *ha->brd_info->fw_info->fwstart;
        while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) {
                risc_code = fw_iter->fwcode;
-               risc_code_size = *fw_iter->fwlen;
-
-               if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) {
-                       risc_address = *fw_iter->fwstart;
-               } else {
-                       /* Extended address */
-                       risc_address = *fw_iter->lfwstart;
-               }
+               risc_size = *fw_iter->fwlen;
+               if (fw_iter->addressing == FW_INFO_ADDR_NORMAL)
+                       risc_addr = *fw_iter->fwstart;
+               else
+                       risc_addr = *fw_iter->lfwstart;
 
                num = 0;
                rval = 0;
-               while (risc_code_size > 0 && !rval) {
+               while (risc_size > 0 && !rval) {
                        cnt = (uint16_t)(ha->fw_transfer_size >> 1);
-                       if (cnt > risc_code_size)
-                               cnt = risc_code_size;
+                       if (cnt > risc_size)
+                               cnt = risc_size;
 
                        DEBUG7(printk("scsi(%ld): Loading risc segment@ "
                            "addr %p, number of bytes 0x%x, offset 0x%lx.\n",
-                           ha->host_no, risc_code, cnt, risc_address));
+                           ha->host_no, risc_code, cnt, risc_addr));
 
                        req_ring = (uint16_t *)ha->request_ring;
                        for (i = 0; i < cnt; i++)
                                req_ring[i] = cpu_to_le16(risc_code[i]);
 
-                       if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) {
-                               rval = qla2x00_load_ram(ha, ha->request_dma,
-                                   risc_address, cnt);
-                       } else {
-                               rval = qla2x00_load_ram_ext(ha,
-                                   ha->request_dma, risc_address, cnt);
-                       }
+                       rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
+                           cnt);
                        if (rval) {
                                DEBUG(printk("scsi(%ld): [ERROR] Failed to "
                                    "load segment %d of firmware\n",
@@ -3548,16 +3538,76 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
                        }
 
                        risc_code += cnt;
-                       risc_address += cnt;
-                       risc_code_size -= cnt;
+                       risc_addr += cnt;
+                       risc_size -= cnt;
                        num++;
                }
 
                /* Next firmware sequence */
                fw_iter++;
        }
+       return rval;
+}
 
-       return (rval);
+int
+qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
+{
+       int     rval, num, i;
+       uint32_t cnt;
+       uint32_t *risc_code;
+       uint32_t risc_addr, risc_size;
+       uint32_t *req_ring;
+       struct qla_fw_info *fw_iter;
+
+       rval = QLA_SUCCESS;
+
+       /* Load firmware sequences */
+       fw_iter = ha->brd_info->fw_info;
+       *srisc_addr = *((uint32_t *)fw_iter->lfwstart);
+       while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) {
+               risc_code = (uint32_t *)fw_iter->fwcode;
+               risc_size = *((uint32_t *)fw_iter->fwlen);
+               risc_addr = *((uint32_t *)fw_iter->lfwstart);
+
+               num = 0;
+               rval = 0;
+               while (risc_size > 0 && !rval) {
+                       cnt = (uint32_t)(ha->fw_transfer_size >> 2);
+                       if (cnt > risc_size)
+                               cnt = risc_size;
+
+                       DEBUG7(printk("scsi(%ld): Loading risc segment@ "
+                           "addr %p, number of bytes 0x%x, offset 0x%lx.\n",
+                           ha->host_no, risc_code, cnt, risc_addr));
+
+                       req_ring = (uint32_t *)ha->request_ring;
+                       for (i = 0; i < cnt; i++)
+                               req_ring[i] = cpu_to_le32(risc_code[i]);
+
+                       rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
+                           cnt);
+                       if (rval) {
+                               DEBUG(printk("scsi(%ld): [ERROR] Failed to "
+                                   "load segment %d of firmware\n",
+                                   ha->host_no, num));
+                               qla_printk(KERN_WARNING, ha,
+                                   "[ERROR] Failed to load segment %d of "
+                                   "firmware\n", num);
+
+                               qla2x00_dump_regs(ha);
+                               break;
+                       }
+
+                       risc_code += cnt;
+                       risc_addr += cnt;
+                       risc_size -= cnt;
+                       num++;
+               }
+
+               /* Next firmware sequence */
+               fw_iter++;
+       }
+       return rval;
 }
 
 int
@@ -3642,8 +3692,108 @@ qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        return rval;
 }
 
+#else  /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */
+
 int
-qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr)
+qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
+{
+       int     rval;
+       int     i, fragment;
+       uint16_t *wcode, *fwcode;
+       uint32_t risc_addr, risc_size, fwclen, wlen, *seg;
+       struct fw_blob *blob;
+
+       /* Load firmware blob. */
+       blob = qla2x00_request_firmware(ha);
+       if (!blob) {
+               qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n");
+               return QLA_FUNCTION_FAILED;
+       }
+
+       rval = QLA_SUCCESS;
+
+       wcode = (uint16_t *)ha->request_ring;
+       *srisc_addr = 0;
+       fwcode = (uint16_t *)blob->fw->data;
+       fwclen = 0;
+
+       /* Validate firmware image by checking version. */
+       if (blob->fw->size < 8 * sizeof(uint16_t)) {
+               qla_printk(KERN_WARNING, ha,
+                   "Unable to verify integrity of firmware image (%Zd)!\n",
+                   blob->fw->size);
+               goto fail_fw_integrity;
+       }
+       for (i = 0; i < 4; i++)
+               wcode[i] = be16_to_cpu(fwcode[i + 4]);
+       if ((wcode[0] == 0xffff && wcode[1] == 0xffff && wcode[2] == 0xffff &&
+           wcode[3] == 0xffff) || (wcode[0] == 0 && wcode[1] == 0 &&
+               wcode[2] == 0 && wcode[3] == 0)) {
+               qla_printk(KERN_WARNING, ha,
+                   "Unable to verify integrity of firmware image!\n");
+               qla_printk(KERN_WARNING, ha,
+                   "Firmware data: %04x %04x %04x %04x!\n", wcode[0],
+                   wcode[1], wcode[2], wcode[3]);
+               goto fail_fw_integrity;
+       }
+
+       seg = blob->segs;
+       while (*seg && rval == QLA_SUCCESS) {
+               risc_addr = *seg;
+               *srisc_addr = *srisc_addr == 0 ? *seg : *srisc_addr;
+               risc_size = be16_to_cpu(fwcode[3]);
+
+               /* Validate firmware image size. */
+               fwclen += risc_size * sizeof(uint16_t);
+               if (blob->fw->size < fwclen) {
+                       qla_printk(KERN_WARNING, ha,
+                           "Unable to verify integrity of firmware image "
+                           "(%Zd)!\n", blob->fw->size);
+                       goto fail_fw_integrity;
+               }
+
+               fragment = 0;
+               while (risc_size > 0 && rval == QLA_SUCCESS) {
+                       wlen = (uint16_t)(ha->fw_transfer_size >> 1);
+                       if (wlen > risc_size)
+                               wlen = risc_size;
+
+                       DEBUG7(printk("scsi(%ld): Loading risc segment@ risc "
+                           "addr %x, number of words 0x%x.\n", ha->host_no,
+                           risc_addr, wlen));
+
+                       for (i = 0; i < wlen; i++)
+                               wcode[i] = swab16(fwcode[i]);
+
+                       rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
+                           wlen);
+                       if (rval) {
+                               DEBUG(printk("scsi(%ld):[ERROR] Failed to load "
+                                   "segment %d of firmware\n", ha->host_no,
+                                   fragment));
+                               qla_printk(KERN_WARNING, ha,
+                                   "[ERROR] Failed to load segment %d of "
+                                   "firmware\n", fragment);
+                               break;
+                       }
+
+                       fwcode += wlen;
+                       risc_addr += wlen;
+                       risc_size -= wlen;
+                       fragment++;
+               }
+
+               /* Next segment. */
+               seg++;
+       }
+       return rval;
+
+fail_fw_integrity:
+       return QLA_FUNCTION_FAILED;
+}
+
+int
+qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
 {
        int     rval;
        int     segments, fragment;
@@ -3651,14 +3801,13 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        uint32_t risc_addr;
        uint32_t risc_size;
        uint32_t i;
-       const struct firmware *fw_entry;
+       struct fw_blob *blob;
        uint32_t *fwcode, fwclen;
 
-       if (request_firmware(&fw_entry, ha->brd_info->fw_fname,
-           &ha->pdev->dev)) {
-               qla_printk(KERN_ERR, ha,
-                   "Firmware image file not available: '%s'\n",
-                   ha->brd_info->fw_fname);
+       /* Load firmware blob. */
+       blob = qla2x00_request_firmware(ha);
+       if (!blob) {
+               qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n");
                return QLA_FUNCTION_FAILED;
        }
 
@@ -3667,14 +3816,14 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        segments = FA_RISC_CODE_SEGMENTS;
        dcode = (uint32_t *)ha->request_ring;
        *srisc_addr = 0;
-       fwcode = (uint32_t *)fw_entry->data;
+       fwcode = (uint32_t *)blob->fw->data;
        fwclen = 0;
 
        /* Validate firmware image by checking version. */
-       if (fw_entry->size < 8 * sizeof(uint32_t)) {
+       if (blob->fw->size < 8 * sizeof(uint32_t)) {
                qla_printk(KERN_WARNING, ha,
-                   "Unable to verify integrity of flash firmware image "
-                   "(%Zd)!\n", fw_entry->size);
+                   "Unable to verify integrity of firmware image (%Zd)!\n",
+                   blob->fw->size);
                goto fail_fw_integrity;
        }
        for (i = 0; i < 4; i++)
@@ -3684,7 +3833,7 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr)
            (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
                dcode[3] == 0)) {
                qla_printk(KERN_WARNING, ha,
-                   "Unable to verify integrity of flash firmware image!\n");
+                   "Unable to verify integrity of firmware image!\n");
                qla_printk(KERN_WARNING, ha,
                    "Firmware data: %08x %08x %08x %08x!\n", dcode[0],
                    dcode[1], dcode[2], dcode[3]);
@@ -3698,10 +3847,11 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr)
 
                /* Validate firmware image size. */
                fwclen += risc_size * sizeof(uint32_t);
-               if (fw_entry->size < fwclen) {
+               if (blob->fw->size < fwclen) {
                        qla_printk(KERN_WARNING, ha,
-                           "Unable to verify integrity of flash firmware "
-                           "image (%Zd)!\n", fw_entry->size);
+                           "Unable to verify integrity of firmware image "
+                           "(%Zd)!\n", blob->fw->size);
+
                        goto fail_fw_integrity;
                }
 
@@ -3739,13 +3889,9 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr)
                /* Next segment. */
                segments--;
        }
-
-       release_firmware(fw_entry);
        return rval;
 
 fail_fw_integrity:
-
-       release_firmware(fw_entry);
        return QLA_FUNCTION_FAILED;
-
 }
+#endif
index 09afc0f06bd4819d4dc9fd9c4650b2cda521454b..5181d966fecba13be29a57c8d1c7e7cc84b753f4 100644 (file)
@@ -909,6 +909,21 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
                        resid = resid_len;
                        cp->resid = resid;
                        CMD_RESID_LEN(cp) = resid;
+
+                       if (!lscsi_status &&
+                           ((unsigned)(cp->request_bufflen - resid) <
+                            cp->underflow)) {
+                               qla_printk(KERN_INFO, ha,
+                                   "scsi(%ld:%d:%d:%d): Mid-layer underflow "
+                                   "detected (%x of %x bytes)...returning "
+                                   "error status.\n", ha->host_no,
+                                   cp->device->channel, cp->device->id,
+                                   cp->device->lun, resid,
+                                   cp->request_bufflen);
+
+                               cp->result = DID_ERROR << 16;
+                               break;
+                       }
                }
                cp->result = DID_OK << 16 | lscsi_status;
 
index c58c9d97b041e4e79121fb940d962d812ea62d40..24304300d7b57b1fa359cd73660636590702e1b4 100644 (file)
@@ -54,10 +54,12 @@ module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(ql2xloginretrycount,
                "Specify an alternate value for the NVRAM login retry count.");
 
-int ql2xfwloadbin=1;
-module_param(ql2xfwloadbin, int, S_IRUGO|S_IRUSR);
-MODULE_PARM_DESC(ql2xfwloadbin,
-               "Load ISP2xxx firmware image via hotplug.");
+#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
+int ql2xfwloadflash;
+module_param(ql2xfwloadflash, int, S_IRUGO|S_IRUSR);
+MODULE_PARM_DESC(ql2xfwloadflash,
+               "Load ISP24xx firmware image from FLASH (onboard memory).");
+#endif
 
 static void qla2x00_free_device(scsi_qla_host_t *);
 
@@ -1261,12 +1263,16 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
        char pci_info[20];
        char fw_str[30];
        fc_port_t *fcport;
+       struct scsi_host_template *sht;
 
        if (pci_enable_device(pdev))
                goto probe_out;
 
-       host = scsi_host_alloc(brd_info->sht ? brd_info->sht:
-           &qla2x00_driver_template, sizeof(scsi_qla_host_t));
+       sht = &qla2x00_driver_template;
+       if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 ||
+           pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432)
+               sht = &qla24xx_driver_template;
+       host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t));
        if (host == NULL) {
                printk(KERN_WARNING
                    "qla2xxx: Couldn't allocate host from scsi layer!\n");
@@ -1291,8 +1297,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                goto probe_failed;
 
        qla_printk(KERN_INFO, ha,
-           "Found an %s, irq %d, iobase 0x%p\n", ha->brd_info->isp_name,
-           pdev->irq, ha->iobase);
+           "Found an ISP%04X, irq %d, iobase 0x%p\n", pdev->device, pdev->irq,
+           ha->iobase);
 
        spin_lock_init(&ha->hardware_lock);
 
@@ -1368,9 +1374,11 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                ha->isp_ops.reset_adapter = qla24xx_reset_adapter;
                ha->isp_ops.nvram_config = qla24xx_nvram_config;
                ha->isp_ops.update_fw_options = qla24xx_update_fw_options;
-               ha->isp_ops.load_risc = qla24xx_load_risc_flash;
-               if (ql2xfwloadbin)
-                       ha->isp_ops.load_risc = qla24xx_load_risc_hotplug;
+               ha->isp_ops.load_risc = qla24xx_load_risc;
+#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
+               if (ql2xfwloadflash)
+                       ha->isp_ops.load_risc = qla24xx_load_risc_flash;
+#endif
                ha->isp_ops.pci_info_str = qla24xx_pci_info_str;
                ha->isp_ops.fw_version_str = qla24xx_fw_version_str;
                ha->isp_ops.intr_handler = qla24xx_intr_handler;
@@ -1531,11 +1539,12 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
        qla_printk(KERN_INFO, ha, "\n"
            " QLogic Fibre Channel HBA Driver: %s\n"
            "  QLogic %s - %s\n"
-           "  %s: %s @ %s hdma%c, host#=%ld, fw=%s\n", qla2x00_version_str,
-           ha->model_number, ha->model_desc ? ha->model_desc: "",
-           ha->brd_info->isp_name, ha->isp_ops.pci_info_str(ha, pci_info),
-           pci_name(pdev), ha->flags.enable_64bit_addressing ? '+': '-',
-           ha->host_no, ha->isp_ops.fw_version_str(ha, fw_str));
+           "  ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n",
+           qla2x00_version_str, ha->model_number,
+           ha->model_desc ? ha->model_desc: "", pdev->device,
+           ha->isp_ops.pci_info_str(ha, pci_info), pci_name(pdev),
+           ha->flags.enable_64bit_addressing ? '+': '-', ha->host_no,
+           ha->isp_ops.fw_version_str(ha, fw_str));
 
        /* Go with fc_rport registration. */
        list_for_each_entry(fcport, &ha->fcports, list)
@@ -2483,45 +2492,115 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout)
        return -ETIMEDOUT;
 }
 
-static struct qla_board_info qla_board_tbl[] = {
-       {
-               .drv_name       = "qla2400",
-               .isp_name       = "ISP2422",
-               .fw_fname       = "ql2400_fw.bin",
-               .sht            = &qla24xx_driver_template,
-       },
-       {
-               .drv_name       = "qla2400",
-               .isp_name       = "ISP2432",
-               .fw_fname       = "ql2400_fw.bin",
-               .sht            = &qla24xx_driver_template,
-       },
+#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
+
+#define qla2x00_release_firmware()     do { } while (0)
+#define qla2x00_pci_module_init()      (0)
+#define qla2x00_pci_module_exit()      do { } while (0)
+
+#else  /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */
+
+/* Firmware interface routines. */
+
+#define FW_BLOBS       6
+#define FW_ISP21XX     0
+#define FW_ISP22XX     1
+#define FW_ISP2300     2
+#define FW_ISP2322     3
+#define FW_ISP63XX     4
+#define FW_ISP24XX     5
+
+static DECLARE_MUTEX(qla_fw_lock);
+
+static struct fw_blob qla_fw_blobs[FW_BLOBS] = {
+       { .name = "ql2100_fw.bin", .segs = { 0x1000, 0 }, },
+       { .name = "ql2200_fw.bin", .segs = { 0x1000, 0 }, },
+       { .name = "ql2300_fw.bin", .segs = { 0x800, 0 }, },
+       { .name = "ql2322_fw.bin", .segs = { 0x800, 0x1c000, 0x1e000, 0 }, },
+       { .name = "ql6312_fw.bin", .segs = { 0x800, 0 }, },
+       { .name = "ql2400_fw.bin", },
+};
+
+struct fw_blob *
+qla2x00_request_firmware(scsi_qla_host_t *ha)
+{
+       struct fw_blob *blob;
+
+       blob = NULL;
+       if (IS_QLA2100(ha)) {
+               blob = &qla_fw_blobs[FW_ISP21XX];
+       } else if (IS_QLA2200(ha)) {
+               blob = &qla_fw_blobs[FW_ISP22XX];
+       } else if (IS_QLA2300(ha) || IS_QLA2312(ha)) {
+               blob = &qla_fw_blobs[FW_ISP2300];
+       } else if (IS_QLA2322(ha)) {
+               blob = &qla_fw_blobs[FW_ISP2322];
+       } else if (IS_QLA6312(ha) || IS_QLA6322(ha)) {
+               blob = &qla_fw_blobs[FW_ISP63XX];
+       } else if (IS_QLA24XX(ha)) {
+               blob = &qla_fw_blobs[FW_ISP24XX];
+       }
+
+       down(&qla_fw_lock);
+       if (blob->fw)
+               goto out;
+
+       if (request_firmware(&blob->fw, blob->name, &ha->pdev->dev)) {
+               DEBUG2(printk("scsi(%ld): Failed to load firmware image "
+                   "(%s).\n", ha->host_no, blob->name));
+               blob->fw = NULL;
+               blob = NULL;
+               goto out;
+       }
+
+out:
+       up(&qla_fw_lock);
+       return blob;
+}
+
+static void
+qla2x00_release_firmware(void)
+{
+       int idx;
+
+       down(&qla_fw_lock);
+       for (idx = 0; idx < FW_BLOBS; idx++)
+               if (qla_fw_blobs[idx].fw)
+                       release_firmware(qla_fw_blobs[idx].fw);
+       up(&qla_fw_lock);
+}
+
+static struct qla_board_info qla_board_tbl = {
+       .drv_name       = "qla2xxx",
 };
 
 static struct pci_device_id qla2xxx_pci_tbl[] = {
-       {
-               .vendor         = PCI_VENDOR_ID_QLOGIC,
-               .device         = PCI_DEVICE_ID_QLOGIC_ISP2422,
-               .subvendor      = PCI_ANY_ID,
-               .subdevice      = PCI_ANY_ID,
-               .driver_data    = (unsigned long)&qla_board_tbl[0],
-       },
-       {
-               .vendor         = PCI_VENDOR_ID_QLOGIC,
-               .device         = PCI_DEVICE_ID_QLOGIC_ISP2432,
-               .subvendor      = PCI_ANY_ID,
-               .subdevice      = PCI_ANY_ID,
-               .driver_data    = (unsigned long)&qla_board_tbl[1],
-       },
-       {0, 0},
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2100,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2200,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2300,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2312,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2322,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6312,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6322,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2422,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432,
+               PCI_ANY_ID, PCI_ANY_ID, },
+       { 0 },
 };
 MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl);
 
 static int __devinit
 qla2xxx_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
-       return qla2x00_probe_one(pdev,
-           (struct qla_board_info *)id->driver_data);
+       return qla2x00_probe_one(pdev, &qla_board_tbl);
 }
 
 static void __devexit
@@ -2532,11 +2611,28 @@ qla2xxx_remove_one(struct pci_dev *pdev)
 
 static struct pci_driver qla2xxx_pci_driver = {
        .name           = "qla2xxx",
+       .driver         = {
+               .owner          = THIS_MODULE,
+       },
        .id_table       = qla2xxx_pci_tbl,
        .probe          = qla2xxx_probe_one,
        .remove         = __devexit_p(qla2xxx_remove_one),
 };
 
+static inline int
+qla2x00_pci_module_init(void)
+{
+       return pci_module_init(&qla2xxx_pci_driver);
+}
+
+static inline void
+qla2x00_pci_module_exit(void)
+{
+       pci_unregister_driver(&qla2xxx_pci_driver);
+}
+
+#endif
+
 /**
  * qla2x00_module_init - Module initialization.
  **/
@@ -2556,6 +2652,9 @@ qla2x00_module_init(void)
 
        /* Derive version string. */
        strcpy(qla2x00_version_str, QLA2XXX_VERSION);
+#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
+       strcat(qla2x00_version_str, "-fw");
+#endif
 #if DEBUG_QLA2100
        strcat(qla2x00_version_str, "-debug");
 #endif
@@ -2565,7 +2664,7 @@ qla2x00_module_init(void)
                return -ENODEV;
 
        printk(KERN_INFO "QLogic Fibre Channel HBA Driver\n");
-       ret = pci_module_init(&qla2xxx_pci_driver);
+       ret = qla2x00_pci_module_init();
        if (ret) {
                kmem_cache_destroy(srb_cachep);
                fc_release_transport(qla2xxx_transport_template);
@@ -2579,7 +2678,8 @@ qla2x00_module_init(void)
 static void __exit
 qla2x00_module_exit(void)
 {
-       pci_unregister_driver(&qla2xxx_pci_driver);
+       qla2x00_pci_module_exit();
+       qla2x00_release_firmware();
        kmem_cache_destroy(srb_cachep);
        fc_release_transport(qla2xxx_transport_template);
 }
index 5b1c12041a4fd054ffb00bed6bb9eefda1665930..5ec5f44602ac8ebd7d18aa1865523fc4873233df 100644 (file)
@@ -115,7 +115,7 @@ static DECLARE_TRANSPORT_CLASS(raid_class,
                               raid_remove,
                               NULL);
 
-static struct {
+static const struct {
        enum raid_state value;
        char            *name;
 } raid_states[] = {
index ab7432a5778e278a7ece69777d253911b365646e..b2bf16a9bf4bffd094164a852a39295eb0fbfc10 100644 (file)
@@ -86,7 +86,8 @@ enum {
        MV_FLAG_DUAL_HC         = (1 << 30),  /* two SATA Host Controllers */
        MV_FLAG_IRQ_COALESCE    = (1 << 29),  /* IRQ coalescing capability */
        MV_COMMON_FLAGS         = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                  ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO),
+                                  ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO |
+                                  ATA_FLAG_NO_ATAPI),
        MV_6XXX_FLAGS           = MV_FLAG_IRQ_COALESCE,
 
        CRQB_FLAG_READ          = (1 << 0),
@@ -430,7 +431,7 @@ static const struct ata_port_operations mv6_ops = {
        .host_stop              = mv_host_stop,
 };
 
-static struct ata_port_info mv_port_info[] = {
+static const struct ata_port_info mv_port_info[] = {
        {  /* chip_504x */
                .sht            = &mv_sht,
                .host_flags     = MV_COMMON_FLAGS,
@@ -1242,8 +1243,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
                                VPRINTK("port %u IRQ found for qc, "
                                        "ata_status 0x%x\n", port,ata_status);
                                /* mark qc status appropriately */
-                               if (!(qc->tf.ctl & ATA_NIEN))
-                                       ata_qc_complete(qc, err_mask);
+                               if (!(qc->tf.ctl & ATA_NIEN)) {
+                                       qc->err_mask |= err_mask;
+                                       ata_qc_complete(qc);
+                               }
                        }
                }
        }
@@ -1864,7 +1867,8 @@ static void mv_eng_timeout(struct ata_port *ap)
                 */
                spin_lock_irqsave(&ap->host_set->lock, flags);
                qc->scsidone = scsi_finish_command;
-               ata_qc_complete(qc, AC_ERR_OTHER);
+               qc->err_mask |= AC_ERR_OTHER;
+               ata_qc_complete(qc);
                spin_unlock_irqrestore(&ap->host_set->lock, flags);
        }
 }
index 8a8e3e3ef0ed3bbaebe61e9713cfaab005f47820..da7fa04b8a7346713ce60895baa79d30fdf777ff 100644 (file)
@@ -70,6 +70,9 @@ enum {
        PDC_HAS_PATA            = (1 << 1), /* PDC20375 has PATA */
 
        PDC_RESET               = (1 << 11), /* HDMA reset */
+
+       PDC_COMMON_FLAGS        = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
+                                 ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI,
 };
 
 
@@ -158,12 +161,11 @@ static const struct ata_port_operations pdc_pata_ops = {
        .host_stop              = ata_pci_host_stop,
 };
 
-static struct ata_port_info pdc_port_info[] = {
+static const struct ata_port_info pdc_port_info[] = {
        /* board_2037x */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SRST | ATA_FLAG_MMIO,
+               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -173,8 +175,7 @@ static struct ata_port_info pdc_port_info[] = {
        /* board_20319 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SRST | ATA_FLAG_MMIO,
+               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -184,8 +185,7 @@ static struct ata_port_info pdc_port_info[] = {
        /* board_20619 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
-                                 ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS,
+               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -401,7 +401,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
        case ATA_PROT_NODATA:
                printk(KERN_ERR "ata%u: command timeout\n", ap->id);
                drv_stat = ata_wait_idle(ap);
-               ata_qc_complete(qc, __ac_err_mask(drv_stat));
+               qc->err_mask |= __ac_err_mask(drv_stat);
+               ata_qc_complete(qc);
                break;
 
        default:
@@ -410,7 +411,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
                printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n",
                       ap->id, qc->tf.command, drv_stat);
 
-               ata_qc_complete(qc, ac_err_mask(drv_stat));
+               qc->err_mask |= ac_err_mask(drv_stat);
+               ata_qc_complete(qc);
                break;
        }
 
@@ -422,21 +424,21 @@ out:
 static inline unsigned int pdc_host_intr( struct ata_port *ap,
                                           struct ata_queued_cmd *qc)
 {
-       unsigned int handled = 0, err_mask = 0;
+       unsigned int handled = 0;
        u32 tmp;
        void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL;
 
        tmp = readl(mmio);
        if (tmp & PDC_ERR_MASK) {
-               err_mask = AC_ERR_DEV;
+               qc->err_mask |= AC_ERR_DEV;
                pdc_reset_port(ap);
        }
 
        switch (qc->tf.protocol) {
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
-               err_mask |= ac_err_mask(ata_wait_idle(ap));
-               ata_qc_complete(qc, err_mask);
+               qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
+               ata_qc_complete(qc);
                handled = 1;
                break;
 
@@ -703,7 +705,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                probe_ent->port[3].scr_addr = base + 0x700;
                break;
        case board_2037x:
-                       probe_ent->n_ports = 2;
+               probe_ent->n_ports = 2;
                break;
        case board_20619:
                probe_ent->n_ports = 4;
@@ -713,7 +715,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
 
                probe_ent->port[2].scr_addr = base + 0x600;
                probe_ent->port[3].scr_addr = base + 0x700;
-                break;
+               break;
        default:
                BUG();
                break;
index a8987f5ff5ccac5fac723cfc1138fd033bdf8422..de05e2883f9c4273c64948e1c7e4bee67e420086 100644 (file)
@@ -170,7 +170,7 @@ static const struct ata_port_operations qs_ata_ops = {
        .bmdma_status           = qs_bmdma_status,
 };
 
-static struct ata_port_info qs_port_info[] = {
+static const struct ata_port_info qs_port_info[] = {
        /* board_2068_idx */
        {
                .sht            = &qs_ata_sht,
@@ -409,8 +409,8 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
                                        case 3: /* device error */
                                                pp->state = qs_state_idle;
                                                qs_enter_reg_mode(qc->ap);
-                                               ata_qc_complete(qc,
-                                                       ac_err_mask(sDST));
+                                               qc->err_mask |= ac_err_mask(sDST);
+                                               ata_qc_complete(qc);
                                                break;
                                        default:
                                                break;
@@ -447,7 +447,8 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
 
                                /* complete taskfile transaction */
                                pp->state = qs_state_idle;
-                               ata_qc_complete(qc, ac_err_mask(status));
+                               qc->err_mask |= ac_err_mask(status);
+                               ata_qc_complete(qc);
                                handled = 1;
                        }
                }
index 36091868560dca76686d1e4a32aa7b5af78d0263..d2053487c73b985efbd6fa1b44e70a60a246ce57 100644 (file)
@@ -176,7 +176,7 @@ static const struct ata_port_operations sil_ops = {
        .host_stop              = ata_pci_host_stop,
 };
 
-static struct ata_port_info sil_port_info[] = {
+static const struct ata_port_info sil_port_info[] = {
        /* sil_3112 */
        {
                .sht            = &sil_sht,
index e0d6f194f54f50217b047083300c32133b35e18e..a0ad3ed2200a8dd55db0a47605e5fae84c882116 100644 (file)
@@ -654,7 +654,8 @@ static void sil24_eng_timeout(struct ata_port *ap)
         */
        printk(KERN_ERR "ata%u: command timeout\n", ap->id);
        qc->scsidone = scsi_finish_command;
-       ata_qc_complete(qc, AC_ERR_OTHER);
+       qc->err_mask |= AC_ERR_OTHER;
+       ata_qc_complete(qc);
 
        sil24_reset_controller(ap);
 }
@@ -711,8 +712,10 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
                sil24_reset_controller(ap);
        }
 
-       if (qc)
-               ata_qc_complete(qc, err_mask);
+       if (qc) {
+               qc->err_mask |= err_mask;
+               ata_qc_complete(qc);
+       }
 }
 
 static inline void sil24_host_intr(struct ata_port *ap)
@@ -734,8 +737,10 @@ static inline void sil24_host_intr(struct ata_port *ap)
                 */
                sil24_update_tf(ap);
 
-               if (qc)
-                       ata_qc_complete(qc, ac_err_mask(pp->tf.command));
+               if (qc) {
+                       qc->err_mask |= ac_err_mask(pp->tf.command);
+                       ata_qc_complete(qc);
+               }
        } else
                sil24_error_intr(ap, slot_stat);
 }
index dcc3ad9a9d6e24cff6a2e236e749b44c64630a31..94b253b80da851860ccd3235551dcb7fe88fc1d9 100644 (file)
@@ -215,12 +215,13 @@ static const struct ata_port_operations pdc_20621_ops = {
        .host_stop              = pdc20621_host_stop,
 };
 
-static struct ata_port_info pdc_port_info[] = {
+static const struct ata_port_info pdc_port_info[] = {
        /* board_20621 */
        {
                .sht            = &pdc_sata_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SRST | ATA_FLAG_MMIO,
+                                 ATA_FLAG_SRST | ATA_FLAG_MMIO |
+                                 ATA_FLAG_NO_ATAPI,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -718,7 +719,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
                        VPRINTK("ata%u: read hdma, 0x%x 0x%x\n", ap->id,
                                readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
                        /* get drive status; clear intr; complete txn */
-                       ata_qc_complete(qc, ac_err_mask(ata_wait_idle(ap)));
+                       qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
+                       ata_qc_complete(qc);
                        pdc20621_pop_hdma(qc);
                }
 
@@ -756,7 +758,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
                        VPRINTK("ata%u: write ata, 0x%x 0x%x\n", ap->id,
                                readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
                        /* get drive status; clear intr; complete txn */
-                       ata_qc_complete(qc, ac_err_mask(ata_wait_idle(ap)));
+                       qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
+                       ata_qc_complete(qc);
                        pdc20621_pop_hdma(qc);
                }
                handled = 1;
@@ -766,7 +769,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
 
                status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
                DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
-               ata_qc_complete(qc, ac_err_mask(status));
+               qc->err_mask |= ac_err_mask(status);
+               ata_qc_complete(qc);
                handled = 1;
 
        } else {
@@ -881,7 +885,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
                printk(KERN_ERR "ata%u: command timeout\n", ap->id);
-               ata_qc_complete(qc, __ac_err_mask(ata_wait_idle(ap)));
+               qc->err_mask |= __ac_err_mask(ata_wait_idle(ap));
+               ata_qc_complete(qc);
                break;
 
        default:
@@ -890,7 +895,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
                printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n",
                       ap->id, qc->tf.command, drv_stat);
 
-               ata_qc_complete(qc, ac_err_mask(drv_stat));
+               qc->err_mask |= ac_err_mask(drv_stat);
+               ata_qc_complete(qc);
                break;
        }
 
index 0be60bba58d320d4c712426bb140606769f791fe..180676d7115a5861007e92dd9f34a85098d4ad59 100644 (file)
@@ -265,10 +265,10 @@ struct scsi_cmnd *scsi_get_command(struct scsi_device *dev, gfp_t gfp_mask)
                spin_lock_irqsave(&dev->list_lock, flags);
                list_add_tail(&cmd->list, &dev->cmd_list);
                spin_unlock_irqrestore(&dev->list_lock, flags);
+               cmd->jiffies_at_alloc = jiffies;
        } else
                put_device(&dev->sdev_gendev);
 
-       cmd->jiffies_at_alloc = jiffies;
        return cmd;
 }                              
 EXPORT_SYMBOL(scsi_get_command);
index e69477d1889bd8e6ab67f862f99d9c3ccc8de7af..f01ec0a7c506f2a68ec8fc993ec643a58d47f1fa 100644 (file)
@@ -354,8 +354,9 @@ static int scsi_dev_info_list_add_str(char *dev_list)
  *     @model, if found, return the matching flags value, else return
  *     the host or global default settings.
  **/
-int scsi_get_device_flags(struct scsi_device *sdev, unsigned char *vendor,
-                         unsigned char *model)
+int scsi_get_device_flags(struct scsi_device *sdev,
+                         const unsigned char *vendor,
+                         const unsigned char *model)
 {
        struct scsi_dev_info_list *devinfo;
        unsigned int bflags;
index 18c5d252301441b287735e74b0dfae07c48b75af..a2333d2c7af0be4712651b2780b7cc10566dab3b 100644 (file)
@@ -422,10 +422,15 @@ static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
  **/
 static void scsi_eh_done(struct scsi_cmnd *scmd)
 {
+       struct completion     *eh_action;
+
        SCSI_LOG_ERROR_RECOVERY(3,
                printk("%s scmd: %p result: %x\n",
                        __FUNCTION__, scmd, scmd->result));
-       complete(scmd->device->host->eh_action);
+
+       eh_action = scmd->device->host->eh_action;
+       if (eh_action)
+               complete(eh_action);
 }
 
 /**
@@ -1314,23 +1319,6 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
        }
 }
 
-/**
- * scsi_eh_lock_done - done function for eh door lock request
- * @scmd:      SCSI command block for the door lock request
- *
- * Notes:
- *     We completed the asynchronous door lock request, and it has either
- *     locked the door or failed.  We must free the command structures
- *     associated with this request.
- **/
-static void scsi_eh_lock_done(struct scsi_cmnd *scmd)
-{
-       struct scsi_request *sreq = scmd->sc_request;
-
-       scsi_release_request(sreq);
-}
-
-
 /**
  * scsi_eh_lock_door - Prevent medium removal for the specified device
  * @sdev:      SCSI device to prevent medium removal
@@ -1353,29 +1341,17 @@ static void scsi_eh_lock_done(struct scsi_cmnd *scmd)
  **/
 static void scsi_eh_lock_door(struct scsi_device *sdev)
 {
-       struct scsi_request *sreq = scsi_allocate_request(sdev, GFP_KERNEL);
+       unsigned char cmnd[MAX_COMMAND_SIZE];
 
-       if (unlikely(!sreq)) {
-               printk(KERN_ERR "%s: request allocate failed,"
-                      "prevent media removal cmd not sent\n", __FUNCTION__);
-               return;
-       }
+       cmnd[0] = ALLOW_MEDIUM_REMOVAL;
+       cmnd[1] = 0;
+       cmnd[2] = 0;
+       cmnd[3] = 0;
+       cmnd[4] = SCSI_REMOVAL_PREVENT;
+       cmnd[5] = 0;
 
-       sreq->sr_cmnd[0] = ALLOW_MEDIUM_REMOVAL;
-       sreq->sr_cmnd[1] = 0;
-       sreq->sr_cmnd[2] = 0;
-       sreq->sr_cmnd[3] = 0;
-       sreq->sr_cmnd[4] = SCSI_REMOVAL_PREVENT;
-       sreq->sr_cmnd[5] = 0;
-       sreq->sr_data_direction = DMA_NONE;
-       sreq->sr_bufflen = 0;
-       sreq->sr_buffer = NULL;
-       sreq->sr_allowed = 5;
-       sreq->sr_done = scsi_eh_lock_done;
-       sreq->sr_timeout_per_command = 10 * HZ;
-       sreq->sr_cmd_len = COMMAND_SIZE(sreq->sr_cmnd[0]);
-
-       scsi_insert_special_req(sreq, 1);
+       scsi_execute_async(sdev, cmnd, DMA_NONE, NULL, 0, 0, 10 * HZ,
+                          5, NULL, NULL, GFP_KERNEL);
 }
 
 
index ce9d73a292e2a0f273992efd56e7cb7370f2bbc0..a7f3f0c84db75537a7cc06d6c7275cef01880874 100644 (file)
@@ -63,39 +63,6 @@ static struct scsi_host_sg_pool scsi_sg_pools[] = {
 };     
 #undef SP
 
-
-/*
- * Function:    scsi_insert_special_req()
- *
- * Purpose:     Insert pre-formed request into request queue.
- *
- * Arguments:   sreq   - request that is ready to be queued.
- *              at_head        - boolean.  True if we should insert at head
- *                        of queue, false if we should insert at tail.
- *
- * Lock status: Assumed that lock is not held upon entry.
- *
- * Returns:     Nothing
- *
- * Notes:       This function is called from character device and from
- *              ioctl types of functions where the caller knows exactly
- *              what SCSI command needs to be issued.   The idea is that
- *              we merely inject the command into the queue (at the head
- *              for now), and then call the queue request function to actually
- *              process it.
- */
-int scsi_insert_special_req(struct scsi_request *sreq, int at_head)
-{
-       /*
-        * Because users of this function are apt to reuse requests with no
-        * modification, we have to sanitise the request flags here
-        */
-       sreq->sr_request->flags &= ~REQ_DONTPREP;
-       blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request,
-                          at_head, sreq);
-       return 0;
-}
-
 static void scsi_run_queue(struct request_queue *q);
 
 /*
@@ -249,8 +216,13 @@ void scsi_do_req(struct scsi_request *sreq, const void *cmnd,
 
        /*
         * head injection *required* here otherwise quiesce won't work
+        *
+        * Because users of this function are apt to reuse requests with no
+        * modification, we have to sanitise the request flags here
         */
-       scsi_insert_special_req(sreq, 1);
+       sreq->sr_request->flags &= ~REQ_DONTPREP;
+       blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request,
+                          1, sreq);
 }
 EXPORT_SYMBOL(scsi_do_req);
 
@@ -287,6 +259,7 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
        memcpy(req->cmd, cmd, req->cmd_len);
        req->sense = sense;
        req->sense_len = 0;
+       req->retries = retries;
        req->timeout = timeout;
        req->flags |= flags | REQ_BLOCK_PC | REQ_SPECIAL | REQ_QUIET;
 
@@ -327,6 +300,200 @@ int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd,
 }
 EXPORT_SYMBOL(scsi_execute_req);
 
+struct scsi_io_context {
+       void *data;
+       void (*done)(void *data, char *sense, int result, int resid);
+       char sense[SCSI_SENSE_BUFFERSIZE];
+};
+
+static kmem_cache_t *scsi_io_context_cache;
+
+static void scsi_end_async(struct request *req)
+{
+       struct scsi_io_context *sioc = req->end_io_data;
+
+       if (sioc->done)
+               sioc->done(sioc->data, sioc->sense, req->errors, req->data_len);
+
+       kmem_cache_free(scsi_io_context_cache, sioc);
+       __blk_put_request(req->q, req);
+}
+
+static int scsi_merge_bio(struct request *rq, struct bio *bio)
+{
+       struct request_queue *q = rq->q;
+
+       bio->bi_flags &= ~(1 << BIO_SEG_VALID);
+       if (rq_data_dir(rq) == WRITE)
+               bio->bi_rw |= (1 << BIO_RW);
+       blk_queue_bounce(q, &bio);
+
+       if (!rq->bio)
+               blk_rq_bio_prep(q, rq, bio);
+       else if (!q->back_merge_fn(q, rq, bio))
+               return -EINVAL;
+       else {
+               rq->biotail->bi_next = bio;
+               rq->biotail = bio;
+               rq->hard_nr_sectors += bio_sectors(bio);
+               rq->nr_sectors = rq->hard_nr_sectors;
+       }
+
+       return 0;
+}
+
+static int scsi_bi_endio(struct bio *bio, unsigned int bytes_done, int error)
+{
+       if (bio->bi_size)
+               return 1;
+
+       bio_put(bio);
+       return 0;
+}
+
+/**
+ * scsi_req_map_sg - map a scatterlist into a request
+ * @rq:                request to fill
+ * @sg:                scatterlist
+ * @nsegs:     number of elements
+ * @bufflen:   len of buffer
+ * @gfp:       memory allocation flags
+ *
+ * scsi_req_map_sg maps a scatterlist into a request so that the
+ * request can be sent to the block layer. We do not trust the scatterlist
+ * sent to use, as some ULDs use that struct to only organize the pages.
+ */
+static int scsi_req_map_sg(struct request *rq, struct scatterlist *sgl,
+                          int nsegs, unsigned bufflen, gfp_t gfp)
+{
+       struct request_queue *q = rq->q;
+       int nr_pages = (bufflen + PAGE_SIZE - 1) >> PAGE_SHIFT;
+       unsigned int data_len = 0, len, bytes, off;
+       struct page *page;
+       struct bio *bio = NULL;
+       int i, err, nr_vecs = 0;
+
+       for (i = 0; i < nsegs; i++) {
+               page = sgl[i].page;
+               off = sgl[i].offset;
+               len = sgl[i].length;
+               data_len += len;
+
+               while (len > 0) {
+                       bytes = min_t(unsigned int, len, PAGE_SIZE - off);
+
+                       if (!bio) {
+                               nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
+                               nr_pages -= nr_vecs;
+
+                               bio = bio_alloc(gfp, nr_vecs);
+                               if (!bio) {
+                                       err = -ENOMEM;
+                                       goto free_bios;
+                               }
+                               bio->bi_end_io = scsi_bi_endio;
+                       }
+
+                       if (bio_add_pc_page(q, bio, page, bytes, off) !=
+                           bytes) {
+                               bio_put(bio);
+                               err = -EINVAL;
+                               goto free_bios;
+                       }
+
+                       if (bio->bi_vcnt >= nr_vecs) {
+                               err = scsi_merge_bio(rq, bio);
+                               if (err) {
+                                       bio_endio(bio, bio->bi_size, 0);
+                                       goto free_bios;
+                               }
+                               bio = NULL;
+                       }
+
+                       page++;
+                       len -= bytes;
+                       off = 0;
+               }
+       }
+
+       rq->buffer = rq->data = NULL;
+       rq->data_len = data_len;
+       return 0;
+
+free_bios:
+       while ((bio = rq->bio) != NULL) {
+               rq->bio = bio->bi_next;
+               /*
+                * call endio instead of bio_put incase it was bounced
+                */
+               bio_endio(bio, bio->bi_size, 0);
+       }
+
+       return err;
+}
+
+/**
+ * scsi_execute_async - insert request
+ * @sdev:      scsi device
+ * @cmd:       scsi command
+ * @data_direction: data direction
+ * @buffer:    data buffer (this can be a kernel buffer or scatterlist)
+ * @bufflen:   len of buffer
+ * @use_sg:    if buffer is a scatterlist this is the number of elements
+ * @timeout:   request timeout in seconds
+ * @retries:   number of times to retry request
+ * @flags:     or into request flags
+ **/
+int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd,
+                      int data_direction, void *buffer, unsigned bufflen,
+                      int use_sg, int timeout, int retries, void *privdata,
+                      void (*done)(void *, char *, int, int), gfp_t gfp)
+{
+       struct request *req;
+       struct scsi_io_context *sioc;
+       int err = 0;
+       int write = (data_direction == DMA_TO_DEVICE);
+
+       sioc = kmem_cache_alloc(scsi_io_context_cache, gfp);
+       if (!sioc)
+               return DRIVER_ERROR << 24;
+       memset(sioc, 0, sizeof(*sioc));
+
+       req = blk_get_request(sdev->request_queue, write, gfp);
+       if (!req)
+               goto free_sense;
+       req->flags |= REQ_BLOCK_PC | REQ_QUIET;
+
+       if (use_sg)
+               err = scsi_req_map_sg(req, buffer, use_sg, bufflen, gfp);
+       else if (bufflen)
+               err = blk_rq_map_kern(req->q, req, buffer, bufflen, gfp);
+
+       if (err)
+               goto free_req;
+
+       req->cmd_len = COMMAND_SIZE(cmd[0]);
+       memcpy(req->cmd, cmd, req->cmd_len);
+       req->sense = sioc->sense;
+       req->sense_len = 0;
+       req->timeout = timeout;
+       req->retries = retries;
+       req->end_io_data = sioc;
+
+       sioc->data = privdata;
+       sioc->done = done;
+
+       blk_execute_rq_nowait(req->q, NULL, req, 1, scsi_end_async);
+       return 0;
+
+free_req:
+       blk_put_request(req);
+free_sense:
+       kfree(sioc);
+       return DRIVER_ERROR << 24;
+}
+EXPORT_SYMBOL_GPL(scsi_execute_async);
+
 /*
  * Function:    scsi_init_cmd_errh()
  *
@@ -884,7 +1051,8 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes,
                        * system where READ CAPACITY failed, we may have read
                        * past the end of the disk.
                        */
-                       if (cmd->device->use_10_for_rw &&
+                       if ((cmd->device->use_10_for_rw &&
+                           sshdr.asc == 0x20 && sshdr.ascq == 0x00) &&
                            (cmd->cmnd[0] == READ_10 ||
                             cmd->cmnd[0] == WRITE_10)) {
                                cmd->device->use_10_for_rw = 0;
@@ -1082,9 +1250,35 @@ static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk,
 static void scsi_generic_done(struct scsi_cmnd *cmd)
 {
        BUG_ON(!blk_pc_request(cmd->request));
-       scsi_io_completion(cmd, cmd->result == 0 ? cmd->bufflen : 0, 0);
+       /*
+        * This will complete the whole command with uptodate=1 so
+        * as far as the block layer is concerned the command completed
+        * successfully. Since this is a REQ_BLOCK_PC command the
+        * caller should check the request's errors value
+        */
+       scsi_io_completion(cmd, cmd->bufflen, 0);
 }
 
+void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd)
+{
+       struct request *req = cmd->request;
+
+       BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
+       memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
+       cmd->cmd_len = req->cmd_len;
+       if (!req->data_len)
+               cmd->sc_data_direction = DMA_NONE;
+       else if (rq_data_dir(req) == WRITE)
+               cmd->sc_data_direction = DMA_TO_DEVICE;
+       else
+               cmd->sc_data_direction = DMA_FROM_DEVICE;
+       
+       cmd->transfersize = req->data_len;
+       cmd->allowed = req->retries;
+       cmd->timeout_per_command = req->timeout;
+}
+EXPORT_SYMBOL_GPL(scsi_setup_blk_pc_cmnd);
+
 static int scsi_prep_fn(struct request_queue *q, struct request *req)
 {
        struct scsi_device *sdev = q->queuedata;
@@ -1220,18 +1414,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
                                goto kill;
                        }
                } else {
-                       memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
-                       cmd->cmd_len = req->cmd_len;
-                       if (rq_data_dir(req) == WRITE)
-                               cmd->sc_data_direction = DMA_TO_DEVICE;
-                       else if (req->data_len)
-                               cmd->sc_data_direction = DMA_FROM_DEVICE;
-                       else
-                               cmd->sc_data_direction = DMA_NONE;
-                       
-                       cmd->transfersize = req->data_len;
-                       cmd->allowed = 3;
-                       cmd->timeout_per_command = req->timeout;
+                       scsi_setup_blk_pc_cmnd(cmd);
                        cmd->done = scsi_generic_done;
                }
        }
@@ -1594,6 +1777,14 @@ int __init scsi_init_queue(void)
 {
        int i;
 
+       scsi_io_context_cache = kmem_cache_create("scsi_io_context",
+                                       sizeof(struct scsi_io_context),
+                                       0, 0, NULL, NULL);
+       if (!scsi_io_context_cache) {
+               printk(KERN_ERR "SCSI: can't init scsi io context cache\n");
+               return -ENOMEM;
+       }
+
        for (i = 0; i < SG_MEMPOOL_NR; i++) {
                struct scsi_host_sg_pool *sgp = scsi_sg_pools + i;
                int size = sgp->size * sizeof(struct scatterlist);
@@ -1621,6 +1812,8 @@ void scsi_exit_queue(void)
 {
        int i;
 
+       kmem_cache_destroy(scsi_io_context_cache);
+
        for (i = 0; i < SG_MEMPOOL_NR; i++) {
                struct scsi_host_sg_pool *sgp = scsi_sg_pools + i;
                mempool_destroy(sgp->pool);
index d632d9e1493cb1fe83b9e1171fd9e9a1fba875d3..f04e7e11f57a884ac08766e670aa82a81c8d5125 100644 (file)
@@ -40,7 +40,6 @@ extern void scsi_exit_hosts(void);
 extern int scsi_dispatch_cmd(struct scsi_cmnd *cmd);
 extern int scsi_setup_command_freelist(struct Scsi_Host *shost);
 extern void scsi_destroy_command_freelist(struct Scsi_Host *shost);
-extern int scsi_insert_special_req(struct scsi_request *sreq, int);
 extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd,
                struct scsi_request *sreq);
 extern void __scsi_release_request(struct scsi_request *sreq);
@@ -57,7 +56,8 @@ static inline void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
 
 /* scsi_devinfo.c */
 extern int scsi_get_device_flags(struct scsi_device *sdev,
-                                unsigned char *vendor, unsigned char *model);
+                                const unsigned char *vendor,
+                                const unsigned char *model);
 extern int __init scsi_init_devinfo(void);
 extern void scsi_exit_devinfo(void);
 
index 374853df9cca10fb733b9eff4ffc8aa373ee5ffc..05ebb9cef961534abd81120d8cc8c3422fc5cead 100644 (file)
@@ -74,7 +74,7 @@
 #define SCSI_SCAN_TARGET_PRESENT       1
 #define SCSI_SCAN_LUN_PRESENT          2
 
-static char *scsi_null_device_strs = "nullnullnullnull";
+static const char *scsi_null_device_strs = "nullnullnullnull";
 
 #define MAX_SCSI_LUNS  512
 
@@ -266,8 +266,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
                        /*
                         * if LLDD reports slave not present, don't clutter
                         * console with alloc failure messages
-
-
                         */
                        if (ret == -ENXIO)
                                display_failure_msg = 0;
@@ -279,7 +277,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
 
 out_device_destroy:
        transport_destroy_device(&sdev->sdev_gendev);
-       scsi_free_queue(sdev->request_queue);
        put_device(&sdev->sdev_gendev);
 out:
        if (display_failure_msg)
@@ -403,6 +400,36 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
        return found_target;
 }
 
+struct work_queue_wrapper {
+       struct work_struct      work;
+       struct scsi_target      *starget;
+};
+
+static void scsi_target_reap_work(void *data) {
+       struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data;
+       struct scsi_target *starget = wqw->starget;
+       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+       unsigned long flags;
+
+       kfree(wqw);
+
+       spin_lock_irqsave(shost->host_lock, flags);
+
+       if (--starget->reap_ref == 0 && list_empty(&starget->devices)) {
+               list_del_init(&starget->siblings);
+               spin_unlock_irqrestore(shost->host_lock, flags);
+               transport_remove_device(&starget->dev);
+               device_del(&starget->dev);
+               transport_destroy_device(&starget->dev);
+               put_device(&starget->dev);
+               return;
+
+       }
+       spin_unlock_irqrestore(shost->host_lock, flags);
+
+       return;
+}
+
 /**
  * scsi_target_reap - check to see if target is in use and destroy if not
  *
@@ -414,19 +441,18 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
  */
 void scsi_target_reap(struct scsi_target *starget)
 {
-       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-       unsigned long flags;
-       spin_lock_irqsave(shost->host_lock, flags);
+       struct work_queue_wrapper *wqw = 
+               kzalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC);
 
-       if (--starget->reap_ref == 0 && list_empty(&starget->devices)) {
-               list_del_init(&starget->siblings);
-               spin_unlock_irqrestore(shost->host_lock, flags);
-               device_del(&starget->dev);
-               transport_unregister_device(&starget->dev);
-               put_device(&starget->dev);
+       if (!wqw) {
+               starget_printk(KERN_ERR, starget,
+                              "Failed to allocate memory in scsi_reap_target()\n");
                return;
        }
-       spin_unlock_irqrestore(shost->host_lock, flags);
+
+       INIT_WORK(&wqw->work, scsi_target_reap_work, wqw);
+       wqw->starget = starget;
+       schedule_work(&wqw->work);
 }
 
 /**
index 46349293de088603099405b48884fe505f665188..15842b1f0f4a3499f20a06f6529fa5e38e4ca917 100644 (file)
@@ -21,7 +21,7 @@
 #include "scsi_priv.h"
 #include "scsi_logging.h"
 
-static struct {
+static const struct {
        enum scsi_device_state  value;
        char                    *name;
 } sdev_states[] = {
@@ -48,7 +48,7 @@ const char *scsi_device_state_name(enum scsi_device_state state)
        return name;
 }
 
-static struct {
+static const struct {
        enum scsi_host_state    value;
        char                    *name;
 } shost_states[] = {
index 6cd5931d9a54a005987a31329399088c93187083..685b997306cfcd4ca8758621e6e815d9d17da01c 100644 (file)
@@ -105,13 +105,14 @@ static struct {
        { FC_PORTSTATE_LINKDOWN,        "Linkdown" },
        { FC_PORTSTATE_ERROR,           "Error" },
        { FC_PORTSTATE_LOOPBACK,        "Loopback" },
+       { FC_PORTSTATE_DELETED,         "Deleted" },
 };
 fc_enum_name_search(port_state, fc_port_state, fc_port_state_names)
 #define FC_PORTSTATE_MAX_NAMELEN       20
 
 
 /* Convert fc_tgtid_binding_type values to ascii string name */
-static struct {
+static const struct {
        enum fc_tgtid_binding_type      value;
        char                            *name;
        int                             matchlen;
@@ -149,7 +150,7 @@ get_fc_##title##_names(u32 table_key, char *buf)            \
 
 
 /* Convert FC_COS bit values to ascii string name */
-static struct {
+static const struct {
        u32                     value;
        char                    *name;
 } fc_cos_names[] = {
@@ -163,7 +164,7 @@ fc_bitfield_name_search(cos, fc_cos_names)
 
 
 /* Convert FC_PORTSPEED bit values to ascii string name */
-static struct {
+static const struct {
        u32                     value;
        char                    *name;
 } fc_port_speed_names[] = {
@@ -189,7 +190,7 @@ show_fc_fc4s (char *buf, u8 *fc4_list)
 
 
 /* Convert FC_RPORT_ROLE bit values to ascii string name */
-static struct {
+static const struct {
        u32                     value;
        char                    *name;
 } fc_remote_port_role_names[] = {
@@ -211,6 +212,7 @@ fc_bitfield_name_search(remote_port_roles, fc_remote_port_role_names)
 #define FC_MGMTSRVR_PORTID             0x00000a
 
 
+static void fc_shost_remove_rports(void  *data);
 static void fc_timeout_deleted_rport(void *data);
 static void fc_scsi_scan_rport(void *data);
 static void fc_rport_terminate(struct fc_rport  *rport);
@@ -318,6 +320,8 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,
        fc_host_next_rport_number(shost) = 0;
        fc_host_next_target_id(shost) = 0;
 
+       fc_host_flags(shost) = 0;
+       INIT_WORK(&fc_host_rport_del_work(shost), fc_shost_remove_rports, shost);
        return 0;
 }
 
@@ -387,6 +391,7 @@ show_fc_rport_##field (struct class_device *cdev, char *buf)                \
        struct fc_internal *i = to_fc_internal(shost->transportt);      \
        if ((i->f->get_rport_##field) &&                                \
            !((rport->port_state == FC_PORTSTATE_BLOCKED) ||            \
+             (rport->port_state == FC_PORTSTATE_DELETED) ||            \
              (rport->port_state == FC_PORTSTATE_NOTPRESENT)))          \
                i->f->get_rport_##field(rport);                         \
        return snprintf(buf, sz, format_string, cast rport->field);     \
@@ -402,6 +407,7 @@ store_fc_rport_##field(struct class_device *cdev, const char *buf,  \
        struct Scsi_Host *shost = rport_to_shost(rport);                \
        struct fc_internal *i = to_fc_internal(shost->transportt);      \
        if ((rport->port_state == FC_PORTSTATE_BLOCKED) ||              \
+           (rport->port_state == FC_PORTSTATE_DELETED) ||              \
            (rport->port_state == FC_PORTSTATE_NOTPRESENT))             \
                return -EBUSY;                                          \
        val = simple_strtoul(buf, NULL, 0);                             \
@@ -519,6 +525,7 @@ store_fc_rport_dev_loss_tmo(struct class_device *cdev, const char *buf,
        struct Scsi_Host *shost = rport_to_shost(rport);
        struct fc_internal *i = to_fc_internal(shost->transportt);
        if ((rport->port_state == FC_PORTSTATE_BLOCKED) ||
+           (rport->port_state == FC_PORTSTATE_DELETED) ||
            (rport->port_state == FC_PORTSTATE_NOTPRESENT))
                return -EBUSY;
        val = simple_strtoul(buf, NULL, 0);
@@ -1769,7 +1776,7 @@ fc_timeout_deleted_rport(void  *data)
        rport->maxframe_size = -1;
        rport->supported_classes = FC_COS_UNSPECIFIED;
        rport->roles = FC_RPORT_ROLE_UNKNOWN;
-       rport->port_state = FC_PORTSTATE_NOTPRESENT;
+       rport->port_state = FC_PORTSTATE_DELETED;
 
        /* remove the identifiers that aren't used in the consisting binding */
        switch (fc_host_tgtid_bind_type(shost)) {
@@ -1789,14 +1796,23 @@ fc_timeout_deleted_rport(void  *data)
                break;
        }
 
-       spin_unlock_irqrestore(shost->host_lock, flags);
-
        /*
         * As this only occurs if the remote port (scsi target)
         * went away and didn't come back - we'll remove
         * all attached scsi devices.
+        *
+        * We'll schedule the shost work item to perform the actual removal
+        * to avoid recursion in the different flush calls if we perform
+        * the removal in each target - and there are lots of targets
+        * whose timeouts fire at the same time.
         */
-       fc_rport_tgt_remove(rport);
+
+       if ( !(fc_host_flags(shost) & FC_SHOST_RPORT_DEL_SCHEDULED)) {
+               fc_host_flags(shost) |= FC_SHOST_RPORT_DEL_SCHEDULED;
+               scsi_queue_work(shost, &fc_host_rport_del_work(shost));
+       }
+
+       spin_unlock_irqrestore(shost->host_lock, flags);
 }
 
 /**
@@ -1818,6 +1834,41 @@ fc_scsi_scan_rport(void *data)
 }
 
 
+/**
+ * fc_shost_remove_rports - called to remove all rports that are marked
+ *                       as in a deleted (not connected) state.
+ * 
+ * @data:      shost whose rports are to be looked at
+ **/
+static void
+fc_shost_remove_rports(void  *data)
+{
+       struct Scsi_Host *shost = (struct Scsi_Host *)data;
+       struct fc_rport *rport, *next_rport;
+       unsigned long flags;
+
+       spin_lock_irqsave(shost->host_lock, flags);
+       while (fc_host_flags(shost) & FC_SHOST_RPORT_DEL_SCHEDULED) {
+
+               fc_host_flags(shost) &= ~FC_SHOST_RPORT_DEL_SCHEDULED;
+
+restart_search:
+               list_for_each_entry_safe(rport, next_rport,
+                               &fc_host_rport_bindings(shost), peers) {
+                       if (rport->port_state == FC_PORTSTATE_DELETED) {
+                               rport->port_state = FC_PORTSTATE_NOTPRESENT;
+                               spin_unlock_irqrestore(shost->host_lock, flags);
+                               fc_rport_tgt_remove(rport);
+                               spin_lock_irqsave(shost->host_lock, flags);
+                               goto restart_search;
+                       }
+               }
+
+       }
+       spin_unlock_irqrestore(shost->host_lock, flags);
+}
+
+
 MODULE_AUTHOR("Martin Hicks");
 MODULE_DESCRIPTION("FC Transport Attributes");
 MODULE_LICENSE("GPL");
index 49fd18c1a9c6d2d4daa433fd8b5ef15ff0ff8ae6..e08462d50c97e885305b218761407a74911b8f71 100644 (file)
@@ -249,7 +249,7 @@ static inline struct list_head *skb_to_lh(struct sk_buff *skb)
 }
 
 static void*
-mempool_zone_alloc_skb(unsigned int gfp_mask, void *pool_data)
+mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data)
 {
        struct mempool_zone *zone = pool_data;
 
index 718a2bc4ed5e6fcbe777637661bdc08769691c5e..46da6fe10ad54d1d25dc1784071365d8fe288287 100644 (file)
@@ -18,6 +18,7 @@
  *  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/config.h>
 #include <linux/ctype.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -378,9 +379,7 @@ 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_helper(struct class_device *cdev, char *buf,
-                                int period)
+static int period_to_str(char *buf, int period)
 {
        int len, picosec;
 
@@ -398,6 +397,14 @@ show_spi_transport_period_helper(struct class_device *cdev, char *buf,
                len = sprint_frac(buf, picosec, 1000);
        }
 
+       return len;
+}
+
+static ssize_t
+show_spi_transport_period_helper(struct class_device *cdev, char *buf,
+                                int period)
+{
+       int len = period_to_str(buf, period);
        buf[len++] = '\n';
        buf[len] = '\0';
        return len;
@@ -812,12 +819,10 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
        if (!scsi_device_sync(sdev) && !scsi_device_dt(sdev))
                return;
 
-       /* see if the device has an echo buffer.  If it does we can
-        * do the SPI pattern write tests */
-
-       len = 0;
-       if (scsi_device_dt(sdev))
-               len = spi_dv_device_get_echo_buffer(sdev, buffer);
+       /* len == -1 is the signal that we need to ascertain the
+        * presence of an echo buffer before trying to use it.  len ==
+        * 0 means we don't have an echo buffer */
+       len = -1;
 
  retry:
 
@@ -840,11 +845,23 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
                if (spi_min_period(starget) == 8)
                        DV_SET(pcomp_en, 1);
        }
+       /* Do the read only INQUIRY tests */
+       spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len,
+                      spi_dv_device_compare_inquiry);
+       /* See if we actually managed to negotiate and sustain DT */
+       if (i->f->get_dt)
+               i->f->get_dt(starget);
+
+       /* see if the device has an echo buffer.  If it does we can do
+        * the SPI pattern write tests.  Because of some broken
+        * devices, we *only* try this on a device that has actually
+        * negotiated DT */
+
+       if (len == -1 && spi_dt(starget))
+               len = spi_dv_device_get_echo_buffer(sdev, buffer);
 
-       if (len == 0) {
+       if (len <= 0) {
                starget_printk(KERN_INFO, starget, "Domain Validation skipping write tests\n");
-               spi_dv_retrain(sdev, buffer, buffer + len,
-                              spi_dv_device_compare_inquiry);
                return;
        }
 
@@ -1031,12 +1048,133 @@ void spi_display_xfer_agreement(struct scsi_target *starget)
                         tp->hold_mcs ? " HMCS" : "",
                         tmp, tp->offset);
        } else {
-               dev_info(&starget->dev, "%sasynchronous.\n",
+               dev_info(&starget->dev, "%sasynchronous\n",
                                tp->width ? "wide " : "");
        }
 }
 EXPORT_SYMBOL(spi_display_xfer_agreement);
 
+#ifdef CONFIG_SCSI_CONSTANTS
+static const char * const one_byte_msgs[] = {
+/* 0x00 */ "Command Complete", NULL, "Save Pointers",
+/* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", 
+/* 0x06 */ "Abort", "Message Reject", "Nop", "Message Parity Error",
+/* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag",
+/* 0x0c */ "Bus device reset", "Abort Tag", "Clear Queue", 
+/* 0x0f */ "Initiate Recovery", "Release Recovery"
+};
+
+static const char * const two_byte_msgs[] = {
+/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag",
+/* 0x23 */ "Ignore Wide Residue"
+};
+
+static const char * const extended_msgs[] = {
+/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request",
+/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request",
+/* 0x04 */ "Parallel Protocol Request"
+};
+
+void print_nego(const unsigned char *msg, int per, int off, int width)
+{
+       if (per) {
+               char buf[20];
+               period_to_str(buf, msg[per]);
+               printk("period = %s ns ", buf);
+       }
+
+       if (off)
+               printk("offset = %d ", msg[off]);
+       if (width)
+               printk("width = %d ", 8 << msg[width]);
+}
+
+int spi_print_msg(const unsigned char *msg)
+{
+       int len = 0, i;
+       if (msg[0] == EXTENDED_MESSAGE) {
+               len = 3 + msg[1];
+               if (msg[2] < ARRAY_SIZE(extended_msgs))
+                       printk ("%s ", extended_msgs[msg[2]]); 
+               else 
+                       printk ("Extended Message, reserved code (0x%02x) ",
+                               (int) msg[2]);
+               switch (msg[2]) {
+               case EXTENDED_MODIFY_DATA_POINTER:
+                       printk("pointer = %d", (int) (msg[3] << 24) |
+                               (msg[4] << 16) | (msg[5] << 8) | msg[6]);
+                       break;
+               case EXTENDED_SDTR:
+                       print_nego(msg, 3, 4, 0);
+                       break;
+               case EXTENDED_WDTR:
+                       print_nego(msg, 0, 0, 3);
+                       break;
+               case EXTENDED_PPR:
+                       print_nego(msg, 3, 5, 6);
+                       break;
+               default:
+               for (i = 2; i < len; ++i) 
+                       printk("%02x ", msg[i]);
+               }
+       /* Identify */
+       } else if (msg[0] & 0x80) {
+               printk("Identify disconnect %sallowed %s %d ",
+                       (msg[0] & 0x40) ? "" : "not ",
+                       (msg[0] & 0x20) ? "target routine" : "lun",
+                       msg[0] & 0x7);
+               len = 1;
+       /* Normal One byte */
+       } else if (msg[0] < 0x1f) {
+               if (msg[0] < ARRAY_SIZE(one_byte_msgs))
+                       printk(one_byte_msgs[msg[0]]);
+               else
+                       printk("reserved (%02x) ", msg[0]);
+               len = 1;
+       /* Two byte */
+       } else if (msg[0] <= 0x2f) {
+               if ((msg[0] - 0x20) < ARRAY_SIZE(two_byte_msgs))
+                       printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], 
+                               msg[1]);
+               else 
+                       printk("reserved two byte (%02x %02x) ", 
+                               msg[0], msg[1]);
+               len = 2;
+       } else 
+               printk("reserved");
+       return len;
+}
+EXPORT_SYMBOL(spi_print_msg);
+
+#else  /* ifndef CONFIG_SCSI_CONSTANTS */
+
+int spi_print_msg(const unsigned char *msg)
+{
+       int len = 0, i;
+
+       if (msg[0] == EXTENDED_MESSAGE) {
+               len = 3 + msg[1];
+               for (i = 0; i < len; ++i)
+                       printk("%02x ", msg[i]);
+       /* Identify */
+       } else if (msg[0] & 0x80) {
+               printk("%02x ", msg[0]);
+               len = 1;
+       /* Normal One byte */
+       } else if (msg[0] < 0x1f) {
+               printk("%02x ", msg[0]);
+               len = 1;
+       /* Two byte */
+       } else if (msg[0] <= 0x2f) {
+               printk("%02x %02x", msg[0], msg[1]);
+               len = 2;
+       } else 
+               printk("%02x ", msg[0]);
+       return len;
+}
+EXPORT_SYMBOL(spi_print_msg);
+#endif /* ! CONFIG_SCSI_CONSTANTS */
+
 #define SETUP_ATTRIBUTE(field)                                         \
        i->private_attrs[count] = class_device_attr_##field;            \
        if (!i->f->set_##field) {                                       \
index 8613a1317712c9d40df22c26dc546d1c8b6aea28..3d3ad7d1b779687046c741f799524a7f91b36aa1 100644 (file)
@@ -245,24 +245,10 @@ static int sd_init_command(struct scsi_cmnd * SCpnt)
         * SG_IO from block layer already setup, just copy cdb basically
         */
        if (blk_pc_request(rq)) {
-               if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd))
-                       return 0;
-
-               memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd));
-               SCpnt->cmd_len = rq->cmd_len;
-               if (rq_data_dir(rq) == WRITE)
-                       SCpnt->sc_data_direction = DMA_TO_DEVICE;
-               else if (rq->data_len)
-                       SCpnt->sc_data_direction = DMA_FROM_DEVICE;
-               else
-                       SCpnt->sc_data_direction = DMA_NONE;
-
-               this_count = rq->data_len;
+               scsi_setup_blk_pc_cmnd(SCpnt);
                if (rq->timeout)
                        timeout = rq->timeout;
 
-               SCpnt->transfersize = rq->data_len;
-               SCpnt->allowed = SD_PASSTHROUGH_RETRIES;
                goto queue;
        }
 
@@ -1509,9 +1495,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
         */
        if (sdkp->media_present) {
                sd_read_capacity(sdkp, disk->disk_name, buffer);
-               if (sdp->removable)
-                       sd_read_write_protect_flag(sdkp, disk->disk_name,
-                                                  buffer);
+               sd_read_write_protect_flag(sdkp, disk->disk_name, buffer);
                sd_read_cache_type(sdkp, disk->disk_name, buffer);
        }
                
index 72ec59456e6934bfd67c42b35970b5eb0b9c6a87..221e96e2620a66f3b9cb264e9c387c85f9ef7add 100644 (file)
@@ -104,8 +104,6 @@ static int sg_allow_dio = SG_ALLOW_DIO_DEF;
 static int sg_add(struct class_device *, struct class_interface *);
 static void sg_remove(struct class_device *, struct class_interface *);
 
-static Scsi_Request *dummy_cmdp;       /* only used for sizeof */
-
 static DEFINE_RWLOCK(sg_dev_arr_lock); /* Also used to lock
                                                           file descriptor list for device */
 
@@ -119,7 +117,7 @@ typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */
        unsigned short sglist_len; /* size of malloc'd scatter-gather list ++ */
        unsigned bufflen;       /* Size of (aggregate) data buffer */
        unsigned b_malloc_len;  /* actual len malloc'ed in buffer */
-       void *buffer;           /* Data buffer or scatter list (k_use_sg>0) */
+       struct scatterlist *buffer;/* scatter list */
        char dio_in_use;        /* 0->indirect IO (or mmap), 1->dio */
        unsigned char cmd_opcode; /* first byte of command */
 } Sg_scatter_hold;
@@ -128,12 +126,11 @@ struct sg_device;         /* forward declarations */
 struct sg_fd;
 
 typedef struct sg_request {    /* SG_MAX_QUEUE requests outstanding per file */
-       Scsi_Request *my_cmdp;  /* != 0  when request with lower levels */
        struct sg_request *nextrp;      /* NULL -> tail request (slist) */
        struct sg_fd *parentfp; /* NULL -> not in use */
        Sg_scatter_hold data;   /* hold buffer, perhaps scatter list */
        sg_io_hdr_t header;     /* scsi command+info, see <scsi/sg.h> */
-       unsigned char sense_b[sizeof (dummy_cmdp->sr_sense_buffer)];
+       unsigned char sense_b[SCSI_SENSE_BUFFERSIZE];
        char res_used;          /* 1 -> using reserve buffer, 0 -> not ... */
        char orphan;            /* 1 -> drop on sight, 0 -> normal */
        char sg_io_owned;       /* 1 -> packet belongs to SG_IO */
@@ -174,7 +171,8 @@ typedef struct sg_device { /* holds the state of each scsi generic device */
 } Sg_device;
 
 static int sg_fasync(int fd, struct file *filp, int mode);
-static void sg_cmd_done(Scsi_Cmnd * SCpnt);    /* tasklet or soft irq callback */
+/* tasklet or soft irq callback */
+static void sg_cmd_done(void *data, char *sense, int result, int resid);
 static int sg_start_req(Sg_request * srp);
 static void sg_finish_rem_req(Sg_request * srp);
 static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size);
@@ -195,8 +193,8 @@ static void sg_remove_scat(Sg_scatter_hold * schp);
 static void sg_build_reserve(Sg_fd * sfp, int req_size);
 static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size);
 static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp);
-static char *sg_page_malloc(int rqSz, int lowDma, int *retSzp);
-static void sg_page_free(char *buff, int size);
+static struct page *sg_page_malloc(int rqSz, int lowDma, int *retSzp);
+static void sg_page_free(struct page *page, int size);
 static Sg_fd *sg_add_sfp(Sg_device * sdp, int dev);
 static int sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp);
 static void __sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp);
@@ -207,7 +205,6 @@ static int sg_res_in_use(Sg_fd * sfp);
 static int sg_allow_access(unsigned char opcode, char dev_type);
 static int sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len);
 static Sg_device *sg_get_dev(int dev);
-static inline unsigned char *sg_scatg2virt(const struct scatterlist *sclp);
 #ifdef CONFIG_SCSI_PROC_FS
 static int sg_last_dev(void);
 #endif
@@ -226,6 +223,7 @@ sg_open(struct inode *inode, struct file *filp)
 {
        int dev = iminor(inode);
        int flags = filp->f_flags;
+       struct request_queue *q;
        Sg_device *sdp;
        Sg_fd *sfp;
        int res;
@@ -287,7 +285,9 @@ sg_open(struct inode *inode, struct file *filp)
        }
        if (!sdp->headfp) {     /* no existing opens on this device */
                sdp->sgdebug = 0;
-               sdp->sg_tablesize = sdp->device->host->sg_tablesize;
+               q = sdp->device->request_queue;
+               sdp->sg_tablesize = min(q->max_hw_segments,
+                                       q->max_phys_segments);
        }
        if ((sfp = sg_add_sfp(sdp, dev)))
                filp->private_data = sfp;
@@ -340,6 +340,7 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
                return -ENXIO;
        SCSI_LOG_TIMEOUT(3, printk("sg_read: %s, count=%d\n",
                                   sdp->disk->disk_name, (int) count));
+
        if (!access_ok(VERIFY_WRITE, buf, count))
                return -EFAULT;
        if (sfp->force_packid && (count >= SZ_SG_HEADER)) {
@@ -491,7 +492,7 @@ sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp)
        if ((hp->mx_sb_len > 0) && hp->sbp) {
                if ((CHECK_CONDITION & hp->masked_status) ||
                    (DRIVER_SENSE & hp->driver_status)) {
-                       int sb_len = sizeof (dummy_cmdp->sr_sense_buffer);
+                       int sb_len = SCSI_SENSE_BUFFERSIZE;
                        sb_len = (hp->mx_sb_len > sb_len) ? sb_len : hp->mx_sb_len;
                        len = 8 + (int) srp->sense_b[7];        /* Additional sense length field */
                        len = (len > sb_len) ? sb_len : len;
@@ -525,7 +526,7 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
        Sg_request *srp;
        struct sg_header old_hdr;
        sg_io_hdr_t *hp;
-       unsigned char cmnd[sizeof (dummy_cmdp->sr_cmnd)];
+       unsigned char cmnd[MAX_COMMAND_SIZE];
 
        if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
                return -ENXIO;
@@ -624,7 +625,7 @@ sg_new_write(Sg_fd * sfp, const char __user *buf, size_t count,
        int k;
        Sg_request *srp;
        sg_io_hdr_t *hp;
-       unsigned char cmnd[sizeof (dummy_cmdp->sr_cmnd)];
+       unsigned char cmnd[MAX_COMMAND_SIZE];
        int timeout;
        unsigned long ul_timeout;
 
@@ -692,11 +693,9 @@ static int
 sg_common_write(Sg_fd * sfp, Sg_request * srp,
                unsigned char *cmnd, int timeout, int blocking)
 {
-       int k;
-       Scsi_Request *SRpnt;
+       int k, data_dir;
        Sg_device *sdp = sfp->parentdp;
        sg_io_hdr_t *hp = &srp->header;
-       request_queue_t *q;
 
        srp->data.cmd_opcode = cmnd[0]; /* hold opcode of command */
        hp->status = 0;
@@ -723,51 +722,36 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
                sg_finish_rem_req(srp);
                return -ENODEV;
        }
-       SRpnt = scsi_allocate_request(sdp->device, GFP_ATOMIC);
-       if (SRpnt == NULL) {
-               SCSI_LOG_TIMEOUT(1, printk("sg_write: no mem\n"));
-               sg_finish_rem_req(srp);
-               return -ENOMEM;
-       }
 
-       srp->my_cmdp = SRpnt;
-       q = SRpnt->sr_device->request_queue;
-       SRpnt->sr_request->rq_disk = sdp->disk;
-       SRpnt->sr_sense_buffer[0] = 0;
-       SRpnt->sr_cmd_len = hp->cmd_len;
-       SRpnt->sr_use_sg = srp->data.k_use_sg;
-       SRpnt->sr_sglist_len = srp->data.sglist_len;
-       SRpnt->sr_bufflen = srp->data.bufflen;
-       SRpnt->sr_underflow = 0;
-       SRpnt->sr_buffer = srp->data.buffer;
        switch (hp->dxfer_direction) {
        case SG_DXFER_TO_FROM_DEV:
        case SG_DXFER_FROM_DEV:
-               SRpnt->sr_data_direction = DMA_FROM_DEVICE;
+               data_dir = DMA_FROM_DEVICE;
                break;
        case SG_DXFER_TO_DEV:
-               SRpnt->sr_data_direction = DMA_TO_DEVICE;
+               data_dir = DMA_TO_DEVICE;
                break;
        case SG_DXFER_UNKNOWN:
-               SRpnt->sr_data_direction = DMA_BIDIRECTIONAL;
+               data_dir = DMA_BIDIRECTIONAL;
                break;
        default:
-               SRpnt->sr_data_direction = DMA_NONE;
+               data_dir = DMA_NONE;
                break;
        }
-       SRpnt->upper_private_data = srp;
-       srp->data.k_use_sg = 0;
-       srp->data.sglist_len = 0;
-       srp->data.bufflen = 0;
-       srp->data.buffer = NULL;
        hp->duration = jiffies_to_msecs(jiffies);
 /* Now send everything of to mid-level. The next time we hear about this
    packet is when sg_cmd_done() is called (i.e. a callback). */
-       scsi_do_req(SRpnt, (void *) cmnd,
-                   (void *) SRpnt->sr_buffer, hp->dxfer_len,
-                   sg_cmd_done, timeout, SG_DEFAULT_RETRIES);
-       /* dxfer_len overwrites SRpnt->sr_bufflen, hence need for b_malloc_len */
-       return 0;
+       if (scsi_execute_async(sdp->device, cmnd, data_dir, srp->data.buffer,
+                               hp->dxfer_len, srp->data.k_use_sg, timeout,
+                               SG_DEFAULT_RETRIES, srp, sg_cmd_done,
+                               GFP_ATOMIC)) {
+               SCSI_LOG_TIMEOUT(1, printk("sg_write: scsi_execute_async failed\n"));
+               /*
+                * most likely out of mem, but could also be a bad map
+                */
+               return -ENOMEM;
+       } else
+               return 0;
 }
 
 static int
@@ -1156,45 +1140,22 @@ sg_fasync(int fd, struct file *filp, int mode)
        return (retval < 0) ? retval : 0;
 }
 
-static inline unsigned char *
-sg_scatg2virt(const struct scatterlist *sclp)
-{
-       return (sclp && sclp->page) ?
-           (unsigned char *) page_address(sclp->page) + sclp->offset : NULL;
-}
-
 /* When startFinish==1 increments page counts for pages other than the 
-   first of scatter gather elements obtained from __get_free_pages().
+   first of scatter gather elements obtained from alloc_pages().
    When startFinish==0 decrements ... */
 static void
 sg_rb_correct4mmap(Sg_scatter_hold * rsv_schp, int startFinish)
 {
-       void *page_ptr;
+       struct scatterlist *sg = rsv_schp->buffer;
        struct page *page;
        int k, m;
 
        SCSI_LOG_TIMEOUT(3, printk("sg_rb_correct4mmap: startFinish=%d, scatg=%d\n", 
                                   startFinish, rsv_schp->k_use_sg));
        /* N.B. correction _not_ applied to base page of each allocation */
-       if (rsv_schp->k_use_sg) {       /* reserve buffer is a scatter gather list */
-               struct scatterlist *sclp = rsv_schp->buffer;
-
-               for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sclp) {
-                       for (m = PAGE_SIZE; m < sclp->length; m += PAGE_SIZE) {
-                               page_ptr = sg_scatg2virt(sclp) + m;
-                               page = virt_to_page(page_ptr);
-                               if (startFinish)
-                                       get_page(page);
-                               else {
-                                       if (page_count(page) > 0)
-                                               __put_page(page);
-                               }
-                       }
-               }
-       } else {                /* reserve buffer is just a single allocation */
-               for (m = PAGE_SIZE; m < rsv_schp->bufflen; m += PAGE_SIZE) {
-                       page_ptr = (unsigned char *) rsv_schp->buffer + m;
-                       page = virt_to_page(page_ptr);
+       for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) {
+               for (m = PAGE_SIZE; m < sg->length; m += PAGE_SIZE) {
+                       page = sg->page;
                        if (startFinish)
                                get_page(page);
                        else {
@@ -1210,9 +1171,10 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type)
 {
        Sg_fd *sfp;
        struct page *page = NOPAGE_SIGBUS;
-       void *page_ptr = NULL;
-       unsigned long offset;
+       unsigned long offset, len, sa;
        Sg_scatter_hold *rsv_schp;
+       struct scatterlist *sg;
+       int k;
 
        if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data)))
                return page;
@@ -1222,30 +1184,21 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type)
                return page;
        SCSI_LOG_TIMEOUT(3, printk("sg_vma_nopage: offset=%lu, scatg=%d\n",
                                   offset, rsv_schp->k_use_sg));
-       if (rsv_schp->k_use_sg) {       /* reserve buffer is a scatter gather list */
-               int k;
-               unsigned long sa = vma->vm_start;
-               unsigned long len;
-               struct scatterlist *sclp = rsv_schp->buffer;
-
-               for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end);
-                    ++k, ++sclp) {
-                       len = vma->vm_end - sa;
-                       len = (len < sclp->length) ? len : sclp->length;
-                       if (offset < len) {
-                               page_ptr = sg_scatg2virt(sclp) + offset;
-                               page = virt_to_page(page_ptr);
-                               get_page(page); /* increment page count */
-                               break;
-                       }
-                       sa += len;
-                       offset -= len;
+       sg = rsv_schp->buffer;
+       sa = vma->vm_start;
+       for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end);
+            ++k, ++sg) {
+               len = vma->vm_end - sa;
+               len = (len < sg->length) ? len : sg->length;
+               if (offset < len) {
+                       page = sg->page;
+                       get_page(page); /* increment page count */
+                       break;
                }
-       } else {                /* reserve buffer is just a single allocation */
-               page_ptr = (unsigned char *) rsv_schp->buffer + offset;
-               page = virt_to_page(page_ptr);
-               get_page(page); /* increment page count */
+               sa += len;
+               offset -= len;
        }
+
        if (type)
                *type = VM_FAULT_MINOR;
        return page;
@@ -1259,8 +1212,10 @@ static int
 sg_mmap(struct file *filp, struct vm_area_struct *vma)
 {
        Sg_fd *sfp;
-       unsigned long req_sz;
+       unsigned long req_sz, len, sa;
        Sg_scatter_hold *rsv_schp;
+       int k;
+       struct scatterlist *sg;
 
        if ((!filp) || (!vma) || (!(sfp = (Sg_fd *) filp->private_data)))
                return -ENXIO;
@@ -1273,24 +1228,15 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma)
        if (req_sz > rsv_schp->bufflen)
                return -ENOMEM; /* cannot map more than reserved buffer */
 
-       if (rsv_schp->k_use_sg) { /* reserve buffer is a scatter gather list */
-               int k;
-               unsigned long sa = vma->vm_start;
-               unsigned long len;
-               struct scatterlist *sclp = rsv_schp->buffer;
-
-               for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end);
-                    ++k, ++sclp) {
-                       if (0 != sclp->offset)
-                               return -EFAULT; /* non page aligned memory ?? */
-                       len = vma->vm_end - sa;
-                       len = (len < sclp->length) ? len : sclp->length;
-                       sa += len;
-               }
-       } else {        /* reserve buffer is just a single allocation */
-               if ((unsigned long) rsv_schp->buffer & (PAGE_SIZE - 1))
-                       return -EFAULT; /* non page aligned memory ?? */
+       sa = vma->vm_start;
+       sg = rsv_schp->buffer;
+       for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end);
+            ++k, ++sg) {
+               len = vma->vm_end - sa;
+               len = (len < sg->length) ? len : sg->length;
+               sa += len;
        }
+
        if (0 == sfp->mmap_called) {
                sg_rb_correct4mmap(rsv_schp, 1);        /* do only once per fd lifetime */
                sfp->mmap_called = 1;
@@ -1304,21 +1250,16 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma)
 /* This function is a "bottom half" handler that is called by the
  * mid level when a command is completed (or has failed). */
 static void
-sg_cmd_done(Scsi_Cmnd * SCpnt)
+sg_cmd_done(void *data, char *sense, int result, int resid)
 {
-       Scsi_Request *SRpnt = NULL;
+       Sg_request *srp = data;
        Sg_device *sdp = NULL;
        Sg_fd *sfp;
-       Sg_request *srp = NULL;
        unsigned long iflags;
        unsigned int ms;
 
-       if (SCpnt && (SRpnt = SCpnt->sc_request))
-               srp = (Sg_request *) SRpnt->upper_private_data;
        if (NULL == srp) {
                printk(KERN_ERR "sg_cmd_done: NULL request\n");
-               if (SRpnt)
-                       scsi_release_request(SRpnt);
                return;
        }
        sfp = srp->parentfp;
@@ -1326,49 +1267,34 @@ sg_cmd_done(Scsi_Cmnd * SCpnt)
                sdp = sfp->parentdp;
        if ((NULL == sdp) || sdp->detached) {
                printk(KERN_INFO "sg_cmd_done: device detached\n");
-               scsi_release_request(SRpnt);
                return;
        }
 
-       /* First transfer ownership of data buffers to sg_device object. */
-       srp->data.k_use_sg = SRpnt->sr_use_sg;
-       srp->data.sglist_len = SRpnt->sr_sglist_len;
-       srp->data.bufflen = SRpnt->sr_bufflen;
-       srp->data.buffer = SRpnt->sr_buffer;
-       /* now clear out request structure */
-       SRpnt->sr_use_sg = 0;
-       SRpnt->sr_sglist_len = 0;
-       SRpnt->sr_bufflen = 0;
-       SRpnt->sr_buffer = NULL;
-       SRpnt->sr_underflow = 0;
-       SRpnt->sr_request->rq_disk = NULL; /* "sg" _disowns_ request blk */
-
-       srp->my_cmdp = NULL;
 
        SCSI_LOG_TIMEOUT(4, printk("sg_cmd_done: %s, pack_id=%d, res=0x%x\n",
-               sdp->disk->disk_name, srp->header.pack_id, (int) SRpnt->sr_result));
-       srp->header.resid = SCpnt->resid;
+               sdp->disk->disk_name, srp->header.pack_id, result));
+       srp->header.resid = resid;
        ms = jiffies_to_msecs(jiffies);
        srp->header.duration = (ms > srp->header.duration) ?
                                (ms - srp->header.duration) : 0;
-       if (0 != SRpnt->sr_result) {
+       if (0 != result) {
                struct scsi_sense_hdr sshdr;
 
-               memcpy(srp->sense_b, SRpnt->sr_sense_buffer,
-                      sizeof (srp->sense_b));
-               srp->header.status = 0xff & SRpnt->sr_result;
-               srp->header.masked_status = status_byte(SRpnt->sr_result);
-               srp->header.msg_status = msg_byte(SRpnt->sr_result);
-               srp->header.host_status = host_byte(SRpnt->sr_result);
-               srp->header.driver_status = driver_byte(SRpnt->sr_result);
+               memcpy(srp->sense_b, sense, sizeof (srp->sense_b));
+               srp->header.status = 0xff & result;
+               srp->header.masked_status = status_byte(result);
+               srp->header.msg_status = msg_byte(result);
+               srp->header.host_status = host_byte(result);
+               srp->header.driver_status = driver_byte(result);
                if ((sdp->sgdebug > 0) &&
                    ((CHECK_CONDITION == srp->header.masked_status) ||
                     (COMMAND_TERMINATED == srp->header.masked_status)))
-                       scsi_print_req_sense("sg_cmd_done", SRpnt);
+                       __scsi_print_sense("sg_cmd_done", sense,
+                                          SCSI_SENSE_BUFFERSIZE);
 
                /* Following if statement is a patch supplied by Eric Youngdale */
-               if (driver_byte(SRpnt->sr_result) != 0
-                   && scsi_command_normalize_sense(SCpnt, &sshdr)
+               if (driver_byte(result) != 0
+                   && scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, &sshdr)
                    && !scsi_sense_is_deferred(&sshdr)
                    && sshdr.sense_key == UNIT_ATTENTION
                    && sdp->device->removable) {
@@ -1379,8 +1305,6 @@ sg_cmd_done(Scsi_Cmnd * SCpnt)
        }
        /* Rely on write phase to clean out srp status values, so no "else" */
 
-       scsi_release_request(SRpnt);
-       SRpnt = NULL;
        if (sfp->closed) {      /* whoops this fd already released, cleanup */
                SCSI_LOG_TIMEOUT(1, printk("sg_cmd_done: already closed, freeing ...\n"));
                sg_finish_rem_req(srp);
@@ -1431,6 +1355,7 @@ static int sg_sysfs_valid = 0;
 
 static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
 {
+       struct request_queue *q = scsidp->request_queue;
        Sg_device *sdp;
        unsigned long iflags;
        void *old_sg_dev_arr = NULL;
@@ -1473,7 +1398,7 @@ static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
        sdp->disk = disk;
        sdp->device = scsidp;
        init_waitqueue_head(&sdp->o_excl_wait);
-       sdp->sg_tablesize = scsidp->host ? scsidp->host->sg_tablesize : 0;
+       sdp->sg_tablesize = min(q->max_hw_segments, q->max_phys_segments);
 
        sg_nr_dev++;
        sg_dev_arr[k] = sdp;
@@ -1753,36 +1678,35 @@ sg_finish_rem_req(Sg_request * srp)
 static int
 sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, int tablesize)
 {
-       int ret_sz;
-       int elem_sz = sizeof (struct scatterlist);
-       int sg_bufflen = tablesize * elem_sz;
-       int mx_sc_elems = tablesize;
+       int sg_bufflen = tablesize * sizeof(struct scatterlist);
+       unsigned int gfp_flags = GFP_ATOMIC | __GFP_NOWARN;
 
-       schp->buffer = sg_page_malloc(sg_bufflen, sfp->low_dma, &ret_sz);
+       /*
+        * TODO: test without low_dma, we should not need it since
+        * the block layer will bounce the buffer for us
+        *
+        * XXX(hch): we shouldn't need GFP_DMA for the actual S/G list.
+        */
+       if (sfp->low_dma)
+                gfp_flags |= GFP_DMA;
+       schp->buffer = kzalloc(sg_bufflen, gfp_flags);
        if (!schp->buffer)
                return -ENOMEM;
-       else if (ret_sz != sg_bufflen) {
-               sg_bufflen = ret_sz;
-               mx_sc_elems = sg_bufflen / elem_sz;
-       }
        schp->sglist_len = sg_bufflen;
-       memset(schp->buffer, 0, sg_bufflen);
-       return mx_sc_elems;     /* number of scat_gath elements allocated */
+       return tablesize;       /* number of scat_gath elements allocated */
 }
 
 #ifdef SG_ALLOW_DIO_CODE
 /* vvvvvvvv  following code borrowed from st driver's direct IO vvvvvvvvv */
-       /* hopefully this generic code will moved to a library */
+       /* TODO: hopefully we can use the generic block layer code */
 
 /* Pin down user pages and put them into a scatter gather list. Returns <= 0 if
    - mapping of all pages not successful
-   - any page is above max_pfn
    (i.e., either completely successful or fails)
 */
 static int 
 st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, 
-                 unsigned long uaddr, size_t count, int rw,
-                 unsigned long max_pfn)
+                 unsigned long uaddr, size_t count, int rw)
 {
        unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
        unsigned long start = uaddr >> PAGE_SHIFT;
@@ -1828,21 +1752,17 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages,
                  * probably wrong function for rw==WRITE
                  */
                flush_dcache_page(pages[i]);
-               if (page_to_pfn(pages[i]) > max_pfn)
-                       goto out_unlock;
                /* ?? Is locking needed? I don't think so */
                /* if (TestSetPageLocked(pages[i]))
                   goto out_unlock; */
         }
 
-       /* Populate the scatter/gather list */
-       sgl[0].page = pages[0]; 
+       sgl[0].page = pages[0];
        sgl[0].offset = uaddr & ~PAGE_MASK;
        if (nr_pages > 1) {
                sgl[0].length = PAGE_SIZE - sgl[0].offset;
                count -= sgl[0].length;
                for (i=1; i < nr_pages ; i++) {
-                       sgl[i].offset = 0;
                        sgl[i].page = pages[i]; 
                        sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE;
                        count -= PAGE_SIZE;
@@ -1855,14 +1775,12 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages,
        kfree(pages);
        return nr_pages;
 
- out_unlock:
-       /* for (j=0; j < i; j++)
-          unlock_page(pages[j]); */
-       res = 0;
  out_unmap:
-       if (res > 0)
+       if (res > 0) {
                for (j=0; j < res; j++)
                        page_cache_release(pages[j]);
+               res = 0;
+       }
        kfree(pages);
        return res;
 }
@@ -1878,8 +1796,6 @@ st_unmap_user_pages(struct scatterlist *sgl, const unsigned int nr_pages,
        for (i=0; i < nr_pages; i++) {
                struct page *page = sgl[i].page;
 
-               /* XXX: just for debug. Remove when PageReserved is removed */
-               BUG_ON(PageReserved(page));
                if (dirtied)
                        SetPageDirty(page);
                /* unlock_page(page); */
@@ -1904,20 +1820,20 @@ sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len)
        sg_io_hdr_t *hp = &srp->header;
        Sg_scatter_hold *schp = &srp->data;
        int sg_tablesize = sfp->parentdp->sg_tablesize;
-       struct scatterlist *sgl;
        int mx_sc_elems, res;
        struct scsi_device *sdev = sfp->parentdp->device;
 
        if (((unsigned long)hp->dxferp &
                        queue_dma_alignment(sdev->request_queue)) != 0)
                return 1;
+
        mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize);
         if (mx_sc_elems <= 0) {
                 return 1;
         }
-       sgl = (struct scatterlist *)schp->buffer;
-       res = st_map_user_pages(sgl, mx_sc_elems, (unsigned long)hp->dxferp, dxfer_len, 
-                               (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0, ULONG_MAX);
+       res = st_map_user_pages(schp->buffer, mx_sc_elems,
+                               (unsigned long)hp->dxferp, dxfer_len, 
+                               (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0);
        if (res <= 0)
                return 1;
        schp->k_use_sg = res;
@@ -1932,9 +1848,11 @@ sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len)
 static int
 sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)
 {
-       int ret_sz;
+       struct scatterlist *sg;
+       int ret_sz = 0, k, rem_sz, num, mx_sc_elems;
+       int sg_tablesize = sfp->parentdp->sg_tablesize;
        int blk_size = buff_size;
-       unsigned char *p = NULL;
+       struct page *p = NULL;
 
        if ((blk_size < 0) || (!sfp))
                return -EFAULT;
@@ -1944,59 +1862,35 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)
        blk_size = (blk_size + SG_SECTOR_MSK) & (~SG_SECTOR_MSK);
        SCSI_LOG_TIMEOUT(4, printk("sg_build_indirect: buff_size=%d, blk_size=%d\n",
                                   buff_size, blk_size));
-       if (blk_size <= SG_SCATTER_SZ) {
-               p = sg_page_malloc(blk_size, sfp->low_dma, &ret_sz);
-               if (!p)
-                       return -ENOMEM;
-               if (blk_size == ret_sz) {       /* got it on the first attempt */
-                       schp->k_use_sg = 0;
-                       schp->buffer = p;
-                       schp->bufflen = blk_size;
-                       schp->b_malloc_len = blk_size;
-                       return 0;
-               }
-       } else {
-               p = sg_page_malloc(SG_SCATTER_SZ, sfp->low_dma, &ret_sz);
+
+       /* N.B. ret_sz carried into this block ... */
+       mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize);
+       if (mx_sc_elems < 0)
+               return mx_sc_elems;     /* most likely -ENOMEM */
+
+       for (k = 0, sg = schp->buffer, rem_sz = blk_size;
+            (rem_sz > 0) && (k < mx_sc_elems);
+            ++k, rem_sz -= ret_sz, ++sg) {
+               
+               num = (rem_sz > SG_SCATTER_SZ) ? SG_SCATTER_SZ : rem_sz;
+               p = sg_page_malloc(num, sfp->low_dma, &ret_sz);
                if (!p)
                        return -ENOMEM;
-       }
-/* Want some local declarations, so start new block ... */
-       {                       /* lets try and build a scatter gather list */
-               struct scatterlist *sclp;
-               int k, rem_sz, num;
-               int mx_sc_elems;
-               int sg_tablesize = sfp->parentdp->sg_tablesize;
-               int first = 1;
-
-               /* N.B. ret_sz carried into this block ... */
-               mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize);
-               if (mx_sc_elems < 0)
-                       return mx_sc_elems;     /* most likely -ENOMEM */
-
-               for (k = 0, sclp = schp->buffer, rem_sz = blk_size;
-                    (rem_sz > 0) && (k < mx_sc_elems);
-                    ++k, rem_sz -= ret_sz, ++sclp) {
-                       if (first)
-                               first = 0;
-                       else {
-                               num =
-                                   (rem_sz >
-                                    SG_SCATTER_SZ) ? SG_SCATTER_SZ : rem_sz;
-                               p = sg_page_malloc(num, sfp->low_dma, &ret_sz);
-                               if (!p)
-                                       break;
-                       }
-                       sg_set_buf(sclp, p, ret_sz);
-
-                       SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n",
-                                         k, sg_scatg2virt(sclp), ret_sz));
-               }               /* end of for loop */
-               schp->k_use_sg = k;
-               SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, rem_sz=%d\n", k, rem_sz));
-               schp->bufflen = blk_size;
-               if (rem_sz > 0) /* must have failed */
-                       return -ENOMEM;
-       }
+
+               sg->page = p;
+               sg->length = ret_sz;
+
+               SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n",
+                                 k, p, ret_sz));
+       }               /* end of for loop */
+
+       schp->k_use_sg = k;
+       SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, rem_sz=%d\n", k, rem_sz));
+
+       schp->bufflen = blk_size;
+       if (rem_sz > 0) /* must have failed */
+               return -ENOMEM;
+
        return 0;
 }
 
@@ -2005,6 +1899,7 @@ sg_write_xfer(Sg_request * srp)
 {
        sg_io_hdr_t *hp = &srp->header;
        Sg_scatter_hold *schp = &srp->data;
+       struct scatterlist *sg = schp->buffer;
        int num_xfer = 0;
        int j, k, onum, usglen, ksglen, res;
        int iovec_count = (int) hp->iovec_count;
@@ -2033,63 +1928,45 @@ sg_write_xfer(Sg_request * srp)
        } else
                onum = 1;
 
-       if (0 == schp->k_use_sg) {      /* kernel has single buffer */
-               for (j = 0, p = schp->buffer; j < onum; ++j) {
-                       res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up);
-                       if (res)
-                               return res;
-                       usglen = (num_xfer > usglen) ? usglen : num_xfer;
-                       if (__copy_from_user(p, up, usglen))
-                               return -EFAULT;
-                       p += usglen;
-                       num_xfer -= usglen;
-                       if (num_xfer <= 0)
-                               return 0;
-               }
-       } else {                /* kernel using scatter gather list */
-               struct scatterlist *sclp = (struct scatterlist *) schp->buffer;
-
-               ksglen = (int) sclp->length;
-               p = sg_scatg2virt(sclp);
-               for (j = 0, k = 0; j < onum; ++j) {
-                       res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up);
-                       if (res)
-                               return res;
-
-                       for (; p; ++sclp, ksglen = (int) sclp->length,
-                                 p = sg_scatg2virt(sclp)) {
-                               if (usglen <= 0)
-                                       break;
-                               if (ksglen > usglen) {
-                                       if (usglen >= num_xfer) {
-                                               if (__copy_from_user
-                                                   (p, up, num_xfer))
-                                                       return -EFAULT;
-                                               return 0;
-                                       }
-                                       if (__copy_from_user(p, up, usglen))
-                                               return -EFAULT;
-                                       p += usglen;
-                                       ksglen -= usglen;
-                                       break;
-                               } else {
-                                       if (ksglen >= num_xfer) {
-                                               if (__copy_from_user
-                                                   (p, up, num_xfer))
-                                                       return -EFAULT;
-                                               return 0;
-                                       }
-                                       if (__copy_from_user(p, up, ksglen))
+       ksglen = sg->length;
+       p = page_address(sg->page);
+       for (j = 0, k = 0; j < onum; ++j) {
+               res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up);
+               if (res)
+                       return res;
+
+               for (; p; ++sg, ksglen = sg->length,
+                    p = page_address(sg->page)) {
+                       if (usglen <= 0)
+                               break;
+                       if (ksglen > usglen) {
+                               if (usglen >= num_xfer) {
+                                       if (__copy_from_user(p, up, num_xfer))
                                                return -EFAULT;
-                                       up += ksglen;
-                                       usglen -= ksglen;
+                                       return 0;
                                }
-                               ++k;
-                               if (k >= schp->k_use_sg)
+                               if (__copy_from_user(p, up, usglen))
+                                       return -EFAULT;
+                               p += usglen;
+                               ksglen -= usglen;
+                               break;
+                       } else {
+                               if (ksglen >= num_xfer) {
+                                       if (__copy_from_user(p, up, num_xfer))
+                                               return -EFAULT;
                                        return 0;
+                               }
+                               if (__copy_from_user(p, up, ksglen))
+                                       return -EFAULT;
+                               up += ksglen;
+                               usglen -= ksglen;
                        }
+                       ++k;
+                       if (k >= schp->k_use_sg)
+                               return 0;
                }
        }
+
        return 0;
 }
 
@@ -2127,29 +2004,25 @@ sg_remove_scat(Sg_scatter_hold * schp)
 {
        SCSI_LOG_TIMEOUT(4, printk("sg_remove_scat: k_use_sg=%d\n", schp->k_use_sg));
        if (schp->buffer && (schp->sglist_len > 0)) {
-               struct scatterlist *sclp = (struct scatterlist *) schp->buffer;
+               struct scatterlist *sg = schp->buffer;
 
                if (schp->dio_in_use) {
 #ifdef SG_ALLOW_DIO_CODE
-                       st_unmap_user_pages(sclp, schp->k_use_sg, TRUE);
+                       st_unmap_user_pages(sg, schp->k_use_sg, TRUE);
 #endif
                } else {
                        int k;
 
-                       for (k = 0; (k < schp->k_use_sg) && sg_scatg2virt(sclp);
-                            ++k, ++sclp) {
+                       for (k = 0; (k < schp->k_use_sg) && sg->page;
+                            ++k, ++sg) {
                                SCSI_LOG_TIMEOUT(5, printk(
                                    "sg_remove_scat: k=%d, a=0x%p, len=%d\n",
-                                   k, sg_scatg2virt(sclp), sclp->length));
-                               sg_page_free(sg_scatg2virt(sclp), sclp->length);
-                               sclp->page = NULL;
-                               sclp->offset = 0;
-                               sclp->length = 0;
+                                   k, sg->page, sg->length));
+                               sg_page_free(sg->page, sg->length);
                        }
                }
-               sg_page_free(schp->buffer, schp->sglist_len);
-       } else if (schp->buffer)
-               sg_page_free(schp->buffer, schp->b_malloc_len);
+               kfree(schp->buffer);
+       }
        memset(schp, 0, sizeof (*schp));
 }
 
@@ -2158,6 +2031,7 @@ sg_read_xfer(Sg_request * srp)
 {
        sg_io_hdr_t *hp = &srp->header;
        Sg_scatter_hold *schp = &srp->data;
+       struct scatterlist *sg = schp->buffer;
        int num_xfer = 0;
        int j, k, onum, usglen, ksglen, res;
        int iovec_count = (int) hp->iovec_count;
@@ -2186,63 +2060,45 @@ sg_read_xfer(Sg_request * srp)
        } else
                onum = 1;
 
-       if (0 == schp->k_use_sg) {      /* kernel has single buffer */
-               for (j = 0, p = schp->buffer; j < onum; ++j) {
-                       res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up);
-                       if (res)
-                               return res;
-                       usglen = (num_xfer > usglen) ? usglen : num_xfer;
-                       if (__copy_to_user(up, p, usglen))
-                               return -EFAULT;
-                       p += usglen;
-                       num_xfer -= usglen;
-                       if (num_xfer <= 0)
-                               return 0;
-               }
-       } else {                /* kernel using scatter gather list */
-               struct scatterlist *sclp = (struct scatterlist *) schp->buffer;
-
-               ksglen = (int) sclp->length;
-               p = sg_scatg2virt(sclp);
-               for (j = 0, k = 0; j < onum; ++j) {
-                       res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up);
-                       if (res)
-                               return res;
-
-                       for (; p; ++sclp, ksglen = (int) sclp->length,
-                                 p = sg_scatg2virt(sclp)) {
-                               if (usglen <= 0)
-                                       break;
-                               if (ksglen > usglen) {
-                                       if (usglen >= num_xfer) {
-                                               if (__copy_to_user
-                                                   (up, p, num_xfer))
-                                                       return -EFAULT;
-                                               return 0;
-                                       }
-                                       if (__copy_to_user(up, p, usglen))
-                                               return -EFAULT;
-                                       p += usglen;
-                                       ksglen -= usglen;
-                                       break;
-                               } else {
-                                       if (ksglen >= num_xfer) {
-                                               if (__copy_to_user
-                                                   (up, p, num_xfer))
-                                                       return -EFAULT;
-                                               return 0;
-                                       }
-                                       if (__copy_to_user(up, p, ksglen))
+       p = page_address(sg->page);
+       ksglen = sg->length;
+       for (j = 0, k = 0; j < onum; ++j) {
+               res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up);
+               if (res)
+                       return res;
+
+               for (; p; ++sg, ksglen = sg->length,
+                    p = page_address(sg->page)) {
+                       if (usglen <= 0)
+                               break;
+                       if (ksglen > usglen) {
+                               if (usglen >= num_xfer) {
+                                       if (__copy_to_user(up, p, num_xfer))
                                                return -EFAULT;
-                                       up += ksglen;
-                                       usglen -= ksglen;
+                                       return 0;
                                }
-                               ++k;
-                               if (k >= schp->k_use_sg)
+                               if (__copy_to_user(up, p, usglen))
+                                       return -EFAULT;
+                               p += usglen;
+                               ksglen -= usglen;
+                               break;
+                       } else {
+                               if (ksglen >= num_xfer) {
+                                       if (__copy_to_user(up, p, num_xfer))
+                                               return -EFAULT;
                                        return 0;
+                               }
+                               if (__copy_to_user(up, p, ksglen))
+                                       return -EFAULT;
+                               up += ksglen;
+                               usglen -= ksglen;
                        }
+                       ++k;
+                       if (k >= schp->k_use_sg)
+                               return 0;
                }
        }
+
        return 0;
 }
 
@@ -2250,37 +2106,32 @@ static int
 sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer)
 {
        Sg_scatter_hold *schp = &srp->data;
+       struct scatterlist *sg = schp->buffer;
+       int k, num;
 
        SCSI_LOG_TIMEOUT(4, printk("sg_read_oxfer: num_read_xfer=%d\n",
                                   num_read_xfer));
        if ((!outp) || (num_read_xfer <= 0))
                return 0;
-       if (schp->k_use_sg > 0) {
-               int k, num;
-               struct scatterlist *sclp = (struct scatterlist *) schp->buffer;
-
-               for (k = 0; (k < schp->k_use_sg) && sg_scatg2virt(sclp);
-                    ++k, ++sclp) {
-                       num = (int) sclp->length;
-                       if (num > num_read_xfer) {
-                               if (__copy_to_user
-                                   (outp, sg_scatg2virt(sclp), num_read_xfer))
-                                       return -EFAULT;
+
+       for (k = 0; (k < schp->k_use_sg) && sg->page; ++k, ++sg) {
+               num = sg->length;
+               if (num > num_read_xfer) {
+                       if (__copy_to_user(outp, page_address(sg->page),
+                                          num_read_xfer))
+                               return -EFAULT;
+                       break;
+               } else {
+                       if (__copy_to_user(outp, page_address(sg->page),
+                                          num))
+                               return -EFAULT;
+                       num_read_xfer -= num;
+                       if (num_read_xfer <= 0)
                                break;
-                       } else {
-                               if (__copy_to_user
-                                   (outp, sg_scatg2virt(sclp), num))
-                                       return -EFAULT;
-                               num_read_xfer -= num;
-                               if (num_read_xfer <= 0)
-                                       break;
-                               outp += num;
-                       }
+                       outp += num;
                }
-       } else {
-               if (__copy_to_user(outp, schp->buffer, num_read_xfer))
-                       return -EFAULT;
        }
+
        return 0;
 }
 
@@ -2306,44 +2157,31 @@ sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size)
 {
        Sg_scatter_hold *req_schp = &srp->data;
        Sg_scatter_hold *rsv_schp = &sfp->reserve;
+       struct scatterlist *sg = rsv_schp->buffer;
+       int k, num, rem;
 
        srp->res_used = 1;
        SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size));
-       size = (size + 1) & (~1);       /* round to even for aha1542 */
-       if (rsv_schp->k_use_sg > 0) {
-               int k, num;
-               int rem = size;
-               struct scatterlist *sclp =
-                   (struct scatterlist *) rsv_schp->buffer;
-
-               for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sclp) {
-                       num = (int) sclp->length;
-                       if (rem <= num) {
-                               if (0 == k) {
-                                       req_schp->k_use_sg = 0;
-                                       req_schp->buffer = sg_scatg2virt(sclp);
-                               } else {
-                                       sfp->save_scat_len = num;
-                                       sclp->length = (unsigned) rem;
-                                       req_schp->k_use_sg = k + 1;
-                                       req_schp->sglist_len =
-                                           rsv_schp->sglist_len;
-                                       req_schp->buffer = rsv_schp->buffer;
-                               }
-                               req_schp->bufflen = size;
-                               req_schp->b_malloc_len = rsv_schp->b_malloc_len;
-                               break;
-                       } else
-                               rem -= num;
-               }
-               if (k >= rsv_schp->k_use_sg)
-                       SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n"));
-       } else {
-               req_schp->k_use_sg = 0;
-               req_schp->bufflen = size;
-               req_schp->buffer = rsv_schp->buffer;
-               req_schp->b_malloc_len = rsv_schp->b_malloc_len;
+       rem = size = (size + 1) & (~1); /* round to even for aha1542 */
+
+       for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) {
+               num = sg->length;
+               if (rem <= num) {
+                       sfp->save_scat_len = num;
+                       sg->length = rem;
+                       req_schp->k_use_sg = k + 1;
+                       req_schp->sglist_len = rsv_schp->sglist_len;
+                       req_schp->buffer = rsv_schp->buffer;
+
+                       req_schp->bufflen = size;
+                       req_schp->b_malloc_len = rsv_schp->b_malloc_len;
+                       break;
+               } else
+                       rem -= num;
        }
+
+       if (k >= rsv_schp->k_use_sg)
+               SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n"));
 }
 
 static void
@@ -2355,11 +2193,10 @@ sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp)
        SCSI_LOG_TIMEOUT(4, printk("sg_unlink_reserve: req->k_use_sg=%d\n",
                                   (int) req_schp->k_use_sg));
        if ((rsv_schp->k_use_sg > 0) && (req_schp->k_use_sg > 0)) {
-               struct scatterlist *sclp =
-                   (struct scatterlist *) rsv_schp->buffer;
+               struct scatterlist *sg = rsv_schp->buffer;
 
                if (sfp->save_scat_len > 0)
-                       (sclp + (req_schp->k_use_sg - 1))->length =
+                       (sg + (req_schp->k_use_sg - 1))->length =
                            (unsigned) sfp->save_scat_len;
                else
                        SCSI_LOG_TIMEOUT(1, printk ("sg_unlink_reserve: BAD save_scat_len\n"));
@@ -2445,7 +2282,6 @@ sg_add_request(Sg_fd * sfp)
        if (resp) {
                resp->nextrp = NULL;
                resp->header.duration = jiffies_to_msecs(jiffies);
-               resp->my_cmdp = NULL;
        }
        write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
        return resp;
@@ -2463,8 +2299,6 @@ 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;
@@ -2507,10 +2341,10 @@ sg_add_sfp(Sg_device * sdp, int dev)
        Sg_fd *sfp;
        unsigned long iflags;
 
-       sfp = (Sg_fd *) sg_page_malloc(sizeof (Sg_fd), 0, NULL);
+       sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN);
        if (!sfp)
                return NULL;
-       memset(sfp, 0, sizeof (Sg_fd));
+
        init_waitqueue_head(&sfp->read_wait);
        rwlock_init(&sfp->rq_list_lock);
 
@@ -2567,7 +2401,7 @@ __sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp)
        }
        sfp->parentdp = NULL;
        SCSI_LOG_TIMEOUT(6, printk("__sg_remove_sfp:    sfp=0x%p\n", sfp));
-       sg_page_free((char *) sfp, sizeof (Sg_fd));
+       kfree(sfp);
 }
 
 /* Returns 0 in normal case, 1 when detached and sdp object removed */
@@ -2632,10 +2466,10 @@ sg_res_in_use(Sg_fd * sfp)
 }
 
 /* If retSzp==NULL want exact size or fail */
-static char *
+static struct page *
 sg_page_malloc(int rqSz, int lowDma, int *retSzp)
 {
-       char *resp = NULL;
+       struct page *resp = NULL;
        gfp_t page_mask;
        int order, a_size;
        int resSz = rqSz;
@@ -2650,11 +2484,11 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp)
 
        for (order = 0, a_size = PAGE_SIZE; a_size < rqSz;
             order++, a_size <<= 1) ;
-       resp = (char *) __get_free_pages(page_mask, order);
+       resp = alloc_pages(page_mask, order);
        while ((!resp) && order && retSzp) {
                --order;
                a_size >>= 1;   /* divide by 2, until PAGE_SIZE */
-               resp = (char *) __get_free_pages(page_mask, order);     /* try half */
+               resp =  alloc_pages(page_mask, order);  /* try half */
                resSz = a_size;
        }
        if (resp) {
@@ -2667,15 +2501,15 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp)
 }
 
 static void
-sg_page_free(char *buff, int size)
+sg_page_free(struct page *page, int size)
 {
        int order, a_size;
 
-       if (!buff)
+       if (!page)
                return;
        for (order = 0, a_size = PAGE_SIZE; a_size < size;
             order++, a_size <<= 1) ;
-       free_pages((unsigned long) buff, order);
+       __free_pages(page, order);
 }
 
 #ifndef MAINTENANCE_IN_CMD
@@ -3067,13 +2901,11 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp)
                                        cp = "     ";
                        }
                        seq_printf(s, cp);
-                       blen = srp->my_cmdp ? 
-                               srp->my_cmdp->sr_bufflen : srp->data.bufflen;
-                       usg = srp->my_cmdp ? 
-                               srp->my_cmdp->sr_use_sg : srp->data.k_use_sg;
+                       blen = srp->data.bufflen;
+                       usg = srp->data.k_use_sg;
                        seq_printf(s, srp->done ? 
                                   ((1 == srp->done) ?  "rcv:" : "fin:")
-                                  : (srp->my_cmdp ? "act:" : "prior:"));
+                                  : "act:");
                        seq_printf(s, " id=%d blen=%d",
                                   srp->header.pack_id, blen);
                        if (srp->done)
index d68cea753bb2222629db977d5ebf37614dc9c093..a4d9be7c6874b471db06fe4a02503db46eb246bb 100644 (file)
@@ -320,25 +320,11 @@ static int sr_init_command(struct scsi_cmnd * SCpnt)
         * these are already setup, just copy cdb basically
         */
        if (SCpnt->request->flags & REQ_BLOCK_PC) {
-               struct request *rq = SCpnt->request;
+               scsi_setup_blk_pc_cmnd(SCpnt);
 
-               if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd))
-                       return 0;
-
-               memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd));
-               SCpnt->cmd_len = rq->cmd_len;
-               if (!rq->data_len)
-                       SCpnt->sc_data_direction = DMA_NONE;
-               else if (rq_data_dir(rq) == WRITE)
-                       SCpnt->sc_data_direction = DMA_TO_DEVICE;
-               else
-                       SCpnt->sc_data_direction = DMA_FROM_DEVICE;
-
-               this_count = rq->data_len;
-               if (rq->timeout)
-                       timeout = rq->timeout;
+               if (SCpnt->timeout_per_command)
+                       timeout = SCpnt->timeout_per_command;
 
-               SCpnt->transfersize = rq->data_len;
                goto queue;
        }
 
@@ -730,7 +716,7 @@ static void get_capabilities(struct scsi_cd *cd)
        unsigned int the_result;
        int retries, rc, n;
 
-       static char *loadmech[] =
+       static const char *loadmech[] =
        {
                "caddy",
                "tray",
index 78274dc91f5c74c0320702735856d90b4390968c..9dde8df2f5c9feccf5d3ae98daad805b37bcecd3 100644 (file)
@@ -68,8 +68,8 @@ void sr_vendor_init(Scsi_CD *cd)
 #ifndef CONFIG_BLK_DEV_SR_VENDOR
        cd->vendor = VENDOR_SCSI3;
 #else
-       char *vendor = cd->device->vendor;
-       char *model = cd->device->model;
+       const char *vendor = cd->device->vendor;
+       const char *model = cd->device->model;
        
        /* default */
        cd->vendor = VENDOR_SCSI3;
index 770c4324f3d5750e51eae824fd59a985209b9732..c4aade8f5345a34f949434df43f20fa847b139d1 100644 (file)
@@ -17,7 +17,7 @@
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  */
 
-static char *verstr = "20050830";
+static const char *verstr = "20050830";
 
 #include <linux/module.h>
 
@@ -50,7 +50,6 @@ static char *verstr = "20050830";
 #include <scsi/scsi_eh.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_ioctl.h>
-#include <scsi/scsi_request.h>
 #include <scsi/sg.h>
 
 
@@ -134,7 +133,7 @@ static struct st_dev_parm {
 #endif
 /* Bit reversed order to get same names for same minors with all
    mode counts */
-static char *st_formats[] = {
+static const char *st_formats[] = {
        "",  "r", "k", "s", "l", "t", "o", "u",
        "m", "v", "p", "x", "a", "y", "q", "z"}; 
 
@@ -188,8 +187,6 @@ static int from_buffer(struct st_buffer *, char __user *, int);
 static void move_buffer_data(struct st_buffer *, int);
 static void buf_to_sg(struct st_buffer *, unsigned int);
 
-static int st_map_user_pages(struct scatterlist *, const unsigned int, 
-                            unsigned long, size_t, int, unsigned long);
 static int sgl_map_user_pages(struct scatterlist *, const unsigned int, 
                              unsigned long, size_t, int);
 static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int);
@@ -313,12 +310,13 @@ static inline char *tape_name(struct scsi_tape *tape)
 }
 
 
-static void st_analyze_sense(struct scsi_request *SRpnt, struct st_cmdstatus *s)
+static void st_analyze_sense(struct st_request *SRpnt, struct st_cmdstatus *s)
 {
        const u8 *ucp;
-       const u8 *sense = SRpnt->sr_sense_buffer;
+       const u8 *sense = SRpnt->sense;
 
-       s->have_sense = scsi_request_normalize_sense(SRpnt, &s->sense_hdr);
+       s->have_sense = scsi_normalize_sense(SRpnt->sense,
+                               SCSI_SENSE_BUFFERSIZE, &s->sense_hdr);
        s->flags = 0;
 
        if (s->have_sense) {
@@ -345,9 +343,9 @@ static void st_analyze_sense(struct scsi_request *SRpnt, struct st_cmdstatus *s)
 
 
 /* Convert the result to success code */
-static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt)
+static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
 {
-       int result = SRpnt->sr_result;
+       int result = SRpnt->result;
        u8 scode;
        DEB(const char *stp;)
        char *name = tape_name(STp);
@@ -366,13 +364,12 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt)
 
         DEB(
         if (debugging) {
-                printk(ST_DEB_MSG "%s: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n",
+                printk(ST_DEB_MSG "%s: Error: %x, cmd: %x %x %x %x %x %x\n",
                       name, result,
-                      SRpnt->sr_cmnd[0], SRpnt->sr_cmnd[1], SRpnt->sr_cmnd[2],
-                      SRpnt->sr_cmnd[3], SRpnt->sr_cmnd[4], SRpnt->sr_cmnd[5],
-                      SRpnt->sr_bufflen);
+                      SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],
+                      SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);
                if (cmdstatp->have_sense)
-                       scsi_print_req_sense("st", SRpnt);
+                        __scsi_print_sense("st", SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
        } ) /* end DEB */
        if (!debugging) { /* Abnormal conditions for tape */
                if (!cmdstatp->have_sense)
@@ -386,20 +383,21 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt)
                         /* scode != UNIT_ATTENTION && */
                         scode != BLANK_CHECK &&
                         scode != VOLUME_OVERFLOW &&
-                        SRpnt->sr_cmnd[0] != MODE_SENSE &&
-                        SRpnt->sr_cmnd[0] != TEST_UNIT_READY) {
+                        SRpnt->cmd[0] != MODE_SENSE &&
+                        SRpnt->cmd[0] != TEST_UNIT_READY) {
                                printk(KERN_WARNING "%s: Error with sense data: ", name);
-                               scsi_print_req_sense("st", SRpnt);
+                               __scsi_print_sense("st", SRpnt->sense,
+                                                  SCSI_SENSE_BUFFERSIZE);
                }
        }
 
        if (cmdstatp->fixed_format &&
            STp->cln_mode >= EXTENDED_SENSE_START) {  /* Only fixed format sense */
                if (STp->cln_sense_value)
-                       STp->cleaning_req |= ((SRpnt->sr_sense_buffer[STp->cln_mode] &
+                       STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
                                               STp->cln_sense_mask) == STp->cln_sense_value);
                else
-                       STp->cleaning_req |= ((SRpnt->sr_sense_buffer[STp->cln_mode] &
+                       STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
                                               STp->cln_sense_mask) != 0);
        }
        if (cmdstatp->have_sense &&
@@ -411,8 +409,8 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt)
        if (cmdstatp->have_sense &&
            scode == RECOVERED_ERROR
 #if ST_RECOVERED_WRITE_FATAL
-           && SRpnt->sr_cmnd[0] != WRITE_6
-           && SRpnt->sr_cmnd[0] != WRITE_FILEMARKS
+           && SRpnt->cmd[0] != WRITE_6
+           && SRpnt->cmd[0] != WRITE_FILEMARKS
 #endif
            ) {
                STp->recover_count++;
@@ -420,9 +418,9 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt)
 
                 DEB(
                if (debugging) {
-                       if (SRpnt->sr_cmnd[0] == READ_6)
+                       if (SRpnt->cmd[0] == READ_6)
                                stp = "read";
-                       else if (SRpnt->sr_cmnd[0] == WRITE_6)
+                       else if (SRpnt->cmd[0] == WRITE_6)
                                stp = "write";
                        else
                                stp = "ioctl";
@@ -438,28 +436,37 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt)
 
 
 /* Wakeup from interrupt */
-static void st_sleep_done(struct scsi_cmnd * SCpnt)
+static void st_sleep_done(void *data, char *sense, int result, int resid)
 {
-       struct scsi_tape *STp = container_of(SCpnt->request->rq_disk->private_data,
-                                            struct scsi_tape, driver);
+       struct st_request *SRpnt = data;
+       struct scsi_tape *STp = SRpnt->stp;
 
-       (STp->buffer)->cmdstat.midlevel_result = SCpnt->result;
-       SCpnt->request->rq_status = RQ_SCSI_DONE;
+       memcpy(SRpnt->sense, sense, SCSI_SENSE_BUFFERSIZE);
+       (STp->buffer)->cmdstat.midlevel_result = SRpnt->result = result;
        DEB( STp->write_pending = 0; )
 
-       if (SCpnt->request->waiting)
-               complete(SCpnt->request->waiting);
+       if (SRpnt->waiting)
+               complete(SRpnt->waiting);
+}
+
+static struct st_request *st_allocate_request(void)
+{
+       return kzalloc(sizeof(struct st_request), GFP_KERNEL);
+}
+
+static void st_release_request(struct st_request *streq)
+{
+       kfree(streq);
 }
 
 /* Do the scsi command. Waits until command performed if do_wait is true.
    Otherwise write_behind_check() is used to check that the command
    has finished. */
-static struct scsi_request *
-st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd,
+static struct st_request *
+st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd,
           int bytes, int direction, int timeout, int retries, int do_wait)
 {
        struct completion *waiting;
-       unsigned char *bp;
 
        /* if async, make sure there's no command outstanding */
        if (!do_wait && ((STp->buffer)->last_SRpnt)) {
@@ -473,7 +480,7 @@ st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *c
        }
 
        if (SRpnt == NULL) {
-               SRpnt = scsi_allocate_request(STp->device, GFP_ATOMIC);
+               SRpnt = st_allocate_request();
                if (SRpnt == NULL) {
                        DEBC( printk(KERN_ERR "%s: Can't get SCSI request.\n",
                                     tape_name(STp)); );
@@ -483,6 +490,7 @@ st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *c
                                (STp->buffer)->syscall_result = (-EBUSY);
                        return NULL;
                }
+               SRpnt->stp = STp;
        }
 
        /* If async IO, set last_SRpnt. This ptr tells write_behind_check
@@ -492,32 +500,28 @@ st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *c
 
        waiting = &STp->wait;
        init_completion(waiting);
-       SRpnt->sr_use_sg = STp->buffer->do_dio || (bytes > (STp->buffer)->frp[0].length);
-       if (SRpnt->sr_use_sg) {
-               if (!STp->buffer->do_dio)
-                       buf_to_sg(STp->buffer, bytes);
-               SRpnt->sr_use_sg = (STp->buffer)->sg_segs;
-               bp = (char *) &((STp->buffer)->sg[0]);
-       } else
-               bp = (STp->buffer)->b_data;
-       SRpnt->sr_data_direction = direction;
-       SRpnt->sr_cmd_len = 0;
-       SRpnt->sr_request->waiting = waiting;
-       SRpnt->sr_request->rq_status = RQ_SCSI_BUSY;
-       SRpnt->sr_request->rq_disk = STp->disk;
-       SRpnt->sr_request->end_io = blk_end_sync_rq;
-       STp->buffer->cmdstat.have_sense = 0;
+       SRpnt->waiting = waiting;
 
-       scsi_do_req(SRpnt, (void *) cmd, bp, bytes,
-                   st_sleep_done, timeout, retries);
+       if (!STp->buffer->do_dio)
+               buf_to_sg(STp->buffer, bytes);
 
-       if (do_wait) {
+       memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd));
+       STp->buffer->cmdstat.have_sense = 0;
+       STp->buffer->syscall_result = 0;
+
+       if (scsi_execute_async(STp->device, cmd, direction,
+                       &((STp->buffer)->sg[0]), bytes, (STp->buffer)->sg_segs,
+                              timeout, retries, SRpnt, st_sleep_done, GFP_KERNEL)) {
+               /* could not allocate the buffer or request was too large */
+               (STp->buffer)->syscall_result = (-EBUSY);
+               (STp->buffer)->last_SRpnt = NULL;
+       }
+       else if (do_wait) {
                wait_for_completion(waiting);
-               SRpnt->sr_request->waiting = NULL;
-               if (SRpnt->sr_request->rq_status != RQ_SCSI_DONE)
-                       SRpnt->sr_result |= (DRIVER_ERROR << 24);
+               SRpnt->waiting = NULL;
                (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
        }
+
        return SRpnt;
 }
 
@@ -532,7 +536,7 @@ static int write_behind_check(struct scsi_tape * STp)
        struct st_buffer *STbuffer;
        struct st_partstat *STps;
        struct st_cmdstatus *cmdstatp;
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
 
        STbuffer = STp->buffer;
        if (!STbuffer->writing)
@@ -548,12 +552,10 @@ static int write_behind_check(struct scsi_tape * STp)
        wait_for_completion(&(STp->wait));
        SRpnt = STbuffer->last_SRpnt;
        STbuffer->last_SRpnt = NULL;
-       SRpnt->sr_request->waiting = NULL;
-       if (SRpnt->sr_request->rq_status != RQ_SCSI_DONE)
-               SRpnt->sr_result |= (DRIVER_ERROR << 24);
+       SRpnt->waiting = NULL;
 
        (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
 
        STbuffer->buffer_bytes -= STbuffer->writing;
        STps = &(STp->ps[STp->partition]);
@@ -593,7 +595,7 @@ static int write_behind_check(struct scsi_tape * STp)
    it messes up the block number). */
 static int cross_eof(struct scsi_tape * STp, int forward)
 {
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        unsigned char cmd[MAX_COMMAND_SIZE];
 
        cmd[0] = SPACE;
@@ -613,7 +615,7 @@ static int cross_eof(struct scsi_tape * STp, int forward)
        if (!SRpnt)
                return (STp->buffer)->syscall_result;
 
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
        SRpnt = NULL;
 
        if ((STp->buffer)->cmdstat.midlevel_result != 0)
@@ -630,7 +632,7 @@ static int flush_write_buffer(struct scsi_tape * STp)
        int offset, transfer, blks;
        int result;
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        struct st_partstat *STps;
 
        result = write_behind_check(STp);
@@ -688,7 +690,7 @@ static int flush_write_buffer(struct scsi_tape * STp)
                        STp->dirty = 0;
                        (STp->buffer)->buffer_bytes = 0;
                }
-               scsi_release_request(SRpnt);
+               st_release_request(SRpnt);
                SRpnt = NULL;
        }
        return result;
@@ -785,7 +787,7 @@ static int set_mode_densblk(struct scsi_tape * STp, struct st_modedef * STm)
 }
 
 
-/* Lock or unlock the drive door. Don't use when scsi_request allocated. */
+/* Lock or unlock the drive door. Don't use when st_request allocated. */
 static int do_door_lock(struct scsi_tape * STp, int do_lock)
 {
        int retval, cmd;
@@ -844,7 +846,7 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
        int attentions, waits, max_wait, scode;
        int retval = CHKRES_READY, new_session = 0;
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt = NULL;
+       struct st_request *SRpnt = NULL;
        struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
 
        max_wait = do_wait ? ST_BLOCK_SECONDS : 0;
@@ -903,7 +905,7 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
        }
 
        if (SRpnt != NULL)
-               scsi_release_request(SRpnt);
+               st_release_request(SRpnt);
        return retval;
 }
 
@@ -918,7 +920,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
        int i, retval, new_session = 0, do_wait;
        unsigned char cmd[MAX_COMMAND_SIZE], saved_cleaning;
        unsigned short st_flags = filp->f_flags;
-       struct scsi_request *SRpnt = NULL;
+       struct st_request *SRpnt = NULL;
        struct st_modedef *STm;
        struct st_partstat *STps;
        char *name = tape_name(STp);
@@ -993,7 +995,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
                        goto err_out;
                }
 
-               if (!SRpnt->sr_result && !STp->buffer->cmdstat.have_sense) {
+               if (!SRpnt->result && !STp->buffer->cmdstat.have_sense) {
                        STp->max_block = ((STp->buffer)->b_data[1] << 16) |
                            ((STp->buffer)->b_data[2] << 8) | (STp->buffer)->b_data[3];
                        STp->min_block = ((STp->buffer)->b_data[4] << 8) |
@@ -1045,7 +1047,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
                }
                STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0;
        }
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
        SRpnt = NULL;
         STp->inited = 1;
 
@@ -1196,7 +1198,7 @@ static int st_flush(struct file *filp)
 {
        int result = 0, result2;
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        struct scsi_tape *STp = filp->private_data;
        struct st_modedef *STm = &(STp->modes[STp->current_mode]);
        struct st_partstat *STps = &(STp->ps[STp->partition]);
@@ -1249,7 +1251,7 @@ static int st_flush(struct file *filp)
                      cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
                     (!cmdstatp->remainder_valid || cmdstatp->uremainder64 == 0))) {
                        /* Write successful at EOM */
-                       scsi_release_request(SRpnt);
+                       st_release_request(SRpnt);
                        SRpnt = NULL;
                        if (STps->drv_file >= 0)
                                STps->drv_file++;
@@ -1259,7 +1261,7 @@ static int st_flush(struct file *filp)
                        STps->eof = ST_FM;
                }
                else { /* Write error */
-                       scsi_release_request(SRpnt);
+                       st_release_request(SRpnt);
                        SRpnt = NULL;
                        printk(KERN_ERR "%s: Error on write filemark.\n", name);
                        if (result == 0)
@@ -1400,11 +1402,11 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf,
                i = STp->try_dio && try_rdio;
        else
                i = STp->try_dio && try_wdio;
+
        if (i && ((unsigned long)buf & queue_dma_alignment(
                                        STp->device->request_queue)) == 0) {
-               i = st_map_user_pages(&(STbp->sg[0]), STbp->use_sg,
-                                     (unsigned long)buf, count, (is_read ? READ : WRITE),
-                                     STp->max_pfn);
+               i = sgl_map_user_pages(&(STbp->sg[0]), STbp->use_sg,
+                                     (unsigned long)buf, count, (is_read ? READ : WRITE));
                if (i > 0) {
                        STbp->do_dio = i;
                        STbp->buffer_bytes = 0;   /* can be used as transfer counter */
@@ -1449,14 +1451,15 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf,
 
 
 /* Can be called more than once after each setup_buffer() */
-static void release_buffering(struct scsi_tape *STp)
+static void release_buffering(struct scsi_tape *STp, int is_read)
 {
        struct st_buffer *STbp;
 
        STbp = STp->buffer;
        if (STbp->do_dio) {
-               sgl_unmap_user_pages(&(STbp->sg[0]), STbp->do_dio, 0);
+               sgl_unmap_user_pages(&(STbp->sg[0]), STbp->do_dio, is_read);
                STbp->do_dio = 0;
+               STbp->sg_segs = 0;
        }
 }
 
@@ -1472,7 +1475,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
        int async_write;
        unsigned char cmd[MAX_COMMAND_SIZE];
        const char __user *b_point;
-       struct scsi_request *SRpnt = NULL;
+       struct st_request *SRpnt = NULL;
        struct scsi_tape *STp = filp->private_data;
        struct st_modedef *STm;
        struct st_partstat *STps;
@@ -1624,7 +1627,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
                        retval = STbp->syscall_result;
                        goto out;
                }
-               if (async_write) {
+               if (async_write && !STbp->syscall_result) {
                        STbp->writing = transfer;
                        STp->dirty = !(STbp->writing ==
                                       STbp->buffer_bytes);
@@ -1698,7 +1701,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
                        } else {
                                count += do_count;
                                STps->drv_block = (-1);         /* Too cautious? */
-                               retval = (-EIO);
+                               retval = STbp->syscall_result;
                        }
 
                }
@@ -1728,8 +1731,8 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
 
  out:
        if (SRpnt != NULL)
-               scsi_release_request(SRpnt);
-       release_buffering(STp);
+               st_release_request(SRpnt);
+       release_buffering(STp, 0);
        up(&STp->lock);
 
        return retval;
@@ -1742,11 +1745,11 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
    Does release user buffer mapping if it is set.
 */
 static long read_tape(struct scsi_tape *STp, long count,
-                     struct scsi_request ** aSRpnt)
+                     struct st_request ** aSRpnt)
 {
        int transfer, blks, bytes;
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        struct st_modedef *STm;
        struct st_partstat *STps;
        struct st_buffer *STbp;
@@ -1787,7 +1790,7 @@ static long read_tape(struct scsi_tape *STp, long count,
        SRpnt = *aSRpnt;
        SRpnt = st_do_scsi(SRpnt, STp, cmd, bytes, DMA_FROM_DEVICE,
                           STp->device->timeout, MAX_RETRIES, 1);
-       release_buffering(STp);
+       release_buffering(STp, 1);
        *aSRpnt = SRpnt;
        if (!SRpnt)
                return STbp->syscall_result;
@@ -1802,10 +1805,10 @@ static long read_tape(struct scsi_tape *STp, long count,
                retval = 1;
                DEBC(printk(ST_DEB_MSG "%s: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n",
                             name,
-                            SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[1],
-                            SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[3],
-                            SRpnt->sr_sense_buffer[4], SRpnt->sr_sense_buffer[5],
-                            SRpnt->sr_sense_buffer[6], SRpnt->sr_sense_buffer[7]));
+                            SRpnt->sense[0], SRpnt->sense[1],
+                            SRpnt->sense[2], SRpnt->sense[3],
+                            SRpnt->sense[4], SRpnt->sense[5],
+                            SRpnt->sense[6], SRpnt->sense[7]));
                if (cmdstatp->have_sense) {
 
                        if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
@@ -1835,7 +1838,7 @@ static long read_tape(struct scsi_tape *STp, long count,
                                                }
                                                STbp->buffer_bytes = bytes - transfer;
                                        } else {
-                                               scsi_release_request(SRpnt);
+                                               st_release_request(SRpnt);
                                                SRpnt = *aSRpnt = NULL;
                                                if (transfer == blks) { /* We did not get anything, error */
                                                        printk(KERN_NOTICE "%s: Incorrect block size.\n", name);
@@ -1929,7 +1932,7 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
        ssize_t retval = 0;
        ssize_t i, transfer;
        int special, do_dio = 0;
-       struct scsi_request *SRpnt = NULL;
+       struct st_request *SRpnt = NULL;
        struct scsi_tape *STp = filp->private_data;
        struct st_modedef *STm;
        struct st_partstat *STps;
@@ -2054,11 +2057,11 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
 
  out:
        if (SRpnt != NULL) {
-               scsi_release_request(SRpnt);
+               st_release_request(SRpnt);
                SRpnt = NULL;
        }
        if (do_dio) {
-               release_buffering(STp);
+               release_buffering(STp, 1);
                STbp->buffer_bytes = 0;
        }
        up(&STp->lock);
@@ -2284,7 +2287,7 @@ static int st_set_options(struct scsi_tape *STp, long options)
 static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs)
 {
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt = NULL;
+       struct st_request *SRpnt = NULL;
 
        memset(cmd, 0, MAX_COMMAND_SIZE);
        cmd[0] = MODE_SENSE;
@@ -2298,7 +2301,7 @@ static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs)
        if (SRpnt == NULL)
                return (STp->buffer)->syscall_result;
 
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
 
        return (STp->buffer)->syscall_result;
 }
@@ -2310,7 +2313,7 @@ static int write_mode_page(struct scsi_tape *STp, int page, int slow)
 {
        int pgo;
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt = NULL;
+       struct st_request *SRpnt = NULL;
 
        memset(cmd, 0, MAX_COMMAND_SIZE);
        cmd[0] = MODE_SELECT;
@@ -2329,7 +2332,7 @@ static int write_mode_page(struct scsi_tape *STp, int page, int slow)
        if (SRpnt == NULL)
                return (STp->buffer)->syscall_result;
 
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
 
        return (STp->buffer)->syscall_result;
 }
@@ -2412,7 +2415,7 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod
        DEB( char *name = tape_name(STp); )
        unsigned char cmd[MAX_COMMAND_SIZE];
        struct st_partstat *STps;
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
 
        if (STp->ready != ST_READY && !load_code) {
                if (STp->ready == ST_NO_TAPE)
@@ -2455,7 +2458,7 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod
                return (STp->buffer)->syscall_result;
 
        retval = (STp->buffer)->syscall_result;
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
 
        if (!retval) {  /* SCSI command successful */
 
@@ -2503,7 +2506,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
        int ioctl_result;
        int chg_eof = 1;
        unsigned char cmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        struct st_partstat *STps;
        int fileno, blkno, at_sm, undone;
        int datalen = 0, direction = DMA_NONE;
@@ -2757,7 +2760,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
        ioctl_result = (STp->buffer)->syscall_result;
 
        if (!ioctl_result) {    /* SCSI command successful */
-               scsi_release_request(SRpnt);
+               st_release_request(SRpnt);
                SRpnt = NULL;
                STps->drv_block = blkno;
                STps->drv_file = fileno;
@@ -2872,7 +2875,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
                                /* Try the other possible state of Page Format if not
                                   already tried */
                                STp->use_pf = !STp->use_pf | PF_TESTED;
-                               scsi_release_request(SRpnt);
+                               st_release_request(SRpnt);
                                SRpnt = NULL;
                                return st_int_ioctl(STp, cmd_in, arg);
                        }
@@ -2882,7 +2885,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
                if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
                        STps->eof = ST_EOD;
 
-               scsi_release_request(SRpnt);
+               st_release_request(SRpnt);
                SRpnt = NULL;
        }
 
@@ -2898,7 +2901,7 @@ static int get_location(struct scsi_tape *STp, unsigned int *block, int *partiti
 {
        int result;
        unsigned char scmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        DEB( char *name = tape_name(STp); )
 
        if (STp->ready != ST_READY)
@@ -2944,7 +2947,7 @@ static int get_location(struct scsi_tape *STp, unsigned int *block, int *partiti
                 DEBC(printk(ST_DEB_MSG "%s: Got tape pos. blk %d part %d.\n", name,
                             *block, *partition));
        }
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
        SRpnt = NULL;
 
        return result;
@@ -2961,7 +2964,7 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition
        unsigned int blk;
        int timeout;
        unsigned char scmd[MAX_COMMAND_SIZE];
-       struct scsi_request *SRpnt;
+       struct st_request *SRpnt;
        DEB( char *name = tape_name(STp); )
 
        if (STp->ready != ST_READY)
@@ -3047,7 +3050,7 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition
                result = 0;
        }
 
-       scsi_release_request(SRpnt);
+       st_release_request(SRpnt);
        SRpnt = NULL;
 
        return result;
@@ -3577,7 +3580,7 @@ static long st_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
 static struct st_buffer *
  new_tape_buffer(int from_initialization, int need_dma, int max_sg)
 {
-       int i, got = 0, segs = 0;
+       int i, got = 0;
        gfp_t priority;
        struct st_buffer *tb;
 
@@ -3594,10 +3597,8 @@ static struct st_buffer *
                return NULL;
        }
        memset(tb, 0, i);
-       tb->frp_segs = tb->orig_frp_segs = segs;
+       tb->frp_segs = tb->orig_frp_segs = 0;
        tb->use_sg = max_sg;
-       if (segs > 0)
-               tb->b_data = page_address(tb->sg[0].page);
        tb->frp = (struct st_buf_fragment *)(&(tb->sg[0]) + max_sg);
 
        tb->in_use = 1;
@@ -3628,7 +3629,7 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm
        priority = GFP_KERNEL | __GFP_NOWARN;
        if (need_dma)
                priority |= GFP_DMA;
-       for (b_size = PAGE_SIZE, order=0;
+       for (b_size = PAGE_SIZE, order=0; order <= 6 &&
             b_size < new_size - STbuffer->buffer_size;
             order++, b_size *= 2)
                ;  /* empty */
@@ -3670,6 +3671,7 @@ static void normalize_buffer(struct st_buffer * STbuffer)
        }
        STbuffer->frp_segs = STbuffer->orig_frp_segs;
        STbuffer->frp_sg_current = 0;
+       STbuffer->sg_segs = 0;
 }
 
 
@@ -3882,7 +3884,6 @@ static int st_probe(struct device *dev)
        struct st_buffer *buffer;
        int i, j, mode, dev_num, error;
        char *stp;
-       u64 bounce_limit;
 
        if (SDp->type != TYPE_TAPE)
                return -ENODEV;
@@ -3892,7 +3893,8 @@ static int st_probe(struct device *dev)
                return -ENODEV;
        }
 
-       i = SDp->host->sg_tablesize;
+       i = min(SDp->request_queue->max_hw_segments,
+               SDp->request_queue->max_phys_segments);
        if (st_max_sg_segs < i)
                i = st_max_sg_segs;
        buffer = new_tape_buffer(1, (SDp->host)->unchecked_isa_dma, i);
@@ -3994,11 +3996,6 @@ static int st_probe(struct device *dev)
        tpnt->long_timeout = ST_LONG_TIMEOUT;
        tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma;
 
-       bounce_limit = scsi_calculate_bounce_limit(SDp->host) >> PAGE_SHIFT;
-       if (bounce_limit > ULONG_MAX)
-               bounce_limit = ULONG_MAX;
-       tpnt->max_pfn = bounce_limit;
-
        for (i = 0; i < ST_NBR_MODES; i++) {
                STm = &(tpnt->modes[i]);
                STm->defined = 0;
@@ -4077,9 +4074,9 @@ static int st_probe(struct device *dev)
 
        sdev_printk(KERN_WARNING, SDp,
                    "Attached scsi tape %s", tape_name(tpnt));
-       printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B), max page reachable by HBA %lu\n",
+       printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B)\n",
               tape_name(tpnt), tpnt->try_dio ? "yes" : "no",
-              queue_dma_alignment(SDp->request_queue) + 1, tpnt->max_pfn);
+              queue_dma_alignment(SDp->request_queue) + 1);
 
        return 0;
 
@@ -4185,7 +4182,11 @@ static void scsi_tape_release(struct kref *kref)
 
 static void st_intr(struct scsi_cmnd *SCpnt)
 {
-       scsi_io_completion(SCpnt, (SCpnt->result ? 0: SCpnt->bufflen), 1);
+       /*
+        * The caller should be checking the request's errors
+        * value.
+        */
+       scsi_io_completion(SCpnt, SCpnt->bufflen, 0);
 }
 
 /*
@@ -4194,27 +4195,10 @@ static void st_intr(struct scsi_cmnd *SCpnt)
  */
 static int st_init_command(struct scsi_cmnd *SCpnt)
 {
-       struct request *rq;
-
        if (!(SCpnt->request->flags & REQ_BLOCK_PC))
                return 0;
 
-       rq = SCpnt->request;
-       if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd))
-               return 0;
-
-       memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd));
-       SCpnt->cmd_len = rq->cmd_len;
-
-       if (rq_data_dir(rq) == WRITE)
-               SCpnt->sc_data_direction = DMA_TO_DEVICE;
-       else if (rq->data_len)
-               SCpnt->sc_data_direction = DMA_FROM_DEVICE;
-       else
-               SCpnt->sc_data_direction = DMA_NONE;
-
-       SCpnt->timeout_per_command = rq->timeout;
-       SCpnt->transfersize = rq->data_len;
+       scsi_setup_blk_pc_cmnd(SCpnt);
        SCpnt->done = st_intr;
        return 1;
 }
@@ -4407,34 +4391,6 @@ static void do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
        return;
 }
 
-
-/* Pin down user pages and put them into a scatter gather list. Returns <= 0 if
-   - mapping of all pages not successful
-   - any page is above max_pfn
-   (i.e., either completely successful or fails)
-*/
-static int st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, 
-                            unsigned long uaddr, size_t count, int rw,
-                            unsigned long max_pfn)
-{
-       int i, nr_pages;
-
-       nr_pages = sgl_map_user_pages(sgl, max_pages, uaddr, count, rw);
-       if (nr_pages <= 0)
-               return nr_pages;
-
-       for (i=0; i < nr_pages; i++) {
-               if (page_to_pfn(sgl[i].page) > max_pfn)
-                       goto out_unmap;
-       }
-       return nr_pages;
-
- out_unmap:
-       sgl_unmap_user_pages(sgl, nr_pages, 0);
-       return 0;
-}
-
-
 /* The following functions may be useful for a larger audience. */
 static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, 
                              unsigned long uaddr, size_t count, int rw)
@@ -4509,6 +4465,7 @@ static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pa
        if (res > 0) {
                for (j=0; j < res; j++)
                        page_cache_release(pages[j]);
+               res = 0;
        }
        kfree(pages);
        return res;
@@ -4524,8 +4481,6 @@ static int sgl_unmap_user_pages(struct scatterlist *sgl, const unsigned int nr_p
        for (i=0; i < nr_pages; i++) {
                struct page *page = sgl[i].page;
 
-               /* XXX: just for debug. Remove when PageReserved is removed */
-               BUG_ON(PageReserved(page));
                if (dirtied)
                        SetPageDirty(page);
                /* FIXME: cache flush missing for rw==READ
index 790acac160bcb33b8bfb2426b2e147f09814563e..411209048d74ba7ccadcf3da0bf0df3de81e48e6 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <linux/completion.h>
 #include <linux/kref.h>
+#include <scsi/scsi_cmnd.h>
 
 /* Descriptor for analyzed sense data */
 struct st_cmdstatus {
@@ -17,6 +18,17 @@ struct st_cmdstatus {
        u8 deferred;
 };
 
+struct scsi_tape;
+
+/* scsi tape command */
+struct st_request {
+       unsigned char cmd[MAX_COMMAND_SIZE];
+       unsigned char sense[SCSI_SENSE_BUFFERSIZE];
+       int result;
+       struct scsi_tape *stp;
+       struct completion *waiting;
+};
+
 /* The tape buffer descriptor. */
 struct st_buffer {
        unsigned char in_use;
@@ -28,7 +40,7 @@ struct st_buffer {
        int read_pointer;
        int writing;
        int syscall_result;
-       struct scsi_request *last_SRpnt;
+       struct st_request *last_SRpnt;
        struct st_cmdstatus cmdstat;
        unsigned char *b_data;
        unsigned short use_sg;  /* zero or max number of s/g segments for this adapter */
index c041bfd56e12c4cc87ed3e906bbbdc7460528274..25cced91c8a63c0e3b85ad4e062e71be27f07eaa 100644 (file)
@@ -70,6 +70,7 @@
  *
  */
 #include <scsi/scsi_dbg.h>
+#include <scsi/scsi_transport_spi.h>
 
 /*
  * Further development / testing that should be done : 
@@ -2378,7 +2379,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
  * 3..length+1 arguments
  *
  * Start the extended message buffer with the EXTENDED_MESSAGE
- * byte, since scsi_print_msg() wants the whole thing.  
+ * byte, since spi_print_msg() wants the whole thing.  
  */
                    extended_msg[0] = EXTENDED_MESSAGE;
                    /* Accept first byte by clearing ACK */
@@ -2431,7 +2432,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
                default:
                    if (!tmp) {
                        printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO);
-                       scsi_print_msg (extended_msg);
+                       spi_print_msg(extended_msg);
                        printk("\n");
                    } else if (tmp != EXTENDED_MESSAGE)
                        printk(KERN_DEBUG "scsi%d: rejecting unknown "
@@ -2566,7 +2567,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
 
     if (!(msg[0] & 0x80)) {
        printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO);
-       scsi_print_msg(msg);
+       spi_print_msg(msg);
        do_abort(instance);
        return;
     }
index 2d9437d7242bbd674ef646b62b76f315b3b116fa..3659dd7b9d760e9a0917a37e083ce3e84097e22d 100644 (file)
@@ -40,7 +40,7 @@
 #ifndef SYM_DEFS_H
 #define SYM_DEFS_H
 
-#define SYM_VERSION "2.2.1"
+#define SYM_VERSION "2.2.2"
 #define SYM_DRIVER_NAME        "sym-" SYM_VERSION
 
 /*
index fd36cf9858cbb0e2cf48816fcea6aa43b0b86dbb..9916a2a22558c992644505ff9b2ae193e0162c15 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifdef __FreeBSD__
-#include <dev/sym/sym_glue.h>
-#else
 #include "sym_glue.h"
-#endif
 
 /*
  *  Macros used for all firmwares.
 #define        SYM_FWA_SCR             sym_fw1a_scr
 #define        SYM_FWB_SCR             sym_fw1b_scr
 #define        SYM_FWZ_SCR             sym_fw1z_scr
-#ifdef __FreeBSD__
-#include <dev/sym/sym_fw1.h>
-#else
 #include "sym_fw1.h"
-#endif
 static struct sym_fwa_ofs sym_fw1a_ofs = {
        SYM_GEN_FW_A(struct SYM_FWA_SCR)
 };
 static struct sym_fwb_ofs sym_fw1b_ofs = {
        SYM_GEN_FW_B(struct SYM_FWB_SCR)
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       SYM_GEN_B(struct SYM_FWB_SCR, data_io)
-#endif
 };
 static struct sym_fwz_ofs sym_fw1z_ofs = {
        SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
@@ -88,19 +77,12 @@ static struct sym_fwz_ofs sym_fw1z_ofs = {
 #define        SYM_FWA_SCR             sym_fw2a_scr
 #define        SYM_FWB_SCR             sym_fw2b_scr
 #define        SYM_FWZ_SCR             sym_fw2z_scr
-#ifdef __FreeBSD__
-#include <dev/sym/sym_fw2.h>
-#else
 #include "sym_fw2.h"
-#endif
 static struct sym_fwa_ofs sym_fw2a_ofs = {
        SYM_GEN_FW_A(struct SYM_FWA_SCR)
 };
 static struct sym_fwb_ofs sym_fw2b_ofs = {
        SYM_GEN_FW_B(struct SYM_FWB_SCR)
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       SYM_GEN_B(struct SYM_FWB_SCR, data_io)
-#endif
        SYM_GEN_B(struct SYM_FWB_SCR, start64)
        SYM_GEN_B(struct SYM_FWB_SCR, pm_handle)
 };
index 43f6810a4045191f17aa6ce4374ac696517b7de4..66ec35beab5baf1dbe9ca57653ef2856758bd1fa 100644 (file)
@@ -92,9 +92,6 @@ struct sym_fwa_ofs {
 };
 struct sym_fwb_ofs {
        SYM_GEN_FW_B(u_short)
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       SYM_GEN_B(u_short, data_io)
-#endif
        SYM_GEN_B(u_short, start64)
        SYM_GEN_B(u_short, pm_handle)
 };
@@ -111,9 +108,6 @@ struct sym_fwa_ba {
 };
 struct sym_fwb_ba {
        SYM_GEN_FW_B(u32)
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       SYM_GEN_B(u32, data_io)
-#endif
        SYM_GEN_B(u32, start64);
        SYM_GEN_B(u32, pm_handle);
 };
index cdd92d82f4b26b4810ac315ff26e4b3817cb88fb..7b39f4a35e9885eb2b0ad219659985524c749731 100644 (file)
@@ -197,12 +197,6 @@ struct SYM_FWB_SCR {
        u32 bad_status          [  7];
        u32 wsr_ma_helper       [  4];
 
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       /* Unknown direction handling */
-       u32 data_io             [  2];
-       u32 data_io_com         [  8];
-       u32 data_io_out         [  7];
-#endif
        /* Data area */
        u32 zero                [  1];
        u32 scratch             [  1];
@@ -1747,48 +1741,6 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = {
        SCR_JUMP,
                PADDR_A (dispatch),
 
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-}/*-------------------------< DATA_IO >--------------------------*/,{
-       /*
-        *  We jump here if the data direction was unknown at the 
-        *  time we had to queue the command to the scripts processor.
-        *  Pointers had been set as follow in this situation:
-        *    savep   -->   DATA_IO
-        *    lastp   -->   start pointer when DATA_IN
-        *    wlastp  -->   start pointer when DATA_OUT
-        *  This script sets savep and lastp according to the 
-        *  direction chosen by the target.
-        */
-       SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
-               PADDR_B (data_io_out),
-}/*-------------------------< DATA_IO_COM >----------------------*/,{
-       /*
-        *  Direction is DATA IN.
-        */
-       SCR_COPY  (4),
-               HADDR_1 (ccb_head.lastp),
-               HADDR_1 (ccb_head.savep),
-       /*
-        *  Jump to the SCRIPTS according to actual direction.
-        */
-       SCR_COPY  (4),
-               HADDR_1 (ccb_head.savep),
-               RADDR_1 (temp),
-       SCR_RETURN,
-               0,
-}/*-------------------------< DATA_IO_OUT >----------------------*/,{
-       /*
-        *  Direction is DATA OUT.
-        */
-       SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)),
-               0,
-       SCR_COPY  (4),
-               HADDR_1 (ccb_head.wlastp),
-               HADDR_1 (ccb_head.lastp),
-       SCR_JUMP,
-               PADDR_B(data_io_com),
-#endif /* SYM_OPT_HANDLE_DIR_UNKNOWN */
-
 }/*-------------------------< ZERO >-----------------------------*/,{
        SCR_DATA_ZERO,
 }/*-------------------------< SCRATCH >--------------------------*/,{
index 7ea7151f5d1ddfbe352093dbb0d98163bbf12df8..851f2706f220942c417041eaa1f1589b24d8d353 100644 (file)
@@ -191,13 +191,6 @@ struct SYM_FWB_SCR {
        u32 pm_wsr_handle       [ 38];
        u32 wsr_ma_helper       [  4];
 
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       /* Unknown direction handling */
-       u32 data_io             [  2];
-       u32 data_io_in          [  2];
-       u32 data_io_com         [  6];
-       u32 data_io_out         [  8];
-#endif
        /* Data area */
        u32 zero                [  1];
        u32 scratch             [  1];
@@ -1838,51 +1831,6 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = {
        SCR_JUMP,
                PADDR_A (dispatch),
 
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-}/*-------------------------< DATA_IO >--------------------------*/,{
-       /*
-        *  We jump here if the data direction was unknown at the 
-        *  time we had to queue the command to the scripts processor.
-        *  Pointers had been set as follow in this situation:
-        *    savep   -->   DATA_IO
-        *    lastp   -->   start pointer when DATA_IN
-        *    wlastp  -->   start pointer when DATA_OUT
-        *  This script sets savep and lastp according to the 
-        *  direction chosen by the target.
-        */
-       SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
-               PADDR_B (data_io_out),
-}/*-------------------------< DATA_IO_IN >-----------------------*/,{
-       /*
-        *  Direction is DATA IN.
-        */
-       SCR_LOAD_REL  (scratcha, 4),
-               offsetof (struct sym_ccb, phys.head.lastp),
-}/*-------------------------< DATA_IO_COM >----------------------*/,{
-       SCR_STORE_REL (scratcha, 4),
-               offsetof (struct sym_ccb, phys.head.savep),
-
-       /*
-        *  Jump to the SCRIPTS according to actual direction.
-        */
-       SCR_LOAD_REL  (temp, 4),
-               offsetof (struct sym_ccb, phys.head.savep),
-       SCR_RETURN,
-               0,
-}/*-------------------------< DATA_IO_OUT >----------------------*/,{
-       /*
-        *  Direction is DATA OUT.
-        */
-       SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)),
-               0,
-       SCR_LOAD_REL  (scratcha, 4),
-               offsetof (struct sym_ccb, phys.head.wlastp),
-       SCR_STORE_REL (scratcha, 4),
-               offsetof (struct sym_ccb, phys.head.lastp),
-       SCR_JUMP,
-               PADDR_B(data_io_com),
-#endif /* SYM_OPT_HANDLE_DIR_UNKNOWN */
-
 }/*-------------------------< ZERO >-----------------------------*/,{
        SCR_DATA_ZERO,
 }/*-------------------------< SCRATCH >--------------------------*/,{
index d76766c3ce1643158ecc27a29dc157d0d36c9ea4..1fffd2b3c654d93da2ef9f49d1b4ac929dd3d5a0 100644 (file)
@@ -514,9 +514,10 @@ static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struc
  */
 int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
 {
-       int dir;
        struct sym_tcb *tp = &np->target[cp->target];
        struct sym_lcb *lp = sym_lp(tp, cp->lun);
+       u32 lastp, goalp;
+       int dir;
 
        /*
         *  Build the CDB.
@@ -534,15 +535,47 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s
                        sym_set_cam_status(cmd, DID_ERROR);
                        goto out_abort;
                }
+
+               /*
+                *  No segments means no data.
+                */
+               if (!cp->segments)
+                       dir = DMA_NONE;
        } else {
                cp->data_len = 0;
                cp->segments = 0;
        }
 
        /*
-        *  Set data pointers.
+        *  Set the data pointer.
         */
-       sym_setup_data_pointers(np, cp, dir);
+       switch (dir) {
+       case DMA_BIDIRECTIONAL:
+               printk("%s: got DMA_BIDIRECTIONAL command", sym_name(np));
+               sym_set_cam_status(cmd, DID_ERROR);
+               goto out_abort;
+       case DMA_TO_DEVICE:
+               goalp = SCRIPTA_BA(np, data_out2) + 8;
+               lastp = goalp - 8 - (cp->segments * (2*4));
+               break;
+       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 DMA_NONE:
+       default:
+               lastp = goalp = SCRIPTB_BA(np, no_data);
+               break;
+       }
+
+       /*
+        *  Set all pointers values needed by SCRIPTS.
+        */
+       cp->phys.head.lastp = cpu_to_scr(lastp);
+       cp->phys.head.savep = cpu_to_scr(lastp);
+       cp->startp          = cp->phys.head.savep;
+       cp->goalp           = cpu_to_scr(goalp);
 
        /*
         *  When `#ifed 1', the code below makes the driver 
@@ -563,10 +596,7 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s
        /*
         *      activate this job.
         */
-       if (lp)
-               sym_start_next_ccbs(np, lp, 2);
-       else
-               sym_put_start_queue(np, cp);
+       sym_start_next_ccbs(np, lp, 2);
        return 0;
 
 out_abort:
@@ -981,15 +1011,14 @@ static int device_queue_depth(struct sym_hcb *np, int target, int lun)
 
 static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
 {
-       struct sym_hcb *np;
-       struct sym_tcb *tp;
+       struct sym_hcb *np = sym_get_hcb(sdev->host);
+       struct sym_tcb *tp = &np->target[sdev->id];
+       struct sym_lcb *lp;
 
        if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN)
                return -ENXIO;
 
-       np = sym_get_hcb(sdev->host);
-       tp = &np->target[sdev->id];
-
+       tp->starget = sdev->sdev_target;
        /*
         * Fail the device init if the device is flagged NOSCAN at BOOT in
         * the NVRAM.  This may speed up boot and maintain coherency with
@@ -999,34 +1028,40 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
         * 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)) {
+       if (tp->usrflags & SYM_SCAN_BOOT_DISABLED) {
                tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
+               starget_printk(KERN_INFO, tp->starget,
+                               "Scan at boot disabled in NVRAM\n");
                return -ENXIO;
        }
 
-       tp->starget = sdev->sdev_target;
+       if (tp->usrflags & SYM_SCAN_LUNS_DISABLED) {
+               if (sdev->lun != 0)
+                       return -ENXIO;
+               starget_printk(KERN_INFO, tp->starget,
+                               "Multiple LUNs disabled in NVRAM\n");
+       }
+
+       lp = sym_alloc_lcb(np, sdev->id, sdev->lun);
+       if (!lp)
+               return -ENOMEM;
+
+       spi_min_period(tp->starget) = tp->usr_period;
+       spi_max_width(tp->starget) = tp->usr_width;
+
        return 0;
 }
 
 /*
  * Linux entry point for device queue sizing.
  */
-static int sym53c8xx_slave_configure(struct scsi_device *device)
+static int sym53c8xx_slave_configure(struct scsi_device *sdev)
 {
-       struct sym_hcb *np = sym_get_hcb(device->host);
-       struct sym_tcb *tp = &np->target[device->id];
-       struct sym_lcb *lp;
+       struct sym_hcb *np = sym_get_hcb(sdev->host);
+       struct sym_tcb *tp = &np->target[sdev->id];
+       struct sym_lcb *lp = sym_lp(tp, sdev->lun);
        int reqtags, depth_to_use;
 
-       /*
-        *  Allocate the LCB if not yet.
-        *  If it fail, we may well be in the sh*t. :)
-        */
-       lp = sym_alloc_lcb(np, device->id, device->lun);
-       if (!lp)
-               return -ENOMEM;
-
        /*
         *  Get user flags.
         */
@@ -1038,10 +1073,10 @@ static int sym53c8xx_slave_configure(struct scsi_device *device)
         *  Use at least 2.
         *  Donnot use more than our maximum.
         */
-       reqtags = device_queue_depth(np, device->id, device->lun);
+       reqtags = device_queue_depth(np, sdev->id, sdev->lun);
        if (reqtags > tp->usrtags)
                reqtags = tp->usrtags;
-       if (!device->tagged_supported)
+       if (!sdev->tagged_supported)
                reqtags = 0;
 #if 1 /* Avoid to locally queue commands for no good reasons */
        if (reqtags > SYM_CONF_MAX_TAG)
@@ -1050,19 +1085,30 @@ static int sym53c8xx_slave_configure(struct scsi_device *device)
 #else
        depth_to_use = (reqtags ? SYM_CONF_MAX_TAG : 2);
 #endif
-       scsi_adjust_queue_depth(device,
-                               (device->tagged_supported ?
+       scsi_adjust_queue_depth(sdev,
+                               (sdev->tagged_supported ?
                                 MSG_SIMPLE_TAG : 0),
                                depth_to_use);
        lp->s.scdev_depth = depth_to_use;
-       sym_tune_dev_queuing(tp, device->lun, reqtags);
+       sym_tune_dev_queuing(tp, sdev->lun, reqtags);
 
-       if (!spi_initial_dv(device->sdev_target))
-               spi_dv_device(device);
+       if (!spi_initial_dv(sdev->sdev_target))
+               spi_dv_device(sdev);
 
        return 0;
 }
 
+static void sym53c8xx_slave_destroy(struct scsi_device *sdev)
+{
+       struct sym_hcb *np = sym_get_hcb(sdev->host);
+       struct sym_lcb *lp = sym_lp(&np->target[sdev->id], sdev->lun);
+
+       if (lp->itlq_tbl)
+               sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK * 4, "ITLQ_TBL");
+       kfree(lp->cb_tags);
+       sym_mfree_dma(lp, sizeof(*lp), "LCB");
+}
+
 /*
  *  Linux entry point for info() function
  */
@@ -1497,7 +1543,7 @@ static int sym_setup_bus_dma_mask(struct sym_hcb *np)
 {
 #if SYM_CONF_DMA_ADDRESSING_MODE > 0
 #if   SYM_CONF_DMA_ADDRESSING_MODE == 1
-#define        DMA_DAC_MASK    0x000000ffffffffffULL /* 40-bit */
+#define        DMA_DAC_MASK    DMA_40BIT_MASK
 #elif SYM_CONF_DMA_ADDRESSING_MODE == 2
 #define        DMA_DAC_MASK    DMA_64BIT_MASK
 #endif
@@ -1926,6 +1972,7 @@ 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,
@@ -2086,6 +2133,7 @@ static void sym2_set_dt(struct scsi_target *starget, int dt)
        tp->tgoal.check_nego = 1;
 }
 
+#if 0
 static void sym2_set_iu(struct scsi_target *starget, int iu)
 {
        struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
@@ -2111,7 +2159,7 @@ static void sym2_set_qas(struct scsi_target *starget, int qas)
                tp->tgoal.qas = 0;
        tp->tgoal.check_nego = 1;
 }
-
+#endif
 
 static struct spi_function_template sym2_transport_functions = {
        .set_offset     = sym2_set_offset,
@@ -2122,10 +2170,12 @@ static struct spi_function_template sym2_transport_functions = {
        .show_width     = 1,
        .set_dt         = sym2_set_dt,
        .show_dt        = 1,
+#if 0
        .set_iu         = sym2_set_iu,
        .show_iu        = 1,
        .set_qas        = sym2_set_qas,
        .show_qas       = 1,
+#endif
        .get_signalling = sym2_get_signalling,
 };
 
index d3d52f14d7c01d55b2c663ae8ec8d9672e2e3bdc..cc92d0c70cd710ed2ea42c94f54beb38d5d96aa9 100644 (file)
@@ -68,7 +68,6 @@
  */
 #define        SYM_CONF_TIMER_INTERVAL         ((HZ+1)/2)
 
-#define SYM_OPT_HANDLE_DIR_UNKNOWN
 #define SYM_OPT_HANDLE_DEVICE_QUEUEING
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 
@@ -268,6 +267,5 @@ void sym_xpt_async_bus_reset(struct sym_hcb *np);
 void sym_xpt_async_sent_bdr(struct sym_hcb *np, int target);
 int  sym_setup_data_and_start (struct sym_hcb *np, struct scsi_cmnd *csio, struct sym_ccb *cp);
 void sym_log_bus_error(struct sym_hcb *np);
-void sym_sniff_inquiry(struct sym_hcb *np, struct scsi_cmnd *cmd, int resid);
 
 #endif /* SYM_GLUE_H */
index a7420cad4547d068951fe768408f6f6a150db102..8260f040d39c8ea82ba2eeb84cb810de062b132a 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <linux/slab.h>
 #include <asm/param.h>         /* for timeouts in units of HZ */
+#include <scsi/scsi_dbg.h>
 
 #include "sym_glue.h"
 #include "sym_nvram.h"
@@ -70,32 +71,12 @@ static void sym_printl_hex(u_char *p, int n)
        printf (".\n");
 }
 
-/*
- *  Print out the content of a SCSI message.
- */
-static int sym_show_msg (u_char * msg)
-{
-       u_char i;
-       printf ("%x",*msg);
-       if (*msg==M_EXTENDED) {
-               for (i=1;i<8;i++) {
-                       if (i-1>msg[1]) break;
-                       printf ("-%x",msg[i]);
-               }
-               return (i+1);
-       } else if ((*msg & 0xf0) == 0x20) {
-               printf ("-%x",msg[1]);
-               return (2);
-       }
-       return (1);
-}
-
 static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg)
 {
        sym_print_addr(cp->cmd, "%s: ", label);
 
-       sym_show_msg(msg);
-       printf(".\n");
+       spi_print_msg(msg);
+       printf("\n");
 }
 
 static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_char *msg)
@@ -103,8 +84,8 @@ static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_ch
        struct sym_tcb *tp = &np->target[target];
        dev_info(&tp->starget->dev, "%s: ", label);
 
-       sym_show_msg(msg);
-       printf(".\n");
+       spi_print_msg(msg);
+       printf("\n");
 }
 
 /*
@@ -635,29 +616,6 @@ static __inline void sym_init_burst(struct sym_hcb *np, u_char bc)
        }
 }
 
-
-/*
- * Print out the list of targets that have some flag disabled by user.
- */
-static void sym_print_targets_flag(struct sym_hcb *np, int mask, char *msg)
-{
-       int cnt;
-       int i;
-
-       for (cnt = 0, i = 0 ; i < SYM_CONF_MAX_TARGET ; i++) {
-               if (i == np->myaddr)
-                       continue;
-               if (np->target[i].usrflags & mask) {
-                       if (!cnt++)
-                               printf("%s: %s disabled for targets",
-                                       sym_name(np), msg);
-                       printf(" %d", i);
-               }
-       }
-       if (cnt)
-               printf(".\n");
-}
-
 /*
  *  Save initial settings of some IO registers.
  *  Assumed to have been set by BIOS.
@@ -962,7 +920,7 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru
                tp->usrflags |= (SYM_DISC_ENABLED | SYM_TAGS_ENABLED);
                tp->usrtags = SYM_SETUP_MAX_TAG;
 
-               sym_nvram_setup_target(np, i, nvram);
+               sym_nvram_setup_target(tp, i, nvram);
 
                if (!tp->usrtags)
                        tp->usrflags &= ~SYM_TAGS_ENABLED;
@@ -1005,13 +963,6 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru
                        sym_name(np), np->rv_scntl3, np->rv_dmode, np->rv_dcntl,
                        np->rv_ctest3, np->rv_ctest4, np->rv_ctest5);
        }
-       /*
-        *  Let user be aware of targets that have some disable flags set.
-        */
-       sym_print_targets_flag(np, SYM_SCAN_BOOT_DISABLED, "SCAN AT BOOT");
-       if (sym_verbose)
-               sym_print_targets_flag(np, SYM_SCAN_LUNS_DISABLED,
-                                      "SCAN FOR LUNS");
 
        return 0;
 }
@@ -1405,7 +1356,6 @@ static void sym_check_goals(struct sym_hcb *np, struct scsi_target *starget,
                goal->iu = 0;
                goal->dt = 0;
                goal->qas = 0;
-               goal->period = 0;
                goal->offset = 0;
                return;
        }
@@ -1465,7 +1415,8 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp
         * Many devices implement PPR in a buggy way, so only use it if we
         * really want to.
         */
-       if (goal->iu || goal->dt || goal->qas || (goal->period < 0xa)) {
+       if (goal->offset &&
+           (goal->iu || goal->dt || goal->qas || (goal->period < 0xa))) {
                nego = NS_PPR;
        } else if (spi_width(starget) != goal->width) {
                nego = NS_WIDE;
@@ -1523,7 +1474,7 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp
 /*
  *  Insert a job into the start queue.
  */
-void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp)
+static void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp)
 {
        u_short qidx;
 
@@ -3654,7 +3605,7 @@ static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int
         *  If result is dp_sg = SYM_CONF_MAX_SG, then we are at the 
         *  end of the data.
         */
-       tmp = scr_to_cpu(sym_goalp(cp));
+       tmp = scr_to_cpu(cp->goalp);
        dp_sg = SYM_CONF_MAX_SG;
        if (dp_scr != tmp)
                dp_sg -= (tmp - 8 - (int)dp_scr) / (2*4);
@@ -3761,7 +3712,7 @@ static void sym_modify_dp(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb
         *  And our alchemy:) allows to easily calculate the data 
         *  script address we want to return for the next data phase.
         */
-       dp_ret = cpu_to_scr(sym_goalp(cp));
+       dp_ret = cpu_to_scr(cp->goalp);
        dp_ret = dp_ret - 8 - (SYM_CONF_MAX_SG - dp_sg) * (2*4);
 
        /*
@@ -3857,7 +3808,7 @@ int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp)
         *  If all data has been transferred,
         *  there is no residual.
         */
-       if (cp->phys.head.lastp == sym_goalp(cp))
+       if (cp->phys.head.lastp == cp->goalp)
                return resid;
 
        /*
@@ -4664,30 +4615,7 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t
                goto out;
        cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
 
-#ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
-       /*
-        *  If the LCB is not yet available and the LUN
-        *  has been probed ok, try to allocate the LCB.
-        */
-       if (!lp && sym_is_bit(tp->lun_map, ln)) {
-               lp = sym_alloc_lcb(np, tn, ln);
-               if (!lp)
-                       goto out_free;
-       }
-#endif
-
-       /*
-        *  If the LCB is not available here, then the 
-        *  logical unit is not yet discovered. For those 
-        *  ones only accept 1 SCSI IO per logical unit, 
-        *  since we cannot allow disconnections.
-        */
-       if (!lp) {
-               if (!sym_is_bit(tp->busy0_map, ln))
-                       sym_set_bit(tp->busy0_map, ln);
-               else
-                       goto out_free;
-       } else {
+       {
                /*
                 *  If we have been asked for a tagged command.
                 */
@@ -4840,12 +4768,6 @@ void sym_free_ccb (struct sym_hcb *np, struct sym_ccb *cp)
                        lp->head.resel_sa =
                                cpu_to_scr(SCRIPTB_BA(np, resel_bad_lun));
        }
-       /*
-        *  Otherwise, we only accept 1 IO per LUN.
-        *  Clear the bit that keeps track of this IO.
-        */
-       else
-               sym_clr_bit(tp->busy0_map, cp->lun);
 
        /*
         *  We donnot queue more than 1 ccb per target 
@@ -4997,20 +4919,7 @@ static void sym_init_tcb (struct sym_hcb *np, u_char tn)
 struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln)
 {
        struct sym_tcb *tp = &np->target[tn];
-       struct sym_lcb *lp = sym_lp(tp, ln);
-
-       /*
-        *  Already done, just return.
-        */
-       if (lp)
-               return lp;
-
-       /*
-        *  Donnot allow LUN control block 
-        *  allocation for not probed LUNs.
-        */
-       if (!sym_is_bit(tp->lun_map, ln))
-               return NULL;
+       struct sym_lcb *lp = NULL;
 
        /*
         *  Initialize the target control block if not yet.
@@ -5082,13 +4991,7 @@ struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln)
        lp->started_max   = SYM_CONF_MAX_TASK;
        lp->started_limit = SYM_CONF_MAX_TASK;
 #endif
-       /*
-        *  If we are busy, count the IO.
-        */
-       if (sym_is_bit(tp->busy0_map, ln)) {
-               lp->busy_itl = 1;
-               sym_clr_bit(tp->busy0_map, ln);
-       }
+
 fail:
        return lp;
 }
@@ -5102,12 +5005,6 @@ static void sym_alloc_lcb_tags (struct sym_hcb *np, u_char tn, u_char ln)
        struct sym_lcb *lp = sym_lp(tp, ln);
        int i;
 
-       /*
-        *  If LCB not available, try to allocate it.
-        */
-       if (!lp && !(lp = sym_alloc_lcb(np, tn, ln)))
-               goto fail;
-
        /*
         *  Allocate the task table and and the tag allocation 
         *  circular buffer. We want both or none.
@@ -5481,8 +5378,7 @@ finish:
        /*
         *  Donnot start more than 1 command after an error.
         */
-       if (lp)
-               sym_start_next_ccbs(np, lp, 1);
+       sym_start_next_ccbs(np, lp, 1);
 #endif
 }
 
@@ -5520,18 +5416,12 @@ void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp)
        tp = &np->target[cp->target];
        lp = sym_lp(tp, cp->lun);
 
-       /*
-        *  Assume device discovered on first success.
-        */
-       if (!lp)
-               sym_set_bit(tp->lun_map, cp->lun);
-
        /*
         *  If all data have been transferred, given than no
         *  extended error did occur, there is no residual.
         */
        resid = 0;
-       if (cp->phys.head.lastp != sym_goalp(cp))
+       if (cp->phys.head.lastp != cp->goalp)
                resid = sym_compute_residual(np, cp);
 
        /*
@@ -5551,15 +5441,6 @@ if (resid)
         */
        sym_set_cam_result_ok(cp, cmd, resid);
 
-#ifdef SYM_OPT_SNIFF_INQUIRY
-       /*
-        *  On standard INQUIRY response (EVPD and CmDt 
-        *  not set), sniff out device capabilities.
-        */
-       if (cp->cdb_buf[0] == INQUIRY && !(cp->cdb_buf[1] & 0x3))
-               sym_sniff_inquiry(np, cmd, resid);
-#endif
-
 #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
        /*
         *  If max number of started ccbs had been reduced,
@@ -5587,7 +5468,7 @@ if (resid)
        /*
         *  Requeue a couple of awaiting scsi commands.
         */
-       if (lp && !sym_que_empty(&lp->waiting_ccbq))
+       if (!sym_que_empty(&lp->waiting_ccbq))
                sym_start_next_ccbs(np, lp, 2);
 #endif
        /*
@@ -5830,8 +5711,7 @@ void sym_hcb_free(struct sym_hcb *np)
        SYM_QUEHEAD *qp;
        struct sym_ccb *cp;
        struct sym_tcb *tp;
-       struct sym_lcb *lp;
-       int target, lun;
+       int target;
 
        if (np->scriptz0)
                sym_mfree_dma(np->scriptz0, np->scriptz_sz, "SCRIPTZ0");
@@ -5857,16 +5737,6 @@ void sym_hcb_free(struct sym_hcb *np)
 
        for (target = 0; target < SYM_CONF_MAX_TARGET ; target++) {
                tp = &np->target[target];
-               for (lun = 0 ; lun < SYM_CONF_MAX_LUN ; lun++) {
-                       lp = sym_lp(tp, lun);
-                       if (!lp)
-                               continue;
-                       if (lp->itlq_tbl)
-                               sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4,
-                                      "ITLQ_TBL");
-                       kfree(lp->cb_tags);
-                       sym_mfree_dma(lp, sizeof(*lp), "LCB");
-               }
 #if SYM_CONF_MAX_LUN > 1
                kfree(tp->lunmp);
 #endif 
index 3a264a40821646c4db6cf9f965d7374944301afd..2456090bb2411734b908bcb7a63fc6700899774d 100644 (file)
  *  They may be defined in platform specific headers, if they 
  *  are useful.
  *
- *    SYM_OPT_HANDLE_DIR_UNKNOWN
- *        When this option is set, the SCRIPTS used by the driver 
- *        are able to handle SCSI transfers with direction not 
- *        supplied by user.
- *        (set for Linux-2.0.X)
- *
  *    SYM_OPT_HANDLE_DEVICE_QUEUEING
  *        When this option is set, the driver will use a queue per 
  *        device and handle QUEUE FULL status requeuing internally.
@@ -64,7 +58,6 @@
  *        (set for Linux)
  */
 #if 0
-#define SYM_OPT_HANDLE_DIR_UNKNOWN
 #define SYM_OPT_HANDLE_DEVICE_QUEUEING
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 #endif
@@ -416,19 +409,6 @@ struct sym_tcb {
        struct sym_lcb **lunmp;         /* Other LCBs [1..MAX_LUN]      */
 #endif
 
-       /*
-        *  Bitmap that tells about LUNs that succeeded at least 
-        *  1 IO and therefore assumed to be a real device.
-        *  Avoid useless allocation of the LCB structure.
-        */
-       u32     lun_map[(SYM_CONF_MAX_LUN+31)/32];
-
-       /*
-        *  Bitmap that tells about LUNs that haven't yet an LCB 
-        *  allocated (not discovered or LCB allocation failed).
-        */
-       u32     busy0_map[(SYM_CONF_MAX_LUN+31)/32];
-
 #ifdef SYM_HAVE_STCB
        /*
         *  O/S specific data structure.
@@ -454,8 +434,10 @@ struct sym_tcb {
         *  Other user settable limits and options.
         *  These limits are read from the NVRAM if present.
         */
-       u_char  usrflags;
-       u_short usrtags;
+       unsigned char   usrflags;
+       unsigned char   usr_period;
+       unsigned char   usr_width;
+       unsigned short  usrtags;
        struct scsi_target *starget;
 };
 
@@ -672,9 +654,6 @@ struct sym_ccbh {
         */
        u32     savep;          /* Jump address to saved data pointer   */
        u32     lastp;          /* SCRIPTS address at end of data       */
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       u32     wlastp;
-#endif
 
        /*
         *  Status fields.
@@ -804,9 +783,6 @@ struct sym_ccb {
        SYM_QUEHEAD link_ccbq;  /* Link to free/busy CCB queue  */
        u32     startp;         /* Initial data pointer         */
        u32     goalp;          /* Expected last data pointer   */
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       u32     wgoalp;
-#endif
        int     ext_sg;         /* Extreme data pointer, used   */
        int     ext_ofs;        /*  to calculate the residual.  */
 #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
@@ -821,12 +797,6 @@ struct sym_ccb {
 
 #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)
-#else
-#define        sym_goalp(cp) (cp->goalp)
-#endif
-
 typedef struct device *m_pool_ident_t;
 
 /*
@@ -1077,7 +1047,6 @@ char *sym_driver_name(void);
 void sym_print_xerr(struct scsi_cmnd *cmd, int x_status);
 int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int);
 struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision);
-void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp);
 #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
 void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn);
 #endif
@@ -1135,71 +1104,6 @@ bad:
 #error "Unsupported DMA addressing mode"
 #endif
 
-/*
- *  Set up data pointers used by SCRIPTS.
- *  Called from O/S specific code.
- */
-static inline void sym_setup_data_pointers(struct sym_hcb *np,
-               struct sym_ccb *cp, int dir)
-{
-       u32 lastp, goalp;
-
-       /*
-        *  No segments means no data.
-        */
-       if (!cp->segments)
-               dir = DMA_NONE;
-
-       /*
-        *  Set the data pointer.
-        */
-       switch(dir) {
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       case DMA_BIDIRECTIONAL:
-#endif
-       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 != DMA_BIDIRECTIONAL)
-                       break;
-               cp->phys.head.wlastp = cpu_to_scr(lastp);
-               /* fall through */
-#else
-               break;
-#endif
-       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 DMA_NONE:
-       default:
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-               cp->host_flags |= HF_DATA_IN;
-#endif
-               lastp = goalp = SCRIPTB_BA(np, no_data);
-               break;
-       }
-
-       /*
-        *  Set all pointers values needed by SCRIPTS.
-        */
-       cp->phys.head.lastp = cpu_to_scr(lastp);
-       cp->phys.head.savep = cpu_to_scr(lastp);
-       cp->startp          = cp->phys.head.savep;
-       cp->goalp           = cpu_to_scr(goalp);
-
-#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
-       /*
-        *  If direction is unknown, start at data_io.
-        */
-       if (dir == DMA_BIDIRECTIONAL)
-               cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA(np, data_io));
-#endif
-}
-
 /*
  *  MEMORY ALLOCATOR.
  */
index a34d403ccc6c4e170b143e8937c9f18bdd038a6f..92bf9b14a7a2bb98fdd0cc772d7496f86dc77637 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifdef __FreeBSD__
-#include <dev/sym/sym_glue.h>
-#else
 #include "sym_glue.h"
-#endif
 
 /*
  *  Simple power of two buddy-like generic allocator.
index 994b7566bcac8ba175646ced2a981c228d59fbf1..15d69298ab6ec9668e14bc83a091c15eb17e53f1 100644 (file)
@@ -92,29 +92,32 @@ void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sy
  *  Get target set-up from Symbios format NVRAM.
  */
 static void
-sym_Symbios_setup_target(struct sym_hcb *np, int target, Symbios_nvram *nvram)
+sym_Symbios_setup_target(struct sym_tcb *tp, int target, Symbios_nvram *nvram)
 {
-       struct sym_tcb *tp = &np->target[target];
        Symbios_target *tn = &nvram->target[target];
 
-       tp->usrtags =
-               (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)? SYM_SETUP_MAX_TAG : 0;
-
+       if (!(tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED))
+               tp->usrtags = 0;
        if (!(tn->flags & SYMBIOS_DISCONNECT_ENABLE))
                tp->usrflags &= ~SYM_DISC_ENABLED;
        if (!(tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME))
                tp->usrflags |= SYM_SCAN_BOOT_DISABLED;
        if (!(tn->flags & SYMBIOS_SCAN_LUNS))
                tp->usrflags |= SYM_SCAN_LUNS_DISABLED;
+       tp->usr_period = (tn->sync_period + 3) / 4;
+       tp->usr_width = (tn->bus_width == 0x8) ? 0 : 1;
 }
 
+static const unsigned char Tekram_sync[16] = {
+       25, 31, 37, 43, 50, 62, 75, 125, 12, 15, 18, 21, 6, 7, 9, 10
+};
+
 /*
  *  Get target set-up from Tekram format NVRAM.
  */
 static void
-sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram)
+sym_Tekram_setup_target(struct sym_tcb *tp, int target, Tekram_nvram *nvram)
 {
-       struct sym_tcb *tp = &np->target[target];
        struct Tekram_target *tn = &nvram->target[target];
 
        if (tn->flags & TEKRAM_TAGGED_COMMANDS) {
@@ -124,22 +127,22 @@ sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram)
        if (tn->flags & TEKRAM_DISCONNECT_ENABLE)
                tp->usrflags |= SYM_DISC_ENABLED;
  
-       /* If any device does not support parity, we will not use this option */
-       if (!(tn->flags & TEKRAM_PARITY_CHECK))
-               np->rv_scntl0  &= ~0x0a; /* SCSI parity checking disabled */
+       if (tn->flags & TEKRAM_SYNC_NEGO)
+               tp->usr_period = Tekram_sync[tn->sync_index & 0xf];
+       tp->usr_width = (tn->flags & TEKRAM_WIDE_NEGO) ? 1 : 0;
 }
 
 /*
  *  Get target setup from NVRAM.
  */
-void sym_nvram_setup_target(struct sym_hcb *np, int target, struct sym_nvram *nvp)
+void sym_nvram_setup_target(struct sym_tcb *tp, int target, struct sym_nvram *nvp)
 {
        switch (nvp->type) {
        case SYM_SYMBIOS_NVRAM:
-               sym_Symbios_setup_target(np, target, &nvp->data.Symbios);
+               sym_Symbios_setup_target(tp, target, &nvp->data.Symbios);
                break;
        case SYM_TEKRAM_NVRAM:
-               sym_Tekram_setup_target(np, target, &nvp->data.Tekram);
+               sym_Tekram_setup_target(tp, target, &nvp->data.Tekram);
                break;
        default:
                break;
index 1538bede52773ad2f1e6fb3662c8bd6012766d8a..bdfbbb083b69f5738231348771c4b0cf0bd6a9f2 100644 (file)
@@ -194,12 +194,12 @@ struct sym_nvram {
 
 #if SYM_CONF_NVRAM_SUPPORT
 void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram);
-void sym_nvram_setup_target (struct sym_hcb *np, int target, struct sym_nvram *nvp);
+void sym_nvram_setup_target (struct sym_tcb *tp, int target, struct sym_nvram *nvp);
 int sym_read_nvram (struct sym_device *np, struct sym_nvram *nvp);
 char *sym_nvram_type(struct sym_nvram *nvp);
 #else
 static inline void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram) { }
-static inline void sym_nvram_setup_target(struct sym_hcb *np, struct sym_nvram *nvram) { }
+static inline void sym_nvram_setup_target(struct sym_tcb *tp, struct sym_nvram *nvram) { }
 static inline int sym_read_nvram(struct sym_device *np, struct sym_nvram *nvp)
 {
        nvp->type = 0;
diff --git a/drivers/scsi/sym53c8xx_comm.h b/drivers/scsi/sym53c8xx_comm.h
deleted file mode 100644 (file)
index 20ae2b1..0000000
+++ /dev/null
@@ -1,792 +0,0 @@
-/******************************************************************************
-**  High Performance device driver for the Symbios 53C896 controller.
-**
-**  Copyright (C) 1998-2001  Gerard Roudier <groudier@free.fr>
-**
-**  This driver also supports all the Symbios 53C8XX controller family, 
-**  except 53C810 revisions < 16, 53C825 revisions < 16 and all 
-**  revisions of 53C815 controllers.
-**
-**  This driver is based on the Linux port of the FreeBSD ncr driver.
-** 
-**  Copyright (C) 1994  Wolfgang Stanglmeier
-**  
-**-----------------------------------------------------------------------------
-**  
-**  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.
-**
-**-----------------------------------------------------------------------------
-**
-**  The Linux port of the FreeBSD ncr driver has been achieved in 
-**  november 1995 by:
-**
-**          Gerard Roudier              <groudier@free.fr>
-**
-**  Being given that this driver originates from the FreeBSD version, and
-**  in order to keep synergy on both, any suggested enhancements and corrections
-**  received on Linux are automatically a potential candidate for the FreeBSD 
-**  version.
-**
-**  The original driver has been written for 386bsd and FreeBSD by
-**          Wolfgang Stanglmeier        <wolf@cologne.de>
-**          Stefan Esser                <se@mi.Uni-Koeln.de>
-**
-**-----------------------------------------------------------------------------
-**
-**  Major contributions:
-**  --------------------
-**
-**  NVRAM detection and reading.
-**    Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
-**
-*******************************************************************************
-*/
-
-/*==========================================================
-**
-**     Debugging tags
-**
-**==========================================================
-*/
-
-#define DEBUG_ALLOC    (0x0001)
-#define DEBUG_PHASE    (0x0002)
-#define DEBUG_QUEUE    (0x0008)
-#define DEBUG_RESULT   (0x0010)
-#define DEBUG_POINTER  (0x0020)
-#define DEBUG_SCRIPT   (0x0040)
-#define DEBUG_TINY     (0x0080)
-#define DEBUG_TIMING   (0x0100)
-#define DEBUG_NEGO     (0x0200)
-#define DEBUG_TAGS     (0x0400)
-#define DEBUG_SCATTER  (0x0800)
-#define DEBUG_IC        (0x1000)
-
-/*
-**    Enable/Disable debug messages.
-**    Can be changed at runtime too.
-*/
-
-#ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
-static int ncr_debug = SCSI_NCR_DEBUG_FLAGS;
-       #define DEBUG_FLAGS ncr_debug
-#else
-       #define DEBUG_FLAGS     SCSI_NCR_DEBUG_FLAGS
-#endif
-
-static inline struct list_head *ncr_list_pop(struct list_head *head)
-{
-       if (!list_empty(head)) {
-               struct list_head *elem = head->next;
-
-               list_del(elem);
-               return elem;
-       }
-
-       return NULL;
-}
-
-#ifdef __sparc__
-#include <asm/irq.h>
-#endif
-
-/*==========================================================
-**
-**     Simple power of two buddy-like allocator.
-**
-**     This simple code is not intended to be fast, but to 
-**     provide power of 2 aligned memory allocations.
-**     Since the SCRIPTS processor only supplies 8 bit 
-**     arithmetic, this allocator allows simple and fast 
-**     address calculations  from the SCRIPTS code.
-**     In addition, cache line alignment is guaranteed for 
-**     power of 2 cache line size.
-**     Enhanced in linux-2.3.44 to provide a memory pool 
-**     per pcidev to support dynamic dma mapping. (I would 
-**     have preferred a real bus astraction, btw).
-**
-**==========================================================
-*/
-
-#define MEMO_SHIFT     4       /* 16 bytes minimum memory chunk */
-#if PAGE_SIZE >= 8192
-#define MEMO_PAGE_ORDER        0       /* 1 PAGE  maximum */
-#else
-#define MEMO_PAGE_ORDER        1       /* 2 PAGES maximum */
-#endif
-#define MEMO_FREE_UNUSED       /* Free unused pages immediately */
-#define MEMO_WARN      1
-#define MEMO_GFP_FLAGS GFP_ATOMIC
-#define MEMO_CLUSTER_SHIFT     (PAGE_SHIFT+MEMO_PAGE_ORDER)
-#define MEMO_CLUSTER_SIZE      (1UL << MEMO_CLUSTER_SHIFT)
-#define MEMO_CLUSTER_MASK      (MEMO_CLUSTER_SIZE-1)
-
-typedef u_long m_addr_t;       /* Enough bits to bit-hack addresses */
-typedef struct device *m_bush_t;       /* Something that addresses DMAable */
-
-typedef struct m_link {                /* Link between free memory chunks */
-       struct m_link *next;
-} m_link_s;
-
-typedef struct m_vtob {                /* Virtual to Bus address translation */
-       struct m_vtob *next;
-       m_addr_t vaddr;
-       m_addr_t baddr;
-} m_vtob_s;
-#define VTOB_HASH_SHIFT                5
-#define VTOB_HASH_SIZE         (1UL << VTOB_HASH_SHIFT)
-#define VTOB_HASH_MASK         (VTOB_HASH_SIZE-1)
-#define VTOB_HASH_CODE(m)      \
-       ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK)
-
-typedef struct m_pool {                /* Memory pool of a given kind */
-       m_bush_t bush;
-       m_addr_t (*getp)(struct m_pool *);
-       void (*freep)(struct m_pool *, m_addr_t);
-       int nump;
-       m_vtob_s *(vtob[VTOB_HASH_SIZE]);
-       struct m_pool *next;
-       struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1];
-} m_pool_s;
-
-static void *___m_alloc(m_pool_s *mp, int size)
-{
-       int i = 0;
-       int s = (1 << MEMO_SHIFT);
-       int j;
-       m_addr_t a;
-       m_link_s *h = mp->h;
-
-       if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
-               return NULL;
-
-       while (size > s) {
-               s <<= 1;
-               ++i;
-       }
-
-       j = i;
-       while (!h[j].next) {
-               if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
-                       h[j].next = (m_link_s *)mp->getp(mp);
-                       if (h[j].next)
-                               h[j].next->next = NULL;
-                       break;
-               }
-               ++j;
-               s <<= 1;
-       }
-       a = (m_addr_t) h[j].next;
-       if (a) {
-               h[j].next = h[j].next->next;
-               while (j > i) {
-                       j -= 1;
-                       s >>= 1;
-                       h[j].next = (m_link_s *) (a+s);
-                       h[j].next->next = NULL;
-               }
-       }
-#ifdef DEBUG
-       printk("___m_alloc(%d) = %p\n", size, (void *) a);
-#endif
-       return (void *) a;
-}
-
-static void ___m_free(m_pool_s *mp, void *ptr, int size)
-{
-       int i = 0;
-       int s = (1 << MEMO_SHIFT);
-       m_link_s *q;
-       m_addr_t a, b;
-       m_link_s *h = mp->h;
-
-#ifdef DEBUG
-       printk("___m_free(%p, %d)\n", ptr, size);
-#endif
-
-       if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
-               return;
-
-       while (size > s) {
-               s <<= 1;
-               ++i;
-       }
-
-       a = (m_addr_t) ptr;
-
-       while (1) {
-#ifdef MEMO_FREE_UNUSED
-               if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
-                       mp->freep(mp, a);
-                       break;
-               }
-#endif
-               b = a ^ s;
-               q = &h[i];
-               while (q->next && q->next != (m_link_s *) b) {
-                       q = q->next;
-               }
-               if (!q->next) {
-                       ((m_link_s *) a)->next = h[i].next;
-                       h[i].next = (m_link_s *) a;
-                       break;
-               }
-               q->next = q->next->next;
-               a = a & b;
-               s <<= 1;
-               ++i;
-       }
-}
-
-static DEFINE_SPINLOCK(ncr53c8xx_lock);
-
-static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags)
-{
-       void *p;
-
-       p = ___m_alloc(mp, size);
-
-       if (DEBUG_FLAGS & DEBUG_ALLOC)
-               printk ("new %-10s[%4d] @%p.\n", name, size, p);
-
-       if (p)
-               memset(p, 0, size);
-       else if (uflags & MEMO_WARN)
-               printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size);
-
-       return p;
-}
-
-#define __m_calloc(mp, s, n)   __m_calloc2(mp, s, n, MEMO_WARN)
-
-static void __m_free(m_pool_s *mp, void *ptr, int size, char *name)
-{
-       if (DEBUG_FLAGS & DEBUG_ALLOC)
-               printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr);
-
-       ___m_free(mp, ptr, size);
-
-}
-
-/*
- * With pci bus iommu support, we use a default pool of unmapped memory 
- * for memory we donnot need to DMA from/to and one pool per pcidev for 
- * memory accessed by the PCI chip. `mp0' is the default not DMAable pool.
- */
-
-static m_addr_t ___mp0_getp(m_pool_s *mp)
-{
-       m_addr_t m = __get_free_pages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER);
-       if (m)
-               ++mp->nump;
-       return m;
-}
-
-static void ___mp0_freep(m_pool_s *mp, m_addr_t m)
-{
-       free_pages(m, MEMO_PAGE_ORDER);
-       --mp->nump;
-}
-
-static m_pool_s mp0 = {NULL, ___mp0_getp, ___mp0_freep};
-
-/*
- * DMAable pools.
- */
-
-/*
- * With pci bus iommu support, we maintain one pool per pcidev and a 
- * hashed reverse table for virtual to bus physical address translations.
- */
-static m_addr_t ___dma_getp(m_pool_s *mp)
-{
-       m_addr_t vp;
-       m_vtob_s *vbp;
-
-       vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB");
-       if (vbp) {
-               dma_addr_t daddr;
-               vp = (m_addr_t) dma_alloc_coherent(mp->bush,
-                                               PAGE_SIZE<<MEMO_PAGE_ORDER,
-                                               &daddr, GFP_ATOMIC);
-               if (vp) {
-                       int hc = VTOB_HASH_CODE(vp);
-                       vbp->vaddr = vp;
-                       vbp->baddr = daddr;
-                       vbp->next = mp->vtob[hc];
-                       mp->vtob[hc] = vbp;
-                       ++mp->nump;
-                       return vp;
-               }
-       }
-       if (vbp)
-               __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
-       return 0;
-}
-
-static void ___dma_freep(m_pool_s *mp, m_addr_t m)
-{
-       m_vtob_s **vbpp, *vbp;
-       int hc = VTOB_HASH_CODE(m);
-
-       vbpp = &mp->vtob[hc];
-       while (*vbpp && (*vbpp)->vaddr != m)
-               vbpp = &(*vbpp)->next;
-       if (*vbpp) {
-               vbp = *vbpp;
-               *vbpp = (*vbpp)->next;
-               dma_free_coherent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER,
-                                 (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
-               __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
-               --mp->nump;
-       }
-}
-
-static inline m_pool_s *___get_dma_pool(m_bush_t bush)
-{
-       m_pool_s *mp;
-       for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next);
-       return mp;
-}
-
-static m_pool_s *___cre_dma_pool(m_bush_t bush)
-{
-       m_pool_s *mp;
-       mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL");
-       if (mp) {
-               memset(mp, 0, sizeof(*mp));
-               mp->bush = bush;
-               mp->getp = ___dma_getp;
-               mp->freep = ___dma_freep;
-               mp->next = mp0.next;
-               mp0.next = mp;
-       }
-       return mp;
-}
-
-static void ___del_dma_pool(m_pool_s *p)
-{
-       struct m_pool **pp = &mp0.next;
-
-       while (*pp && *pp != p)
-               pp = &(*pp)->next;
-       if (*pp) {
-               *pp = (*pp)->next;
-               __m_free(&mp0, p, sizeof(*p), "MPOOL");
-       }
-}
-
-static void *__m_calloc_dma(m_bush_t bush, int size, char *name)
-{
-       u_long flags;
-       struct m_pool *mp;
-       void *m = NULL;
-
-       spin_lock_irqsave(&ncr53c8xx_lock, flags);
-       mp = ___get_dma_pool(bush);
-       if (!mp)
-               mp = ___cre_dma_pool(bush);
-       if (mp)
-               m = __m_calloc(mp, size, name);
-       if (mp && !mp->nump)
-               ___del_dma_pool(mp);
-       spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
-
-       return m;
-}
-
-static void __m_free_dma(m_bush_t bush, void *m, int size, char *name)
-{
-       u_long flags;
-       struct m_pool *mp;
-
-       spin_lock_irqsave(&ncr53c8xx_lock, flags);
-       mp = ___get_dma_pool(bush);
-       if (mp)
-               __m_free(mp, m, size, name);
-       if (mp && !mp->nump)
-               ___del_dma_pool(mp);
-       spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
-}
-
-static m_addr_t __vtobus(m_bush_t bush, void *m)
-{
-       u_long flags;
-       m_pool_s *mp;
-       int hc = VTOB_HASH_CODE(m);
-       m_vtob_s *vp = NULL;
-       m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK;
-
-       spin_lock_irqsave(&ncr53c8xx_lock, flags);
-       mp = ___get_dma_pool(bush);
-       if (mp) {
-               vp = mp->vtob[hc];
-               while (vp && (m_addr_t) vp->vaddr != a)
-                       vp = vp->next;
-       }
-       spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
-       return vp ? vp->baddr + (((m_addr_t) m) - a) : 0;
-}
-
-#define _m_calloc_dma(np, s, n)                __m_calloc_dma(np->dev, s, n)
-#define _m_free_dma(np, p, s, n)       __m_free_dma(np->dev, p, s, n)
-#define m_calloc_dma(s, n)             _m_calloc_dma(np, s, n)
-#define m_free_dma(p, s, n)            _m_free_dma(np, p, s, n)
-#define _vtobus(np, p)                 __vtobus(np->dev, p)
-#define vtobus(p)                      _vtobus(np, p)
-
-/*
- *  Deal with DMA mapping/unmapping.
- */
-
-/* To keep track of the dma mapping (sg/single) that has been set */
-#define __data_mapped  SCp.phase
-#define __data_mapping SCp.have_data_in
-
-static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd)
-{
-       switch(cmd->__data_mapped) {
-       case 2:
-               dma_unmap_sg(dev, cmd->buffer, cmd->use_sg,
-                               cmd->sc_data_direction);
-               break;
-       case 1:
-               dma_unmap_single(dev, cmd->__data_mapping,
-                                cmd->request_bufflen,
-                                cmd->sc_data_direction);
-               break;
-       }
-       cmd->__data_mapped = 0;
-}
-
-static u_long __map_scsi_single_data(struct device *dev, struct scsi_cmnd *cmd)
-{
-       dma_addr_t mapping;
-
-       if (cmd->request_bufflen == 0)
-               return 0;
-
-       mapping = dma_map_single(dev, cmd->request_buffer,
-                                cmd->request_bufflen,
-                                cmd->sc_data_direction);
-       cmd->__data_mapped = 1;
-       cmd->__data_mapping = mapping;
-
-       return mapping;
-}
-
-static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd)
-{
-       int use_sg;
-
-       if (cmd->use_sg == 0)
-               return 0;
-
-       use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg,
-                       cmd->sc_data_direction);
-       cmd->__data_mapped = 2;
-       cmd->__data_mapping = use_sg;
-
-       return use_sg;
-}
-
-#define unmap_scsi_data(np, cmd)       __unmap_scsi_data(np->dev, cmd)
-#define map_scsi_single_data(np, cmd)  __map_scsi_single_data(np->dev, cmd)
-#define map_scsi_sg_data(np, cmd)      __map_scsi_sg_data(np->dev, cmd)
-
-/*==========================================================
-**
-**     Driver setup.
-**
-**     This structure is initialized from linux config 
-**     options. It can be overridden at boot-up by the boot 
-**     command line.
-**
-**==========================================================
-*/
-static struct ncr_driver_setup
-       driver_setup                    = SCSI_NCR_DRIVER_SETUP;
-
-#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
-static struct ncr_driver_setup
-       driver_safe_setup __initdata    = SCSI_NCR_DRIVER_SAFE_SETUP;
-#endif
-
-#define initverbose (driver_setup.verbose)
-#define bootverbose (np->verbose)
-
-
-/*===================================================================
-**
-**     Driver setup from the boot command line
-**
-**===================================================================
-*/
-
-#ifdef MODULE
-#define        ARG_SEP ' '
-#else
-#define        ARG_SEP ','
-#endif
-
-#define OPT_TAGS               1
-#define OPT_MASTER_PARITY      2
-#define OPT_SCSI_PARITY                3
-#define OPT_DISCONNECTION      4
-#define OPT_SPECIAL_FEATURES   5
-#define OPT_UNUSED_1           6
-#define OPT_FORCE_SYNC_NEGO    7
-#define OPT_REVERSE_PROBE      8
-#define OPT_DEFAULT_SYNC       9
-#define OPT_VERBOSE            10
-#define OPT_DEBUG              11
-#define OPT_BURST_MAX          12
-#define OPT_LED_PIN            13
-#define OPT_MAX_WIDE           14
-#define OPT_SETTLE_DELAY       15
-#define OPT_DIFF_SUPPORT       16
-#define OPT_IRQM               17
-#define OPT_PCI_FIX_UP         18
-#define OPT_BUS_CHECK          19
-#define OPT_OPTIMIZE           20
-#define OPT_RECOVERY           21
-#define OPT_SAFE_SETUP         22
-#define OPT_USE_NVRAM          23
-#define OPT_EXCLUDE            24
-#define OPT_HOST_ID            25
-
-#ifdef SCSI_NCR_IARB_SUPPORT
-#define OPT_IARB               26
-#endif
-
-static char setup_token[] __initdata = 
-       "tags:"   "mpar:"
-       "spar:"   "disc:"
-       "specf:"  "ultra:"
-       "fsn:"    "revprob:"
-       "sync:"   "verb:"
-       "debug:"  "burst:"
-       "led:"    "wide:"
-       "settle:" "diff:"
-       "irqm:"   "pcifix:"
-       "buschk:" "optim:"
-       "recovery:"
-       "safe:"   "nvram:"
-       "excl:"   "hostid:"
-#ifdef SCSI_NCR_IARB_SUPPORT
-       "iarb:"
-#endif
-       ;       /* DONNOT REMOVE THIS ';' */
-
-#ifdef MODULE
-#define        ARG_SEP ' '
-#else
-#define        ARG_SEP ','
-#endif
-
-static int __init get_setup_token(char *p)
-{
-       char *cur = setup_token;
-       char *pc;
-       int i = 0;
-
-       while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
-               ++pc;
-               ++i;
-               if (!strncmp(p, cur, pc - cur))
-                       return i;
-               cur = pc;
-       }
-       return 0;
-}
-
-
-static int __init sym53c8xx__setup(char *str)
-{
-#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
-       char *cur = str;
-       char *pc, *pv;
-       int i, val, c;
-       int xi = 0;
-
-       while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
-               char *pe;
-
-               val = 0;
-               pv = pc;
-               c = *++pv;
-
-               if      (c == 'n')
-                       val = 0;
-               else if (c == 'y')
-                       val = 1;
-               else
-                       val = (int) simple_strtoul(pv, &pe, 0);
-
-               switch (get_setup_token(cur)) {
-               case OPT_TAGS:
-                       driver_setup.default_tags = val;
-                       if (pe && *pe == '/') {
-                               i = 0;
-                               while (*pe && *pe != ARG_SEP && 
-                                       i < sizeof(driver_setup.tag_ctrl)-1) {
-                                       driver_setup.tag_ctrl[i++] = *pe++;
-                               }
-                               driver_setup.tag_ctrl[i] = '\0';
-                       }
-                       break;
-               case OPT_MASTER_PARITY:
-                       driver_setup.master_parity = val;
-                       break;
-               case OPT_SCSI_PARITY:
-                       driver_setup.scsi_parity = val;
-                       break;
-               case OPT_DISCONNECTION:
-                       driver_setup.disconnection = val;
-                       break;
-               case OPT_SPECIAL_FEATURES:
-                       driver_setup.special_features = val;
-                       break;
-               case OPT_FORCE_SYNC_NEGO:
-                       driver_setup.force_sync_nego = val;
-                       break;
-               case OPT_REVERSE_PROBE:
-                       driver_setup.reverse_probe = val;
-                       break;
-               case OPT_DEFAULT_SYNC:
-                       driver_setup.default_sync = val;
-                       break;
-               case OPT_VERBOSE:
-                       driver_setup.verbose = val;
-                       break;
-               case OPT_DEBUG:
-                       driver_setup.debug = val;
-                       break;
-               case OPT_BURST_MAX:
-                       driver_setup.burst_max = val;
-                       break;
-               case OPT_LED_PIN:
-                       driver_setup.led_pin = val;
-                       break;
-               case OPT_MAX_WIDE:
-                       driver_setup.max_wide = val? 1:0;
-                       break;
-               case OPT_SETTLE_DELAY:
-                       driver_setup.settle_delay = val;
-                       break;
-               case OPT_DIFF_SUPPORT:
-                       driver_setup.diff_support = val;
-                       break;
-               case OPT_IRQM:
-                       driver_setup.irqm = val;
-                       break;
-               case OPT_PCI_FIX_UP:
-                       driver_setup.pci_fix_up = val;
-                       break;
-               case OPT_BUS_CHECK:
-                       driver_setup.bus_check = val;
-                       break;
-               case OPT_OPTIMIZE:
-                       driver_setup.optimize = val;
-                       break;
-               case OPT_RECOVERY:
-                       driver_setup.recovery = val;
-                       break;
-               case OPT_USE_NVRAM:
-                       driver_setup.use_nvram = val;
-                       break;
-               case OPT_SAFE_SETUP:
-                       memcpy(&driver_setup, &driver_safe_setup,
-                               sizeof(driver_setup));
-                       break;
-               case OPT_EXCLUDE:
-                       if (xi < SCSI_NCR_MAX_EXCLUDES)
-                               driver_setup.excludes[xi++] = val;
-                       break;
-               case OPT_HOST_ID:
-                       driver_setup.host_id = val;
-                       break;
-#ifdef SCSI_NCR_IARB_SUPPORT
-               case OPT_IARB:
-                       driver_setup.iarb = val;
-                       break;
-#endif
-               default:
-                       printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
-                       break;
-               }
-
-               if ((cur = strchr(cur, ARG_SEP)) != NULL)
-                       ++cur;
-       }
-#endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */
-       return 1;
-}
-
-/*===================================================================
-**
-**     Get device queue depth from boot command line.
-**
-**===================================================================
-*/
-#define DEF_DEPTH      (driver_setup.default_tags)
-#define ALL_TARGETS    -2
-#define NO_TARGET      -1
-#define ALL_LUNS       -2
-#define NO_LUN         -1
-
-static int device_queue_depth(int unit, int target, int lun)
-{
-       int c, h, t, u, v;
-       char *p = driver_setup.tag_ctrl;
-       char *ep;
-
-       h = -1;
-       t = NO_TARGET;
-       u = NO_LUN;
-       while ((c = *p++) != 0) {
-               v = simple_strtoul(p, &ep, 0);
-               switch(c) {
-               case '/':
-                       ++h;
-                       t = ALL_TARGETS;
-                       u = ALL_LUNS;
-                       break;
-               case 't':
-                       if (t != target)
-                               t = (target == v) ? v : NO_TARGET;
-                       u = ALL_LUNS;
-                       break;
-               case 'u':
-                       if (u != lun)
-                               u = (lun == v) ? v : NO_LUN;
-                       break;
-               case 'q':
-                       if (h == unit &&
-                               (t == ALL_TARGETS || t == target) &&
-                               (u == ALL_LUNS    || u == lun))
-                               return v;
-                       break;
-               case '-':
-                       t = ALL_TARGETS;
-                       u = ALL_LUNS;
-                       break;
-               default:
-                       break;
-               }
-               p = ep;
-       }
-       return DEF_DEPTH;
-}
diff --git a/drivers/scsi/sym53c8xx_defs.h b/drivers/scsi/sym53c8xx_defs.h
deleted file mode 100644 (file)
index 139cd0e..0000000
+++ /dev/null
@@ -1,1320 +0,0 @@
-/******************************************************************************
-**  High Performance device driver for the Symbios 53C896 controller.
-**
-**  Copyright (C) 1998-2001  Gerard Roudier <groudier@free.fr>
-**
-**  This driver also supports all the Symbios 53C8XX controller family, 
-**  except 53C810 revisions < 16, 53C825 revisions < 16 and all 
-**  revisions of 53C815 controllers.
-**
-**  This driver is based on the Linux port of the FreeBSD ncr driver.
-** 
-**  Copyright (C) 1994  Wolfgang Stanglmeier
-**  
-**-----------------------------------------------------------------------------
-**  
-**  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.
-**
-**-----------------------------------------------------------------------------
-**
-**  The Linux port of the FreeBSD ncr driver has been achieved in 
-**  november 1995 by:
-**
-**          Gerard Roudier              <groudier@free.fr>
-**
-**  Being given that this driver originates from the FreeBSD version, and
-**  in order to keep synergy on both, any suggested enhancements and corrections
-**  received on Linux are automatically a potential candidate for the FreeBSD 
-**  version.
-**
-**  The original driver has been written for 386bsd and FreeBSD by
-**          Wolfgang Stanglmeier        <wolf@cologne.de>
-**          Stefan Esser                <se@mi.Uni-Koeln.de>
-**
-**-----------------------------------------------------------------------------
-**
-**  Major contributions:
-**  --------------------
-**
-**  NVRAM detection and reading.
-**    Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
-**
-**  Added support for MIPS big endian systems.
-**    Carsten Langgaard, carstenl@mips.com
-**    Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
-**
-**  Added support for HP PARISC big endian systems.
-**    Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
-**
-*******************************************************************************
-*/
-
-#ifndef SYM53C8XX_DEFS_H
-#define SYM53C8XX_DEFS_H
-
-#include <linux/config.h>
-
-/*
-**     If you want a driver as small as possible, donnot define the 
-**     following options.
-*/
-#define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
-#define SCSI_NCR_DEBUG_INFO_SUPPORT
-
-/*
-**     To disable integrity checking, do not define the 
-**     following option.
-*/
-#ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK
-#      define SCSI_NCR_ENABLE_INTEGRITY_CHECK
-#endif
-
-/* ---------------------------------------------------------------------
-** Take into account kernel configured parameters.
-** Most of these options can be overridden at startup by a command line.
-** ---------------------------------------------------------------------
-*/
-
-/*
- * For Ultra2 and Ultra3 SCSI support option, use special features. 
- *
- * Value (default) means:
- *     bit 0 : all features enabled, except:
- *             bit 1 : PCI Write And Invalidate.
- *             bit 2 : Data Phase Mismatch handling from SCRIPTS.
- *
- * Use boot options ncr53c8xx=specf:1 if you want all chip features to be 
- * enabled by the driver.
- */
-#define        SCSI_NCR_SETUP_SPECIAL_FEATURES         (3)
-
-#define SCSI_NCR_MAX_SYNC                      (80)
-
-/*
- * Allow tags from 2 to 256, default 8
- */
-#ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
-#if    CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
-#define SCSI_NCR_MAX_TAGS      (2)
-#elif  CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256
-#define SCSI_NCR_MAX_TAGS      (256)
-#else
-#define        SCSI_NCR_MAX_TAGS       CONFIG_SCSI_NCR53C8XX_MAX_TAGS
-#endif
-#else
-#define SCSI_NCR_MAX_TAGS      (8)
-#endif
-
-/*
- * Allow tagged command queuing support if configured with default number 
- * of tags set to max (see above).
- */
-#ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
-#define        SCSI_NCR_SETUP_DEFAULT_TAGS     CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
-#elif  defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
-#define        SCSI_NCR_SETUP_DEFAULT_TAGS     SCSI_NCR_MAX_TAGS
-#else
-#define        SCSI_NCR_SETUP_DEFAULT_TAGS     (0)
-#endif
-
-/*
- * Immediate arbitration
- */
-#if defined(CONFIG_SCSI_NCR53C8XX_IARB)
-#define SCSI_NCR_IARB_SUPPORT
-#endif
-
-/*
- * Sync transfer frequency at startup.
- * Allow from 5Mhz to 80Mhz default 20 Mhz.
- */
-#ifndef        CONFIG_SCSI_NCR53C8XX_SYNC
-#define        CONFIG_SCSI_NCR53C8XX_SYNC      (20)
-#elif  CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
-#undef CONFIG_SCSI_NCR53C8XX_SYNC
-#define        CONFIG_SCSI_NCR53C8XX_SYNC      SCSI_NCR_MAX_SYNC
-#endif
-
-#if    CONFIG_SCSI_NCR53C8XX_SYNC == 0
-#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (255)
-#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 5
-#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (50)
-#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 20
-#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
-#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 33
-#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (11)
-#elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 40
-#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (10)
-#else
-#define        SCSI_NCR_SETUP_DEFAULT_SYNC     (9)
-#endif
-
-/*
- * Disallow disconnections at boot-up
- */
-#ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
-#define SCSI_NCR_SETUP_DISCONNECTION   (0)
-#else
-#define SCSI_NCR_SETUP_DISCONNECTION   (1)
-#endif
-
-/*
- * Force synchronous negotiation for all targets
- */
-#ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
-#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
-#else
-#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
-#endif
-
-/*
- * Disable master parity checking (flawed hardwares need that)
- */
-#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
-#define SCSI_NCR_SETUP_MASTER_PARITY   (0)
-#else
-#define SCSI_NCR_SETUP_MASTER_PARITY   (1)
-#endif
-
-/*
- * Disable scsi parity checking (flawed devices may need that)
- */
-#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
-#define SCSI_NCR_SETUP_SCSI_PARITY     (0)
-#else
-#define SCSI_NCR_SETUP_SCSI_PARITY     (1)
-#endif
-
-/*
- * Settle time after reset at boot-up
- */
-#define SCSI_NCR_SETUP_SETTLE_TIME     (2)
-
-/*
-**     Bridge quirks work-around option defaulted to 1.
-*/
-#ifndef        SCSI_NCR_PCIQ_WORK_AROUND_OPT
-#define        SCSI_NCR_PCIQ_WORK_AROUND_OPT   1
-#endif
-
-/*
-**     Work-around common bridge misbehaviour.
-**
-**     - Do not flush posted writes in the opposite 
-**       direction on read.
-**     - May reorder DMA writes to memory.
-**
-**     This option should not affect performances 
-**     significantly, so it is the default.
-*/
-#if    SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1
-#define        SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
-#define        SCSI_NCR_PCIQ_MAY_REORDER_WRITES
-#define        SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
-
-/*
-**     Same as option 1, but also deal with 
-**     misconfigured interrupts.
-**
-**     - Edge triggerred instead of level sensitive.
-**     - No interrupt line connected.
-**     - IRQ number misconfigured.
-**     
-**     If no interrupt is delivered, the driver will 
-**     catch the interrupt conditions 10 times per 
-**     second. No need to say that this option is 
-**     not recommended.
-*/
-#elif  SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2
-#define        SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
-#define        SCSI_NCR_PCIQ_MAY_REORDER_WRITES
-#define        SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
-#define        SCSI_NCR_PCIQ_BROKEN_INTR
-
-/*
-**     Some bridge designers decided to flush 
-**     everything prior to deliver the interrupt.
-**     This option tries to deal with such a 
-**     behaviour.
-*/
-#elif  SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3
-#define        SCSI_NCR_PCIQ_SYNC_ON_INTR
-#endif
-
-/*
-**     Other parameters not configurable with "make config"
-**     Avoid to change these constants, unless you know what you are doing.
-*/
-
-#define SCSI_NCR_ALWAYS_SIMPLE_TAG
-#define SCSI_NCR_MAX_SCATTER   (127)
-#define SCSI_NCR_MAX_TARGET    (16)
-
-/*
-**   Compute some desirable value for CAN_QUEUE 
-**   and CMD_PER_LUN.
-**   The driver will use lower values if these 
-**   ones appear to be too large.
-*/
-#define SCSI_NCR_CAN_QUEUE     (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET)
-#define SCSI_NCR_CMD_PER_LUN   (SCSI_NCR_MAX_TAGS)
-
-#define SCSI_NCR_SG_TABLESIZE  (SCSI_NCR_MAX_SCATTER)
-#define SCSI_NCR_TIMER_INTERVAL        (HZ)
-
-#if 1 /* defined CONFIG_SCSI_MULTI_LUN */
-#define SCSI_NCR_MAX_LUN       (16)
-#else
-#define SCSI_NCR_MAX_LUN       (1)
-#endif
-
-/*
- *  IO functions definition for big/little endian CPU support.
- *  For now, the NCR is only supported in little endian addressing mode, 
- */
-
-#ifdef __BIG_ENDIAN
-
-#define        inw_l2b         inw
-#define        inl_l2b         inl
-#define        outw_b2l        outw
-#define        outl_b2l        outl
-
-#define        readb_raw       readb
-#define        writeb_raw      writeb
-
-#if defined(SCSI_NCR_BIG_ENDIAN)
-#define        readw_l2b       __raw_readw
-#define        readl_l2b       __raw_readl
-#define        writew_b2l      __raw_writew
-#define        writel_b2l      __raw_writel
-#define        readw_raw       __raw_readw
-#define        readl_raw       __raw_readl
-#define        writew_raw      __raw_writew
-#define        writel_raw      __raw_writel
-#else  /* Other big-endian */
-#define        readw_l2b       readw
-#define        readl_l2b       readl
-#define        writew_b2l      writew
-#define        writel_b2l      writel
-#define        readw_raw       readw
-#define        readl_raw       readl
-#define        writew_raw      writew
-#define        writel_raw      writel
-#endif
-
-#else  /* little endian */
-
-#define        inw_raw         inw
-#define        inl_raw         inl
-#define        outw_raw        outw
-#define        outl_raw        outl
-
-#define        readb_raw       readb
-#define        readw_raw       readw
-#define        readl_raw       readl
-#define        writeb_raw      writeb
-#define        writew_raw      writew
-#define        writel_raw      writel
-
-#endif
-
-#if !defined(__hppa__) && !defined(__mips__)
-#ifdef SCSI_NCR_BIG_ENDIAN
-#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
-#endif
-#endif
-
-#define MEMORY_BARRIER()       mb()
-
-
-/*
- *  If the NCR uses big endian addressing mode over the 
- *  PCI, actual io register addresses for byte and word 
- *  accesses must be changed according to lane routing.
- *  Btw, ncr_offb() and ncr_offw() macros only apply to 
- *  constants and so donnot generate bloated code.
- */
-
-#if    defined(SCSI_NCR_BIG_ENDIAN)
-
-#define ncr_offb(o)    (((o)&~3)+((~((o)&3))&3))
-#define ncr_offw(o)    (((o)&~3)+((~((o)&3))&2))
-
-#else
-
-#define ncr_offb(o)    (o)
-#define ncr_offw(o)    (o)
-
-#endif
-
-/*
- *  If the CPU and the NCR use same endian-ness addressing,
- *  no byte reordering is needed for script patching.
- *  Macro cpu_to_scr() is to be used for script patching.
- *  Macro scr_to_cpu() is to be used for getting a DWORD 
- *  from the script.
- */
-
-#if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
-
-#define cpu_to_scr(dw) cpu_to_le32(dw)
-#define scr_to_cpu(dw) le32_to_cpu(dw)
-
-#elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
-
-#define cpu_to_scr(dw) cpu_to_be32(dw)
-#define scr_to_cpu(dw) be32_to_cpu(dw)
-
-#else
-
-#define cpu_to_scr(dw) (dw)
-#define scr_to_cpu(dw) (dw)
-
-#endif
-
-/*
- *  Access to the controller chip.
- *
- *  If the CPU and the NCR use same endian-ness addressing,
- *  no byte reordering is needed for accessing chip io 
- *  registers. Functions suffixed by '_raw' are assumed 
- *  to access the chip over the PCI without doing byte 
- *  reordering. Functions suffixed by '_l2b' are 
- *  assumed to perform little-endian to big-endian byte 
- *  reordering, those suffixed by '_b2l' blah, blah,
- *  blah, ...
- */
-
-/*
- *  MEMORY mapped IO input / output
- */
-
-#define INB_OFF(o)             readb_raw((char __iomem *)np->reg + ncr_offb(o))
-#define OUTB_OFF(o, val)       writeb_raw((val), (char __iomem *)np->reg + ncr_offb(o))
-
-#if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
-
-#define INW_OFF(o)             readw_l2b((char __iomem *)np->reg + ncr_offw(o))
-#define INL_OFF(o)             readl_l2b((char __iomem *)np->reg + (o))
-
-#define OUTW_OFF(o, val)       writew_b2l((val), (char __iomem *)np->reg + ncr_offw(o))
-#define OUTL_OFF(o, val)       writel_b2l((val), (char __iomem *)np->reg + (o))
-
-#elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
-
-#define INW_OFF(o)             readw_b2l((char __iomem *)np->reg + ncr_offw(o))
-#define INL_OFF(o)             readl_b2l((char __iomem *)np->reg + (o))
-
-#define OUTW_OFF(o, val)       writew_l2b((val), (char __iomem *)np->reg + ncr_offw(o))
-#define OUTL_OFF(o, val)       writel_l2b((val), (char __iomem *)np->reg + (o))
-
-#else
-
-#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
-/* Only 8 or 32 bit transfers allowed */
-#define INW_OFF(o)             (readb((char __iomem *)np->reg + ncr_offw(o)) << 8 | readb((char __iomem *)np->reg + ncr_offw(o) + 1))
-#else
-#define INW_OFF(o)             readw_raw((char __iomem *)np->reg + ncr_offw(o))
-#endif
-#define INL_OFF(o)             readl_raw((char __iomem *)np->reg + (o))
-
-#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
-/* Only 8 or 32 bit transfers allowed */
-#define OUTW_OFF(o, val)       do { writeb((char)((val) >> 8), (char __iomem *)np->reg + ncr_offw(o)); writeb((char)(val), (char __iomem *)np->reg + ncr_offw(o) + 1); } while (0)
-#else
-#define OUTW_OFF(o, val)       writew_raw((val), (char __iomem *)np->reg + ncr_offw(o))
-#endif
-#define OUTL_OFF(o, val)       writel_raw((val), (char __iomem *)np->reg + (o))
-
-#endif
-
-#define INB(r)         INB_OFF (offsetof(struct ncr_reg,r))
-#define INW(r)         INW_OFF (offsetof(struct ncr_reg,r))
-#define INL(r)         INL_OFF (offsetof(struct ncr_reg,r))
-
-#define OUTB(r, val)   OUTB_OFF (offsetof(struct ncr_reg,r), (val))
-#define OUTW(r, val)   OUTW_OFF (offsetof(struct ncr_reg,r), (val))
-#define OUTL(r, val)   OUTL_OFF (offsetof(struct ncr_reg,r), (val))
-
-/*
- *  Set bit field ON, OFF 
- */
-
-#define OUTONB(r, m)   OUTB(r, INB(r) | (m))
-#define OUTOFFB(r, m)  OUTB(r, INB(r) & ~(m))
-#define OUTONW(r, m)   OUTW(r, INW(r) | (m))
-#define OUTOFFW(r, m)  OUTW(r, INW(r) & ~(m))
-#define OUTONL(r, m)   OUTL(r, INL(r) | (m))
-#define OUTOFFL(r, m)  OUTL(r, INL(r) & ~(m))
-
-/*
- *  We normally want the chip to have a consistent view
- *  of driver internal data structures when we restart it.
- *  Thus these macros.
- */
-#define OUTL_DSP(v)                            \
-       do {                                    \
-               MEMORY_BARRIER();               \
-               OUTL (nc_dsp, (v));             \
-       } while (0)
-
-#define OUTONB_STD()                           \
-       do {                                    \
-               MEMORY_BARRIER();               \
-               OUTONB (nc_dcntl, (STD|NOCOM)); \
-       } while (0)
-
-
-/*
-**   NCR53C8XX devices features table.
-*/
-struct ncr_chip {
-       unsigned short  revision_id;
-       unsigned char   burst_max;      /* log-base-2 of max burst */
-       unsigned char   offset_max;
-       unsigned char   nr_divisor;
-       unsigned int    features;
-#define FE_LED0                (1<<0)
-#define FE_WIDE                (1<<1)    /* Wide data transfers */
-#define FE_ULTRA       (1<<2)    /* Ultra speed 20Mtrans/sec */
-#define FE_DBLR                (1<<4)    /* Clock doubler present */
-#define FE_QUAD                (1<<5)    /* Clock quadrupler present */
-#define FE_ERL         (1<<6)    /* Enable read line */
-#define FE_CLSE                (1<<7)    /* Cache line size enable */
-#define FE_WRIE                (1<<8)    /* Write & Invalidate enable */
-#define FE_ERMP                (1<<9)    /* Enable read multiple */
-#define FE_BOF         (1<<10)   /* Burst opcode fetch */
-#define FE_DFS         (1<<11)   /* DMA fifo size */
-#define FE_PFEN                (1<<12)   /* Prefetch enable */
-#define FE_LDSTR       (1<<13)   /* Load/Store supported */
-#define FE_RAM         (1<<14)   /* On chip RAM present */
-#define FE_VARCLK      (1<<15)   /* SCSI clock may vary */
-#define FE_RAM8K       (1<<16)   /* On chip RAM sized 8Kb */
-#define FE_64BIT       (1<<17)   /* Have a 64-bit PCI interface */
-#define FE_IO256       (1<<18)   /* Requires full 256 bytes in PCI space */
-#define FE_NOPM                (1<<19)   /* Scripts handles phase mismatch */
-#define FE_LEDC                (1<<20)   /* Hardware control of LED */
-#define FE_DIFF                (1<<21)   /* Support Differential SCSI */
-#define FE_66MHZ       (1<<23)   /* 66MHz PCI Support */
-#define FE_DAC         (1<<24)   /* Support DAC cycles (64 bit addressing) */
-#define FE_ISTAT1      (1<<25)   /* Have ISTAT1, MBOX0, MBOX1 registers */
-#define FE_DAC_IN_USE  (1<<26)   /* Platform does DAC cycles */
-#define FE_EHP         (1<<27)   /* 720: Even host parity */
-#define FE_MUX         (1<<28)   /* 720: Multiplexed bus */
-#define FE_EA          (1<<29)   /* 720: Enable Ack */
-
-#define FE_CACHE_SET   (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
-#define FE_SCSI_SET    (FE_WIDE|FE_ULTRA|FE_DBLR|FE_QUAD|F_CLK80)
-#define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
-};
-
-
-/*
-**     Driver setup structure.
-**
-**     This structure is initialized from linux config options.
-**     It can be overridden at boot-up by the boot command line.
-*/
-#define SCSI_NCR_MAX_EXCLUDES 8
-struct ncr_driver_setup {
-       u8      master_parity;
-       u8      scsi_parity;
-       u8      disconnection;
-       u8      special_features;
-       u8      force_sync_nego;
-       u8      reverse_probe;
-       u8      pci_fix_up;
-       u8      use_nvram;
-       u8      verbose;
-       u8      default_tags;
-       u16     default_sync;
-       u16     debug;
-       u8      burst_max;
-       u8      led_pin;
-       u8      max_wide;
-       u8      settle_delay;
-       u8      diff_support;
-       u8      irqm;
-       u8      bus_check;
-       u8      optimize;
-       u8      recovery;
-       u8      host_id;
-       u16     iarb;
-       u32     excludes[SCSI_NCR_MAX_EXCLUDES];
-       char    tag_ctrl[100];
-};
-
-/*
-**     Initial setup.
-**     Can be overriden at startup by a command line.
-*/
-#define SCSI_NCR_DRIVER_SETUP                  \
-{                                              \
-       SCSI_NCR_SETUP_MASTER_PARITY,           \
-       SCSI_NCR_SETUP_SCSI_PARITY,             \
-       SCSI_NCR_SETUP_DISCONNECTION,           \
-       SCSI_NCR_SETUP_SPECIAL_FEATURES,        \
-       SCSI_NCR_SETUP_FORCE_SYNC_NEGO,         \
-       0,                                      \
-       0,                                      \
-       1,                                      \
-       0,                                      \
-       SCSI_NCR_SETUP_DEFAULT_TAGS,            \
-       SCSI_NCR_SETUP_DEFAULT_SYNC,            \
-       0x00,                                   \
-       7,                                      \
-       0,                                      \
-       1,                                      \
-       SCSI_NCR_SETUP_SETTLE_TIME,             \
-       0,                                      \
-       0,                                      \
-       1,                                      \
-       0,                                      \
-       0,                                      \
-       255,                                    \
-       0x00                                    \
-}
-
-/*
-**     Boot fail safe setup.
-**     Override initial setup from boot command line:
-**     ncr53c8xx=safe:y
-*/
-#define SCSI_NCR_DRIVER_SAFE_SETUP             \
-{                                              \
-       0,                                      \
-       1,                                      \
-       0,                                      \
-       0,                                      \
-       0,                                      \
-       0,                                      \
-       0,                                      \
-       1,                                      \
-       2,                                      \
-       0,                                      \
-       255,                                    \
-       0x00,                                   \
-       255,                                    \
-       0,                                      \
-       0,                                      \
-       10,                                     \
-       1,                                      \
-       1,                                      \
-       1,                                      \
-       0,                                      \
-       0,                                      \
-       255                                     \
-}
-
-/**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/
-
-/*-----------------------------------------------------------------
-**
-**     The ncr 53c810 register structure.
-**
-**-----------------------------------------------------------------
-*/
-
-struct ncr_reg {
-/*00*/  u8     nc_scntl0;    /* full arb., ena parity, par->ATN  */
-
-/*01*/  u8     nc_scntl1;    /* no reset                         */
-        #define   ISCON   0x10  /* connected to scsi               */
-        #define   CRST    0x08  /* force reset                      */
-        #define   IARB    0x02  /* immediate arbitration            */
-
-/*02*/  u8     nc_scntl2;    /* no disconnect expected           */
-       #define   SDU     0x80  /* cmd: disconnect will raise error */
-       #define   CHM     0x40  /* sta: chained mode                */
-       #define   WSS     0x08  /* sta: wide scsi send           [W]*/
-       #define   WSR     0x01  /* sta: wide scsi received       [W]*/
-
-/*03*/  u8     nc_scntl3;    /* cnf system clock dependent       */
-       #define   EWS     0x08  /* cmd: enable wide scsi         [W]*/
-       #define   ULTRA   0x80  /* cmd: ULTRA enable                */
-                               /* bits 0-2, 7 rsvd for C1010       */
-
-/*04*/  u8     nc_scid;        /* cnf host adapter scsi address    */
-       #define   RRE     0x40  /* r/w:e enable response to resel.  */
-       #define   SRE     0x20  /* r/w:e enable response to select  */
-
-/*05*/  u8     nc_sxfer;       /* ### Sync speed and count         */
-                               /* bits 6-7 rsvd for C1010          */
-
-/*06*/  u8     nc_sdid;        /* ### Destination-ID               */
-
-/*07*/  u8     nc_gpreg;       /* ??? IO-Pins                      */
-
-/*08*/  u8     nc_sfbr;        /* ### First byte in phase          */
-
-/*09*/  u8     nc_socl;
-       #define   CREQ    0x80  /* r/w: SCSI-REQ                    */
-       #define   CACK    0x40  /* r/w: SCSI-ACK                    */
-       #define   CBSY    0x20  /* r/w: SCSI-BSY                    */
-       #define   CSEL    0x10  /* r/w: SCSI-SEL                    */
-       #define   CATN    0x08  /* r/w: SCSI-ATN                    */
-       #define   CMSG    0x04  /* r/w: SCSI-MSG                    */
-       #define   CC_D    0x02  /* r/w: SCSI-C_D                    */
-       #define   CI_O    0x01  /* r/w: SCSI-I_O                    */
-
-/*0a*/  u8     nc_ssid;
-
-/*0b*/  u8     nc_sbcl;
-
-/*0c*/  u8     nc_dstat;
-        #define   DFE     0x80  /* sta: dma fifo empty              */
-        #define   MDPE    0x40  /* int: master data parity error    */
-        #define   BF      0x20  /* int: script: bus fault           */
-        #define   ABRT    0x10  /* int: script: command aborted     */
-        #define   SSI     0x08  /* int: script: single step         */
-        #define   SIR     0x04  /* int: script: interrupt instruct. */
-        #define   IID     0x01  /* int: script: illegal instruct.   */
-
-/*0d*/  u8     nc_sstat0;
-        #define   ILF     0x80  /* sta: data in SIDL register lsb   */
-        #define   ORF     0x40  /* sta: data in SODR register lsb   */
-        #define   OLF     0x20  /* sta: data in SODL register lsb   */
-        #define   AIP     0x10  /* sta: arbitration in progress     */
-        #define   LOA     0x08  /* sta: arbitration lost            */
-        #define   WOA     0x04  /* sta: arbitration won             */
-        #define   IRST    0x02  /* sta: scsi reset signal           */
-        #define   SDP     0x01  /* sta: scsi parity signal          */
-
-/*0e*/  u8     nc_sstat1;
-       #define   FF3210  0xf0  /* sta: bytes in the scsi fifo      */
-
-/*0f*/  u8     nc_sstat2;
-        #define   ILF1    0x80  /* sta: data in SIDL register msb[W]*/
-        #define   ORF1    0x40  /* sta: data in SODR register msb[W]*/
-        #define   OLF1    0x20  /* sta: data in SODL register msb[W]*/
-        #define   DM      0x04  /* sta: DIFFSENS mismatch (895/6 only) */
-        #define   LDSC    0x02  /* sta: disconnect & reconnect      */
-
-/*10*/  u8     nc_dsa; /* --> Base page                    */
-/*11*/  u8     nc_dsa1;
-/*12*/  u8     nc_dsa2;
-/*13*/  u8     nc_dsa3;
-
-/*14*/  u8     nc_istat;       /* --> Main Command and status      */
-        #define   CABRT   0x80  /* cmd: abort current operation     */
-        #define   SRST    0x40  /* mod: reset chip                  */
-        #define   SIGP    0x20  /* r/w: message from host to ncr    */
-        #define   SEM     0x10  /* r/w: message between host + ncr  */
-        #define   CON     0x08  /* sta: connected to scsi           */
-        #define   INTF    0x04  /* sta: int on the fly (reset by wr)*/
-        #define   SIP     0x02  /* sta: scsi-interrupt              */
-        #define   DIP     0x01  /* sta: host/script interrupt       */
-
-/*15*/  u8     nc_istat1;      /* 896 and later cores only */
-        #define   FLSH    0x04  /* sta: chip is flushing            */
-        #define   SRUN    0x02  /* sta: scripts are running         */
-        #define   SIRQD   0x01  /* r/w: disable INT pin             */
-
-/*16*/  u8     nc_mbox0;       /* 896 and later cores only */
-/*17*/  u8     nc_mbox1;       /* 896 and later cores only */
-
-/*18*/ u8      nc_ctest0;
-       #define   EHP     0x04  /* 720 even host parity             */
-/*19*/  u8     nc_ctest1;
-
-/*1a*/  u8     nc_ctest2;
-       #define   CSIGP   0x40
-                               /* bits 0-2,7 rsvd for C1010        */
-
-/*1b*/  u8     nc_ctest3;
-       #define   FLF     0x08  /* cmd: flush dma fifo              */
-       #define   CLF     0x04  /* cmd: clear dma fifo              */
-       #define   FM      0x02  /* mod: fetch pin mode              */
-       #define   WRIE    0x01  /* mod: write and invalidate enable */
-                               /* bits 4-7 rsvd for C1010          */
-
-/*1c*/  u32    nc_temp;        /* ### Temporary stack              */
-
-/*20*/ u8      nc_dfifo;
-/*21*/  u8     nc_ctest4;
-       #define   MUX     0x80  /* 720 host bus multiplex mode      */
-       #define   BDIS    0x80  /* mod: burst disable               */
-       #define   MPEE    0x08  /* mod: master parity error enable  */
-
-/*22*/  u8     nc_ctest5;
-       #define   DFS     0x20  /* mod: dma fifo size               */
-                               /* bits 0-1, 3-7 rsvd for C1010          */
-/*23*/  u8     nc_ctest6;
-
-/*24*/  u32    nc_dbc; /* ### Byte count and command       */
-/*28*/  u32    nc_dnad;        /* ### Next command register        */
-/*2c*/  u32    nc_dsp; /* --> Script Pointer               */
-/*30*/  u32    nc_dsps;        /* --> Script pointer save/opcode#2 */
-
-/*34*/  u8     nc_scratcha;  /* Temporary register a            */
-/*35*/  u8     nc_scratcha1;
-/*36*/  u8     nc_scratcha2;
-/*37*/  u8     nc_scratcha3;
-
-/*38*/  u8     nc_dmode;
-       #define   BL_2    0x80  /* mod: burst length shift value +2 */
-       #define   BL_1    0x40  /* mod: burst length shift value +1 */
-       #define   ERL     0x08  /* mod: enable read line            */
-       #define   ERMP    0x04  /* mod: enable read multiple        */
-       #define   BOF     0x02  /* mod: burst op code fetch         */
-
-/*39*/  u8     nc_dien;
-/*3a*/  u8     nc_sbr;
-
-/*3b*/  u8     nc_dcntl;       /* --> Script execution control     */
-       #define   CLSE    0x80  /* mod: cache line size enable      */
-       #define   PFF     0x40  /* cmd: pre-fetch flush             */
-       #define   PFEN    0x20  /* mod: pre-fetch enable            */
-       #define   EA      0x20  /* mod: 720 enable-ack              */
-       #define   SSM     0x10  /* mod: single step mode            */
-       #define   IRQM    0x08  /* mod: irq mode (1 = totem pole !) */
-       #define   STD     0x04  /* cmd: start dma mode              */
-       #define   IRQD    0x02  /* mod: irq disable                 */
-       #define   NOCOM   0x01  /* cmd: protect sfbr while reselect */
-                               /* bits 0-1 rsvd for C1010          */
-
-/*3c*/  u32    nc_adder;
-
-/*40*/  u16    nc_sien;        /* -->: interrupt enable            */
-/*42*/  u16    nc_sist;        /* <--: interrupt status            */
-        #define   SBMC    0x1000/* sta: SCSI Bus Mode Change (895/6 only) */
-        #define   STO     0x0400/* sta: timeout (select)            */
-        #define   GEN     0x0200/* sta: timeout (general)           */
-        #define   HTH     0x0100/* sta: timeout (handshake)         */
-        #define   MA      0x80  /* sta: phase mismatch              */
-        #define   CMP     0x40  /* sta: arbitration complete        */
-        #define   SEL     0x20  /* sta: selected by another device  */
-        #define   RSL     0x10  /* sta: reselected by another device*/
-        #define   SGE     0x08  /* sta: gross error (over/underflow)*/
-        #define   UDC     0x04  /* sta: unexpected disconnect       */
-        #define   RST     0x02  /* sta: scsi bus reset detected     */
-        #define   PAR     0x01  /* sta: scsi parity error           */
-
-/*44*/  u8     nc_slpar;
-/*45*/  u8     nc_swide;
-/*46*/  u8     nc_macntl;
-/*47*/  u8     nc_gpcntl;
-/*48*/  u8     nc_stime0;    /* cmd: timeout for select&handshake*/
-/*49*/  u8     nc_stime1;    /* cmd: timeout user defined        */
-/*4a*/  u16   nc_respid;    /* sta: Reselect-IDs                */
-
-/*4c*/  u8     nc_stest0;
-
-/*4d*/  u8     nc_stest1;
-       #define   SCLK    0x80  /* Use the PCI clock as SCSI clock      */
-       #define   DBLEN   0x08  /* clock doubler running                */
-       #define   DBLSEL  0x04  /* clock doubler selected               */
-  
-
-/*4e*/  u8     nc_stest2;
-       #define   ROF     0x40  /* reset scsi offset (after gross error!) */
-       #define   DIF     0x20  /* 720 SCSI differential mode             */
-       #define   EXT     0x02  /* extended filtering                     */
-
-/*4f*/  u8     nc_stest3;
-       #define   TE     0x80   /* c: tolerAnt enable */
-       #define   HSC    0x20   /* c: Halt SCSI Clock */
-       #define   CSF    0x02   /* c: clear scsi fifo */
-
-/*50*/  u16   nc_sidl; /* Lowlevel: latched from scsi data */
-/*52*/  u8     nc_stest4;
-       #define   SMODE  0xc0   /* SCSI bus mode      (895/6 only) */
-       #define    SMODE_HVD 0x40       /* High Voltage Differential       */
-       #define    SMODE_SE  0x80       /* Single Ended                    */
-       #define    SMODE_LVD 0xc0       /* Low Voltage Differential        */
-       #define   LCKFRQ 0x20   /* Frequency Lock (895/6 only)     */
-                               /* bits 0-5 rsvd for C1010          */
-
-/*53*/  u8     nc_53_;
-/*54*/  u16    nc_sodl;        /* Lowlevel: data out to scsi data  */
-/*56*/ u8      nc_ccntl0;      /* Chip Control 0 (896)             */
-       #define   ENPMJ  0x80   /* Enable Phase Mismatch Jump       */
-       #define   PMJCTL 0x40   /* Phase Mismatch Jump Control      */
-       #define   ENNDJ  0x20   /* Enable Non Data PM Jump          */
-       #define   DISFC  0x10   /* Disable Auto FIFO Clear          */
-       #define   DILS   0x02   /* Disable Internal Load/Store      */
-       #define   DPR    0x01   /* Disable Pipe Req                 */
-
-/*57*/ u8      nc_ccntl1;      /* Chip Control 1 (896)             */
-       #define   ZMOD   0x80   /* High Impedance Mode              */
-       #define   DIC    0x10   /* Disable Internal Cycles          */
-       #define   DDAC   0x08   /* Disable Dual Address Cycle       */
-       #define   XTIMOD 0x04   /* 64-bit Table Ind. Indexing Mode  */
-       #define   EXTIBMV 0x02  /* Enable 64-bit Table Ind. BMOV    */
-       #define   EXDBMV 0x01   /* Enable 64-bit Direct BMOV        */
-
-/*58*/  u16    nc_sbdl;        /* Lowlevel: data from scsi data    */
-/*5a*/  u16    nc_5a_;
-
-/*5c*/  u8     nc_scr0;        /* Working register B               */
-/*5d*/  u8     nc_scr1;        /*                                  */
-/*5e*/  u8     nc_scr2;        /*                                  */
-/*5f*/  u8     nc_scr3;        /*                                  */
-
-/*60*/  u8     nc_scrx[64];    /* Working register C-R             */
-/*a0*/ u32     nc_mmrs;        /* Memory Move Read Selector        */
-/*a4*/ u32     nc_mmws;        /* Memory Move Write Selector       */
-/*a8*/ u32     nc_sfs;         /* Script Fetch Selector            */
-/*ac*/ u32     nc_drs;         /* DSA Relative Selector            */
-/*b0*/ u32     nc_sbms;        /* Static Block Move Selector       */
-/*b4*/ u32     nc_dbms;        /* Dynamic Block Move Selector      */
-/*b8*/ u32     nc_dnad64;      /* DMA Next Address 64              */
-/*bc*/ u16     nc_scntl4;      /* C1010 only                       */
-       #define   U3EN   0x80   /* Enable Ultra 3                   */
-       #define   AIPEN  0x40   /* Allow check upper byte lanes     */
-       #define   XCLKH_DT 0x08 /* Extra clock of data hold on DT
-                                       transfer edge               */
-       #define   XCLKH_ST 0x04 /* Extra clock of data hold on ST
-                                       transfer edge               */
-
-/*be*/  u8     nc_aipcntl0;    /* Epat Control 1 C1010 only        */
-/*bf*/  u8     nc_aipcntl1;    /* AIP Control C1010_66 Only        */
-
-/*c0*/ u32     nc_pmjad1;      /* Phase Mismatch Jump Address 1    */
-/*c4*/ u32     nc_pmjad2;      /* Phase Mismatch Jump Address 2    */
-/*c8*/ u8      nc_rbc;         /* Remaining Byte Count             */
-/*c9*/ u8      nc_rbc1;        /*                                  */
-/*ca*/ u8      nc_rbc2;        /*                                  */
-/*cb*/ u8      nc_rbc3;        /*                                  */
-
-/*cc*/ u8      nc_ua;          /* Updated Address                  */
-/*cd*/ u8      nc_ua1;         /*                                  */
-/*ce*/ u8      nc_ua2;         /*                                  */
-/*cf*/ u8      nc_ua3;         /*                                  */
-/*d0*/ u32     nc_esa;         /* Entry Storage Address            */
-/*d4*/ u8      nc_ia;          /* Instruction Address              */
-/*d5*/ u8      nc_ia1;
-/*d6*/ u8      nc_ia2;
-/*d7*/ u8      nc_ia3;
-/*d8*/ u32     nc_sbc;         /* SCSI Byte Count (3 bytes only)   */
-/*dc*/ u32     nc_csbc;        /* Cumulative SCSI Byte Count       */
-
-                               /* Following for C1010 only         */
-/*e0*/  u16    nc_crcpad;      /* CRC Value                        */
-/*e2*/  u8     nc_crccntl0;    /* CRC control register             */
-       #define   SNDCRC  0x10  /* Send CRC Request                 */
-/*e3*/  u8     nc_crccntl1;    /* CRC control register             */
-/*e4*/  u32    nc_crcdata;     /* CRC data register                */ 
-/*e8*/  u32    nc_e8_;         /* rsvd                             */
-/*ec*/  u32    nc_ec_;         /* rsvd                             */
-/*f0*/  u16    nc_dfbc;        /* DMA FIFO byte count              */ 
-
-};
-
-/*-----------------------------------------------------------
-**
-**     Utility macros for the script.
-**
-**-----------------------------------------------------------
-*/
-
-#define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
-#define REG(r) REGJ (nc_, r)
-
-typedef u32 ncrcmd;
-
-/*-----------------------------------------------------------
-**
-**     SCSI phases
-**
-**     DT phases illegal for ncr driver.
-**
-**-----------------------------------------------------------
-*/
-
-#define        SCR_DATA_OUT    0x00000000
-#define        SCR_DATA_IN     0x01000000
-#define        SCR_COMMAND     0x02000000
-#define        SCR_STATUS      0x03000000
-#define SCR_DT_DATA_OUT        0x04000000
-#define SCR_DT_DATA_IN 0x05000000
-#define SCR_MSG_OUT    0x06000000
-#define SCR_MSG_IN      0x07000000
-
-#define SCR_ILG_OUT    0x04000000
-#define SCR_ILG_IN     0x05000000
-
-/*-----------------------------------------------------------
-**
-**     Data transfer via SCSI.
-**
-**-----------------------------------------------------------
-**
-**     MOVE_ABS (LEN)
-**     <<start address>>
-**
-**     MOVE_IND (LEN)
-**     <<dnad_offset>>
-**
-**     MOVE_TBL
-**     <<dnad_offset>>
-**
-**-----------------------------------------------------------
-*/
-
-#define OPC_MOVE          0x08000000
-
-#define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l))
-#define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l))
-#define SCR_MOVE_TBL     (0x10000000 | OPC_MOVE)
-
-#define SCR_CHMOV_ABS(l) ((0x00000000) | (l))
-#define SCR_CHMOV_IND(l) ((0x20000000) | (l))
-#define SCR_CHMOV_TBL     (0x10000000)
-
-struct scr_tblmove {
-        u32  size;
-        u32  addr;
-};
-
-/*-----------------------------------------------------------
-**
-**     Selection
-**
-**-----------------------------------------------------------
-**
-**     SEL_ABS | SCR_ID (0..15)    [ | REL_JMP]
-**     <<alternate_address>>
-**
-**     SEL_TBL | << dnad_offset>>  [ | REL_JMP]
-**     <<alternate_address>>
-**
-**-----------------------------------------------------------
-*/
-
-#define        SCR_SEL_ABS     0x40000000
-#define        SCR_SEL_ABS_ATN 0x41000000
-#define        SCR_SEL_TBL     0x42000000
-#define        SCR_SEL_TBL_ATN 0x43000000
-
-
-#ifdef SCSI_NCR_BIG_ENDIAN
-struct scr_tblsel {
-        u8     sel_scntl3;
-        u8     sel_id;
-        u8     sel_sxfer;
-        u8     sel_scntl4;     
-};
-#else
-struct scr_tblsel {
-        u8     sel_scntl4;     
-        u8     sel_sxfer;
-        u8     sel_id;
-        u8     sel_scntl3;
-};
-#endif
-
-#define SCR_JMP_REL     0x04000000
-#define SCR_ID(id)     (((u32)(id)) << 16)
-
-/*-----------------------------------------------------------
-**
-**     Waiting for Disconnect or Reselect
-**
-**-----------------------------------------------------------
-**
-**     WAIT_DISC
-**     dummy: <<alternate_address>>
-**
-**     WAIT_RESEL
-**     <<alternate_address>>
-**
-**-----------------------------------------------------------
-*/
-
-#define        SCR_WAIT_DISC   0x48000000
-#define SCR_WAIT_RESEL  0x50000000
-
-/*-----------------------------------------------------------
-**
-**     Bit Set / Reset
-**
-**-----------------------------------------------------------
-**
-**     SET (flags {|.. })
-**
-**     CLR (flags {|.. })
-**
-**-----------------------------------------------------------
-*/
-
-#define SCR_SET(f)     (0x58000000 | (f))
-#define SCR_CLR(f)     (0x60000000 | (f))
-
-#define        SCR_CARRY       0x00000400
-#define        SCR_TRG         0x00000200
-#define        SCR_ACK         0x00000040
-#define        SCR_ATN         0x00000008
-
-
-
-
-/*-----------------------------------------------------------
-**
-**     Memory to memory move
-**
-**-----------------------------------------------------------
-**
-**     COPY (bytecount)
-**     << source_address >>
-**     << destination_address >>
-**
-**     SCR_COPY   sets the NO FLUSH option by default.
-**     SCR_COPY_F does not set this option.
-**
-**     For chips which do not support this option,
-**     ncr_copy_and_bind() will remove this bit.
-**-----------------------------------------------------------
-*/
-
-#define SCR_NO_FLUSH 0x01000000
-
-#define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
-#define SCR_COPY_F(n) (0xc0000000 | (n))
-
-/*-----------------------------------------------------------
-**
-**     Register move and binary operations
-**
-**-----------------------------------------------------------
-**
-**     SFBR_REG (reg, op, data)        reg  = SFBR op data
-**     << 0 >>
-**
-**     REG_SFBR (reg, op, data)        SFBR = reg op data
-**     << 0 >>
-**
-**     REG_REG  (reg, op, data)        reg  = reg op data
-**     << 0 >>
-**
-**-----------------------------------------------------------
-**     On 810A, 860, 825A, 875, 895 and 896 chips the content 
-**     of SFBR register can be used as data (SCR_SFBR_DATA).
-**     The 896 has additionnal IO registers starting at 
-**     offset 0x80. Bit 7 of register offset is stored in 
-**     bit 7 of the SCRIPTS instruction first DWORD.
-**-----------------------------------------------------------
-*/
-
-#define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80)) 
-
-#define SCR_SFBR_REG(reg,op,data) \
-        (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
-
-#define SCR_REG_SFBR(reg,op,data) \
-        (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
-
-#define SCR_REG_REG(reg,op,data) \
-        (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
-
-
-#define      SCR_LOAD   0x00000000
-#define      SCR_SHL    0x01000000
-#define      SCR_OR     0x02000000
-#define      SCR_XOR    0x03000000
-#define      SCR_AND    0x04000000
-#define      SCR_SHR    0x05000000
-#define      SCR_ADD    0x06000000
-#define      SCR_ADDC   0x07000000
-
-#define      SCR_SFBR_DATA   (0x00800000>>8ul) /* Use SFBR as data */
-
-/*-----------------------------------------------------------
-**
-**     FROM_REG (reg)            SFBR = reg
-**     << 0 >>
-**
-**     TO_REG   (reg)            reg  = SFBR
-**     << 0 >>
-**
-**     LOAD_REG (reg, data)      reg  = <data>
-**     << 0 >>
-**
-**     LOAD_SFBR(data)           SFBR = <data>
-**     << 0 >>
-**
-**-----------------------------------------------------------
-*/
-
-#define        SCR_FROM_REG(reg) \
-       SCR_REG_SFBR(reg,SCR_OR,0)
-
-#define        SCR_TO_REG(reg) \
-       SCR_SFBR_REG(reg,SCR_OR,0)
-
-#define        SCR_LOAD_REG(reg,data) \
-       SCR_REG_REG(reg,SCR_LOAD,data)
-
-#define SCR_LOAD_SFBR(data) \
-        (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
-
-/*-----------------------------------------------------------
-**
-**     LOAD  from memory   to register.
-**     STORE from register to memory.
-**
-**     Only supported by 810A, 860, 825A, 875, 895 and 896.
-**
-**-----------------------------------------------------------
-**
-**     LOAD_ABS (LEN)
-**     <<start address>>
-**
-**     LOAD_REL (LEN)        (DSA relative)
-**     <<dsa_offset>>
-**
-**-----------------------------------------------------------
-*/
-
-#define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul)
-#define SCR_NO_FLUSH2  0x02000000
-#define SCR_DSA_REL2   0x10000000
-
-#define SCR_LOAD_R(reg, how, n) \
-        (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
-
-#define SCR_STORE_R(reg, how, n) \
-        (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
-
-#define SCR_LOAD_ABS(reg, n)   SCR_LOAD_R(reg, SCR_NO_FLUSH2, n)
-#define SCR_LOAD_REL(reg, n)   SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n)
-#define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n)
-#define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n)
-
-#define SCR_STORE_ABS(reg, n)  SCR_STORE_R(reg, SCR_NO_FLUSH2, n)
-#define SCR_STORE_REL(reg, n)  SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n)
-#define SCR_STORE_ABS_F(reg, n)        SCR_STORE_R(reg, 0, n)
-#define SCR_STORE_REL_F(reg, n)        SCR_STORE_R(reg, SCR_DSA_REL2, n)
-
-
-/*-----------------------------------------------------------
-**
-**     Waiting for Disconnect or Reselect
-**
-**-----------------------------------------------------------
-**
-**     JUMP            [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<address>>
-**
-**     JUMPR           [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<distance>>
-**
-**     CALL            [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<address>>
-**
-**     CALLR           [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<distance>>
-**
-**     RETURN          [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<dummy>>
-**
-**     INT             [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<ident>>
-**
-**     INT_FLY         [ | IFTRUE/IFFALSE ( ... ) ]
-**     <<ident>>
-**
-**     Conditions:
-**          WHEN (phase)
-**          IF   (phase)
-**          CARRYSET
-**          DATA (data, mask)
-**
-**-----------------------------------------------------------
-*/
-
-#define SCR_NO_OP       0x80000000
-#define SCR_JUMP        0x80080000
-#define SCR_JUMP64      0x80480000
-#define SCR_JUMPR       0x80880000
-#define SCR_CALL        0x88080000
-#define SCR_CALLR       0x88880000
-#define SCR_RETURN      0x90080000
-#define SCR_INT         0x98080000
-#define SCR_INT_FLY     0x98180000
-
-#define IFFALSE(arg)   (0x00080000 | (arg))
-#define IFTRUE(arg)    (0x00000000 | (arg))
-
-#define WHEN(phase)    (0x00030000 | (phase))
-#define IF(phase)      (0x00020000 | (phase))
-
-#define DATA(D)        (0x00040000 | ((D) & 0xff))
-#define MASK(D,M)      (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
-
-#define CARRYSET       (0x00200000)
-
-/*-----------------------------------------------------------
-**
-**     SCSI  constants.
-**
-**-----------------------------------------------------------
-*/
-
-/*
-**     Messages
-*/
-
-#define        M_COMPLETE      COMMAND_COMPLETE
-#define        M_EXTENDED      EXTENDED_MESSAGE
-#define        M_SAVE_DP       SAVE_POINTERS
-#define        M_RESTORE_DP    RESTORE_POINTERS
-#define        M_DISCONNECT    DISCONNECT
-#define        M_ID_ERROR      INITIATOR_ERROR
-#define        M_ABORT         ABORT_TASK_SET
-#define        M_REJECT        MESSAGE_REJECT
-#define        M_NOOP          NOP
-#define        M_PARITY        MSG_PARITY_ERROR
-#define        M_LCOMPLETE     LINKED_CMD_COMPLETE
-#define        M_FCOMPLETE     LINKED_FLG_CMD_COMPLETE
-#define        M_RESET         TARGET_RESET
-#define        M_ABORT_TAG     ABORT_TASK
-#define        M_CLEAR_QUEUE   CLEAR_TASK_SET
-#define        M_INIT_REC      INITIATE_RECOVERY
-#define        M_REL_REC       RELEASE_RECOVERY
-#define        M_TERMINATE     (0x11)
-#define        M_SIMPLE_TAG    SIMPLE_QUEUE_TAG
-#define        M_HEAD_TAG      HEAD_OF_QUEUE_TAG
-#define        M_ORDERED_TAG   ORDERED_QUEUE_TAG
-#define        M_IGN_RESIDUE   IGNORE_WIDE_RESIDUE
-#define        M_IDENTIFY      (0x80)
-
-#define        M_X_MODIFY_DP   EXTENDED_MODIFY_DATA_POINTER
-#define        M_X_SYNC_REQ    EXTENDED_SDTR
-#define        M_X_WIDE_REQ    EXTENDED_WDTR
-#define        M_X_PPR_REQ     EXTENDED_PPR
-
-/*
-**     Status
-*/
-
-#define        S_GOOD          (0x00)
-#define        S_CHECK_COND    (0x02)
-#define        S_COND_MET      (0x04)
-#define        S_BUSY          (0x08)
-#define        S_INT           (0x10)
-#define        S_INT_COND_MET  (0x14)
-#define        S_CONFLICT      (0x18)
-#define        S_TERMINATED    (0x20)
-#define        S_QUEUE_FULL    (0x28)
-#define        S_ILLEGAL       (0xff)
-#define        S_SENSE         (0x80)
-
-/*
- * End of ncrreg from FreeBSD
- */
-
-#endif /* defined SYM53C8XX_DEFS_H */
index e08510d09ff6fa6ef26ec6832781b6dd90ef9b2a..d2bcd1f87cd61b10349d715c1795d2d5cf5761e5 100644 (file)
@@ -102,7 +102,7 @@ static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
 #define SERIAL_PORT_DFNS
 #endif
 
-static struct old_serial_port old_serial_port[] = {
+static const struct old_serial_port old_serial_port[] = {
        SERIAL_PORT_DFNS /* defined in asm/serial.h */
 };
 
index 5c3c03932d6d45663bb39e790d565f9c6623f934..8adca0ce267f66ed7f57b5e36e8365e1a165ab5e 100644 (file)
@@ -468,7 +468,7 @@ static unsigned short timedia_eight_port[] = {
        0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
 };
 
-static struct timedia_struct {
+static const struct timedia_struct {
        int num;
        unsigned short *ids;
 } timedia_data[] = {
@@ -516,7 +516,7 @@ pci_timedia_setup(struct serial_private *priv, struct pciserial_board *board,
                break;
        case 3:
                offset = board->uart_offset;
-               bar = 1;
+               /* FALLTHROUGH */
        case 4: /* BAR 2 */
        case 5: /* BAR 3 */
        case 6: /* BAR 4 */
index ad47c1b84c3f0677f0d6459c89294e4eb912d331..812bae62c8ecffdf653900c786ecf03a1373c999 100644 (file)
@@ -10,7 +10,7 @@ menu "Serial drivers"
 # The new 8250/16550 serial drivers
 config SERIAL_8250
        tristate "8250/16550 and compatible serial support"
-       depends on (BROKEN || !(SPARC64 || SPARC32))
+       depends on (BROKEN || !SPARC)
        select SERIAL_CORE
        ---help---
          This selects whether you want to include the driver for the standard
@@ -469,14 +469,14 @@ config SERIAL_IMX_CONSOLE
 
 config SERIAL_SUNCORE
        bool
-       depends on SPARC32 || SPARC64
+       depends on SPARC
        select SERIAL_CORE
        select SERIAL_CORE_CONSOLE
        default y
 
 config SERIAL_SUNZILOG
        tristate "Sun Zilog8530 serial support"
-       depends on SPARC32 || SPARC64
+       depends on SPARC
        help
          This driver supports the Zilog8530 serial ports found on many Sparc
          systems.  Say Y or M if you want to be able to these serial ports.
@@ -491,7 +491,7 @@ config SERIAL_SUNZILOG_CONSOLE
 
 config SERIAL_SUNSU
        tristate "Sun SU serial support"
-       depends on (SPARC32 || SPARC64) && PCI
+       depends on SPARC && PCI
        help
          This driver supports the 8250 serial ports that run the keyboard and
          mouse on (PCI) UltraSPARC systems.  Say Y or M if you want to be able
@@ -547,7 +547,7 @@ config PDC_CONSOLE
 
 config SERIAL_SUNSAB
        tristate "Sun Siemens SAB82532 serial support"
-       depends on (SPARC32 || SPARC64) && PCI
+       depends on SPARC && PCI
        help
          This driver supports the Siemens SAB82532 DUSCC serial ports on newer
          (PCI) UltraSPARC systems.  Say Y or M if you want to be able to these
index 938d185841c9eeb138f04b6c3389d48a03d0a11c..d84476ee65923d85a4ce5043b162565324c6db79 100644 (file)
@@ -49,7 +49,6 @@
 #include <linux/serial.h>
 
 #include <asm/io.h>
-#include <asm/irq.h>
 #include <asm/sizes.h>
 #include <asm/hardware/amba.h>
 #include <asm/hardware/clock.h>
@@ -63,7 +62,8 @@
 
 #define AMBA_ISR_PASS_LIMIT    256
 
-#define UART_DUMMY_RSR_RX      256
+#define UART_DR_ERROR          (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE)
+#define UART_DUMMY_DR_RX       (1 << 16)
 
 /*
  * We wrap our port structure around the generic uart_port.
@@ -116,7 +116,7 @@ pl011_rx_chars(struct uart_amba_port *uap)
 #endif
 {
        struct tty_struct *tty = uap->port.info->tty;
-       unsigned int status, ch, flag, rsr, max_count = 256;
+       unsigned int status, ch, flag, max_count = 256;
 
        status = readw(uap->port.membase + UART01x_FR);
        while ((status & UART01x_FR_RXFE) == 0 && max_count--) {
@@ -129,7 +129,7 @@ pl011_rx_chars(struct uart_amba_port *uap)
                         */
                }
 
-               ch = readw(uap->port.membase + UART01x_DR);
+               ch = readw(uap->port.membase + UART01x_DR) | UART_DUMMY_DR_RX;
                flag = TTY_NORMAL;
                uap->port.icount.rx++;
 
@@ -137,34 +137,33 @@ pl011_rx_chars(struct uart_amba_port *uap)
                 * Note that the error handling code is
                 * out of the main execution path
                 */
-               rsr = readw(uap->port.membase + UART01x_RSR) | UART_DUMMY_RSR_RX;
-               if (unlikely(rsr & UART01x_RSR_ANY)) {
-                       if (rsr & UART01x_RSR_BE) {
-                               rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE);
+               if (unlikely(ch & UART_DR_ERROR)) {
+                       if (ch & UART011_DR_BE) {
+                               ch &= ~(UART011_DR_FE | UART011_DR_PE);
                                uap->port.icount.brk++;
                                if (uart_handle_break(&uap->port))
                                        goto ignore_char;
-                       } else if (rsr & UART01x_RSR_PE)
+                       } else if (ch & UART011_DR_PE)
                                uap->port.icount.parity++;
-                       else if (rsr & UART01x_RSR_FE)
+                       else if (ch & UART011_DR_FE)
                                uap->port.icount.frame++;
-                       if (rsr & UART01x_RSR_OE)
+                       if (ch & UART011_DR_OE)
                                uap->port.icount.overrun++;
 
-                       rsr &= uap->port.read_status_mask;
+                       ch &= uap->port.read_status_mask;
 
-                       if (rsr & UART01x_RSR_BE)
+                       if (ch & UART011_DR_BE)
                                flag = TTY_BREAK;
-                       else if (rsr & UART01x_RSR_PE)
+                       else if (ch & UART011_DR_PE)
                                flag = TTY_PARITY;
-                       else if (rsr & UART01x_RSR_FE)
+                       else if (ch & UART011_DR_FE)
                                flag = TTY_FRAME;
                }
 
-               if (uart_handle_sysrq_char(&uap->port, ch, regs))
+               if (uart_handle_sysrq_char(&uap->port, ch & 255, regs))
                        goto ignore_char;
 
-               uart_insert_char(&uap->port, rsr, UART01x_RSR_OE, ch, flag);
+               uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag);
 
        ignore_char:
                status = readw(uap->port.membase + UART01x_FR);
@@ -476,33 +475,33 @@ pl011_set_termios(struct uart_port *port, struct termios *termios,
         */
        uart_update_timeout(port, termios->c_cflag, baud);
 
-       port->read_status_mask = UART01x_RSR_OE;
+       port->read_status_mask = UART011_DR_OE | 255;
        if (termios->c_iflag & INPCK)
-               port->read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
+               port->read_status_mask |= UART011_DR_FE | UART011_DR_PE;
        if (termios->c_iflag & (BRKINT | PARMRK))
-               port->read_status_mask |= UART01x_RSR_BE;
+               port->read_status_mask |= UART011_DR_BE;
 
        /*
         * Characters to ignore
         */
        port->ignore_status_mask = 0;
        if (termios->c_iflag & IGNPAR)
-               port->ignore_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
+               port->ignore_status_mask |= UART011_DR_FE | UART011_DR_PE;
        if (termios->c_iflag & IGNBRK) {
-               port->ignore_status_mask |= UART01x_RSR_BE;
+               port->ignore_status_mask |= UART011_DR_BE;
                /*
                 * If we're ignoring parity and break indicators,
                 * ignore overruns too (for real raw support).
                 */
                if (termios->c_iflag & IGNPAR)
-                       port->ignore_status_mask |= UART01x_RSR_OE;
+                       port->ignore_status_mask |= UART011_DR_OE;
        }
 
        /*
         * Ignore all characters if CREAD is not set.
         */
        if ((termios->c_cflag & CREAD) == 0)
-               port->ignore_status_mask |= UART_DUMMY_RSR_RX;
+               port->ignore_status_mask |= UART_DUMMY_DR_RX;
 
        if (UART_ENABLE_MS(port, termios->c_cflag))
                pl011_enable_ms(port);
index 355cd93a8a873aa277dbcc65bf3d4c41c5f49d0e..83c4c12165877c4e02b2449a63969dbdba05ab04 100644 (file)
@@ -994,7 +994,7 @@ static int __init imx_serial_init(void)
 static void __exit imx_serial_exit(void)
 {
        uart_unregister_driver(&imx_reg);
-       driver_unregister(&serial_imx_driver);
+       platform_driver_unregister(&serial_imx_driver);
 }
 
 module_init(imx_serial_init);
index ff5e6309d682c132a455b5b285bfcd96af1b3cc2..cc998b99a19f816e4aae59295ee7e3c40ce7c502 100644 (file)
@@ -361,7 +361,7 @@ static int serial_pxa_startup(struct uart_port *port)
        if (port->line == 3) /* HWUART */
                up->mcr |= UART_MCR_AFE;
        else
-       up->mcr = 0;
+               up->mcr = 0;
 
        /*
         * Allocate the IRQ
@@ -641,7 +641,7 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
        int i;
 
        /*
-        *      First save the UER then disable the interrupts
+        *      First save the IER then disable the interrupts
         */
        ier = serial_in(up, UART_IER);
        serial_out(up, UART_IER, UART_IER_UUE);
index 0e3daf6d7b502575f05baf78d90bb7f37919f2d2..25a086458ab9bcb431d06eb6a7d92e71d3e7f405 100644 (file)
@@ -161,7 +161,6 @@ static void sa1100_stop_tx(struct uart_port *port)
 static void sa1100_start_tx(struct uart_port *port)
 {
        struct sa1100_port *sport = (struct sa1100_port *)port;
-       unsigned long flags;
        u32 utcr3;
 
        utcr3 = UART_GET_UTCR3(sport);
index 2331296e1e17b068db98d8097bd85e1c80341898..c17d680e3f04ddfe954b02e763a390aef2cd7478 100644 (file)
@@ -1779,7 +1779,7 @@ struct baud_rates {
        unsigned int cflag;
 };
 
-static struct baud_rates baud_rates[] = {
+static const struct baud_rates baud_rates[] = {
        { 921600, B921600 },
        { 460800, B460800 },
        { 230400, B230400 },
index 2c7d3ef76e8e8d627eca5c77f2c561b5d7bedc8c..7ce0c7e66d3704b6664adb42e342599f8248cabd 100644 (file)
@@ -85,7 +85,7 @@ struct multi_id {
        int multi;              /* 1 = multifunction, > 1 = # ports */
 };
 
-static struct multi_id multi_id[] = {
+static const struct multi_id multi_id[] = {
        { MANFID_OMEGA,   PRODID_OMEGA_QSP_100,         4 },
        { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232,    2 },
        { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232_D1, 2 },
@@ -354,8 +354,8 @@ next_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse)
 
 static int simple_config(dev_link_t *link)
 {
-       static kio_addr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
-       static int size_table[2] = { 8, 16 };
+       static const kio_addr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
+       static const int size_table[2] = { 8, 16 };
        client_handle_t handle = link->handle;
        struct serial_info *info = link->priv;
        struct serial_cfg_mem *cfg_mem;
index a50c2bc506f245d34bb0785d81cf3856151bd65e..3639c3f8d3578f0fdb9fa5841ed04a410f379b99 100644 (file)
@@ -22,6 +22,7 @@ obj-$(CONFIG_USB_MIDI)                += class/
 obj-$(CONFIG_USB_PRINTER)      += class/
 
 obj-$(CONFIG_USB_STORAGE)      += storage/
+obj-$(CONFIG_USB)              += storage/
 
 obj-$(CONFIG_USB_AIPTEK)       += input/
 obj-$(CONFIG_USB_ATI_REMOTE)   += input/
index f429862e0974b2d7e3f1285daefa5d77d219f606..550ddfa71a4378d5f653a1cc885f01c0cf507aac 100644 (file)
@@ -44,6 +44,19 @@ config USB_CXACRU
          To compile this driver as a module, choose M here: the
          module will be called cxacru.
 
+config USB_UEAGLEATM
+       tristate "ADI 930 and eagle USB DSL modem"
+       depends on USB_ATM
+       select FW_LOADER
+       help
+         Say Y here if you have an ADSL USB modem based on the ADI 930
+         or eagle chipset. In order to use your modem you will need to
+         install firmwares and CMV (Command Management Variables); see
+         <https://gna.org/projects/ueagleatm/> for details.
+
+         To compile this driver as a module, choose M here: the
+         module will be called ueagle-atm.
+
 config USB_XUSBATM
        tristate "Other USB DSL modem support"
        depends on USB_ATM
index 85099718c6837d96ccafe58035613a73aa6d02bb..4c4a776ab1cd3ba3022d6e4574e1f88d450ff549 100644 (file)
@@ -4,6 +4,7 @@
 
 obj-$(CONFIG_USB_CXACRU)       += cxacru.o
 obj-$(CONFIG_USB_SPEEDTOUCH)   += speedtch.o
+obj-$(CONFIG_USB_UEAGLEATM)    += ueagle-atm.o
 obj-$(CONFIG_USB_ATM)          += usbatm.o
 obj-$(CONFIG_USB_XUSBATM)      += xusbatm.o
 
index 79861ee12a29c44c9837ea72f2feaf8312428848..af0a41e7870e0955eaf04e4e63608be04150982d 100644 (file)
@@ -787,6 +787,9 @@ static const struct usb_device_id cxacru_usb_ids[] = {
        { /* V = Conexant                       P = ADSL modem (Hasbani project)        */
                USB_DEVICE(0x0572, 0xcb00),     .driver_info = (unsigned long) &cxacru_cb00
        },
+       { /* V = Conexant             P = ADSL modem (Well PTI-800 */
+               USB_DEVICE(0x0572, 0xcb02),     .driver_info = (unsigned long) &cxacru_cb00
+       },
        { /* V = Conexant                       P = ADSL modem                          */
                USB_DEVICE(0x0572, 0xcb01),     .driver_info = (unsigned long) &cxacru_cb00
        },
@@ -850,7 +853,6 @@ static int cxacru_usb_probe(struct usb_interface *intf, const struct usb_device_
 }
 
 static struct usb_driver cxacru_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = cxacru_driver_name,
        .probe          = cxacru_usb_probe,
        .disconnect     = usbatm_usb_disconnect,
index d0cbbb7f0385df42d3152646b51cfbedf1667d3f..b28336148658f6ba453b0b6454876bfe1d064323 100644 (file)
@@ -659,7 +659,6 @@ MODULE_DEVICE_TABLE(usb, speedtch_usb_ids);
 static int speedtch_usb_probe(struct usb_interface *, const struct usb_device_id *);
 
 static struct usb_driver speedtch_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = speedtch_driver_name,
        .probe          = speedtch_usb_probe,
        .disconnect     = usbatm_usb_disconnect,
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c
new file mode 100644 (file)
index 0000000..7d2a679
--- /dev/null
@@ -0,0 +1,1820 @@
+/*-
+ * Copyright (c) 2003, 2004
+ *     Damien Bergamini <damien.bergamini@free.fr>. All rights reserved.
+ *
+ * Copyright (c) 2005 Matthieu Castet <castet.matthieu@free.fr>
+ *
+ * This software is available to you under a choice of one of two
+ * licenses. You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * GPL license :
+ * 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.
+ *
+ *
+ * HISTORY : some part of the code was base on ueagle 1.3 BSD driver,
+ * Damien Bergamini agree to put his code under a DUAL GPL/BSD license.
+ *
+ * The rest of the code was was rewritten from scratch.
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/crc32.h>
+#include <linux/usb.h>
+#include <linux/firmware.h>
+#include <linux/ctype.h>
+#include <linux/kthread.h>
+#include <linux/version.h>
+#include <asm/unaligned.h>
+
+#include "usbatm.h"
+
+#define EAGLEUSBVERSION "ueagle 1.1"
+
+
+/*
+ * Debug macros
+ */
+#define uea_dbg(usb_dev, format, args...)      \
+       do { \
+               if (debug >= 1) \
+                       dev_dbg(&(usb_dev)->dev, \
+                               "[ueagle-atm dbg] %s: " format, \
+                                       __FUNCTION__, ##args); \
+       } while (0)
+
+#define uea_vdbg(usb_dev, format, args...)     \
+       do { \
+               if (debug >= 2) \
+                       dev_dbg(&(usb_dev)->dev, \
+                               "[ueagle-atm vdbg]  " format, ##args); \
+       } while (0)
+
+#define uea_enters(usb_dev) \
+       uea_vdbg(usb_dev, "entering %s\n", __FUNCTION__)
+
+#define uea_leaves(usb_dev) \
+       uea_vdbg(usb_dev, "leaving  %s\n", __FUNCTION__)
+
+#define uea_err(usb_dev, format,args...) \
+       dev_err(&(usb_dev)->dev ,"[UEAGLE-ATM] " format , ##args)
+
+#define uea_warn(usb_dev, format,args...) \
+       dev_warn(&(usb_dev)->dev ,"[Ueagle-atm] " format, ##args)
+
+#define uea_info(usb_dev, format,args...) \
+       dev_info(&(usb_dev)->dev ,"[ueagle-atm] " format, ##args)
+
+struct uea_cmvs {
+       u32 address;
+       u16 offset;
+       u32 data;
+} __attribute__ ((packed));
+
+struct uea_softc {
+       struct usb_device *usb_dev;
+       struct usbatm_data *usbatm;
+
+       int modem_index;
+       unsigned int driver_info;
+
+       int booting;
+       int reset;
+
+       wait_queue_head_t sync_q;
+
+       struct task_struct *kthread;
+       u32 data;
+       wait_queue_head_t cmv_ack_wait;
+       int cmv_ack;
+
+       struct work_struct task;
+       u16 pageno;
+       u16 ovl;
+
+       const struct firmware *dsp_firm;
+       struct urb *urb_int;
+
+       u8 cmv_function;
+       u16 cmv_idx;
+       u32 cmv_address;
+       u16 cmv_offset;
+
+       /* keep in sync with eaglectl */
+       struct uea_stats {
+               struct {
+                       u32 state;
+                       u32 flags;
+                       u32 mflags;
+                       u32 vidcpe;
+                       u32 vidco;
+                       u32 dsrate;
+                       u32 usrate;
+                       u32 dsunc;
+                       u32 usunc;
+                       u32 dscorr;
+                       u32 uscorr;
+                       u32 txflow;
+                       u32 rxflow;
+                       u32 usattenuation;
+                       u32 dsattenuation;
+                       u32 dsmargin;
+                       u32 usmargin;
+                       u32 firmid;
+               } phy;
+       } stats;
+};
+
+/*
+ * Elsa IDs
+ */
+#define ELSA_VID               0x05CC
+#define ELSA_PID_PSTFIRM       0x3350
+#define ELSA_PID_PREFIRM       0x3351
+
+/*
+ * Sagem USB IDs
+ */
+#define EAGLE_VID              0x1110
+#define EAGLE_I_PID_PREFIRM    0x9010  /* Eagle I */
+#define EAGLE_I_PID_PSTFIRM    0x900F  /* Eagle I */
+
+#define EAGLE_IIC_PID_PREFIRM  0x9024  /* Eagle IIC */
+#define EAGLE_IIC_PID_PSTFIRM  0x9023  /* Eagle IIC */
+
+#define EAGLE_II_PID_PREFIRM   0x9022  /* Eagle II */
+#define EAGLE_II_PID_PSTFIRM   0x9021  /* Eagle II */
+
+/*
+ *  Eagle III Pid
+ */
+#define EAGLE_III_PID_PREFIRM  0x9032  /* Eagle III */
+#define EAGLE_III_PID_PSTFIRM  0x9031  /* Eagle III */
+
+/*
+ * USR USB IDs
+ */
+#define USR_VID                        0x0BAF
+#define MILLER_A_PID_PREFIRM   0x00F2
+#define MILLER_A_PID_PSTFIRM   0x00F1
+#define MILLER_B_PID_PREFIRM   0x00FA
+#define MILLER_B_PID_PSTFIRM   0x00F9
+#define HEINEKEN_A_PID_PREFIRM 0x00F6
+#define HEINEKEN_A_PID_PSTFIRM 0x00F5
+#define HEINEKEN_B_PID_PREFIRM 0x00F8
+#define HEINEKEN_B_PID_PSTFIRM 0x00F7
+
+#define PREFIRM 0
+#define PSTFIRM (1<<7)
+enum {
+       ADI930 = 0,
+       EAGLE_I,
+       EAGLE_II,
+       EAGLE_III
+};
+
+/* macros for both struct usb_device_id and struct uea_softc */
+#define UEA_IS_PREFIRM(x) \
+       (!((x)->driver_info & PSTFIRM))
+#define UEA_CHIP_VERSION(x) \
+       ((x)->driver_info & 0xf)
+
+#define IS_ISDN(sc) \
+       (le16_to_cpu(sc->usb_dev->descriptor.bcdDevice) & 0x80)
+
+#define INS_TO_USBDEV(ins) ins->usb_dev
+
+#define GET_STATUS(data) \
+       ((data >> 8) & 0xf)
+#define IS_OPERATIONAL(sc) \
+       (GET_STATUS(sc->stats.phy.state) == 2)
+
+/*
+ * Set of macros to handle unaligned data in the firmware blob.
+ * The FW_GET_BYTE() macro is provided only for consistency.
+ */
+
+#define FW_GET_BYTE(p) *((__u8 *) (p))
+#define FW_GET_WORD(p) le16_to_cpu(get_unaligned((__le16 *) (p)))
+#define FW_GET_LONG(p) le32_to_cpu(get_unaligned((__le32 *) (p)))
+
+#define FW_DIR "ueagle-atm/"
+#define NB_MODEM 4
+
+#define BULK_TIMEOUT 300
+#define CTRL_TIMEOUT 1000
+
+#define ACK_TIMEOUT msecs_to_jiffies(1500)
+
+#define UEA_INTR_IFACE_NO      0
+#define UEA_US_IFACE_NO                1
+#define UEA_DS_IFACE_NO                2
+
+#define FASTEST_ISO_INTF       8
+
+#define UEA_BULK_DATA_PIPE     0x02
+#define UEA_IDMA_PIPE          0x04
+#define UEA_INTR_PIPE          0x04
+#define UEA_ISO_DATA_PIPE      0x08
+
+#define UEA_SET_BLOCK          0x0001
+#define UEA_SET_MODE           0x0003
+#define UEA_SET_2183_DATA      0x0004
+#define UEA_SET_TIMEOUT                0x0011
+
+#define UEA_LOOPBACK_OFF       0x0002
+#define UEA_LOOPBACK_ON                0x0003
+#define UEA_BOOT_IDMA          0x0006
+#define UEA_START_RESET                0x0007
+#define UEA_END_RESET          0x0008
+
+#define UEA_SWAP_MAILBOX       (0x3fcd | 0x4000)
+#define UEA_MPTX_START         (0x3fce | 0x4000)
+#define UEA_MPTX_MAILBOX       (0x3fd6 | 0x4000)
+#define UEA_MPRX_MAILBOX       (0x3fdf | 0x4000)
+
+/* structure describing a block within a DSP page */
+struct block_info {
+       __le16 wHdr;
+#define UEA_BIHDR 0xabcd
+       __le16 wAddress;
+       __le16 wSize;
+       __le16 wOvlOffset;
+       __le16 wOvl;            /* overlay */
+       __le16 wLast;
+} __attribute__ ((packed));
+#define BLOCK_INFO_SIZE 12
+
+/* structure representing a CMV (Configuration and Management Variable) */
+struct cmv {
+       __le16 wPreamble;
+#define PREAMBLE 0x535c
+       __u8 bDirection;
+#define MODEMTOHOST 0x01
+#define HOSTTOMODEM 0x10
+       __u8 bFunction;
+#define FUNCTION_TYPE(f)    ((f) >> 4)
+#define MEMACCESS      0x1
+#define ADSLDIRECTIVE  0x7
+
+#define FUNCTION_SUBTYPE(f) ((f) & 0x0f)
+/* for MEMACCESS */
+#define REQUESTREAD    0x0
+#define REQUESTWRITE   0x1
+#define REPLYREAD      0x2
+#define REPLYWRITE     0x3
+/* for ADSLDIRECTIVE */
+#define KERNELREADY    0x0
+#define MODEMREADY     0x1
+
+#define MAKEFUNCTION(t, s) (((t) & 0xf) << 4 | ((s) & 0xf))
+       __le16 wIndex;
+       __le32 dwSymbolicAddress;
+#define MAKESA(a, b, c, d)                                             \
+       (((c) & 0xff) << 24 |                                           \
+        ((d) & 0xff) << 16 |                                           \
+        ((a) & 0xff) << 8  |                                           \
+        ((b) & 0xff))
+
+#define SA_CNTL MAKESA('C', 'N', 'T', 'L')
+#define SA_DIAG MAKESA('D', 'I', 'A', 'G')
+#define SA_INFO MAKESA('I', 'N', 'F', 'O')
+#define SA_OPTN MAKESA('O', 'P', 'T', 'N')
+#define SA_RATE MAKESA('R', 'A', 'T', 'E')
+#define SA_STAT MAKESA('S', 'T', 'A', 'T')
+       __le16 wOffsetAddress;
+       __le32 dwData;
+} __attribute__ ((packed));
+#define CMV_SIZE 16
+
+/* structure representing swap information */
+struct swap_info {
+       __u8 bSwapPageNo;
+       __u8 bOvl;              /* overlay */
+} __attribute__ ((packed));
+
+/* structure representing interrupt data */
+struct intr_pkt {
+       __u8 bType;
+       __u8 bNotification;
+       __le16 wValue;
+       __le16 wIndex;
+       __le16 wLength;
+       __le16 wInterrupt;
+#define INT_LOADSWAPPAGE 0x0001
+#define INT_INCOMINGCMV  0x0002
+       union {
+               struct {
+                       struct swap_info swapinfo;
+                       __le16 wDataSize;
+               } __attribute__ ((packed)) s1;
+
+               struct {
+                       struct cmv cmv;
+                       __le16 wDataSize;
+               } __attribute__ ((packed)) s2;
+       } __attribute__ ((packed)) u;
+#define bSwapPageNo    u.s1.swapinfo.bSwapPageNo
+#define bOvl           u.s1.swapinfo.bOvl
+} __attribute__ ((packed));
+#define INTR_PKT_SIZE 28
+
+static struct usb_driver uea_driver;
+static DECLARE_MUTEX(uea_semaphore);
+static const char *chip_name[] = {"ADI930", "Eagle I", "Eagle II", "Eagle III"};
+
+static int modem_index;
+static unsigned int debug;
+static int sync_wait[NB_MODEM];
+static char *cmv_file[NB_MODEM];
+
+module_param(debug, uint, 0644);
+MODULE_PARM_DESC(debug, "module debug level (0=off,1=on,2=verbose)");
+module_param_array(sync_wait, bool, NULL, 0644);
+MODULE_PARM_DESC(sync_wait, "wait the synchronisation before starting ATM");
+module_param_array(cmv_file, charp, NULL, 0644);
+MODULE_PARM_DESC(cmv_file,
+               "file name with configuration and management variables");
+
+#define UPDATE_ATM_STAT(type, val) \
+       do { \
+               if (sc->usbatm->atm_dev) \
+                       sc->usbatm->atm_dev->type = val; \
+       } while (0)
+
+/* Firmware loading */
+#define LOAD_INTERNAL     0xA0
+#define F8051_USBCS       0x7f92
+
+/**
+ * uea_send_modem_cmd - Send a command for pre-firmware devices.
+ */
+static int uea_send_modem_cmd(struct usb_device *usb,
+               u16 addr, u16 size, u8 * buff)
+{
+       int ret = -ENOMEM;
+       u8 *xfer_buff;
+
+       xfer_buff = kmalloc(size, GFP_KERNEL);
+       if (xfer_buff) {
+               memcpy(xfer_buff, buff, size);
+               ret = usb_control_msg(usb,
+                                     usb_sndctrlpipe(usb, 0),
+                                     LOAD_INTERNAL,
+                                     USB_DIR_OUT | USB_TYPE_VENDOR |
+                                     USB_RECIP_DEVICE, addr, 0, xfer_buff,
+                                     size, CTRL_TIMEOUT);
+               kfree(xfer_buff);
+       }
+
+       if (ret < 0)
+               return ret;
+
+       return (ret == size) ? 0 : -EIO;
+}
+
+static void uea_upload_pre_firmware(const struct firmware *fw_entry, void *context)
+{
+       struct usb_device *usb = context;
+       u8 *pfw, value;
+       u32 crc = 0;
+       int ret, size;
+
+       uea_enters(usb);
+       if (!fw_entry) {
+               uea_err(usb, "firmware is not available\n");
+               goto err;
+       }
+
+       pfw = fw_entry->data;
+       size = fw_entry->size;
+       if (size < 4)
+               goto err_fw_corrupted;
+
+       crc = FW_GET_LONG(pfw);
+       pfw += 4;
+       size -= 4;
+       if (crc32_be(0, pfw, size) != crc)
+               goto err_fw_corrupted;
+
+       /*
+        * Start to upload formware : send reset
+        */
+       value = 1;
+       ret = uea_send_modem_cmd(usb, F8051_USBCS, sizeof(value), &value);
+
+       if (ret < 0) {
+               uea_err(usb, "modem reset failed with error %d\n", ret);
+               goto err;
+       }
+
+       while (size > 3) {
+               u8 len = FW_GET_BYTE(pfw);
+               u16 add = FW_GET_WORD(pfw + 1);
+
+               size -= len + 3;
+               if (size < 0)
+                       goto err_fw_corrupted;
+
+               ret = uea_send_modem_cmd(usb, add, len, pfw + 3);
+               if (ret < 0) {
+                       uea_err(usb, "uploading firmware data failed "
+                                       "with error %d\n", ret);
+                       goto err;
+               }
+               pfw += len + 3;
+       }
+
+       if (size != 0)
+               goto err_fw_corrupted;
+
+       /*
+        * Tell the modem we finish : de-assert reset
+        */
+       value = 0;
+       ret = uea_send_modem_cmd(usb, F8051_USBCS, 1, &value);
+       if (ret < 0)
+               uea_err(usb, "modem de-assert failed with error %d\n", ret);
+       else
+               uea_info(usb, "firmware uploaded\n");
+
+       uea_leaves(usb);
+       return;
+
+err_fw_corrupted:
+       uea_err(usb, "firmware is corrupted\n");
+err:
+       uea_leaves(usb);
+}
+
+/**
+ * uea_load_firmware - Load usb firmware for pre-firmware devices.
+ */
+static int uea_load_firmware(struct usb_device *usb, unsigned int ver)
+{
+       int ret;
+       char *fw_name = FW_DIR "eagle.fw";
+
+       uea_enters(usb);
+       uea_info(usb, "pre-firmware device, uploading firmware\n");
+
+       switch (ver) {
+       case ADI930:
+               fw_name = FW_DIR "adi930.fw";
+               break;
+       case EAGLE_I:
+               fw_name = FW_DIR "eagleI.fw";
+               break;
+       case EAGLE_II:
+               fw_name = FW_DIR "eagleII.fw";
+               break;
+       case EAGLE_III:
+               fw_name = FW_DIR "eagleIII.fw";
+               break;
+       }
+
+       ret = request_firmware_nowait(THIS_MODULE, 1, fw_name, &usb->dev, usb, uea_upload_pre_firmware);
+       if (ret)
+               uea_err(usb, "firmware %s is not available\n", fw_name);
+       else
+               uea_info(usb, "loading firmware %s\n", fw_name);
+
+       uea_leaves(usb);
+       return ret;
+}
+
+/* modem management : dsp firmware, send/read CMV, monitoring statistic
+ */
+
+/*
+ * Make sure that the DSP code provided is safe to use.
+ */
+static int check_dsp(u8 *dsp, unsigned int len)
+{
+       u8 pagecount, blockcount;
+       u16 blocksize;
+       u32 pageoffset;
+       unsigned int i, j, p, pp;
+
+       pagecount = FW_GET_BYTE(dsp);
+       p = 1;
+
+       /* enough space for page offsets? */
+       if (p + 4 * pagecount > len)
+               return 1;
+
+       for (i = 0; i < pagecount; i++) {
+
+               pageoffset = FW_GET_LONG(dsp + p);
+               p += 4;
+
+               if (pageoffset == 0)
+                       continue;
+
+               /* enough space for blockcount? */
+               if (pageoffset >= len)
+                       return 1;
+
+               pp = pageoffset;
+               blockcount = FW_GET_BYTE(dsp + pp);
+               pp += 1;
+
+               for (j = 0; j < blockcount; j++) {
+
+                       /* enough space for block header? */
+                       if (pp + 4 > len)
+                               return 1;
+
+                       pp += 2;        /* skip blockaddr */
+                       blocksize = FW_GET_WORD(dsp + pp);
+                       pp += 2;
+
+                       /* enough space for block data? */
+                       if (pp + blocksize > len)
+                               return 1;
+
+                       pp += blocksize;
+               }
+       }
+
+       return 0;
+}
+
+/*
+ * send data to the idma pipe
+ * */
+static int uea_idma_write(struct uea_softc *sc, void *data, u32 size)
+{
+       int ret = -ENOMEM;
+       u8 *xfer_buff;
+       int bytes_read;
+
+       xfer_buff = kmalloc(size, GFP_KERNEL);
+       if (!xfer_buff) {
+               uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n");
+               return ret;
+       }
+
+       memcpy(xfer_buff, data, size);
+
+       ret = usb_bulk_msg(sc->usb_dev,
+                        usb_sndbulkpipe(sc->usb_dev, UEA_IDMA_PIPE),
+                        xfer_buff, size, &bytes_read, BULK_TIMEOUT);
+
+       kfree(xfer_buff);
+       if (ret < 0)
+               return ret;
+       if (size != bytes_read) {
+               uea_err(INS_TO_USBDEV(sc), "size != bytes_read %d %d\n", size,
+                      bytes_read);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int request_dsp(struct uea_softc *sc)
+{
+       int ret;
+       char *dsp_name;
+
+       if (UEA_CHIP_VERSION(sc) == ADI930) {
+               if (IS_ISDN(sc))
+                       dsp_name = FW_DIR "DSP9i.bin";
+               else
+                       dsp_name = FW_DIR "DSP9p.bin";
+       } else {
+               if (IS_ISDN(sc))
+                       dsp_name = FW_DIR "DSPei.bin";
+               else
+                       dsp_name = FW_DIR "DSPep.bin";
+       }
+
+       ret = request_firmware(&sc->dsp_firm,
+                               dsp_name, &sc->usb_dev->dev);
+       if (ret < 0) {
+               uea_err(INS_TO_USBDEV(sc),
+                      "requesting firmware %s failed with error %d\n",
+                      dsp_name, ret);
+               return ret;
+       }
+
+       if (check_dsp(sc->dsp_firm->data, sc->dsp_firm->size)) {
+               uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n",
+                      dsp_name);
+               release_firmware(sc->dsp_firm);
+               sc->dsp_firm = NULL;
+               return -EILSEQ;
+       }
+
+       return 0;
+}
+
+/*
+ * The uea_load_page() function must be called within a process context
+ */
+static void uea_load_page(void *xsc)
+{
+       struct uea_softc *sc = xsc;
+       u16 pageno = sc->pageno;
+       u16 ovl = sc->ovl;
+       struct block_info bi;
+
+       u8 *p;
+       u8 pagecount, blockcount;
+       u16 blockaddr, blocksize;
+       u32 pageoffset;
+       int i;
+
+       /* reload firmware when reboot start and it's loaded already */
+       if (ovl == 0 && pageno == 0 && sc->dsp_firm) {
+               release_firmware(sc->dsp_firm);
+               sc->dsp_firm = NULL;
+       }
+
+       if (sc->dsp_firm == NULL && request_dsp(sc) < 0)
+               return;
+
+       p = sc->dsp_firm->data;
+       pagecount = FW_GET_BYTE(p);
+       p += 1;
+
+       if (pageno >= pagecount)
+               goto bad1;
+
+       p += 4 * pageno;
+       pageoffset = FW_GET_LONG(p);
+
+       if (pageoffset == 0)
+               goto bad1;
+
+       p = sc->dsp_firm->data + pageoffset;
+       blockcount = FW_GET_BYTE(p);
+       p += 1;
+
+       uea_dbg(INS_TO_USBDEV(sc),
+              "sending %u blocks for DSP page %u\n", blockcount, pageno);
+
+       bi.wHdr = cpu_to_le16(UEA_BIHDR);
+       bi.wOvl = cpu_to_le16(ovl);
+       bi.wOvlOffset = cpu_to_le16(ovl | 0x8000);
+
+       for (i = 0; i < blockcount; i++) {
+               blockaddr = FW_GET_WORD(p);
+               p += 2;
+
+               blocksize = FW_GET_WORD(p);
+               p += 2;
+
+               bi.wSize = cpu_to_le16(blocksize);
+               bi.wAddress = cpu_to_le16(blockaddr);
+               bi.wLast = cpu_to_le16((i == blockcount - 1) ? 1 : 0);
+
+               /* send block info through the IDMA pipe */
+               if (uea_idma_write(sc, &bi, BLOCK_INFO_SIZE))
+                       goto bad2;
+
+               /* send block data through the IDMA pipe */
+               if (uea_idma_write(sc, p, blocksize))
+                       goto bad2;
+
+               p += blocksize;
+       }
+
+       return;
+
+bad2:
+       uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i);
+       return;
+bad1:
+       uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n",pageno);
+}
+
+static inline void wake_up_cmv_ack(struct uea_softc *sc)
+{
+       sc->cmv_ack = 1;
+       wake_up(&sc->cmv_ack_wait);
+}
+
+static inline int wait_cmv_ack(struct uea_softc *sc)
+{
+       int ret = wait_event_timeout(sc->cmv_ack_wait,
+                                                  sc->cmv_ack, ACK_TIMEOUT);
+       sc->cmv_ack = 0;
+
+       if (ret < 0)
+               return ret;
+
+       return (ret == 0) ? -ETIMEDOUT : 0;
+
+}
+
+#define UCDC_SEND_ENCAPSULATED_COMMAND 0x00
+
+static int uea_request(struct uea_softc *sc,
+               u16 value, u16 index, u16 size, void *data)
+{
+       u8 *xfer_buff;
+       int ret = -ENOMEM;
+
+       xfer_buff = kmalloc(size, GFP_KERNEL);
+       if (!xfer_buff) {
+               uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n");
+               return ret;
+       }
+       memcpy(xfer_buff, data, size);
+
+       ret = usb_control_msg(sc->usb_dev, usb_sndctrlpipe(sc->usb_dev, 0),
+                             UCDC_SEND_ENCAPSULATED_COMMAND,
+                             USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                             value, index, xfer_buff, size, CTRL_TIMEOUT);
+
+       kfree(xfer_buff);
+       if (ret < 0) {
+               uea_err(INS_TO_USBDEV(sc), "usb_control_msg error %d\n", ret);
+               return ret;
+       }
+
+       if (ret != size) {
+               uea_err(INS_TO_USBDEV(sc),
+                      "usb_control_msg send only %d bytes (instead of %d)\n",
+                      ret, size);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int uea_cmv(struct uea_softc *sc,
+               u8 function, u32 address, u16 offset, u32 data)
+{
+       struct cmv cmv;
+       int ret;
+
+       /* we send a request, but we expect a reply */
+       sc->cmv_function = function | 0x2;
+       sc->cmv_idx++;
+       sc->cmv_address = address;
+       sc->cmv_offset = offset;
+
+       cmv.wPreamble = cpu_to_le16(PREAMBLE);
+       cmv.bDirection = HOSTTOMODEM;
+       cmv.bFunction = function;
+       cmv.wIndex = cpu_to_le16(sc->cmv_idx);
+       put_unaligned(cpu_to_le32(address), &cmv.dwSymbolicAddress);
+       cmv.wOffsetAddress = cpu_to_le16(offset);
+       put_unaligned(cpu_to_le32(data >> 16 | data << 16), &cmv.dwData);
+
+       ret = uea_request(sc, UEA_SET_BLOCK, UEA_MPTX_START, CMV_SIZE, &cmv);
+       if (ret < 0)
+               return ret;
+       return wait_cmv_ack(sc);
+}
+
+static inline int uea_read_cmv(struct uea_softc *sc,
+               u32 address, u16 offset, u32 *data)
+{
+       int ret = uea_cmv(sc, MAKEFUNCTION(MEMACCESS, REQUESTREAD),
+                         address, offset, 0);
+       if (ret < 0)
+               uea_err(INS_TO_USBDEV(sc),
+                       "reading cmv failed with error %d\n", ret);
+       else
+               *data = sc->data;
+
+       return ret;
+}
+
+static inline int uea_write_cmv(struct uea_softc *sc,
+               u32 address, u16 offset, u32 data)
+{
+       int ret = uea_cmv(sc, MAKEFUNCTION(MEMACCESS, REQUESTWRITE),
+                         address, offset, data);
+       if (ret < 0)
+               uea_err(INS_TO_USBDEV(sc),
+                       "writing cmv failed with error %d\n", ret);
+
+       return ret;
+}
+
+/*
+ * Monitor the modem and update the stat
+ * return 0 if everything is ok
+ * return < 0 if an error occurs (-EAGAIN reboot needed)
+ */
+static int uea_stat(struct uea_softc *sc)
+{
+       u32 data;
+       int ret;
+
+       uea_enters(INS_TO_USBDEV(sc));
+       data = sc->stats.phy.state;
+
+       ret = uea_read_cmv(sc, SA_STAT, 0, &sc->stats.phy.state);
+       if (ret < 0)
+               return ret;
+
+       switch (GET_STATUS(sc->stats.phy.state)) {
+       case 0:         /* not yet synchronized */
+               uea_dbg(INS_TO_USBDEV(sc),
+                      "modem not yet synchronized\n");
+               return 0;
+
+       case 1:         /* initialization */
+               uea_dbg(INS_TO_USBDEV(sc), "modem initializing\n");
+               return 0;
+
+       case 2:         /* operational */
+               uea_vdbg(INS_TO_USBDEV(sc), "modem operational\n");
+               break;
+
+       case 3:         /* fail ... */
+               uea_info(INS_TO_USBDEV(sc), "modem synchronization failed\n");
+               return -EAGAIN;
+
+       case 4 ... 6:   /* test state */
+               uea_warn(INS_TO_USBDEV(sc),
+                               "modem in test mode - not supported\n");
+               return -EAGAIN;
+
+       case 7:         /* fast-retain ... */
+               uea_info(INS_TO_USBDEV(sc), "modem in fast-retain mode\n");
+               return 0;
+       default:
+               uea_err(INS_TO_USBDEV(sc), "modem invalid SW mode %d\n",
+                       GET_STATUS(sc->stats.phy.state));
+               return -EAGAIN;
+       }
+
+       if (GET_STATUS(data) != 2) {
+               uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_OFF, 0, NULL);
+               uea_info(INS_TO_USBDEV(sc), "modem operational\n");
+
+               /* release the dsp firmware as it is not needed until
+                * the next failure
+                */
+               if (sc->dsp_firm) {
+                       release_firmware(sc->dsp_firm);
+                       sc->dsp_firm = NULL;
+               }
+
+               ret = uea_read_cmv(sc, SA_INFO, 10, &sc->stats.phy.firmid);
+               if (ret < 0)
+                       return ret;
+               uea_info(INS_TO_USBDEV(sc), "ATU-R firmware version : %x\n",
+                               sc->stats.phy.firmid);
+       }
+
+       /* always update it as atm layer could not be init when we switch to
+        * operational state
+        */
+       UPDATE_ATM_STAT(signal, ATM_PHY_SIG_FOUND);
+
+       /* wake up processes waiting for synchronization */
+       wake_up(&sc->sync_q);
+
+       ret = uea_read_cmv(sc, SA_DIAG, 2, &sc->stats.phy.flags);
+       if (ret < 0)
+               return ret;
+       sc->stats.phy.mflags |= sc->stats.phy.flags;
+
+       /* in case of a flags ( for example delineation LOSS (& 0x10)),
+        * we check the status again in order to detect the failure earlier
+        */
+       if (sc->stats.phy.flags) {
+               uea_dbg(INS_TO_USBDEV(sc), "Stat flag = %d\n",
+                      sc->stats.phy.flags);
+               return 0;
+       }
+
+       ret = uea_read_cmv(sc, SA_RATE, 0, &data);
+       if (ret < 0)
+               return ret;
+
+       /* in bulk mode the modem have problem with high rate
+        * changing internal timing could improve things, but the
+        * value is misterious.
+        * ADI930 don't support it (-EPIPE error).
+        */
+       if (UEA_CHIP_VERSION(sc) != ADI930
+                   && sc->stats.phy.dsrate != (data >> 16) * 32) {
+               /* Original timming from ADI(used in windows driver)
+                * 0x20ffff>>16 * 32 = 32 * 32 = 1Mbits
+                */
+               u16 timeout = (data <= 0x20ffff) ? 0 : 1;
+               ret = uea_request(sc, UEA_SET_TIMEOUT, timeout, 0, NULL);
+               uea_info(INS_TO_USBDEV(sc),
+                               "setting new timeout %d%s\n", timeout,
+                               ret < 0?" failed":"");
+       }
+       sc->stats.phy.dsrate = (data >> 16) * 32;
+       sc->stats.phy.usrate = (data & 0xffff) * 32;
+       UPDATE_ATM_STAT(link_rate, sc->stats.phy.dsrate * 1000 / 424);
+
+       ret = uea_read_cmv(sc, SA_DIAG, 23, &data);
+       if (ret < 0)
+               return ret;
+       sc->stats.phy.dsattenuation = (data & 0xff) / 2;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 47, &data);
+       if (ret < 0)
+               return ret;
+       sc->stats.phy.usattenuation = (data & 0xff) / 2;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 25, &sc->stats.phy.dsmargin);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 49, &sc->stats.phy.usmargin);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 51, &sc->stats.phy.rxflow);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 52, &sc->stats.phy.txflow);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 54, &sc->stats.phy.dsunc);
+       if (ret < 0)
+               return ret;
+
+       /* only for atu-c */
+       ret = uea_read_cmv(sc, SA_DIAG, 58, &sc->stats.phy.usunc);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_DIAG, 53, &sc->stats.phy.dscorr);
+       if (ret < 0)
+               return ret;
+
+       /* only for atu-c */
+       ret = uea_read_cmv(sc, SA_DIAG, 57, &sc->stats.phy.uscorr);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_INFO, 8, &sc->stats.phy.vidco);
+       if (ret < 0)
+               return ret;
+
+       ret = uea_read_cmv(sc, SA_INFO, 13, &sc->stats.phy.vidcpe);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+static int request_cmvs(struct uea_softc *sc,
+                struct uea_cmvs **cmvs, const struct firmware **fw)
+{
+       int ret, size;
+       u8 *data;
+       char *file;
+       static char cmv_name[256] = FW_DIR;
+
+       if (cmv_file[sc->modem_index] == NULL) {
+               if (UEA_CHIP_VERSION(sc) == ADI930)
+                       file = (IS_ISDN(sc)) ? "CMV9i.bin" : "CMV9p.bin";
+               else
+                       file = (IS_ISDN(sc)) ? "CMVei.bin" : "CMVep.bin";
+       } else
+               file = cmv_file[sc->modem_index];
+
+       strcpy(cmv_name, FW_DIR);
+       strlcat(cmv_name, file, sizeof(cmv_name));
+
+       ret = request_firmware(fw, cmv_name, &sc->usb_dev->dev);
+       if (ret < 0) {
+               uea_err(INS_TO_USBDEV(sc),
+                      "requesting firmware %s failed with error %d\n",
+                      cmv_name, ret);
+               return ret;
+       }
+
+       data = (u8 *) (*fw)->data;
+       size = *data * sizeof(struct uea_cmvs) + 1;
+       if (size != (*fw)->size) {
+               uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n",
+                      cmv_name);
+               release_firmware(*fw);
+               return -EILSEQ;
+       }
+
+       *cmvs = (struct uea_cmvs *)(data + 1);
+       return *data;
+}
+
+/* Start boot post firmware modem:
+ * - send reset commands through usb control pipe
+ * - start workqueue for DSP loading
+ * - send CMV options to modem
+ */
+
+static int uea_start_reset(struct uea_softc *sc)
+{
+       u16 zero = 0;   /* ;-) */
+       int i, len, ret;
+       struct uea_cmvs *cmvs;
+       const struct firmware *cmvs_fw;
+
+       uea_enters(INS_TO_USBDEV(sc));
+       uea_info(INS_TO_USBDEV(sc), "(re)booting started\n");
+
+       sc->booting = 1;
+       UPDATE_ATM_STAT(signal, ATM_PHY_SIG_LOST);
+
+       /* reset statistics */
+       memset(&sc->stats, 0, sizeof(struct uea_stats));
+
+       /* tell the modem that we want to boot in IDMA mode */
+       uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_ON, 0, NULL);
+       uea_request(sc, UEA_SET_MODE, UEA_BOOT_IDMA, 0, NULL);
+
+       /* enter reset mode */
+       uea_request(sc, UEA_SET_MODE, UEA_START_RESET, 0, NULL);
+
+       /* original driver use 200ms, but windows driver use 100ms */
+       msleep(100);
+
+       /* leave reset mode */
+       uea_request(sc, UEA_SET_MODE, UEA_END_RESET, 0, NULL);
+
+       /* clear tx and rx mailboxes */
+       uea_request(sc, UEA_SET_2183_DATA, UEA_MPTX_MAILBOX, 2, &zero);
+       uea_request(sc, UEA_SET_2183_DATA, UEA_MPRX_MAILBOX, 2, &zero);
+       uea_request(sc, UEA_SET_2183_DATA, UEA_SWAP_MAILBOX, 2, &zero);
+
+       msleep(1000);
+       sc->cmv_function = MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY);
+       sc->booting = 0;
+
+       /* start loading DSP */
+       sc->pageno = 0;
+       sc->ovl = 0;
+       schedule_work(&sc->task);
+
+       /* wait for modem ready CMV */
+       ret = wait_cmv_ack(sc);
+       if (ret < 0)
+               return ret;
+
+       /* Enter in R-IDLE (cmv) until instructed otherwise */
+       ret = uea_write_cmv(sc, SA_CNTL, 0, 1);
+       if (ret < 0)
+               return ret;
+
+       /* get options */
+       ret = len = request_cmvs(sc, &cmvs, &cmvs_fw);
+       if (ret < 0)
+               return ret;
+
+       /* send options */
+       for (i = 0; i < len; i++) {
+               ret = uea_write_cmv(sc, FW_GET_LONG(&cmvs[i].address),
+                                       FW_GET_WORD(&cmvs[i].offset),
+                                       FW_GET_LONG(&cmvs[i].data));
+               if (ret < 0)
+                       goto out;
+       }
+       /* Enter in R-ACT-REQ */
+       ret = uea_write_cmv(sc, SA_CNTL, 0, 2);
+out:
+       release_firmware(cmvs_fw);
+       sc->reset = 0;
+       uea_leaves(INS_TO_USBDEV(sc));
+       return ret;
+}
+
+/*
+ * In case of an error wait 1s before rebooting the modem
+ * if the modem don't request reboot (-EAGAIN).
+ * Monitor the modem every 1s.
+ */
+
+static int uea_kthread(void *data)
+{
+       struct uea_softc *sc = data;
+       int ret = -EAGAIN;
+
+       uea_enters(INS_TO_USBDEV(sc));
+       while (!kthread_should_stop()) {
+               if (ret < 0 || sc->reset)
+                       ret = uea_start_reset(sc);
+               if (!ret)
+                       ret = uea_stat(sc);
+               if (ret != -EAGAIN)
+                       msleep(1000);
+       }
+       uea_leaves(INS_TO_USBDEV(sc));
+       return ret;
+}
+
+/* Load second usb firmware for ADI930 chip */
+static int load_XILINX_firmware(struct uea_softc *sc)
+{
+       const struct firmware *fw_entry;
+       int ret, size, u, ln;
+       u8 *pfw, value;
+       char *fw_name = FW_DIR "930-fpga.bin";
+
+       uea_enters(INS_TO_USBDEV(sc));
+
+       ret = request_firmware(&fw_entry, fw_name, &sc->usb_dev->dev);
+       if (ret) {
+               uea_err(INS_TO_USBDEV(sc), "firmware %s is not available\n",
+                      fw_name);
+               goto err0;
+       }
+
+       pfw = fw_entry->data;
+       size = fw_entry->size;
+       if (size != 0x577B) {
+               uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n",
+                      fw_name);
+               ret = -EILSEQ;
+               goto err1;
+       }
+       for (u = 0; u < size; u += ln) {
+               ln = min(size - u, 64);
+               ret = uea_request(sc, 0xe, 0, ln, pfw + u);
+               if (ret < 0) {
+                       uea_err(INS_TO_USBDEV(sc),
+                              "elsa download data failed (%d)\n", ret);
+                       goto err1;
+               }
+       }
+
+       /* finish to send the fpga
+        */
+       ret = uea_request(sc, 0xe, 1, 0, NULL);
+       if (ret < 0) {
+               uea_err(INS_TO_USBDEV(sc),
+                               "elsa download data failed (%d)\n", ret);
+               goto err1;
+       }
+
+       /*
+        * Tell the modem we finish : de-assert reset
+        */
+       value = 0;
+       ret = uea_send_modem_cmd(sc->usb_dev, 0xe, 1, &value);
+       if (ret < 0)
+               uea_err(sc->usb_dev, "elsa de-assert failed with error %d\n", ret);
+
+
+err1:
+       release_firmware(fw_entry);
+err0:
+       uea_leaves(INS_TO_USBDEV(sc));
+       return ret;
+}
+
+static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv)
+{
+       uea_enters(INS_TO_USBDEV(sc));
+       if (le16_to_cpu(cmv->wPreamble) != PREAMBLE)
+               goto bad1;
+
+       if (cmv->bDirection != MODEMTOHOST)
+               goto bad1;
+
+       /* FIXME : ADI930 reply wrong preambule (func = 2, sub = 2) to
+        * the first MEMACESS cmv. Ignore it...
+        */
+       if (cmv->bFunction != sc->cmv_function) {
+               if (UEA_CHIP_VERSION(sc) == ADI930
+                               && cmv->bFunction ==  MAKEFUNCTION(2, 2)) {
+                       cmv->wIndex = cpu_to_le16(sc->cmv_idx);
+                       put_unaligned(cpu_to_le32(sc->cmv_address), &cmv->dwSymbolicAddress);
+                       cmv->wOffsetAddress = cpu_to_le16(sc->cmv_offset);
+               }
+               else
+                       goto bad2;
+       }
+
+       if (cmv->bFunction == MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY)) {
+               wake_up_cmv_ack(sc);
+               return;
+       }
+
+       /* in case of MEMACCESS */
+       if (le16_to_cpu(cmv->wIndex) != sc->cmv_idx ||
+           le32_to_cpu(get_unaligned(&cmv->dwSymbolicAddress)) !=
+           sc->cmv_address
+           || le16_to_cpu(cmv->wOffsetAddress) != sc->cmv_offset)
+               goto bad2;
+
+       sc->data = le32_to_cpu(get_unaligned(&cmv->dwData));
+       sc->data = sc->data << 16 | sc->data >> 16;
+
+       wake_up_cmv_ack(sc);
+       return;
+
+bad2:
+       uea_err(INS_TO_USBDEV(sc), "unexpected cmv received,"
+                       "Function : %d, Subfunction : %d\n",
+                       FUNCTION_TYPE(cmv->bFunction),
+                       FUNCTION_SUBTYPE(cmv->bFunction));
+       return;
+
+bad1:
+       uea_err(INS_TO_USBDEV(sc), "invalid cmv received, "
+                       "wPreamble %d, bDirection %d\n",
+                       le16_to_cpu(cmv->wPreamble), cmv->bDirection);
+}
+
+/*
+ * interrupt handler
+ */
+static void uea_intr(struct urb *urb, struct pt_regs *regs)
+{
+       struct uea_softc *sc = (struct uea_softc *)urb->context;
+       struct intr_pkt *intr;
+       uea_enters(INS_TO_USBDEV(sc));
+
+       if (urb->status < 0) {
+               uea_err(INS_TO_USBDEV(sc), "uea_intr() failed with %d\n",
+                      urb->status);
+               return;
+       }
+
+       intr = (struct intr_pkt *) urb->transfer_buffer;
+
+       /* device-to-host interrupt */
+       if (intr->bType != 0x08 || sc->booting) {
+               uea_err(INS_TO_USBDEV(sc), "wrong intr\n");
+               // rebooting ?
+               // sc->reset = 1;
+               goto resubmit;
+       }
+
+       switch (le16_to_cpu(intr->wInterrupt)) {
+       case INT_LOADSWAPPAGE:
+               sc->pageno = intr->bSwapPageNo;
+               sc->ovl = intr->bOvl >> 4 | intr->bOvl << 4;
+               schedule_work(&sc->task);
+               break;
+
+       case INT_INCOMINGCMV:
+               uea_dispatch_cmv(sc, &intr->u.s2.cmv);
+               break;
+
+       default:
+               uea_err(INS_TO_USBDEV(sc), "unknown intr %u\n",
+                      le16_to_cpu(intr->wInterrupt));
+       }
+
+resubmit:
+       usb_submit_urb(sc->urb_int, GFP_ATOMIC);
+}
+
+/*
+ * Start the modem : init the data and start kernel thread
+ */
+static int uea_boot(struct uea_softc *sc)
+{
+       int ret;
+       struct intr_pkt *intr;
+
+       uea_enters(INS_TO_USBDEV(sc));
+
+       INIT_WORK(&sc->task, uea_load_page, sc);
+       init_waitqueue_head(&sc->sync_q);
+       init_waitqueue_head(&sc->cmv_ack_wait);
+
+       if (UEA_CHIP_VERSION(sc) == ADI930)
+               load_XILINX_firmware(sc);
+
+       intr = kmalloc(INTR_PKT_SIZE, GFP_KERNEL);
+       if (!intr) {
+               uea_err(INS_TO_USBDEV(sc),
+                      "cannot allocate interrupt package\n");
+               uea_leaves(INS_TO_USBDEV(sc));
+               return -ENOMEM;
+       }
+
+       sc->urb_int = usb_alloc_urb(0, GFP_KERNEL);
+       if (!sc->urb_int) {
+               uea_err(INS_TO_USBDEV(sc), "cannot allocate interrupt URB\n");
+               goto err;
+       }
+
+       usb_fill_int_urb(sc->urb_int, sc->usb_dev,
+                        usb_rcvintpipe(sc->usb_dev, UEA_INTR_PIPE),
+                        intr, INTR_PKT_SIZE, uea_intr, sc,
+                        sc->usb_dev->actconfig->interface[0]->altsetting[0].
+                        endpoint[0].desc.bInterval);
+
+       ret = usb_submit_urb(sc->urb_int, GFP_KERNEL);
+       if (ret < 0) {
+               uea_err(INS_TO_USBDEV(sc),
+                      "urb submition failed with error %d\n", ret);
+               goto err1;
+       }
+
+       sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm");
+       if (sc->kthread == ERR_PTR(-ENOMEM)) {
+               uea_err(INS_TO_USBDEV(sc), "failed to create thread\n");
+               goto err2;
+       }
+
+       uea_leaves(INS_TO_USBDEV(sc));
+       return 0;
+
+err2:
+       usb_kill_urb(sc->urb_int);
+err1:
+       kfree(intr);
+err:
+       usb_free_urb(sc->urb_int);
+       uea_leaves(INS_TO_USBDEV(sc));
+       return -ENOMEM;
+}
+
+/*
+ * Stop the modem : kill kernel thread and free data
+ */
+static void uea_stop(struct uea_softc *sc)
+{
+       int ret;
+       uea_enters(INS_TO_USBDEV(sc));
+       ret = kthread_stop(sc->kthread);
+       uea_info(INS_TO_USBDEV(sc), "kthread finish with status %d\n", ret);
+
+       /* stop any pending boot process */
+       flush_scheduled_work();
+
+       uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_ON, 0, NULL);
+
+       usb_kill_urb(sc->urb_int);
+       kfree(sc->urb_int->transfer_buffer);
+       usb_free_urb(sc->urb_int);
+
+       if (sc->dsp_firm)
+               release_firmware(sc->dsp_firm);
+       uea_leaves(INS_TO_USBDEV(sc));
+}
+
+/* syfs interface */
+static struct uea_softc *dev_to_uea(struct device *dev)
+{
+       struct usb_interface *intf;
+       struct usbatm_data *usbatm;
+
+       intf = to_usb_interface(dev);
+       if (!intf)
+               return NULL;
+
+       usbatm = usb_get_intfdata(intf);
+       if (!usbatm)
+               return NULL;
+
+       return usbatm->driver_data;
+}
+
+static ssize_t read_status(struct device *dev, struct device_attribute *attr,
+               char *buf)
+{
+       int ret = -ENODEV;
+       struct uea_softc *sc;
+
+       down(&uea_semaphore);
+       sc = dev_to_uea(dev);
+       if (!sc)
+               goto out;
+       ret = snprintf(buf, 10, "%08x\n", sc->stats.phy.state);
+out:
+       up(&uea_semaphore);
+       return ret;
+}
+
+static ssize_t reboot(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
+{
+       int ret = -ENODEV;
+       struct uea_softc *sc;
+
+       down(&uea_semaphore);
+       sc = dev_to_uea(dev);
+       if (!sc)
+               goto out;
+       sc->reset = 1;
+       ret = count;
+out:
+       up(&uea_semaphore);
+       return ret;
+}
+
+static DEVICE_ATTR(stat_status, S_IWUGO | S_IRUGO, read_status, reboot);
+
+static ssize_t read_human_status(struct device *dev, struct device_attribute *attr,
+               char *buf)
+{
+       int ret = -ENODEV;
+       struct uea_softc *sc;
+
+       down(&uea_semaphore);
+       sc = dev_to_uea(dev);
+       if (!sc)
+               goto out;
+
+       switch (GET_STATUS(sc->stats.phy.state)) {
+       case 0:
+               ret = sprintf(buf, "Modem is booting\n");
+               break;
+       case 1:
+               ret = sprintf(buf, "Modem is initializing\n");
+               break;
+       case 2:
+               ret = sprintf(buf, "Modem is operational\n");
+               break;
+       default:
+               ret = sprintf(buf, "Modem synchronization failed\n");
+               break;
+       }
+out:
+       up(&uea_semaphore);
+       return ret;
+}
+
+static DEVICE_ATTR(stat_human_status, S_IWUGO | S_IRUGO, read_human_status, NULL);
+
+static ssize_t read_delin(struct device *dev, struct device_attribute *attr,
+               char *buf)
+{
+       int ret = -ENODEV;
+       struct uea_softc *sc;
+
+       down(&uea_semaphore);
+       sc = dev_to_uea(dev);
+       if (!sc)
+               goto out;
+
+       if (sc->stats.phy.flags & 0x0C00)
+               ret = sprintf(buf, "ERROR\n");
+       else if (sc->stats.phy.flags & 0x0030)
+               ret = sprintf(buf, "LOSS\n");
+       else
+               ret = sprintf(buf, "GOOD\n");
+out:
+       up(&uea_semaphore);
+       return ret;
+}
+
+static DEVICE_ATTR(stat_delin, S_IWUGO | S_IRUGO, read_delin, NULL);
+
+#define UEA_ATTR(name, reset)                                  \
+                                                               \
+static ssize_t read_##name(struct device *dev,                         \
+               struct device_attribute *attr, char *buf)       \
+{                                                              \
+       int ret = -ENODEV;                                      \
+       struct uea_softc *sc;                                   \
+                                                               \
+       down(&uea_semaphore);                                   \
+       sc = dev_to_uea(dev);                                   \
+       if (!sc)                                                \
+               goto out;                                       \
+       ret = snprintf(buf, 10, "%08x\n", sc->stats.phy.name);  \
+       if (reset)                                              \
+               sc->stats.phy.name = 0;                         \
+out:                                                           \
+       up(&uea_semaphore);                                     \
+       return ret;                                             \
+}                                                              \
+                                                               \
+static DEVICE_ATTR(stat_##name, S_IRUGO, read_##name, NULL)
+
+UEA_ATTR(mflags, 1);
+UEA_ATTR(vidcpe, 0);
+UEA_ATTR(usrate, 0);
+UEA_ATTR(dsrate, 0);
+UEA_ATTR(usattenuation, 0);
+UEA_ATTR(dsattenuation, 0);
+UEA_ATTR(usmargin, 0);
+UEA_ATTR(dsmargin, 0);
+UEA_ATTR(txflow, 0);
+UEA_ATTR(rxflow, 0);
+UEA_ATTR(uscorr, 0);
+UEA_ATTR(dscorr, 0);
+UEA_ATTR(usunc, 0);
+UEA_ATTR(dsunc, 0);
+
+/* Retrieve the device End System Identifier (MAC) */
+
+#define htoi(x) (isdigit(x) ? x-'0' : toupper(x)-'A'+10)
+static int uea_getesi(struct uea_softc *sc, u_char * esi)
+{
+       unsigned char mac_str[2 * ETH_ALEN + 1];
+       int i;
+       if (usb_string
+           (sc->usb_dev, sc->usb_dev->descriptor.iSerialNumber, mac_str,
+            sizeof(mac_str)) != 2 * ETH_ALEN)
+               return 1;
+
+       for (i = 0; i < ETH_ALEN; i++)
+               esi[i] = htoi(mac_str[2 * i]) * 16 + htoi(mac_str[2 * i + 1]);
+
+       return 0;
+}
+
+/* ATM stuff */
+static int uea_atm_open(struct usbatm_data *usbatm, struct atm_dev *atm_dev)
+{
+       struct uea_softc *sc = usbatm->driver_data;
+
+       return uea_getesi(sc, atm_dev->esi);
+}
+
+static int uea_heavy(struct usbatm_data *usbatm, struct usb_interface *intf)
+{
+       struct uea_softc *sc = usbatm->driver_data;
+
+       wait_event(sc->sync_q, IS_OPERATIONAL(sc));
+
+       return 0;
+
+}
+
+static int claim_interface(struct usb_device *usb_dev,
+                          struct usbatm_data *usbatm, int ifnum)
+{
+       int ret;
+       struct usb_interface *intf = usb_ifnum_to_if(usb_dev, ifnum);
+
+       if (!intf) {
+               uea_err(usb_dev, "interface %d not found\n", ifnum);
+               return -ENODEV;
+       }
+
+       ret = usb_driver_claim_interface(&uea_driver, intf, usbatm);
+       if (ret != 0)
+               uea_err(usb_dev, "can't claim interface %d, error %d\n", ifnum,
+                      ret);
+       return ret;
+}
+
+static void create_fs_entries(struct uea_softc *sc, struct usb_interface *intf)
+{
+       /* sysfs interface */
+       device_create_file(&intf->dev, &dev_attr_stat_status);
+       device_create_file(&intf->dev, &dev_attr_stat_mflags);
+       device_create_file(&intf->dev, &dev_attr_stat_human_status);
+       device_create_file(&intf->dev, &dev_attr_stat_delin);
+       device_create_file(&intf->dev, &dev_attr_stat_vidcpe);
+       device_create_file(&intf->dev, &dev_attr_stat_usrate);
+       device_create_file(&intf->dev, &dev_attr_stat_dsrate);
+       device_create_file(&intf->dev, &dev_attr_stat_usattenuation);
+       device_create_file(&intf->dev, &dev_attr_stat_dsattenuation);
+       device_create_file(&intf->dev, &dev_attr_stat_usmargin);
+       device_create_file(&intf->dev, &dev_attr_stat_dsmargin);
+       device_create_file(&intf->dev, &dev_attr_stat_txflow);
+       device_create_file(&intf->dev, &dev_attr_stat_rxflow);
+       device_create_file(&intf->dev, &dev_attr_stat_uscorr);
+       device_create_file(&intf->dev, &dev_attr_stat_dscorr);
+       device_create_file(&intf->dev, &dev_attr_stat_usunc);
+       device_create_file(&intf->dev, &dev_attr_stat_dsunc);
+}
+
+static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
+                  const struct usb_device_id *id, int *heavy)
+{
+       struct usb_device *usb = interface_to_usbdev(intf);
+       struct uea_softc *sc;
+       int ret, ifnum = intf->altsetting->desc.bInterfaceNumber;
+
+       uea_enters(usb);
+
+       /* interface 0 is for firmware/monitoring */
+       if (ifnum != UEA_INTR_IFACE_NO)
+               return -ENODEV;
+
+       *heavy = sync_wait[modem_index];
+
+       /* interface 1 is for outbound traffic */
+       ret = claim_interface(usb, usbatm, UEA_US_IFACE_NO);
+       if (ret < 0)
+               return ret;
+
+       /* ADI930 has only 2 interfaces and inbound traffic
+        * is on interface 1
+        */
+       if (UEA_CHIP_VERSION(id) != ADI930) {
+               /* interface 2 is for inbound traffic */
+               ret = claim_interface(usb, usbatm, UEA_DS_IFACE_NO);
+               if (ret < 0)
+                       return ret;
+       }
+
+       sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL);
+       if (!sc) {
+               uea_err(INS_TO_USBDEV(sc), "uea_init: not enough memory !\n");
+               return -ENOMEM;
+       }
+
+       sc->usb_dev = usb;
+       usbatm->driver_data = sc;
+       sc->usbatm = usbatm;
+       sc->modem_index = (modem_index < NB_MODEM) ? modem_index++ : 0;
+       sc->driver_info = id->driver_info;
+
+       ret = uea_boot(sc);
+       if (ret < 0) {
+               kfree(sc);
+               return ret;
+       }
+
+       create_fs_entries(sc, intf);
+       return 0;
+}
+
+static void destroy_fs_entries(struct uea_softc *sc, struct usb_interface *intf)
+{
+       /* sysfs interface */
+       device_remove_file(&intf->dev, &dev_attr_stat_status);
+       device_remove_file(&intf->dev, &dev_attr_stat_mflags);
+       device_remove_file(&intf->dev, &dev_attr_stat_human_status);
+       device_remove_file(&intf->dev, &dev_attr_stat_delin);
+       device_remove_file(&intf->dev, &dev_attr_stat_vidcpe);
+       device_remove_file(&intf->dev, &dev_attr_stat_usrate);
+       device_remove_file(&intf->dev, &dev_attr_stat_dsrate);
+       device_remove_file(&intf->dev, &dev_attr_stat_usattenuation);
+       device_remove_file(&intf->dev, &dev_attr_stat_dsattenuation);
+       device_remove_file(&intf->dev, &dev_attr_stat_usmargin);
+       device_remove_file(&intf->dev, &dev_attr_stat_dsmargin);
+       device_remove_file(&intf->dev, &dev_attr_stat_txflow);
+       device_remove_file(&intf->dev, &dev_attr_stat_rxflow);
+       device_remove_file(&intf->dev, &dev_attr_stat_uscorr);
+       device_remove_file(&intf->dev, &dev_attr_stat_dscorr);
+       device_remove_file(&intf->dev, &dev_attr_stat_usunc);
+       device_remove_file(&intf->dev, &dev_attr_stat_dsunc);
+}
+
+static void uea_unbind(struct usbatm_data *usbatm, struct usb_interface *intf)
+{
+       struct uea_softc *sc = usbatm->driver_data;
+
+       destroy_fs_entries(sc, intf);
+       uea_stop(sc);
+       kfree(sc);
+}
+
+static struct usbatm_driver uea_usbatm_driver = {
+       .driver_name = "ueagle-atm",
+       .owner = THIS_MODULE,
+       .bind = uea_bind,
+       .atm_start = uea_atm_open,
+       .unbind = uea_unbind,
+       .heavy_init = uea_heavy,
+       .in = UEA_BULK_DATA_PIPE,
+       .out = UEA_BULK_DATA_PIPE,
+};
+
+static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id)
+{
+       struct usb_device *usb = interface_to_usbdev(intf);
+
+       uea_enters(usb);
+       uea_info(usb, "ADSL device founded vid (%#X) pid (%#X) : %s\n",
+              le16_to_cpu(usb->descriptor.idVendor),
+              le16_to_cpu(usb->descriptor.idProduct),
+              chip_name[UEA_CHIP_VERSION(id)]);
+
+       usb_reset_device(usb);
+
+       if (UEA_IS_PREFIRM(id))
+               return uea_load_firmware(usb, UEA_CHIP_VERSION(id));
+
+       return usbatm_usb_probe(intf, id, &uea_usbatm_driver);
+}
+
+static void uea_disconnect(struct usb_interface *intf)
+{
+       struct usb_device *usb = interface_to_usbdev(intf);
+       int ifnum = intf->altsetting->desc.bInterfaceNumber;
+       uea_enters(usb);
+
+       /* ADI930 has 2 interfaces and eagle 3 interfaces.
+        * Pre-firmware device has one interface
+        */
+       if (usb->config->desc.bNumInterfaces != 1 && ifnum == 0) {
+               down(&uea_semaphore);
+               usbatm_usb_disconnect(intf);
+               up(&uea_semaphore);
+               uea_info(usb, "ADSL device removed\n");
+       }
+
+       uea_leaves(usb);
+}
+
+/*
+ * List of supported VID/PID
+ */
+static const struct usb_device_id uea_ids[] = {
+       {USB_DEVICE(ELSA_VID,   ELSA_PID_PREFIRM),      .driver_info = ADI930 | PREFIRM},
+       {USB_DEVICE(ELSA_VID,   ELSA_PID_PSTFIRM),      .driver_info = ADI930 | PSTFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_I_PID_PREFIRM),   .driver_info = EAGLE_I | PREFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_I_PID_PSTFIRM),   .driver_info = EAGLE_I | PSTFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_II_PID_PREFIRM),  .driver_info = EAGLE_II | PREFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_II_PID_PSTFIRM),  .driver_info = EAGLE_II | PSTFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_IIC_PID_PREFIRM), .driver_info = EAGLE_II | PREFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_IIC_PID_PSTFIRM), .driver_info = EAGLE_II | PSTFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_III_PID_PREFIRM), .driver_info = EAGLE_III | PREFIRM},
+       {USB_DEVICE(EAGLE_VID,  EAGLE_III_PID_PSTFIRM), .driver_info = EAGLE_III | PSTFIRM},
+       {USB_DEVICE(USR_VID,    MILLER_A_PID_PREFIRM),  .driver_info = EAGLE_I | PREFIRM},
+       {USB_DEVICE(USR_VID,    MILLER_A_PID_PSTFIRM),  .driver_info = EAGLE_I | PSTFIRM},
+       {USB_DEVICE(USR_VID,    MILLER_B_PID_PREFIRM),  .driver_info = EAGLE_I | PREFIRM},
+       {USB_DEVICE(USR_VID,    MILLER_B_PID_PSTFIRM),  .driver_info = EAGLE_I | PSTFIRM},
+       {USB_DEVICE(USR_VID,    HEINEKEN_A_PID_PREFIRM),.driver_info = EAGLE_I | PREFIRM},
+       {USB_DEVICE(USR_VID,    HEINEKEN_A_PID_PSTFIRM),.driver_info = EAGLE_I | PSTFIRM},
+       {USB_DEVICE(USR_VID,    HEINEKEN_B_PID_PREFIRM),.driver_info = EAGLE_I | PREFIRM},
+       {USB_DEVICE(USR_VID,    HEINEKEN_B_PID_PSTFIRM),.driver_info = EAGLE_I | PSTFIRM},
+       {}
+};
+
+/*
+ * USB driver descriptor
+ */
+static struct usb_driver uea_driver = {
+       .name = "ueagle-atm",
+       .id_table = uea_ids,
+       .probe = uea_probe,
+       .disconnect = uea_disconnect,
+};
+
+MODULE_DEVICE_TABLE(usb, uea_ids);
+
+/**
+ * uea_init - Initialize the module.
+ *      Register to USB subsystem
+ */
+static int __init uea_init(void)
+{
+       printk(KERN_INFO "[ueagle-atm] driver " EAGLEUSBVERSION " loaded\n");
+
+       usb_register(&uea_driver);
+
+       return 0;
+}
+
+module_init(uea_init);
+
+/**
+ * uea_exit  -  Destroy module
+ *    Deregister with USB subsystem
+ */
+static void __exit uea_exit(void)
+{
+       /*
+        * This calls automatically the uea_disconnect method if necessary:
+        */
+       usb_deregister(&uea_driver);
+
+       printk(KERN_INFO "[ueagle-atm] driver unloaded\n");
+}
+
+module_exit(uea_exit);
+
+MODULE_AUTHOR("Damien Bergamini/Matthieu Castet/Stanislaw W. Gruszka");
+MODULE_DESCRIPTION("ADI 930/Eagle USB ADSL Modem driver");
+MODULE_LICENSE("Dual BSD/GPL");
index c466739428b2c501eb99c809f02226f55c7c9a76..9baa6296fc95de6992a7795c948e5cf8b190f8c5 100644 (file)
@@ -646,14 +646,14 @@ static void usbatm_destroy_instance(struct kref *kref)
        kfree(instance);
 }
 
-void usbatm_get_instance(struct usbatm_data *instance)
+static void usbatm_get_instance(struct usbatm_data *instance)
 {
        dbg("%s", __func__);
 
        kref_get(&instance->refcount);
 }
 
-void usbatm_put_instance(struct usbatm_data *instance)
+static void usbatm_put_instance(struct usbatm_data *instance)
 {
        dbg("%s", __func__);
 
@@ -879,7 +879,7 @@ static int usbatm_atm_init(struct usbatm_data *instance)
 
  fail:
        instance->atm_dev = NULL;
-       shutdown_atm_dev(atm_dev); /* usbatm_atm_dev_close will eventually be called */
+       atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */
        return ret;
 }
 
@@ -1164,7 +1164,7 @@ void usbatm_usb_disconnect(struct usb_interface *intf)
 
        /* ATM finalize */
        if (instance->atm_dev)
-               shutdown_atm_dev(instance->atm_dev);
+               atm_dev_deregister(instance->atm_dev);
 
        usbatm_put_instance(instance);  /* taken in usbatm_usb_probe */
 }
index 7fe7fb484d1048b3be77508072ed4d1dcc903a93..5c76e3aaaa5e9aaa290936da377ed574011500c4 100644 (file)
@@ -140,7 +140,6 @@ static int xusbatm_usb_probe(struct usb_interface *intf,
 }
 
 static struct usb_driver xusbatm_usb_driver = {
-       .owner          = THIS_MODULE,
        .name           = xusbatm_driver_name,
        .probe          = xusbatm_usb_probe,
        .disconnect     = usbatm_usb_disconnect,
index 50858273f8d3e980ea1651f6b47b51ff2656623c..3ad9ee8b84a9bdb05d15d94c21d12fad90f9dee4 100644 (file)
@@ -2732,7 +2732,6 @@ static struct usb_device_id usb_audio_ids [] = {
 MODULE_DEVICE_TABLE (usb, usb_audio_ids);
 
 static struct usb_driver usb_audio_driver = {
-       .owner =        THIS_MODULE,
        .name =         "audio",
        .probe =        usb_audio_probe,
        .disconnect =   usb_audio_disconnect,
index 1b4751412970fe2cb4ff7674997217199b632156..248279e44c99d57c969a8ef03057b850da0cfb57 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com>
  * Copyright (c) 2000 Vojtech Pavlik   <vojtech@suse.cz>
  * Copyright (c) 2004 Oliver Neukum    <oliver@neukum.name>
+ * Copyright (c) 2005 David Kubicek    <dave@awk.cz>
  *
  * USB Abstract Control Model driver for USB modems and ISDN adapters
  *
@@ -29,6 +30,7 @@
  *             config we want, sysadmin changes bConfigurationValue in sysfs.
  *     v0.23 - use softirq for rx processing, as needed by tty layer
  *     v0.24 - change probe method to evaluate CDC union descriptor
+ *     v0.25 - downstream tasks paralelized to maximize throughput
  */
 
 /*
 #include <linux/usb_cdc.h>
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
+#include <linux/list.h>
 
 #include "cdc-acm.h"
 
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.23"
-#define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik"
+#define DRIVER_VERSION "v0.25"
+#define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek"
 #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
 
 static struct usb_driver acm_driver;
@@ -284,7 +287,9 @@ exit:
 /* data interface returns incoming bytes, or we got unthrottled */
 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
 {
-       struct acm *acm = urb->context;
+       struct acm_rb *buf;
+       struct acm_ru *rcv = urb->context;
+       struct acm *acm = rcv->instance;
        dbg("Entering acm_read_bulk with status %d\n", urb->status);
 
        if (!ACM_READY(acm))
@@ -293,49 +298,109 @@ static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
        if (urb->status)
                dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
 
-       /* calling tty_flip_buffer_push() in_irq() isn't allowed */
-       tasklet_schedule(&acm->bh);
+       buf = rcv->buffer;
+       buf->size = urb->actual_length;
+
+       spin_lock(&acm->read_lock);
+       list_add_tail(&rcv->list, &acm->spare_read_urbs);
+       list_add_tail(&buf->list, &acm->filled_read_bufs);
+       spin_unlock(&acm->read_lock);
+
+       tasklet_schedule(&acm->urb_task);
 }
 
 static void acm_rx_tasklet(unsigned long _acm)
 {
        struct acm *acm = (void *)_acm;
-       struct urb *urb = acm->readurb;
+       struct acm_rb *buf;
        struct tty_struct *tty = acm->tty;
-       unsigned char *data = urb->transfer_buffer;
+       struct acm_ru *rcv;
+       //unsigned long flags;
        int i = 0;
        dbg("Entering acm_rx_tasklet");
 
-       if (urb->actual_length > 0 && !acm->throttle)  {
-               for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
-                       /* if we insert more than TTY_FLIPBUF_SIZE characters,
-                        * we drop them. */
-                       if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-                               tty_flip_buffer_push(tty);
-                       }
-                       tty_insert_flip_char(tty, data[i], 0);
-               }
-               dbg("Handed %d bytes to tty layer", i+1);
-               tty_flip_buffer_push(tty);
+       if (!ACM_READY(acm) || acm->throttle)
+               return;
+
+next_buffer:
+       spin_lock(&acm->read_lock);
+       if (list_empty(&acm->filled_read_bufs)) {
+               spin_unlock(&acm->read_lock);
+               goto urbs;
        }
+       buf = list_entry(acm->filled_read_bufs.next,
+                        struct acm_rb, list);
+       list_del(&buf->list);
+       spin_unlock(&acm->read_lock);
+
+       dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size);
+
+       for (i = 0; i < buf->size && !acm->throttle; i++) {
+               /* if we insert more than TTY_FLIPBUF_SIZE characters,
+                  we drop them. */
+               if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+                       tty_flip_buffer_push(tty);
+               }
+               tty_insert_flip_char(tty, buf->base[i], 0);
+       }
+       tty_flip_buffer_push(tty);
 
        spin_lock(&acm->throttle_lock);
        if (acm->throttle) {
                dbg("Throtteling noticed");
-               memmove(data, data + i, urb->actual_length - i);
-               urb->actual_length -= i;
-               acm->resubmit_to_unthrottle = 1;
+               memmove(buf->base, buf->base + i, buf->size - i);
+               buf->size -= i;
                spin_unlock(&acm->throttle_lock);
+               spin_lock(&acm->read_lock);
+               list_add(&buf->list, &acm->filled_read_bufs);
+               spin_unlock(&acm->read_lock);
                return;
        }
        spin_unlock(&acm->throttle_lock);
 
-       urb->actual_length = 0;
-       urb->dev = acm->dev;
-
-       i = usb_submit_urb(urb, GFP_ATOMIC);
-       if (i)
-               dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
+       spin_lock(&acm->read_lock);
+       list_add(&buf->list, &acm->spare_read_bufs);
+       spin_unlock(&acm->read_lock);
+       goto next_buffer;
+
+urbs:
+       while (!list_empty(&acm->spare_read_bufs)) {
+               spin_lock(&acm->read_lock);
+               if (list_empty(&acm->spare_read_urbs)) {
+                       spin_unlock(&acm->read_lock);
+                       return;
+               }
+               rcv = list_entry(acm->spare_read_urbs.next,
+                                struct acm_ru, list);
+               list_del(&rcv->list);
+               spin_unlock(&acm->read_lock);
+
+               buf = list_entry(acm->spare_read_bufs.next,
+                                struct acm_rb, list);
+               list_del(&buf->list);
+
+               rcv->buffer = buf;
+
+               usb_fill_bulk_urb(rcv->urb, acm->dev,
+                                 acm->rx_endpoint,
+                                 buf->base,
+                                 acm->readsize,
+                                 acm_read_bulk, rcv);
+               rcv->urb->transfer_dma = buf->dma;
+               rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+
+               dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p\n", rcv->urb, rcv, buf);
+
+               /* This shouldn't kill the driver as unsuccessful URBs are returned to the
+                  free-urbs-pool and resubmited ASAP */
+               if (usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) {
+                       list_add(&buf->list, &acm->spare_read_bufs);
+                       spin_lock(&acm->read_lock);
+                       list_add(&rcv->list, &acm->spare_read_urbs);
+                       spin_unlock(&acm->read_lock);
+                       return;
+               }
+       }
 }
 
 /* data interface wrote those outgoing bytes */
@@ -369,6 +434,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
 {
        struct acm *acm;
        int rv = -EINVAL;
+       int i;
        dbg("Entering acm_tty_open.\n");
        
        down(&open_sem);
@@ -382,7 +448,9 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
        tty->driver_data = acm;
        acm->tty = tty;
 
-
+       /* force low_latency on so that our tty_push actually forces the data through,
+          otherwise it is scheduled, and with high data rates data can get lost. */
+       tty->low_latency = 1;
 
        if (acm->used++) {
                goto done;
@@ -394,18 +462,20 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
                goto bail_out;
        }
 
-       acm->readurb->dev = acm->dev;
-       if (usb_submit_urb(acm->readurb, GFP_KERNEL)) {
-               dbg("usb_submit_urb(read bulk) failed");
-               goto bail_out_and_unlink;
-       }
-
        if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
                goto full_bailout;
 
-       /* force low_latency on so that our tty_push actually forces the data through, 
-          otherwise it is scheduled, and with high data rates data can get lost. */
-       tty->low_latency = 1;
+       INIT_LIST_HEAD(&acm->spare_read_urbs);
+       INIT_LIST_HEAD(&acm->spare_read_bufs);
+       INIT_LIST_HEAD(&acm->filled_read_bufs);
+       for (i = 0; i < ACM_NRU; i++) {
+               list_add(&(acm->ru[i].list), &acm->spare_read_urbs);
+       }
+       for (i = 0; i < ACM_NRB; i++) {
+               list_add(&(acm->rb[i].list), &acm->spare_read_bufs);
+       }
+
+       tasklet_schedule(&acm->urb_task);
 
 done:
 err_out:
@@ -413,8 +483,6 @@ err_out:
        return rv;
 
 full_bailout:
-       usb_kill_urb(acm->readurb);
-bail_out_and_unlink:
        usb_kill_urb(acm->ctrlurb);
 bail_out:
        acm->used--;
@@ -424,18 +492,22 @@ bail_out:
 
 static void acm_tty_unregister(struct acm *acm)
 {
+       int i;
+
        tty_unregister_device(acm_tty_driver, acm->minor);
        usb_put_intf(acm->control);
        acm_table[acm->minor] = NULL;
        usb_free_urb(acm->ctrlurb);
-       usb_free_urb(acm->readurb);
        usb_free_urb(acm->writeurb);
+       for (i = 0; i < ACM_NRU; i++)
+               usb_free_urb(acm->ru[i].urb);
        kfree(acm);
 }
 
 static void acm_tty_close(struct tty_struct *tty, struct file *filp)
 {
        struct acm *acm = tty->driver_data;
+       int i;
 
        if (!acm || !acm->used)
                return;
@@ -446,7 +518,8 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp)
                        acm_set_control(acm, acm->ctrlout = 0);
                        usb_kill_urb(acm->ctrlurb);
                        usb_kill_urb(acm->writeurb);
-                       usb_kill_urb(acm->readurb);
+                       for (i = 0; i < ACM_NRU; i++)
+                               usb_kill_urb(acm->ru[i].urb);
                } else
                        acm_tty_unregister(acm);
        }
@@ -528,10 +601,7 @@ static void acm_tty_unthrottle(struct tty_struct *tty)
        spin_lock_bh(&acm->throttle_lock);
        acm->throttle = 0;
        spin_unlock_bh(&acm->throttle_lock);
-       if (acm->resubmit_to_unthrottle) {
-               acm->resubmit_to_unthrottle = 0;
-               acm_read_bulk(acm->readurb, NULL);
-       }
+       tasklet_schedule(&acm->urb_task);
 }
 
 static void acm_tty_break_ctl(struct tty_struct *tty, int state)
@@ -588,7 +658,7 @@ static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int
        return -ENOIOCTLCMD;
 }
 
-static __u32 acm_tty_speed[] = {
+static const __u32 acm_tty_speed[] = {
        0, 50, 75, 110, 134, 150, 200, 300, 600,
        1200, 1800, 2400, 4800, 9600, 19200, 38400,
        57600, 115200, 230400, 460800, 500000, 576000,
@@ -596,7 +666,7 @@ static __u32 acm_tty_speed[] = {
        2500000, 3000000, 3500000, 4000000
 };
 
-static __u8 acm_tty_size[] = {
+static const __u8 acm_tty_size[] = {
        5, 6, 7, 8
 };
 
@@ -694,6 +764,7 @@ static int acm_probe (struct usb_interface *intf,
        int call_interface_num = -1;
        int data_interface_num;
        unsigned long quirks;
+       int i;
 
        /* handle quirks deadly to normal probing*/
        quirks = (unsigned long)id->driver_info;
@@ -833,7 +904,7 @@ skip_normal_probe:
        }
 
        ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
-       readsize = le16_to_cpu(epread->wMaxPacketSize);
+       readsize = le16_to_cpu(epread->wMaxPacketSize)*2;
        acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize);
        acm->control = control_interface;
        acm->data = data_interface;
@@ -842,12 +913,14 @@ skip_normal_probe:
        acm->ctrl_caps = ac_management_function;
        acm->ctrlsize = ctrlsize;
        acm->readsize = readsize;
-       acm->bh.func = acm_rx_tasklet;
-       acm->bh.data = (unsigned long) acm;
+       acm->urb_task.func = acm_rx_tasklet;
+       acm->urb_task.data = (unsigned long) acm;
        INIT_WORK(&acm->work, acm_softint, acm);
        spin_lock_init(&acm->throttle_lock);
        spin_lock_init(&acm->write_lock);
+       spin_lock_init(&acm->read_lock);
        acm->write_ready = 1;
+       acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
 
        buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
        if (!buf) {
@@ -856,13 +929,6 @@ skip_normal_probe:
        }
        acm->ctrl_buffer = buf;
 
-       buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma);
-       if (!buf) {
-               dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n");
-               goto alloc_fail3;
-       }
-       acm->read_buffer = buf;
-
        if (acm_write_buffers_alloc(acm) < 0) {
                dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
                goto alloc_fail4;
@@ -873,10 +939,25 @@ skip_normal_probe:
                dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
                goto alloc_fail5;
        }
-       acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
-       if (!acm->readurb) {
-               dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
-               goto alloc_fail6;
+       for (i = 0; i < ACM_NRU; i++) {
+               struct acm_ru *rcv = &(acm->ru[i]);
+
+               if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) {
+                       dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)\n");
+                       goto alloc_fail7;
+               }
+
+               rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+               rcv->instance = acm;
+       }
+       for (i = 0; i < ACM_NRB; i++) {
+               struct acm_rb *buf = &(acm->rb[i]);
+
+               // Using usb_buffer_alloc instead of kmalloc as Oliver suggested
+               if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) {
+                       dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)\n");
+                       goto alloc_fail7;
+               }
        }
        acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
        if (!acm->writeurb) {
@@ -889,15 +970,9 @@ skip_normal_probe:
        acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        acm->ctrlurb->transfer_dma = acm->ctrl_dma;
 
-       usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
-                         acm->read_buffer, readsize, acm_read_bulk, acm);
-       acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
-       acm->readurb->transfer_dma = acm->read_dma;
-
        usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
                          NULL, acm->writesize, acm_write_bulk, acm);
        acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
-       /* acm->writeurb->transfer_dma = 0; */
 
        dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
 
@@ -917,14 +992,14 @@ skip_normal_probe:
        return 0;
 
 alloc_fail7:
-       usb_free_urb(acm->readurb);
-alloc_fail6:
+       for (i = 0; i < ACM_NRB; i++)
+               usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
+       for (i = 0; i < ACM_NRU; i++)
+               usb_free_urb(acm->ru[i].urb);
        usb_free_urb(acm->ctrlurb);
 alloc_fail5:
        acm_write_buffers_free(acm);
 alloc_fail4:
-       usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma);
-alloc_fail3:
        usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
 alloc_fail2:
        kfree(acm);
@@ -936,6 +1011,7 @@ static void acm_disconnect(struct usb_interface *intf)
 {
        struct acm *acm = usb_get_intfdata (intf);
        struct usb_device *usb_dev = interface_to_usbdev(intf);
+       int i;
 
        if (!acm || !acm->dev) {
                dbg("disconnect on nonexisting interface");
@@ -946,15 +1022,24 @@ static void acm_disconnect(struct usb_interface *intf)
        acm->dev = NULL;
        usb_set_intfdata (intf, NULL);
 
+       tasklet_disable(&acm->urb_task);
+
        usb_kill_urb(acm->ctrlurb);
-       usb_kill_urb(acm->readurb);
        usb_kill_urb(acm->writeurb);
+       for (i = 0; i < ACM_NRU; i++)
+               usb_kill_urb(acm->ru[i].urb);
+
+       INIT_LIST_HEAD(&acm->filled_read_bufs);
+       INIT_LIST_HEAD(&acm->spare_read_bufs);
+
+       tasklet_enable(&acm->urb_task);
 
        flush_scheduled_work(); /* wait for acm_softint */
 
        acm_write_buffers_free(acm);
-       usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma);
        usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
+       for (i = 0; i < ACM_NRB; i++)
+               usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
 
        usb_driver_release_interface(&acm_driver, acm->data);
 
@@ -1003,7 +1088,6 @@ static struct usb_device_id acm_ids[] = {
 MODULE_DEVICE_TABLE (usb, acm_ids);
 
 static struct usb_driver acm_driver = {
-       .owner =        THIS_MODULE,
        .name =         "cdc_acm",
        .probe =        acm_probe,
        .disconnect =   acm_disconnect,
index 963a5dfd209670a8d93dcc1825d24eb600af6da8..fd2aaccdcbac7a4d04cc65f74743ea92541299fe 100644 (file)
@@ -59,6 +59,9 @@
  * when processing onlcr, so we only need 2 buffers.
  */
 #define ACM_NWB  2
+#define ACM_NRU  16
+#define ACM_NRB  16
+
 struct acm_wb {
        unsigned char *buf;
        dma_addr_t dmah;
@@ -66,22 +69,43 @@ struct acm_wb {
        int use;
 };
 
+struct acm_rb {
+       struct list_head        list;
+       int                     size;
+       unsigned char           *base;
+       dma_addr_t              dma;
+};
+
+struct acm_ru {
+       struct list_head        list;
+       struct acm_rb           *buffer;
+       struct urb              *urb;
+       struct acm              *instance;
+};
+
 struct acm {
        struct usb_device *dev;                         /* the corresponding usb device */
        struct usb_interface *control;                  /* control interface */
        struct usb_interface *data;                     /* data interface */
        struct tty_struct *tty;                         /* the corresponding tty */
-       struct urb *ctrlurb, *readurb, *writeurb;       /* urbs */
-       u8 *ctrl_buffer, *read_buffer;                  /* buffers of urbs */
-       dma_addr_t ctrl_dma, read_dma;                  /* dma handles of buffers */
+       struct urb *ctrlurb, *writeurb;                 /* urbs */
+       u8 *ctrl_buffer;                                /* buffers of urbs */
+       dma_addr_t ctrl_dma;                            /* dma handles of buffers */
        struct acm_wb wb[ACM_NWB];
+       struct acm_ru ru[ACM_NRU];
+       struct acm_rb rb[ACM_NRB];
+       int rx_endpoint;
+       spinlock_t read_lock;
+       struct list_head spare_read_urbs;
+       struct list_head spare_read_bufs;
+       struct list_head filled_read_bufs;
        int write_current;                              /* current write buffer */
        int write_used;                                 /* number of non-empty write buffers */
        int write_ready;                                /* write urb is not running */
        spinlock_t write_lock;
        struct usb_cdc_line_coding line;                /* bits, stop, parity */
        struct work_struct work;                        /* work queue entry for line discipline waking up */
-       struct tasklet_struct bh;                       /* rx processing */
+       struct tasklet_struct urb_task;                 /* rx processing */
        spinlock_t throttle_lock;                       /* synchronize throtteling and read callback */
        unsigned int ctrlin;                            /* input control lines (DCD, DSR, RI, break, overruns) */
        unsigned int ctrlout;                           /* output control lines (DTR, RTS) */
@@ -91,7 +115,6 @@ struct acm {
        unsigned int minor;                             /* acm minor number */
        unsigned char throttle;                         /* throttled by tty layer */
        unsigned char clocal;                           /* termios CLOCAL */
-       unsigned char resubmit_to_unthrottle;           /* throtteling has disabled the read urb */
        unsigned int ctrl_caps;                         /* control capabilities from the class specific header */
 };
 
index 5f8af35e763306ee3d2778b0a4faf8459b8af931..f13f004d311f674b545af196ab0e7d0571050b77 100644 (file)
@@ -2027,7 +2027,6 @@ static struct usb_device_id id_table[] = {
 };
 
 static struct usb_driver usb_midi_driver = {
-       .owner =        THIS_MODULE,
        .name =         "midi",
        .probe =        usb_midi_probe,
        .disconnect =   usb_midi_disconnect,
index 357e75335f17d87396c88dfcb729899176ae2a49..dba4cc0260770ebf8d6c39963cd8345c80a98b2a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1999 Michael Gee      <michael@linuxspecific.com>
  * Copyright (c) 1999 Pavel Machek     <pavel@suse.cz>
- * Copyright (c) 2000 Randy Dunlap     <rddunlap@osdl.org>
+ * Copyright (c) 2000 Randy Dunlap     <rdunlap@xenotime.net>
  * Copyright (c) 2000 Vojtech Pavlik   <vojtech@suse.cz>
  # Copyright (c) 2001 Pete Zaitcev     <zaitcev@redhat.com>
  # Copyright (c) 2001 David Paschal    <paschal@rcsis.com>
@@ -199,7 +199,7 @@ struct quirk_printer_struct {
 #define USBLP_QUIRK_BIDIR      0x1     /* reports bidir but requires unidirectional mode (no INs/reads) */
 #define USBLP_QUIRK_USB_INIT   0x2     /* needs vendor USB init string */
 
-static struct quirk_printer_struct quirk_printers[] = {
+static const struct quirk_printer_struct quirk_printers[] = {
        { 0x03f0, 0x0004, USBLP_QUIRK_BIDIR }, /* HP DeskJet 895C */
        { 0x03f0, 0x0104, USBLP_QUIRK_BIDIR }, /* HP DeskJet 880C */
        { 0x03f0, 0x0204, USBLP_QUIRK_BIDIR }, /* HP DeskJet 815C */
@@ -301,7 +301,7 @@ static void usblp_bulk_write(struct urb *urb, struct pt_regs *regs)
  * Get and print printer errors.
  */
 
-static char *usblp_messages[] = { "ok", "out of paper", "off-line", "on fire" };
+static const char *usblp_messages[] = { "ok", "out of paper", "off-line", "on fire" };
 
 static int usblp_check_status(struct usblp *usblp, int err)
 {
@@ -438,7 +438,7 @@ static unsigned int usblp_poll(struct file *file, struct poll_table_struct *wait
                               | (!usblp->wcomplete ? 0 : POLLOUT | POLLWRNORM);
 }
 
-static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static long usblp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        struct usblp *usblp = file->private_data;
        int length, err, i;
@@ -838,7 +838,8 @@ static struct file_operations usblp_fops = {
        .read =         usblp_read,
        .write =        usblp_write,
        .poll =         usblp_poll,
-       .ioctl =        usblp_ioctl,
+       .unlocked_ioctl =       usblp_ioctl,
+       .compat_ioctl =         usblp_ioctl,
        .open =         usblp_open,
        .release =      usblp_release,
 };
@@ -849,6 +850,20 @@ static struct usb_class_driver usblp_class = {
        .minor_base =   USBLP_MINOR_BASE,
 };
 
+static ssize_t usblp_show_ieee1284_id(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct usb_interface *intf = to_usb_interface(dev);
+       struct usblp *usblp = usb_get_intfdata (intf);
+
+       if (usblp->device_id_string[0] == 0 &&
+           usblp->device_id_string[1] == 0)
+               return 0;
+
+       return sprintf(buf, "%s", usblp->device_id_string+2);
+}
+
+static DEVICE_ATTR(ieee1284_id, S_IRUGO, usblp_show_ieee1284_id, NULL);
+
 static int usblp_probe(struct usb_interface *intf,
                       const struct usb_device_id *id)
 {
@@ -933,20 +948,12 @@ static int usblp_probe(struct usb_interface *intf,
 
        /* Retrieve and store the device ID string. */
        usblp_cache_device_id_string(usblp);
+       device_create_file(&intf->dev, &dev_attr_ieee1284_id);
 
 #ifdef DEBUG
        usblp_check_status(usblp, 0);
 #endif
 
-       info("usblp%d: USB %sdirectional printer dev %d "
-               "if %d alt %d proto %d vid 0x%4.4X pid 0x%4.4X",
-               usblp->minor, usblp->bidir ? "Bi" : "Uni", dev->devnum,
-               usblp->ifnum,
-               usblp->protocol[usblp->current_protocol].alt_setting,
-               usblp->current_protocol,
-               le16_to_cpu(usblp->dev->descriptor.idVendor),
-               le16_to_cpu(usblp->dev->descriptor.idProduct));
-
        usb_set_intfdata (intf, usblp);
 
        usblp->present = 1;
@@ -957,11 +964,20 @@ static int usblp_probe(struct usb_interface *intf,
                goto abort_intfdata;
        }
        usblp->minor = intf->minor;
+       info("usblp%d: USB %sdirectional printer dev %d "
+               "if %d alt %d proto %d vid 0x%4.4X pid 0x%4.4X",
+               usblp->minor, usblp->bidir ? "Bi" : "Uni", dev->devnum,
+               usblp->ifnum,
+               usblp->protocol[usblp->current_protocol].alt_setting,
+               usblp->current_protocol,
+               le16_to_cpu(usblp->dev->descriptor.idVendor),
+               le16_to_cpu(usblp->dev->descriptor.idProduct));
 
        return 0;
 
 abort_intfdata:
        usb_set_intfdata (intf, NULL);
+       device_remove_file(&intf->dev, &dev_attr_ieee1284_id);
 abort:
        if (usblp) {
                if (usblp->writebuf)
@@ -1156,6 +1172,8 @@ static void usblp_disconnect(struct usb_interface *intf)
                BUG ();
        }
 
+       device_remove_file(&intf->dev, &dev_attr_ieee1284_id);
+
        down (&usblp_sem);
        down (&usblp->sem);
        usblp->present = 0;
@@ -1186,7 +1204,6 @@ static struct usb_device_id usblp_ids [] = {
 MODULE_DEVICE_TABLE (usb, usblp_ids);
 
 static struct usb_driver usblp_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usblp",
        .probe =        usblp_probe,
        .disconnect =   usblp_disconnect,
index 86d5c380892d08efc4eb556031ddb3afe038ba03..28329ddf187c2f57cefee9e03395f1ee8912e707 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for USB Core files and filesystem
 #
 
-usbcore-objs   := usb.o hub.o hcd.o urb.o message.o \
+usbcore-objs   := usb.o hub.o hcd.o urb.o message.o driver.o \
                        config.o file.o buffer.o sysfs.o devio.o notify.o
 
 ifeq ($(CONFIG_PCI),y)
index 419c9943a7cbde9428aef14df1f266bd7e32c142..ad742cec94fa09d1e8b5f5b1b9f0cf249b9e9e57 100644 (file)
@@ -55,6 +55,9 @@ int hcd_buffer_create (struct usb_hcd *hcd)
        char            name [16];
        int             i, size;
 
+       if (!hcd->self.controller->dma_mask)
+               return 0;
+
        for (i = 0; i < HCD_BUFFER_POOLS; i++) { 
                if (!(size = pool_max [i]))
                        continue;
index 83e815d3cd52e088cae80a38a51fc0213535ab32..2684e15b813b6cde3001c660aaeff7e8f097b04d 100644 (file)
 /* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */
 #define ALLOW_SERIAL_NUMBER
 
-static char *format_topo =
+static const char *format_topo =
 /* T:  Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd */
 "\nT:  Bus=%2.2d Lev=%2.2d Prnt=%2.2d Port=%2.2d Cnt=%2.2d Dev#=%3d Spd=%3s MxCh=%2d\n";
 
-static char *format_string_manufacturer =
+static const char *format_string_manufacturer =
 /* S:  Manufacturer=xxxx */
   "S:  Manufacturer=%.100s\n";
 
-static char *format_string_product =
+static const char *format_string_product =
 /* S:  Product=xxxx */
   "S:  Product=%.100s\n";
 
 #ifdef ALLOW_SERIAL_NUMBER
-static char *format_string_serialnumber =
+static const char *format_string_serialnumber =
 /* S:  SerialNumber=xxxx */
   "S:  SerialNumber=%.100s\n";
 #endif
 
-static char *format_bandwidth =
+static const char *format_bandwidth =
 /* B:  Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */
   "B:  Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n";
   
-static char *format_device1 =
+static const char *format_device1 =
 /* D:  Ver=xx.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */
   "D:  Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n";
 
-static char *format_device2 =
+static const char *format_device2 =
 /* P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx */
   "P:  Vendor=%04x ProdID=%04x Rev=%2x.%02x\n";
 
-static char *format_config =
+static const char *format_config =
 /* C:  #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */
   "C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n";
   
-static char *format_iface =
+static const char *format_iface =
 /* I:  If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=xxxx*/
   "I:  If#=%2d Alt=%2d #EPs=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x Driver=%s\n";
 
-static char *format_endpt =
+static const char *format_endpt =
 /* E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=D?s */
   "E:  Ad=%02x(%c) Atr=%02x(%-4s) MxPS=%4d Ivl=%d%cs\n";
 
@@ -545,10 +545,10 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, loff_t *ski
                struct usb_device *childdev = usbdev->children[chix];
 
                if (childdev) {
-                       down(&childdev->serialize);
+                       usb_lock_device(childdev);
                        ret = usb_device_dump(buffer, nbytes, skip_bytes, file_offset, childdev,
                                        bus, level + 1, chix, ++cnt);
-                       up(&childdev->serialize);
+                       usb_unlock_device(childdev);
                        if (ret == -EFAULT)
                                return total_written;
                        total_written += ret;
index b1d6e9af732d743d741ccc3b4d4c013fc74b2dc0..2b68998fe4b34fd0809f1dab9b4f078f7243306f 100644 (file)
@@ -402,7 +402,6 @@ static void driver_disconnect(struct usb_interface *intf)
 }
 
 struct usb_driver usbfs_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbfs",
        .probe =        driver_probe,
        .disconnect =   driver_disconnect,
@@ -1350,9 +1349,7 @@ static int proc_ioctl(struct dev_state *ps, struct usbdevfs_ioctl *ctl)
        /* let kernel drivers try to (re)bind to the interface */
        case USBDEVFS_CONNECT:
                usb_unlock_device(ps->dev);
-               usb_lock_all_devices();
                bus_rescan_devices(intf->dev.bus);
-               usb_unlock_all_devices();
                usb_lock_device(ps->dev);
                break;
 
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
new file mode 100644 (file)
index 0000000..076462c
--- /dev/null
@@ -0,0 +1,472 @@
+/*
+ * drivers/usb/driver.c - most of the driver model stuff for usb
+ *
+ * (C) Copyright 2005 Greg Kroah-Hartman <gregkh@suse.de>
+ *
+ * based on drivers/usb/usb.c which had the following copyrights:
+ *     (C) Copyright Linus Torvalds 1999
+ *     (C) Copyright Johannes Erdfelt 1999-2001
+ *     (C) Copyright Andreas Gal 1999
+ *     (C) Copyright Gregory P. Smith 1999
+ *     (C) Copyright Deti Fliegl 1999 (new USB architecture)
+ *     (C) Copyright Randy Dunlap 2000
+ *     (C) Copyright David Brownell 2000-2004
+ *     (C) Copyright Yggdrasil Computing, Inc. 2000
+ *             (usb_device_id matching changes by Adam J. Richter)
+ *     (C) Copyright Greg Kroah-Hartman 2002-2003
+ *
+ * NOTE! This is not actually a driver at all, rather this is
+ * just a collection of helper routines that implement the
+ * generic USB things that the real drivers can use..
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/device.h>
+#include <linux/usb.h>
+#include "hcd.h"
+#include "usb.h"
+
+static int usb_match_one_id(struct usb_interface *interface,
+                           const struct usb_device_id *id);
+
+struct usb_dynid {
+       struct list_head node;
+       struct usb_device_id id;
+};
+
+
+static int generic_probe(struct device *dev)
+{
+       return 0;
+}
+static int generic_remove(struct device *dev)
+{
+       struct usb_device *udev = to_usb_device(dev);
+
+       /* if this is only an unbind, not a physical disconnect, then
+        * unconfigure the device */
+       if (udev->state == USB_STATE_CONFIGURED)
+               usb_set_configuration(udev, 0);
+
+       /* in case the call failed or the device was suspended */
+       if (udev->state >= USB_STATE_CONFIGURED)
+               usb_disable_device(udev, 0);
+       return 0;
+}
+
+struct device_driver usb_generic_driver = {
+       .owner = THIS_MODULE,
+       .name = "usb",
+       .bus = &usb_bus_type,
+       .probe = generic_probe,
+       .remove = generic_remove,
+};
+
+/* Fun hack to determine if the struct device is a
+ * usb device or a usb interface. */
+int usb_generic_driver_data;
+
+#ifdef CONFIG_HOTPLUG
+
+/*
+ * Adds a new dynamic USBdevice ID to this driver,
+ * and cause the driver to probe for all devices again.
+ */
+static ssize_t store_new_id(struct device_driver *driver,
+                           const char *buf, size_t count)
+{
+       struct usb_driver *usb_drv = to_usb_driver(driver);
+       struct usb_dynid *dynid;
+       u32 idVendor = 0;
+       u32 idProduct = 0;
+       int fields = 0;
+
+       fields = sscanf(buf, "%x %x", &idVendor, &idProduct);
+       if (fields < 2)
+               return -EINVAL;
+
+       dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
+       if (!dynid)
+               return -ENOMEM;
+
+       INIT_LIST_HEAD(&dynid->node);
+       dynid->id.idVendor = idVendor;
+       dynid->id.idProduct = idProduct;
+       dynid->id.match_flags = USB_DEVICE_ID_MATCH_DEVICE;
+
+       spin_lock(&usb_drv->dynids.lock);
+       list_add_tail(&usb_drv->dynids.list, &dynid->node);
+       spin_unlock(&usb_drv->dynids.lock);
+
+       if (get_driver(driver)) {
+               driver_attach(driver);
+               put_driver(driver);
+       }
+
+       return count;
+}
+static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
+
+static int usb_create_newid_file(struct usb_driver *usb_drv)
+{
+       int error = 0;
+
+       if (usb_drv->no_dynamic_id)
+               goto exit;
+
+       if (usb_drv->probe != NULL)
+               error = sysfs_create_file(&usb_drv->driver.kobj,
+                                         &driver_attr_new_id.attr);
+exit:
+       return error;
+}
+
+static void usb_remove_newid_file(struct usb_driver *usb_drv)
+{
+       if (usb_drv->no_dynamic_id)
+               return;
+
+       if (usb_drv->probe != NULL)
+               sysfs_remove_file(&usb_drv->driver.kobj,
+                                 &driver_attr_new_id.attr);
+}
+
+static void usb_free_dynids(struct usb_driver *usb_drv)
+{
+       struct usb_dynid *dynid, *n;
+
+       spin_lock(&usb_drv->dynids.lock);
+       list_for_each_entry_safe(dynid, n, &usb_drv->dynids.list, node) {
+               list_del(&dynid->node);
+               kfree(dynid);
+       }
+       spin_unlock(&usb_drv->dynids.lock);
+}
+#else
+static inline int usb_create_newid_file(struct usb_driver *usb_drv)
+{
+       return 0;
+}
+
+static void usb_remove_newid_file(struct usb_driver *usb_drv)
+{
+}
+
+static inline void usb_free_dynids(struct usb_driver *usb_drv)
+{
+}
+#endif
+
+static const struct usb_device_id *usb_match_dynamic_id(struct usb_interface *intf,
+                                                       struct usb_driver *drv)
+{
+       struct usb_dynid *dynid;
+
+       spin_lock(&drv->dynids.lock);
+       list_for_each_entry(dynid, &drv->dynids.list, node) {
+               if (usb_match_one_id(intf, &dynid->id)) {
+                       spin_unlock(&drv->dynids.lock);
+                       return &dynid->id;
+               }
+       }
+       spin_unlock(&drv->dynids.lock);
+       return NULL;
+}
+
+
+/* called from driver core with usb_bus_type.subsys writelock */
+static int usb_probe_interface(struct device *dev)
+{
+       struct usb_interface * intf = to_usb_interface(dev);
+       struct usb_driver * driver = to_usb_driver(dev->driver);
+       const struct usb_device_id *id;
+       int error = -ENODEV;
+
+       dev_dbg(dev, "%s\n", __FUNCTION__);
+
+       if (!driver->probe)
+               return error;
+       /* FIXME we'd much prefer to just resume it ... */
+       if (interface_to_usbdev(intf)->state == USB_STATE_SUSPENDED)
+               return -EHOSTUNREACH;
+
+       id = usb_match_id(intf, driver->id_table);
+       if (!id)
+               id = usb_match_dynamic_id(intf, driver);
+       if (id) {
+               dev_dbg(dev, "%s - got id\n", __FUNCTION__);
+
+               /* Interface "power state" doesn't correspond to any hardware
+                * state whatsoever.  We use it to record when it's bound to
+                * a driver that may start I/0:  it's not frozen/quiesced.
+                */
+               mark_active(intf);
+               intf->condition = USB_INTERFACE_BINDING;
+               error = driver->probe(intf, id);
+               if (error) {
+                       mark_quiesced(intf);
+                       intf->condition = USB_INTERFACE_UNBOUND;
+               } else
+                       intf->condition = USB_INTERFACE_BOUND;
+       }
+
+       return error;
+}
+
+/* called from driver core with usb_bus_type.subsys writelock */
+static int usb_unbind_interface(struct device *dev)
+{
+       struct usb_interface *intf = to_usb_interface(dev);
+       struct usb_driver *driver = to_usb_driver(intf->dev.driver);
+
+       intf->condition = USB_INTERFACE_UNBINDING;
+
+       /* release all urbs for this interface */
+       usb_disable_interface(interface_to_usbdev(intf), intf);
+
+       if (driver && driver->disconnect)
+               driver->disconnect(intf);
+
+       /* reset other interface state */
+       usb_set_interface(interface_to_usbdev(intf),
+                       intf->altsetting[0].desc.bInterfaceNumber,
+                       0);
+       usb_set_intfdata(intf, NULL);
+       intf->condition = USB_INTERFACE_UNBOUND;
+       mark_quiesced(intf);
+
+       return 0;
+}
+
+/* returns 0 if no match, 1 if match */
+static int usb_match_one_id(struct usb_interface *interface,
+                           const struct usb_device_id *id)
+{
+       struct usb_host_interface *intf;
+       struct usb_device *dev;
+
+       /* proc_connectinfo in devio.c may call us with id == NULL. */
+       if (id == NULL)
+               return 0;
+
+       intf = interface->cur_altsetting;
+       dev = interface_to_usbdev(interface);
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
+           id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
+           id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
+               return 0;
+
+       /* No need to test id->bcdDevice_lo != 0, since 0 is never
+          greater than any unsigned number. */
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
+           (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
+           (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice)))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&
+           (id->bDeviceClass != dev->descriptor.bDeviceClass))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&
+           (id->bDeviceSubClass!= dev->descriptor.bDeviceSubClass))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&
+           (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&
+           (id->bInterfaceClass != intf->desc.bInterfaceClass))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) &&
+           (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass))
+               return 0;
+
+       if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) &&
+           (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))
+               return 0;
+
+       return 1;
+}
+/**
+ * usb_match_id - find first usb_device_id matching device or interface
+ * @interface: the interface of interest
+ * @id: array of usb_device_id structures, terminated by zero entry
+ *
+ * usb_match_id searches an array of usb_device_id's and returns
+ * the first one matching the device or interface, or null.
+ * This is used when binding (or rebinding) a driver to an interface.
+ * Most USB device drivers will use this indirectly, through the usb core,
+ * but some layered driver frameworks use it directly.
+ * These device tables are exported with MODULE_DEVICE_TABLE, through
+ * modutils, to support the driver loading functionality of USB hotplugging.
+ *
+ * What Matches:
+ *
+ * The "match_flags" element in a usb_device_id controls which
+ * members are used.  If the corresponding bit is set, the
+ * value in the device_id must match its corresponding member
+ * in the device or interface descriptor, or else the device_id
+ * does not match.
+ *
+ * "driver_info" is normally used only by device drivers,
+ * but you can create a wildcard "matches anything" usb_device_id
+ * as a driver's "modules.usbmap" entry if you provide an id with
+ * only a nonzero "driver_info" field.  If you do this, the USB device
+ * driver's probe() routine should use additional intelligence to
+ * decide whether to bind to the specified interface.
+ *
+ * What Makes Good usb_device_id Tables:
+ *
+ * The match algorithm is very simple, so that intelligence in
+ * driver selection must come from smart driver id records.
+ * Unless you have good reasons to use another selection policy,
+ * provide match elements only in related groups, and order match
+ * specifiers from specific to general.  Use the macros provided
+ * for that purpose if you can.
+ *
+ * The most specific match specifiers use device descriptor
+ * data.  These are commonly used with product-specific matches;
+ * the USB_DEVICE macro lets you provide vendor and product IDs,
+ * and you can also match against ranges of product revisions.
+ * These are widely used for devices with application or vendor
+ * specific bDeviceClass values.
+ *
+ * Matches based on device class/subclass/protocol specifications
+ * are slightly more general; use the USB_DEVICE_INFO macro, or
+ * its siblings.  These are used with single-function devices
+ * where bDeviceClass doesn't specify that each interface has
+ * its own class.
+ *
+ * Matches based on interface class/subclass/protocol are the
+ * most general; they let drivers bind to any interface on a
+ * multiple-function device.  Use the USB_INTERFACE_INFO
+ * macro, or its siblings, to match class-per-interface style
+ * devices (as recorded in bDeviceClass).
+ *
+ * Within those groups, remember that not all combinations are
+ * meaningful.  For example, don't give a product version range
+ * without vendor and product IDs; or specify a protocol without
+ * its associated class and subclass.
+ */
+const struct usb_device_id *usb_match_id(struct usb_interface *interface,
+                                        const struct usb_device_id *id)
+{
+       /* proc_connectinfo in devio.c may call us with id == NULL. */
+       if (id == NULL)
+               return NULL;
+
+       /* It is important to check that id->driver_info is nonzero,
+          since an entry that is all zeroes except for a nonzero
+          id->driver_info is the way to create an entry that
+          indicates that the driver want to examine every
+          device and interface. */
+       for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||
+              id->driver_info; id++) {
+               if (usb_match_one_id(interface, id))
+                       return id;
+       }
+
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(usb_match_id);
+
+int usb_device_match(struct device *dev, struct device_driver *drv)
+{
+       struct usb_interface *intf;
+       struct usb_driver *usb_drv;
+       const struct usb_device_id *id;
+
+       /* check for generic driver, which we don't match any device with */
+       if (drv == &usb_generic_driver)
+               return 0;
+
+       intf = to_usb_interface(dev);
+       usb_drv = to_usb_driver(drv);
+
+       id = usb_match_id(intf, usb_drv->id_table);
+       if (id)
+               return 1;
+
+       id = usb_match_dynamic_id(intf, usb_drv);
+       if (id)
+               return 1;
+       return 0;
+}
+
+/**
+ * usb_register_driver - register a USB driver
+ * @new_driver: USB operations for the driver
+ * @owner: module owner of this driver.
+ *
+ * Registers a USB driver with the USB core.  The list of unattached
+ * interfaces will be rescanned whenever a new driver is added, allowing
+ * the new driver to attach to any recognized devices.
+ * Returns a negative error code on failure and 0 on success.
+ *
+ * NOTE: if you want your driver to use the USB major number, you must call
+ * usb_register_dev() to enable that functionality.  This function no longer
+ * takes care of that.
+ */
+int usb_register_driver(struct usb_driver *new_driver, struct module *owner)
+{
+       int retval = 0;
+
+       if (usb_disabled())
+               return -ENODEV;
+
+       new_driver->driver.name = (char *)new_driver->name;
+       new_driver->driver.bus = &usb_bus_type;
+       new_driver->driver.probe = usb_probe_interface;
+       new_driver->driver.remove = usb_unbind_interface;
+       new_driver->driver.owner = owner;
+       spin_lock_init(&new_driver->dynids.lock);
+       INIT_LIST_HEAD(&new_driver->dynids.list);
+
+       retval = driver_register(&new_driver->driver);
+
+       if (!retval) {
+               pr_info("%s: registered new driver %s\n",
+                       usbcore_name, new_driver->name);
+               usbfs_update_special();
+               usb_create_newid_file(new_driver);
+       } else {
+               printk(KERN_ERR "%s: error %d registering driver %s\n",
+                       usbcore_name, retval, new_driver->name);
+       }
+
+       return retval;
+}
+EXPORT_SYMBOL_GPL(usb_register_driver);
+
+/**
+ * usb_deregister - unregister a USB driver
+ * @driver: USB operations of the driver to unregister
+ * Context: must be able to sleep
+ *
+ * Unlinks the specified driver from the internal USB driver list.
+ *
+ * NOTE: If you called usb_register_dev(), you still need to call
+ * usb_deregister_dev() to clean up your driver's allocated minor numbers,
+ * this * call will no longer do it for you.
+ */
+void usb_deregister(struct usb_driver *driver)
+{
+       pr_info("%s: deregistering driver %s\n", usbcore_name, driver->name);
+
+       usb_remove_newid_file(driver);
+       usb_free_dynids(driver);
+       driver_unregister(&driver->driver);
+
+       usbfs_update_special();
+}
+EXPORT_SYMBOL_GPL(usb_deregister);
index 7feb829362d63212d5383e6aba652373036e5150..29b5b2a6e183e11aab66d4615d502869bfeb9812 100644 (file)
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
+#include <linux/usb.h>
+
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <linux/usb.h>
+
+#ifdef CONFIG_PPC_PMAC
+#include <asm/machdep.h>
+#include <asm/pmac_feature.h>
+#include <asm/pci-bridge.h>
+#include <asm/prom.h>
+#endif
 
 #include "usb.h"
 #include "hcd.h"
@@ -211,6 +219,7 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message)
                        goto done;
                }
        }
+       synchronize_irq(dev->irq);
 
        /* FIXME until the generic PM interfaces change a lot more, this
         * can't use PCI D1 and D2 states.  For example, the confusion
@@ -277,8 +286,22 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message)
        }
 
 done:
-       if (retval == 0)
+       if (retval == 0) {
                dev->dev.power.power_state = PMSG_SUSPEND;
+
+#ifdef CONFIG_PPC_PMAC
+               /* Disable ASIC clocks for USB */
+               if (_machine == _MACH_Pmac) {
+                       struct device_node      *of_node;
+
+                       of_node = pci_device_to_OF_node (dev);
+                       if (of_node)
+                               pmac_call_feature(PMAC_FTR_USB_ENABLE,
+                                                       of_node, 0, 0);
+               }
+#endif
+       }
+
        return retval;
 }
 EXPORT_SYMBOL (usb_hcd_pci_suspend);
@@ -301,6 +324,18 @@ int usb_hcd_pci_resume (struct pci_dev *dev)
                return 0;
        }
 
+#ifdef CONFIG_PPC_PMAC
+       /* Reenable ASIC clocks for USB */
+       if (_machine == _MACH_Pmac) {
+               struct device_node *of_node;
+
+               of_node = pci_device_to_OF_node (dev);
+               if (of_node)
+                       pmac_call_feature (PMAC_FTR_USB_ENABLE,
+                                               of_node, 0, 1);
+       }
+#endif
+
        /* NOTE:  chip docs cover clean "real suspend" cases (what Linux
         * calls "standby", "suspend to RAM", and so on).  There are also
         * dirty cases when swsusp fakes a suspend in "shutdown" mode.
@@ -358,7 +393,7 @@ int usb_hcd_pci_resume (struct pci_dev *dev)
 
        dev->dev.power.power_state = PMSG_ON;
 
-       hcd->saw_irq = 0;
+       clear_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
 
        if (hcd->driver->resume) {
                retval = hcd->driver->resume(hcd);
index 5e5f65a475ab95c2d50b372d70d4f5533ad98f6e..0018bbc4de3414bae4bd447e619b169239e593fc 100644 (file)
@@ -857,9 +857,7 @@ static int register_root_hub (struct usb_device *usb_dev,
                return (retval < 0) ? retval : -EMSGSIZE;
        }
 
-       usb_lock_device (usb_dev);
        retval = usb_new_device (usb_dev);
-       usb_unlock_device (usb_dev);
        if (retval) {
                usb_dev->bus->root_hub = NULL;
                dev_err (parent_dev, "can't register root hub for %s, %d\n",
@@ -1315,11 +1313,12 @@ static int hcd_unlink_urb (struct urb *urb, int status)
         * finish unlinking the initial failed usb_set_address()
         * or device descriptor fetch.
         */
-       if (!hcd->saw_irq && hcd->self.root_hub != urb->dev) {
+       if (!test_bit(HCD_FLAG_SAW_IRQ, &hcd->flags)
+           && hcd->self.root_hub != urb->dev) {
                dev_warn (hcd->self.controller, "Unlink after no-IRQ?  "
                        "Controller is probably using the wrong IRQ."
                        "\n");
-               hcd->saw_irq = 1;
+               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
        }
 
        urb->status = status;
@@ -1649,13 +1648,15 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs * r)
        struct usb_hcd          *hcd = __hcd;
        int                     start = hcd->state;
 
-       if (start == HC_STATE_HALT)
+       if (unlikely(start == HC_STATE_HALT ||
+           !test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)))
                return IRQ_NONE;
        if (hcd->driver->irq (hcd, r) == IRQ_NONE)
                return IRQ_NONE;
 
-       hcd->saw_irq = 1;
-       if (hcd->state == HC_STATE_HALT)
+       set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
+
+       if (unlikely(hcd->state == HC_STATE_HALT))
                usb_hc_died (hcd);
        return IRQ_HANDLED;
 }
@@ -1768,6 +1769,8 @@ int usb_add_hcd(struct usb_hcd *hcd,
 
        dev_info(hcd->self.controller, "%s\n", hcd->product_desc);
 
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+
        /* till now HC has been in an indeterminate state ... */
        if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) {
                dev_err(hcd->self.controller, "can't reset\n");
@@ -1822,8 +1825,6 @@ int usb_add_hcd(struct usb_hcd *hcd,
                retval = -ENOMEM;
                goto err_allocate_root_hub;
        }
-       rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :
-                       USB_SPEED_FULL;
 
        /* Although in principle hcd->driver->start() might need to use rhdev,
         * none of the current drivers do.
@@ -1841,6 +1842,9 @@ int usb_add_hcd(struct usb_hcd *hcd,
                dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");
        hcd->remote_wakeup = hcd->can_wakeup;
 
+       rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :
+                       USB_SPEED_FULL;
+       rhdev->bus_mA = min(500u, hcd->power_budget);
        if ((retval = register_root_hub(rhdev, hcd)) != 0)
                goto err_register_root_hub;
 
@@ -1886,7 +1890,10 @@ void usb_remove_hcd(struct usb_hcd *hcd)
        spin_lock_irq (&hcd_root_hub_lock);
        hcd->rh_registered = 0;
        spin_unlock_irq (&hcd_root_hub_lock);
+
+       down(&usb_bus_list_lock);
        usb_disconnect(&hcd->self.root_hub);
+       up(&usb_bus_list_lock);
 
        hcd->poll_rh = 0;
        del_timer_sync(&hcd->rh_timer);
index 24a62a2ff86dd38b11dd3494069b99a8bd9882b2..591b5aad1a18a018719b7a977ab3f43fe7184b8a 100644 (file)
@@ -72,7 +72,12 @@ struct usb_hcd {     /* usb_bus.hcpriv points to this */
         * hardware info/state
         */
        const struct hc_driver  *driver;        /* hw-specific hooks */
-       unsigned                saw_irq : 1;
+
+       /* Flags that need to be manipulated atomically */
+       unsigned long           flags;
+#define HCD_FLAG_HW_ACCESSIBLE 0x00000001
+#define HCD_FLAG_SAW_IRQ       0x00000002
+
        unsigned                can_wakeup:1;   /* hw supports wakeup? */
        unsigned                remote_wakeup:1;/* sw should use wakeup? */
        unsigned                rh_registered:1;/* is root hub registered? */
@@ -375,6 +380,7 @@ extern int usb_find_interface_driver (struct usb_device *dev,
 #ifdef CONFIG_PM
 extern void usb_hcd_suspend_root_hub (struct usb_hcd *hcd);
 extern void usb_hcd_resume_root_hub (struct usb_hcd *hcd);
+extern void usb_root_hub_lost_power (struct usb_device *rhdev);
 extern int hcd_bus_suspend (struct usb_bus *bus);
 extern int hcd_bus_resume (struct usb_bus *bus);
 #else
index 840727948d846aa12eb476e4ba5dd07f71f1a2ae..650d5ee5871b2f1e6c3f8d7f628c11cd91bed2b1 100644 (file)
@@ -32,7 +32,7 @@
 #include "hub.h"
 
 /* Protect struct usb_device->state and ->children members
- * Note: Both are also protected by ->serialize, except that ->state can
+ * Note: Both are also protected by ->dev.sem, except that ->state can
  * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */
 static DEFINE_SPINLOCK(device_state_lock);
 
@@ -515,6 +515,31 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
        return ret;
 }
 
+
+/* caller has locked the hub device */
+static void hub_pre_reset(struct usb_hub *hub, int disable_ports)
+{
+       struct usb_device *hdev = hub->hdev;
+       int port1;
+
+       for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
+               if (hdev->children[port1 - 1]) {
+                       usb_disconnect(&hdev->children[port1 - 1]);
+                       if (disable_ports)
+                               hub_port_disable(hub, port1, 0);
+               }
+       }
+       hub_quiesce(hub);
+}
+
+/* caller has locked the hub device */
+static void hub_post_reset(struct usb_hub *hub)
+{
+       hub_activate(hub);
+       hub_power_on(hub);
+}
+
+
 static int hub_configure(struct usb_hub *hub,
        struct usb_endpoint_descriptor *endpoint)
 {
@@ -677,26 +702,40 @@ static int hub_configure(struct usb_hub *hub,
         * and battery-powered root hubs (may provide just 8 mA).
         */
        ret = usb_get_status(hdev, USB_RECIP_DEVICE, 0, &hubstatus);
-       if (ret < 0) {
+       if (ret < 2) {
                message = "can't get hub status";
                goto fail;
        }
        le16_to_cpus(&hubstatus);
        if (hdev == hdev->bus->root_hub) {
-               struct usb_hcd *hcd =
-                               container_of(hdev->bus, struct usb_hcd, self);
-
-               hub->power_budget = min(500u, hcd->power_budget) / 2;
+               if (hdev->bus_mA == 0 || hdev->bus_mA >= 500)
+                       hub->mA_per_port = 500;
+               else {
+                       hub->mA_per_port = hdev->bus_mA;
+                       hub->limited_power = 1;
+               }
        } else if ((hubstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
                dev_dbg(hub_dev, "hub controller current requirement: %dmA\n",
                        hub->descriptor->bHubContrCurrent);
-               hub->power_budget = (501 - hub->descriptor->bHubContrCurrent)
-                                       / 2;
+               hub->limited_power = 1;
+               if (hdev->maxchild > 0) {
+                       int remaining = hdev->bus_mA -
+                                       hub->descriptor->bHubContrCurrent;
+
+                       if (remaining < hdev->maxchild * 100)
+                               dev_warn(hub_dev,
+                                       "insufficient power available "
+                                       "to use all downstream ports\n");
+                       hub->mA_per_port = 100;         /* 7.2.1.1 */
+               }
+       } else {        /* Self-powered external hub */
+               /* FIXME: What about battery-powered external hubs that
+                * provide less current per port? */
+               hub->mA_per_port = 500;
        }
-       if (hub->power_budget)
-               dev_dbg(hub_dev, "%dmA bus power budget for children\n",
-                       hub->power_budget * 2);
-
+       if (hub->mA_per_port < 500)
+               dev_dbg(hub_dev, "%umA bus power budget for each child\n",
+                               hub->mA_per_port);
 
        ret = hub_hub_status(hub, &hubstatus, &hubchange);
        if (ret < 0) {
@@ -750,29 +789,10 @@ fail:
 
 static unsigned highspeed_hubs;
 
-/* Called after the hub driver is unbound from a hub with children */
-static void hub_remove_children_work(void *__hub)
-{
-       struct usb_hub          *hub = __hub;
-       struct usb_device       *hdev = hub->hdev;
-       int                     i;
-
-       kfree(hub);
-
-       usb_lock_device(hdev);
-       for (i = 0; i < hdev->maxchild; ++i) {
-               if (hdev->children[i])
-                       usb_disconnect(&hdev->children[i]);
-       }
-       usb_unlock_device(hdev);
-       usb_put_dev(hdev);
-}
-
 static void hub_disconnect(struct usb_interface *intf)
 {
        struct usb_hub *hub = usb_get_intfdata (intf);
        struct usb_device *hdev;
-       int n, port1;
 
        usb_set_intfdata (intf, NULL);
        hdev = hub->hdev;
@@ -780,7 +800,9 @@ static void hub_disconnect(struct usb_interface *intf)
        if (hdev->speed == USB_SPEED_HIGH)
                highspeed_hubs--;
 
-       hub_quiesce(hub);
+       /* Disconnect all children and quiesce the hub */
+       hub_pre_reset(hub, 1);
+
        usb_free_urb(hub->urb);
        hub->urb = NULL;
 
@@ -800,27 +822,7 @@ static void hub_disconnect(struct usb_interface *intf)
                hub->buffer = NULL;
        }
 
-       /* If there are any children then this is an unbind only, not a
-        * physical disconnection.  The active ports must be disabled
-        * and later on we must call usb_disconnect().  We can't call
-        * it now because we may not hold the hub's device lock.
-        */
-       n = 0;
-       for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
-               if (hdev->children[port1 - 1]) {
-                       ++n;
-                       hub_port_disable(hub, port1, 1);
-               }
-       }
-
-       if (n == 0)
-               kfree(hub);
-       else {
-               /* Reuse the hub->leds work_struct for our own purposes */
-               INIT_WORK(&hub->leds, hub_remove_children_work, hub);
-               schedule_work(&hub->leds);
-               usb_get_dev(hdev);
-       }
+       kfree(hub);
 }
 
 static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
@@ -917,26 +919,6 @@ hub_ioctl(struct usb_interface *intf, unsigned int code, void *user_data)
        }
 }
 
-/* caller has locked the hub device */
-static void hub_pre_reset(struct usb_hub *hub)
-{
-       struct usb_device *hdev = hub->hdev;
-       int i;
-
-       for (i = 0; i < hdev->maxchild; ++i) {
-               if (hdev->children[i])
-                       usb_disconnect(&hdev->children[i]);
-       }
-       hub_quiesce(hub);
-}
-
-/* caller has locked the hub device */
-static void hub_post_reset(struct usb_hub *hub)
-{
-       hub_activate(hub);
-       hub_power_on(hub);
-}
-
 
 /* grab device/port lock, returning index of that port (zero based).
  * protects the upstream link used by this device from concurrent
@@ -964,24 +946,21 @@ static int locktree(struct usb_device *udev)
        t = locktree(hdev);
        if (t < 0)
                return t;
-       for (t = 0; t < hdev->maxchild; t++) {
-               if (hdev->children[t] == udev) {
-                       /* everything is fail-fast once disconnect
-                        * processing starts
-                        */
-                       if (udev->state == USB_STATE_NOTATTACHED)
-                               break;
 
-                       /* when everyone grabs locks top->bottom,
-                        * non-overlapping work may be concurrent
-                        */
-                       down(&udev->serialize);
-                       up(&hdev->serialize);
-                       return t + 1;
-               }
+       /* everything is fail-fast once disconnect
+        * processing starts
+        */
+       if (udev->state == USB_STATE_NOTATTACHED) {
+               usb_unlock_device(hdev);
+               return -ENODEV;
        }
+
+       /* when everyone grabs locks top->bottom,
+        * non-overlapping work may be concurrent
+        */
+       usb_lock_device(udev);
        usb_unlock_device(hdev);
-       return -ENODEV;
+       return udev->portnum;
 }
 
 static void recursively_mark_NOTATTACHED(struct usb_device *udev)
@@ -1039,6 +1018,39 @@ void usb_set_device_state(struct usb_device *udev,
 EXPORT_SYMBOL(usb_set_device_state);
 
 
+#ifdef CONFIG_PM
+
+/**
+ * usb_root_hub_lost_power - called by HCD if the root hub lost Vbus power
+ * @rhdev: struct usb_device for the root hub
+ *
+ * The USB host controller driver calls this function when its root hub
+ * is resumed and Vbus power has been interrupted or the controller
+ * has been reset.  The routine marks all the children of the root hub
+ * as NOTATTACHED and marks logical connect-change events on their ports.
+ */
+void usb_root_hub_lost_power(struct usb_device *rhdev)
+{
+       struct usb_hub *hub;
+       int port1;
+       unsigned long flags;
+
+       dev_warn(&rhdev->dev, "root hub lost power or was reset\n");
+       spin_lock_irqsave(&device_state_lock, flags);
+       hub = hdev_to_hub(rhdev);
+       for (port1 = 1; port1 <= rhdev->maxchild; ++port1) {
+               if (rhdev->children[port1 - 1]) {
+                       recursively_mark_NOTATTACHED(
+                                       rhdev->children[port1 - 1]);
+                       set_bit(port1, hub->change_bits);
+               }
+       }
+       spin_unlock_irqrestore(&device_state_lock, flags);
+}
+EXPORT_SYMBOL_GPL(usb_root_hub_lost_power);
+
+#endif
+
 static void choose_address(struct usb_device *udev)
 {
        int             devnum;
@@ -1099,16 +1111,10 @@ void usb_disconnect(struct usb_device **pdev)
         * this quiesces everyting except pending urbs.
         */
        usb_set_device_state(udev, USB_STATE_NOTATTACHED);
-
-       /* lock the bus list on behalf of HCDs unregistering their root hubs */
-       if (!udev->parent) {
-               down(&usb_bus_list_lock);
-               usb_lock_device(udev);
-       } else
-               down(&udev->serialize);
-
        dev_info (&udev->dev, "USB disconnect, address %d\n", udev->devnum);
 
+       usb_lock_device(udev);
+
        /* Free up all the children before we remove this device */
        for (i = 0; i < USB_MAXCHILDREN; i++) {
                if (udev->children[i])
@@ -1136,54 +1142,112 @@ void usb_disconnect(struct usb_device **pdev)
        *pdev = NULL;
        spin_unlock_irq(&device_state_lock);
 
-       if (!udev->parent) {
-               usb_unlock_device(udev);
-               up(&usb_bus_list_lock);
-       } else
-               up(&udev->serialize);
+       usb_unlock_device(udev);
 
        device_unregister(&udev->dev);
 }
 
+static inline const char *plural(int n)
+{
+       return (n == 1 ? "" : "s");
+}
+
 static int choose_configuration(struct usb_device *udev)
 {
-       int c, i;
+       int i;
+       u16 devstatus;
+       int bus_powered;
+       int num_configs;
+       struct usb_host_config *c, *best;
+
+       /* If this fails, assume the device is bus-powered */
+       devstatus = 0;
+       usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
+       le16_to_cpus(&devstatus);
+       bus_powered = ((devstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0);
+       dev_dbg(&udev->dev, "device is %s-powered\n",
+                       bus_powered ? "bus" : "self");
+
+       best = NULL;
+       c = udev->config;
+       num_configs = udev->descriptor.bNumConfigurations;
+       for (i = 0; i < num_configs; (i++, c++)) {
+               struct usb_interface_descriptor *desc =
+                               &c->intf_cache[0]->altsetting->desc;
+
+               /*
+                * HP's USB bus-powered keyboard has only one configuration
+                * and it claims to be self-powered; other devices may have
+                * similar errors in their descriptors.  If the next test
+                * were allowed to execute, such configurations would always
+                * be rejected and the devices would not work as expected.
+                */
+#if 0
+               /* Rule out self-powered configs for a bus-powered device */
+               if (bus_powered && (c->desc.bmAttributes &
+                                       USB_CONFIG_ATT_SELFPOWER))
+                       continue;
+#endif
 
-       /* NOTE: this should interact with hub power budgeting */
+               /*
+                * The next test may not be as effective as it should be.
+                * Some hubs have errors in their descriptor, claiming
+                * to be self-powered when they are really bus-powered.
+                * We will overestimate the amount of current such hubs
+                * make available for each port.
+                *
+                * This is a fairly benign sort of failure.  It won't
+                * cause us to reject configurations that we should have
+                * accepted.
+                */
 
-       c = udev->config[0].desc.bConfigurationValue;
-       if (udev->descriptor.bNumConfigurations != 1) {
-               for (i = 0; i < udev->descriptor.bNumConfigurations; i++) {
-                       struct usb_interface_descriptor *desc;
+               /* Rule out configs that draw too much bus current */
+               if (c->desc.bMaxPower * 2 > udev->bus_mA)
+                       continue;
 
-                       /* heuristic:  Linux is more likely to have class
-                        * drivers, so avoid vendor-specific interfaces.
-                        */
-                       desc = &udev->config[i].intf_cache[0]
-                                       ->altsetting->desc;
-                       if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC)
-                               continue;
-                       /* COMM/2/all is CDC ACM, except 0xff is MSFT RNDIS.
-                        * MSFT needs this to be the first config; never use
-                        * it as the default unless Linux has host-side RNDIS.
-                        * A second config would ideally be CDC-Ethernet, but
-                        * may instead be the "vendor specific" CDC subset
-                        * long used by ARM Linux for sa1100 or pxa255.
-                        */
-                       if (desc->bInterfaceClass == USB_CLASS_COMM
-                                       && desc->bInterfaceSubClass == 2
-                                       && desc->bInterfaceProtocol == 0xff) {
-                               c = udev->config[1].desc.bConfigurationValue;
-                               continue;
-                       }
-                       c = udev->config[i].desc.bConfigurationValue;
+               /* If the first config's first interface is COMM/2/0xff
+                * (MSFT RNDIS), rule it out unless Linux has host-side
+                * RNDIS support. */
+               if (i == 0 && desc->bInterfaceClass == USB_CLASS_COMM
+                               && desc->bInterfaceSubClass == 2
+                               && desc->bInterfaceProtocol == 0xff) {
+#ifndef CONFIG_USB_NET_RNDIS
+                       continue;
+#else
+                       best = c;
+#endif
+               }
+
+               /* From the remaining configs, choose the first one whose
+                * first interface is for a non-vendor-specific class.
+                * Reason: Linux is more likely to have a class driver
+                * than a vendor-specific driver. */
+               else if (udev->descriptor.bDeviceClass !=
+                                               USB_CLASS_VENDOR_SPEC &&
+                               desc->bInterfaceClass !=
+                                               USB_CLASS_VENDOR_SPEC) {
+                       best = c;
                        break;
                }
+
+               /* If all the remaining configs are vendor-specific,
+                * choose the first one. */
+               else if (!best)
+                       best = c;
+       }
+
+       if (best) {
+               i = best->desc.bConfigurationValue;
                dev_info(&udev->dev,
-                       "configuration #%d chosen from %d choices\n",
-                       c, udev->descriptor.bNumConfigurations);
+                       "configuration #%d chosen from %d choice%s\n",
+                       i, num_configs, plural(num_configs));
+       } else {
+               i = -1;
+               dev_warn(&udev->dev,
+                       "no configuration chosen from %d choice%s\n",
+                       num_configs, plural(num_configs));
        }
-       return c;
+       return i;
 }
 
 #ifdef DEBUG
@@ -1210,8 +1274,8 @@ static inline void show_string(struct usb_device *udev, char *id, char *string)
  *
  * This is called with devices which have been enumerated, but not yet
  * configured.  The device descriptor is available, but not descriptors
- * for any device configuration.  The caller must have locked udev and
- * either the parent hub (if udev is a normal device) or else the
+ * for any device configuration.  The caller must have locked either
+ * the parent hub (if udev is a normal device) or else the
  * usb_bus_list_lock (if udev is a root hub).  The parent's pointer to
  * udev has already been installed, but udev is not yet visible through
  * sysfs or other filesystem code.
@@ -1221,8 +1285,7 @@ static inline void show_string(struct usb_device *udev, char *id, char *string)
  *
  * This call is synchronous, and may not be used in an interrupt context.
  *
- * Only the hub driver should ever call this; root hub registration
- * uses it indirectly.
+ * Only the hub driver or root-hub registrar should ever call this.
  */
 int usb_new_device(struct usb_device *udev)
 {
@@ -1269,15 +1332,9 @@ int usb_new_device(struct usb_device *udev)
                                        le16_to_cpu(udev->config[0].desc.wTotalLength),
                                        USB_DT_OTG, (void **) &desc) == 0) {
                        if (desc->bmAttributes & USB_OTG_HNP) {
-                               unsigned                port1;
+                               unsigned                port1 = udev->portnum;
                                struct usb_device       *root = udev->parent;
                                
-                               for (port1 = 1; port1 <= root->maxchild;
-                                               port1++) {
-                                       if (root->children[port1-1] == udev)
-                                               break;
-                               }
-
                                dev_info(&udev->dev,
                                        "Dual-Role OTG device on %sHNP port\n",
                                        (port1 == bus->otg_port)
@@ -1331,27 +1388,27 @@ int usb_new_device(struct usb_device *udev)
        }
        usb_create_sysfs_dev_files (udev);
 
+       usb_lock_device(udev);
+
        /* choose and set the configuration. that registers the interfaces
         * with the driver core, and lets usb device drivers bind to them.
         */
        c = choose_configuration(udev);
-       if (c < 0)
-               dev_warn(&udev->dev,
-                               "can't choose an initial configuration\n");
-       else {
+       if (c >= 0) {
                err = usb_set_configuration(udev, c);
                if (err) {
                        dev_err(&udev->dev, "can't set config #%d, error %d\n",
                                        c, err);
-                       usb_remove_sysfs_dev_files(udev);
-                       device_del(&udev->dev);
-                       goto fail;
+                       /* This need not be fatal.  The user can try to
+                        * set other configurations. */
                }
        }
 
        /* USB device state == configured ... usable */
        usb_notify_add_device(udev);
 
+       usb_unlock_device(udev);
+
        return 0;
 
 fail:
@@ -1654,22 +1711,15 @@ static int __usb_suspend_device (struct usb_device *udev, int port1)
 int usb_suspend_device(struct usb_device *udev)
 {
 #ifdef CONFIG_USB_SUSPEND
-       int     port1, status;
-
-       port1 = locktree(udev);
-       if (port1 < 0)
-               return port1;
-
-       status = __usb_suspend_device(udev, port1);
-       usb_unlock_device(udev);
-       return status;
+       if (udev->state == USB_STATE_NOTATTACHED)
+               return -ENODEV;
+       return __usb_suspend_device(udev, udev->portnum);
 #else
        /* NOTE:  udev->state unchanged, it's not lying ... */
        udev->dev.power.power_state = PMSG_SUSPEND;
        return 0;
 #endif
 }
-EXPORT_SYMBOL_GPL(usb_suspend_device);
 
 /*
  * If the USB "suspend" state is in use (rather than "global suspend"),
@@ -1695,13 +1745,14 @@ static int finish_device_resume(struct usb_device *udev)
        usb_set_device_state(udev, udev->actconfig
                        ? USB_STATE_CONFIGURED
                        : USB_STATE_ADDRESS);
+       udev->dev.power.power_state = PMSG_ON;
 
        /* 10.5.4.5 says be sure devices in the tree are still there.
         * For now let's assume the device didn't go crazy on resume,
         * and device drivers will know about any resume quirks.
         */
        status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
-       if (status < 0)
+       if (status < 2)
                dev_dbg(&udev->dev,
                        "gone after usb resume? status %d\n",
                        status);
@@ -1710,7 +1761,7 @@ static int finish_device_resume(struct usb_device *udev)
                int             (*resume)(struct device *);
 
                le16_to_cpus(&devstatus);
-               if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)
+               if ((devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP))
                                && udev->parent) {
                        status = usb_control_msg(udev,
                                        usb_sndctrlpipe(udev, 0),
@@ -1730,8 +1781,14 @@ static int finish_device_resume(struct usb_device *udev)
                 * may have a child resume event to deal with soon
                 */
                resume = udev->dev.bus->resume;
-               for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++)
-                       (void) resume(&udev->actconfig->interface[i]->dev);
+               for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
+                       struct device *dev =
+                                       &udev->actconfig->interface[i]->dev;
+
+                       down(&dev->sem);
+                       (void) resume(dev);
+                       up(&dev->sem);
+               }
                status = 0;
 
        } else if (udev->devnum <= 0) {
@@ -1814,11 +1871,10 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev)
  */
 int usb_resume_device(struct usb_device *udev)
 {
-       int     port1, status;
+       int     status;
 
-       port1 = locktree(udev);
-       if (port1 < 0)
-               return port1;
+       if (udev->state == USB_STATE_NOTATTACHED)
+               return -ENODEV;
 
 #ifdef CONFIG_USB_SUSPEND
        /* selective resume of one downstream hub-to-device port */
@@ -1827,7 +1883,7 @@ int usb_resume_device(struct usb_device *udev)
                        // NOTE swsusp may bork us, device state being wrong...
                        // NOTE this fails if parent is also suspended...
                        status = hub_port_resume(hdev_to_hub(udev->parent),
-                                       port1, udev);
+                                       udev->portnum, udev);
                } else
                        status = 0;
        } else
@@ -1837,13 +1893,11 @@ int usb_resume_device(struct usb_device *udev)
                dev_dbg(&udev->dev, "can't resume, status %d\n",
                        status);
 
-       usb_unlock_device(udev);
-
        /* rebind drivers that had no suspend() */
        if (status == 0) {
-               usb_lock_all_devices();
+               usb_unlock_device(udev);
                bus_rescan_devices(&usb_bus_type);
-               usb_unlock_all_devices();
+               usb_lock_device(udev);
        }
        return status;
 }
@@ -1857,14 +1911,14 @@ static int remote_wakeup(struct usb_device *udev)
        /* don't repeat RESUME sequence if this device
         * was already woken up by some other task
         */
-       down(&udev->serialize);
+       usb_lock_device(udev);
        if (udev->state == USB_STATE_SUSPENDED) {
                dev_dbg(&udev->dev, "RESUME (wakeup)\n");
                /* TRSMRCY = 10 msec */
                msleep(10);
                status = finish_device_resume(udev);
        }
-       up(&udev->serialize);
+       usb_unlock_device(udev);
 #endif
        return status;
 }
@@ -1965,7 +2019,7 @@ static int hub_resume(struct usb_interface *intf)
 
                if (!udev || status < 0)
                        continue;
-               down (&udev->serialize);
+               usb_lock_device(udev);
                if (portstat & USB_PORT_STAT_SUSPEND)
                        status = hub_port_resume(hub, port1, udev);
                else {
@@ -1976,7 +2030,7 @@ static int hub_resume(struct usb_interface *intf)
                                hub_port_logical_disconnect(hub, port1);
                        }
                }
-               up(&udev->serialize);
+               usb_unlock_device(udev);
        }
        }
 #endif
@@ -2360,39 +2414,36 @@ hub_power_remaining (struct usb_hub *hub)
 {
        struct usb_device *hdev = hub->hdev;
        int remaining;
-       unsigned i;
+       int port1;
 
-       remaining = hub->power_budget;
-       if (!remaining)         /* self-powered */
+       if (!hub->limited_power)
                return 0;
 
-       for (i = 0; i < hdev->maxchild; i++) {
-               struct usb_device       *udev = hdev->children[i];
-               int                     delta, ceiling;
+       remaining = hdev->bus_mA - hub->descriptor->bHubContrCurrent;
+       for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
+               struct usb_device       *udev = hdev->children[port1 - 1];
+               int                     delta;
 
                if (!udev)
                        continue;
 
-               /* 100mA per-port ceiling, or 8mA for OTG ports */
-               if (i != (udev->bus->otg_port - 1) || hdev->parent)
-                       ceiling = 50;
-               else
-                       ceiling = 4;
-
+               /* Unconfigured devices may not use more than 100mA,
+                * or 8mA for OTG ports */
                if (udev->actconfig)
-                       delta = udev->actconfig->desc.bMaxPower;
+                       delta = udev->actconfig->desc.bMaxPower * 2;
+               else if (port1 != udev->bus->otg_port || hdev->parent)
+                       delta = 100;
                else
-                       delta = ceiling;
-               // dev_dbg(&udev->dev, "budgeted %dmA\n", 2 * delta);
-               if (delta > ceiling)
-                       dev_warn(&udev->dev, "%dmA over %dmA budget!\n",
-                               2 * (delta - ceiling), 2 * ceiling);
+                       delta = 8;
+               if (delta > hub->mA_per_port)
+                       dev_warn(&udev->dev, "%dmA is over %umA budget "
+                                       "for port %d!\n",
+                                       delta, hub->mA_per_port, port1);
                remaining -= delta;
        }
        if (remaining < 0) {
-               dev_warn(hub->intfdev,
-                       "%dmA over power budget!\n",
-                       -2 * remaining);
+               dev_warn(hub->intfdev, "%dmA over power budget!\n",
+                       - remaining);
                remaining = 0;
        }
        return remaining;
@@ -2487,7 +2538,8 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
 
                usb_set_device_state(udev, USB_STATE_POWERED);
                udev->speed = USB_SPEED_UNKNOWN;
+               udev->bus_mA = hub->mA_per_port;
+
                /* set the address */
                choose_address(udev);
                if (udev->devnum <= 0) {
@@ -2507,16 +2559,16 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
                 * on the parent.
                 */
                if (udev->descriptor.bDeviceClass == USB_CLASS_HUB
-                               && hub->power_budget) {
+                               && udev->bus_mA <= 100) {
                        u16     devstat;
 
                        status = usb_get_status(udev, USB_RECIP_DEVICE, 0,
                                        &devstat);
-                       if (status < 0) {
+                       if (status < 2) {
                                dev_dbg(&udev->dev, "get status %d ?\n", status);
                                goto loop_disable;
                        }
-                       cpu_to_le16s(&devstat);
+                       le16_to_cpus(&devstat);
                        if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
                                dev_err(&udev->dev,
                                        "can't connect bus-powered hub "
@@ -2541,7 +2593,6 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
                 * udev becomes globally accessible, although presumably
                 * no one will look at it until hdev is unlocked.
                 */
-               down (&udev->serialize);
                status = 0;
 
                /* We mustn't add new devices if the parent hub has
@@ -2565,15 +2616,12 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
                        }
                }
 
-               up (&udev->serialize);
                if (status)
                        goto loop_disable;
 
                status = hub_power_remaining(hub);
                if (status)
-                       dev_dbg(hub_dev,
-                               "%dmA power budget left\n",
-                               2 * status);
+                       dev_dbg(hub_dev, "%dmA power budget left\n", status);
 
                return;
 
@@ -2649,6 +2697,8 @@ static void hub_events(void)
                if (i) {
                        dpm_runtime_resume(&hdev->dev);
                        dpm_runtime_resume(&intf->dev);
+                       usb_put_intf(intf);
+                       continue;
                }
 
                /* Lock the device, then check to see if we were
@@ -2662,7 +2712,7 @@ static void hub_events(void)
 
                /* If the hub has died, clean up after it */
                if (hdev->state == USB_STATE_NOTATTACHED) {
-                       hub_pre_reset(hub);
+                       hub_pre_reset(hub, 0);
                        goto loop;
                }
 
@@ -2785,6 +2835,11 @@ static void hub_events(void)
                        if (hubchange & HUB_CHANGE_LOCAL_POWER) {
                                dev_dbg (hub_dev, "power change\n");
                                clear_hub_feature(hdev, C_HUB_LOCAL_POWER);
+                               if (hubstatus & HUB_STATUS_LOCAL_POWER)
+                                       /* FIXME: Is this always true? */
+                                       hub->limited_power = 0;
+                               else
+                                       hub->limited_power = 1;
                        }
                        if (hubchange & HUB_CHANGE_OVERCURRENT) {
                                dev_dbg (hub_dev, "overcurrent change\n");
@@ -2833,7 +2888,6 @@ static struct usb_device_id hub_id_table [] = {
 MODULE_DEVICE_TABLE (usb, hub_id_table);
 
 static struct usb_driver hub_driver = {
-       .owner =        THIS_MODULE,
        .name =         "hub",
        .probe =        hub_probe,
        .disconnect =   hub_disconnect,
@@ -2945,7 +2999,8 @@ int usb_reset_device(struct usb_device *udev)
        struct usb_hub                  *parent_hub;
        struct usb_device_descriptor    descriptor = udev->descriptor;
        struct usb_hub                  *hub = NULL;
-       int                             i, ret = 0, port1 = -1;
+       int                             i, ret = 0;
+       int                             port1 = udev->portnum;
 
        if (udev->state == USB_STATE_NOTATTACHED ||
                        udev->state == USB_STATE_SUSPENDED) {
@@ -2959,18 +3014,6 @@ int usb_reset_device(struct usb_device *udev)
                dev_dbg(&udev->dev, "%s for root hub!\n", __FUNCTION__);
                return -EISDIR;
        }
-
-       for (i = 0; i < parent_hdev->maxchild; i++)
-               if (parent_hdev->children[i] == udev) {
-                       port1 = i + 1;
-                       break;
-               }
-
-       if (port1 < 0) {
-               /* If this ever happens, it's very bad */
-               dev_err(&udev->dev, "Can't locate device's port!\n");
-               return -ENOENT;
-       }
        parent_hub = hdev_to_hub(parent_hdev);
 
        /* If we're resetting an active hub, take some special actions */
@@ -2978,7 +3021,7 @@ int usb_reset_device(struct usb_device *udev)
                        udev->actconfig->interface[0]->dev.driver ==
                                &hub_driver.driver &&
                        (hub = hdev_to_hub(udev)) != NULL) {
-               hub_pre_reset(hub);
+               hub_pre_reset(hub, 0);
        }
 
        set_bit(port1, parent_hub->busy_bits);
index bf23f8978024b146c755dc3bb125c4f8947a5b87..29d5f45a8456369f39dd1ed79d8853b40a5cefa7 100644 (file)
@@ -220,8 +220,9 @@ struct usb_hub {
        struct usb_hub_descriptor *descriptor;  /* class descriptor */
        struct usb_tt           tt;             /* Transaction Translator */
 
-       u8                      power_budget;   /* in 2mA units; or zero */
+       unsigned                mA_per_port;    /* current for each child */
 
+       unsigned                limited_power:1;
        unsigned                quiescing:1;
        unsigned                activating:1;
        unsigned                resume_root_hub:1;
index fe74f99ca5f4bb8dc5f981cce78e86115702c3d2..319de03944e7a39d9d0bac12a46afc4f8c32a023 100644 (file)
@@ -1387,6 +1387,12 @@ free_interfaces:
        if (dev->state != USB_STATE_ADDRESS)
                usb_disable_device (dev, 1);    // Skip ep0
 
+       i = dev->bus_mA - cp->desc.bMaxPower * 2;
+       if (i < 0)
+               dev_warn(&dev->dev, "new config #%d exceeds power "
+                               "limit by %dmA\n",
+                               configuration, -i);
+
        if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
                        USB_REQ_SET_CONFIGURATION, 0, configuration, 0,
                        NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0)
index e197ce9353de0f4591ad38861413b7ceb1b66593..56a3520863a969f366a1be30ea7c0618317de4a4 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/spinlock.h>
 #include <linux/errno.h>
 #include <linux/smp_lock.h>
-#include <linux/rwsem.h>
 #include <linux/usb.h>
 
 #include <asm/io.h>
 const char *usbcore_name = "usbcore";
 
 static int nousb;      /* Disable USB when built into kernel image */
-                       /* Not honored on modular build */
 
-static DECLARE_RWSEM(usb_all_devices_rwsem);
-
-
-static int generic_probe (struct device *dev)
-{
-       return 0;
-}
-static int generic_remove (struct device *dev)
-{
-       struct usb_device *udev = to_usb_device(dev);
-
-       /* if this is only an unbind, not a physical disconnect, then
-        * unconfigure the device */
-       if (udev->state == USB_STATE_CONFIGURED)
-               usb_set_configuration(udev, 0);
-
-       /* in case the call failed or the device was suspended */
-       if (udev->state >= USB_STATE_CONFIGURED)
-               usb_disable_device(udev, 0);
-       return 0;
-}
-
-static struct device_driver usb_generic_driver = {
-       .owner = THIS_MODULE,
-       .name = "usb",
-       .bus = &usb_bus_type,
-       .probe = generic_probe,
-       .remove = generic_remove,
-};
-
-static int usb_generic_driver_data;
-
-/* called from driver core with usb_bus_type.subsys writelock */
-static int usb_probe_interface(struct device *dev)
-{
-       struct usb_interface * intf = to_usb_interface(dev);
-       struct usb_driver * driver = to_usb_driver(dev->driver);
-       const struct usb_device_id *id;
-       int error = -ENODEV;
-
-       dev_dbg(dev, "%s\n", __FUNCTION__);
-
-       if (!driver->probe)
-               return error;
-       /* FIXME we'd much prefer to just resume it ... */
-       if (interface_to_usbdev(intf)->state == USB_STATE_SUSPENDED)
-               return -EHOSTUNREACH;
-
-       id = usb_match_id (intf, driver->id_table);
-       if (id) {
-               dev_dbg (dev, "%s - got id\n", __FUNCTION__);
-
-               /* Interface "power state" doesn't correspond to any hardware
-                * state whatsoever.  We use it to record when it's bound to
-                * a driver that may start I/0:  it's not frozen/quiesced.
-                */
-               mark_active(intf);
-               intf->condition = USB_INTERFACE_BINDING;
-               error = driver->probe (intf, id);
-               if (error) {
-                       mark_quiesced(intf);
-                       intf->condition = USB_INTERFACE_UNBOUND;
-               } else
-                       intf->condition = USB_INTERFACE_BOUND;
-       }
-
-       return error;
-}
-
-/* called from driver core with usb_bus_type.subsys writelock */
-static int usb_unbind_interface(struct device *dev)
-{
-       struct usb_interface *intf = to_usb_interface(dev);
-       struct usb_driver *driver = to_usb_driver(intf->dev.driver);
-
-       intf->condition = USB_INTERFACE_UNBINDING;
-
-       /* release all urbs for this interface */
-       usb_disable_interface(interface_to_usbdev(intf), intf);
-
-       if (driver && driver->disconnect)
-               driver->disconnect(intf);
-
-       /* reset other interface state */
-       usb_set_interface(interface_to_usbdev(intf),
-                       intf->altsetting[0].desc.bInterfaceNumber,
-                       0);
-       usb_set_intfdata(intf, NULL);
-       intf->condition = USB_INTERFACE_UNBOUND;
-       mark_quiesced(intf);
-
-       return 0;
-}
-
-/**
- * usb_register - register a USB driver
- * @new_driver: USB operations for the driver
- *
- * Registers a USB driver with the USB core.  The list of unattached
- * interfaces will be rescanned whenever a new driver is added, allowing
- * the new driver to attach to any recognized devices.
- * Returns a negative error code on failure and 0 on success.
- * 
- * NOTE: if you want your driver to use the USB major number, you must call
- * usb_register_dev() to enable that functionality.  This function no longer
- * takes care of that.
- */
-int usb_register(struct usb_driver *new_driver)
-{
-       int retval = 0;
-
-       if (nousb)
-               return -ENODEV;
-
-       new_driver->driver.name = (char *)new_driver->name;
-       new_driver->driver.bus = &usb_bus_type;
-       new_driver->driver.probe = usb_probe_interface;
-       new_driver->driver.remove = usb_unbind_interface;
-       new_driver->driver.owner = new_driver->owner;
-
-       usb_lock_all_devices();
-       retval = driver_register(&new_driver->driver);
-       usb_unlock_all_devices();
-
-       if (!retval) {
-               pr_info("%s: registered new driver %s\n",
-                       usbcore_name, new_driver->name);
-               usbfs_update_special();
-       } else {
-               printk(KERN_ERR "%s: error %d registering driver %s\n",
-                       usbcore_name, retval, new_driver->name);
-       }
-
-       return retval;
-}
-
-/**
- * usb_deregister - unregister a USB driver
- * @driver: USB operations of the driver to unregister
- * Context: must be able to sleep
- *
- * Unlinks the specified driver from the internal USB driver list.
- * 
- * NOTE: If you called usb_register_dev(), you still need to call
- * usb_deregister_dev() to clean up your driver's allocated minor numbers,
- * this * call will no longer do it for you.
- */
-void usb_deregister(struct usb_driver *driver)
-{
-       pr_info("%s: deregistering driver %s\n", usbcore_name, driver->name);
-
-       usb_lock_all_devices();
-       driver_unregister (&driver->driver);
-       usb_unlock_all_devices();
-
-       usbfs_update_special();
-}
 
 /**
  * usb_ifnum_to_if - get the interface object with a given interface number
@@ -351,152 +192,23 @@ void usb_driver_release_interface(struct usb_driver *driver,
        iface->condition = USB_INTERFACE_UNBOUND;
        mark_quiesced(iface);
 }
-
-/**
- * usb_match_id - find first usb_device_id matching device or interface
- * @interface: the interface of interest
- * @id: array of usb_device_id structures, terminated by zero entry
- *
- * usb_match_id searches an array of usb_device_id's and returns
- * the first one matching the device or interface, or null.
- * This is used when binding (or rebinding) a driver to an interface.
- * Most USB device drivers will use this indirectly, through the usb core,
- * but some layered driver frameworks use it directly.
- * These device tables are exported with MODULE_DEVICE_TABLE, through
- * modutils and "modules.usbmap", to support the driver loading
- * functionality of USB hotplugging.
- *
- * What Matches:
- *
- * The "match_flags" element in a usb_device_id controls which
- * members are used.  If the corresponding bit is set, the
- * value in the device_id must match its corresponding member
- * in the device or interface descriptor, or else the device_id
- * does not match.
- *
- * "driver_info" is normally used only by device drivers,
- * but you can create a wildcard "matches anything" usb_device_id
- * as a driver's "modules.usbmap" entry if you provide an id with
- * only a nonzero "driver_info" field.  If you do this, the USB device
- * driver's probe() routine should use additional intelligence to
- * decide whether to bind to the specified interface.
- * 
- * What Makes Good usb_device_id Tables:
- *
- * The match algorithm is very simple, so that intelligence in
- * driver selection must come from smart driver id records.
- * Unless you have good reasons to use another selection policy,
- * provide match elements only in related groups, and order match
- * specifiers from specific to general.  Use the macros provided
- * for that purpose if you can.
- *
- * The most specific match specifiers use device descriptor
- * data.  These are commonly used with product-specific matches;
- * the USB_DEVICE macro lets you provide vendor and product IDs,
- * and you can also match against ranges of product revisions.
- * These are widely used for devices with application or vendor
- * specific bDeviceClass values.
- *
- * Matches based on device class/subclass/protocol specifications
- * are slightly more general; use the USB_DEVICE_INFO macro, or
- * its siblings.  These are used with single-function devices
- * where bDeviceClass doesn't specify that each interface has
- * its own class. 
- *
- * Matches based on interface class/subclass/protocol are the
- * most general; they let drivers bind to any interface on a
- * multiple-function device.  Use the USB_INTERFACE_INFO
- * macro, or its siblings, to match class-per-interface style 
- * devices (as recorded in bDeviceClass).
- *  
- * Within those groups, remember that not all combinations are
- * meaningful.  For example, don't give a product version range
- * without vendor and product IDs; or specify a protocol without
- * its associated class and subclass.
- */   
-const struct usb_device_id *
-usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
-{
-       struct usb_host_interface *intf;
-       struct usb_device *dev;
-
-       /* proc_connectinfo in devio.c may call us with id == NULL. */
-       if (id == NULL)
-               return NULL;
-
-       intf = interface->cur_altsetting;
-       dev = interface_to_usbdev(interface);
-
-       /* It is important to check that id->driver_info is nonzero,
-          since an entry that is all zeroes except for a nonzero
-          id->driver_info is the way to create an entry that
-          indicates that the driver want to examine every
-          device and interface. */
-       for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||
-              id->driver_info; id++) {
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
-                   id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
-                   id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
-                       continue;
-
-               /* No need to test id->bcdDevice_lo != 0, since 0 is never
-                  greater than any unsigned number. */
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
-                   (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
-                   (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice)))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&
-                   (id->bDeviceClass != dev->descriptor.bDeviceClass))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&
-                   (id->bDeviceSubClass!= dev->descriptor.bDeviceSubClass))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&
-                   (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&
-                   (id->bInterfaceClass != intf->desc.bInterfaceClass))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) &&
-                   (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass))
-                       continue;
-
-               if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) &&
-                   (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))
-                       continue;
-
-               return id;
-       }
-
-       return NULL;
-}
-
+struct find_interface_arg {
+       int minor;
+       struct usb_interface *interface;
+};
 
 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;
+       struct find_interface_arg *arg = data;
+       struct usb_interface *intf;
 
        /* 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;
+       if (intf->minor != -1 && intf->minor == arg->minor) {
+               arg->interface = intf;
                return 1;
        }
        return 0;
@@ -513,35 +225,14 @@ static int __find_interface(struct device * dev, void * data)
  */
 struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
 {
-       struct usb_interface *intf = (struct usb_interface *)(long)minor;
-       int ret;
-
-       ret = driver_for_each_device(&drv->driver, NULL, &intf, __find_interface);
+       struct find_interface_arg argb;
 
-       return ret ? intf : NULL;
+       argb.minor = minor;
+       argb.interface = NULL;
+       driver_for_each_device(&drv->driver, NULL, &argb, __find_interface);
+       return argb.interface;
 }
 
-static int usb_device_match (struct device *dev, struct device_driver *drv)
-{
-       struct usb_interface *intf;
-       struct usb_driver *usb_drv;
-       const struct usb_device_id *id;
-
-       /* check for generic driver, which we don't match any device with */
-       if (drv == &usb_generic_driver)
-               return 0;
-
-       intf = to_usb_interface(dev);
-       usb_drv = to_usb_driver(drv);
-       
-       id = usb_match_id (intf, usb_drv->id_table);
-       if (id)
-               return 1;
-
-       return 0;
-}
-
-
 #ifdef CONFIG_HOTPLUG
 
 /*
@@ -750,12 +441,11 @@ usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1)
                /* hub driver sets up TT records */
        }
 
+       dev->portnum = port1;
        dev->bus = bus;
        dev->parent = parent;
        INIT_LIST_HEAD(&dev->filelist);
 
-       init_MUTEX(&dev->serialize);
-
        return dev;
 }
 
@@ -828,75 +518,20 @@ void usb_put_intf(struct usb_interface *intf)
 
 /*                     USB device locking
  *
- * Although locking USB devices should be straightforward, it is
- * complicated by the way the driver-model core works.  When a new USB
- * driver is registered or unregistered, the core will automatically
- * probe or disconnect all matching interfaces on all USB devices while
- * holding the USB subsystem writelock.  There's no good way for us to
- * tell which devices will be used or to lock them beforehand; our only
- * option is to effectively lock all the USB devices.
- *
- * We do that by using a private rw-semaphore, usb_all_devices_rwsem.
- * When locking an individual device you must first acquire the rwsem's
- * readlock.  When a driver is registered or unregistered the writelock
- * must be held.  These actions are encapsulated in the subroutines
- * below, so all a driver needs to do is call usb_lock_device() and
- * usb_unlock_device().
+ * USB devices and interfaces are locked using the semaphore in their
+ * embedded struct device.  The hub driver guarantees that whenever a
+ * device is connected or disconnected, drivers are called with the
+ * USB device locked as well as their particular interface.
  *
  * Complications arise when several devices are to be locked at the same
  * time.  Only hub-aware drivers that are part of usbcore ever have to
- * do this; nobody else needs to worry about it.  The problem is that
- * usb_lock_device() must not be called to lock a second device since it
- * would acquire the rwsem's readlock reentrantly, leading to deadlock if
- * another thread was waiting for the writelock.  The solution is simple:
- *
- *     When locking more than one device, call usb_lock_device()
- *     to lock the first one.  Lock the others by calling
- *     down(&udev->serialize) directly.
- *
- *     When unlocking multiple devices, use up(&udev->serialize)
- *     to unlock all but the last one.  Unlock the last one by
- *     calling usb_unlock_device().
+ * do this; nobody else needs to worry about it.  The rule for locking
+ * is simple:
  *
  *     When locking both a device and its parent, always lock the
  *     the parent first.
  */
 
-/**
- * usb_lock_device - acquire the lock for a usb device structure
- * @udev: device that's being locked
- *
- * Use this routine when you don't hold any other device locks;
- * to acquire nested inner locks call down(&udev->serialize) directly.
- * This is necessary for proper interaction with usb_lock_all_devices().
- */
-void usb_lock_device(struct usb_device *udev)
-{
-       down_read(&usb_all_devices_rwsem);
-       down(&udev->serialize);
-}
-
-/**
- * usb_trylock_device - attempt to acquire the lock for a usb device structure
- * @udev: device that's being locked
- *
- * Don't use this routine if you already hold a device lock;
- * use down_trylock(&udev->serialize) instead.
- * This is necessary for proper interaction with usb_lock_all_devices().
- *
- * Returns 1 if successful, 0 if contention.
- */
-int usb_trylock_device(struct usb_device *udev)
-{
-       if (!down_read_trylock(&usb_all_devices_rwsem))
-               return 0;
-       if (down_trylock(&udev->serialize)) {
-               up_read(&usb_all_devices_rwsem);
-               return 0;
-       }
-       return 1;
-}
-
 /**
  * usb_lock_device_for_reset - cautiously acquire the lock for a
  *     usb device structure
@@ -935,7 +570,7 @@ int usb_lock_device_for_reset(struct usb_device *udev,
                }
        }
 
-       while (!usb_trylock_device(udev)) {
+       while (usb_trylock_device(udev) != 0) {
 
                /* If we can't acquire the lock after waiting one second,
                 * we're probably deadlocked */
@@ -953,39 +588,6 @@ int usb_lock_device_for_reset(struct usb_device *udev,
        return 1;
 }
 
-/**
- * usb_unlock_device - release the lock for a usb device structure
- * @udev: device that's being unlocked
- *
- * Use this routine when releasing the only device lock you hold;
- * to release inner nested locks call up(&udev->serialize) directly.
- * This is necessary for proper interaction with usb_lock_all_devices().
- */
-void usb_unlock_device(struct usb_device *udev)
-{
-       up(&udev->serialize);
-       up_read(&usb_all_devices_rwsem);
-}
-
-/**
- * usb_lock_all_devices - acquire the lock for all usb device structures
- *
- * This is necessary when registering a new driver or probing a bus,
- * since the driver-model core may try to use any usb_device.
- */
-void usb_lock_all_devices(void)
-{
-       down_write(&usb_all_devices_rwsem);
-}
-
-/**
- * usb_unlock_all_devices - release the lock for all usb device structures
- */
-void usb_unlock_all_devices(void)
-{
-       up_write(&usb_all_devices_rwsem);
-}
-
 
 static struct usb_device *match_device(struct usb_device *dev,
                                       u16 vendor_id, u16 product_id)
@@ -1008,10 +610,10 @@ static struct usb_device *match_device(struct usb_device *dev,
        /* look through all of the children of this device */
        for (child = 0; child < dev->maxchild; ++child) {
                if (dev->children[child]) {
-                       down(&dev->children[child]->serialize);
+                       usb_lock_device(dev->children[child]);
                        ret_dev = match_device(dev->children[child],
                                               vendor_id, product_id);
-                       up(&dev->children[child]->serialize);
+                       usb_unlock_device(dev->children[child]);
                        if (ret_dev)
                                goto exit;
                }
@@ -1432,7 +1034,8 @@ static int usb_generic_suspend(struct device *dev, pm_message_t message)
                        mark_quiesced(intf);
        } else {
                // FIXME else if there's no suspend method, disconnect...
-               dev_warn(dev, "no %s?\n", "suspend");
+               dev_warn(dev, "no suspend for driver %s?\n", driver->name);
+               mark_quiesced(intf);
                status = 0;
        }
        return status;
@@ -1460,8 +1063,10 @@ static int usb_generic_resume(struct device *dev)
        }
 
        if ((dev->driver == NULL) ||
-           (dev->driver_data == &usb_generic_driver_data))
+           (dev->driver_data == &usb_generic_driver_data)) {
+               dev->power.power_state.event = PM_EVENT_FREEZE;
                return 0;
+       }
 
        intf = to_usb_interface(dev);
        driver = to_usb_driver(dev->driver);
@@ -1481,7 +1086,7 @@ static int usb_generic_resume(struct device *dev)
                        mark_quiesced(intf);
                }
        } else
-               dev_warn(dev, "no %s?\n", "resume");
+               dev_warn(dev, "no resume for driver %s?\n", driver->name);
        return 0;
 }
 
@@ -1493,18 +1098,8 @@ struct bus_type usb_bus_type = {
        .resume =       usb_generic_resume,
 };
 
-#ifndef MODULE
-
-static int __init usb_setup_disable(char *str)
-{
-       nousb = 1;
-       return 1;
-}
-
 /* format to disable USB on kernel command line is: nousb */
-__setup("nousb", usb_setup_disable);
-
-#endif
+__module_param_call("", nousb, param_set_bool, param_get_bool, &nousb, 0444);
 
 /*
  * for external read access to <nousb>
@@ -1595,8 +1190,6 @@ module_exit(usb_exit);
  * driver modules to use.
  */
 
-EXPORT_SYMBOL(usb_register);
-EXPORT_SYMBOL(usb_deregister);
 EXPORT_SYMBOL(usb_disabled);
 
 EXPORT_SYMBOL_GPL(usb_get_intf);
@@ -1607,14 +1200,10 @@ EXPORT_SYMBOL(usb_put_dev);
 EXPORT_SYMBOL(usb_get_dev);
 EXPORT_SYMBOL(usb_hub_tt_clear_buffer);
 
-EXPORT_SYMBOL(usb_lock_device);
-EXPORT_SYMBOL(usb_trylock_device);
 EXPORT_SYMBOL(usb_lock_device_for_reset);
-EXPORT_SYMBOL(usb_unlock_device);
 
 EXPORT_SYMBOL(usb_driver_claim_interface);
 EXPORT_SYMBOL(usb_driver_release_interface);
-EXPORT_SYMBOL(usb_match_id);
 EXPORT_SYMBOL(usb_find_interface);
 EXPORT_SYMBOL(usb_ifnum_to_if);
 EXPORT_SYMBOL(usb_altnum_to_altsetting);
index 1c4a68499dce53cd060b27deb0d05c6658a01a04..4647e1ebc68d08fcfadae61bd9e0f4310c23abc0 100644 (file)
@@ -16,9 +16,6 @@ extern int usb_get_device_descriptor(struct usb_device *dev,
 extern char *usb_cache_string(struct usb_device *udev, int index);
 extern int usb_set_configuration(struct usb_device *dev, int configuration);
 
-extern void usb_lock_all_devices(void);
-extern void usb_unlock_all_devices(void);
-
 extern void usb_kick_khubd(struct usb_device *dev);
 extern void usb_suspend_root_hub(struct usb_device *hdev);
 extern void usb_resume_root_hub(struct usb_device *dev);
@@ -33,6 +30,9 @@ extern void usb_host_cleanup(void);
 extern int usb_suspend_device(struct usb_device *dev);
 extern int usb_resume_device(struct usb_device *dev);
 
+extern struct device_driver usb_generic_driver;
+extern int usb_generic_driver_data;
+extern int usb_device_match(struct device *dev, struct device_driver *drv);
 
 /* Interfaces and their "power state" are owned by usbcore */
 
index c655d46c8aed5ef7c0cd31510155613985c40a86..9734cb76dd6c24ff499204aa7ff5c60ecae7865f 100644 (file)
@@ -138,7 +138,7 @@ static const char *const ep_name [] = {
        /* or like sa1100: two fixed function endpoints */
        "ep1out-bulk", "ep2in-bulk",
 };
-#define DUMMY_ENDPOINTS        (sizeof(ep_name)/sizeof(char *))
+#define DUMMY_ENDPOINTS        ARRAY_SIZE(ep_name)
 
 /*-------------------------------------------------------------------------*/
 
@@ -896,7 +896,7 @@ dummy_gadget_release (struct device *dev)
 #endif
 }
 
-static int dummy_udc_probe (struct platform_device *dev)
+static int dummy_udc_probe (struct platform_device *pdev)
 {
        struct dummy    *dum = the_controller;
        int             rc;
@@ -909,7 +909,7 @@ static int dummy_udc_probe (struct platform_device *dev)
        dum->gadget.is_otg = (dummy_to_hcd(dum)->self.otg_port != 0);
 
        strcpy (dum->gadget.dev.bus_id, "gadget");
-       dum->gadget.dev.parent = &dev->dev;
+       dum->gadget.dev.parent = &pdev->dev;
        dum->gadget.dev.release = dummy_gadget_release;
        rc = device_register (&dum->gadget.dev);
        if (rc < 0)
@@ -919,47 +919,47 @@ static int dummy_udc_probe (struct platform_device *dev)
        usb_bus_get (&dummy_to_hcd (dum)->self);
 #endif
 
-       platform_set_drvdata (dev, dum);
+       platform_set_drvdata (pdev, dum);
        device_create_file (&dum->gadget.dev, &dev_attr_function);
        return rc;
 }
 
-static int dummy_udc_remove (struct platform_device *dev)
+static int dummy_udc_remove (struct platform_device *pdev)
 {
-       struct dummy    *dum = platform_get_drvdata (dev);
+       struct dummy    *dum = platform_get_drvdata (pdev);
 
-       platform_set_drvdata (dev, NULL);
+       platform_set_drvdata (pdev, NULL);
        device_remove_file (&dum->gadget.dev, &dev_attr_function);
        device_unregister (&dum->gadget.dev);
        return 0;
 }
 
-static int dummy_udc_suspend (struct platform_device *dev, pm_message_t state)
+static int dummy_udc_suspend (struct platform_device *pdev, pm_message_t state)
 {
-       struct dummy    *dum = platform_get_drvdata(dev);
+       struct dummy    *dum = platform_get_drvdata(pdev);
 
-       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
+       dev_dbg (&pdev->dev, "%s\n", __FUNCTION__);
        spin_lock_irq (&dum->lock);
        dum->udc_suspended = 1;
        set_link_state (dum);
        spin_unlock_irq (&dum->lock);
 
-       dev->dev.power.power_state = state;
+       pdev->dev.power.power_state = state;
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
 
-static int dummy_udc_resume (struct platform_device *dev)
+static int dummy_udc_resume (struct platform_device *pdev)
 {
-       struct dummy    *dum = platform_get_drvdata(dev);
+       struct dummy    *dum = platform_get_drvdata(pdev);
 
-       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
+       dev_dbg (&pdev->dev, "%s\n", __FUNCTION__);
        spin_lock_irq (&dum->lock);
        dum->udc_suspended = 0;
        set_link_state (dum);
        spin_unlock_irq (&dum->lock);
 
-       dev->dev.power.power_state = PMSG_ON;
+       pdev->dev.power.power_state = PMSG_ON;
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
@@ -1576,7 +1576,7 @@ static int dummy_hub_status (struct usb_hcd *hcd, char *buf)
        dum = hcd_to_dummy (hcd);
 
        spin_lock_irqsave (&dum->lock, flags);
-       if (hcd->state != HC_STATE_RUNNING)
+       if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
                goto done;
 
        if (dum->resuming && time_after_eq (jiffies, dum->re_timeout)) {
@@ -1623,7 +1623,7 @@ static int dummy_hub_control (
        int             retval = 0;
        unsigned long   flags;
 
-       if (hcd->state != HC_STATE_RUNNING)
+       if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
                return -ETIMEDOUT;
 
        dum = hcd_to_dummy (hcd);
@@ -1756,9 +1756,12 @@ static int dummy_bus_suspend (struct usb_hcd *hcd)
 {
        struct dummy *dum = hcd_to_dummy (hcd);
 
+       dev_dbg (&hcd->self.root_hub->dev, "%s\n", __FUNCTION__);
+
        spin_lock_irq (&dum->lock);
        dum->rh_state = DUMMY_RH_SUSPENDED;
        set_link_state (dum);
+       hcd->state = HC_STATE_SUSPENDED;
        spin_unlock_irq (&dum->lock);
        return 0;
 }
@@ -1766,14 +1769,23 @@ static int dummy_bus_suspend (struct usb_hcd *hcd)
 static int dummy_bus_resume (struct usb_hcd *hcd)
 {
        struct dummy *dum = hcd_to_dummy (hcd);
+       int rc = 0;
+
+       dev_dbg (&hcd->self.root_hub->dev, "%s\n", __FUNCTION__);
 
        spin_lock_irq (&dum->lock);
-       dum->rh_state = DUMMY_RH_RUNNING;
-       set_link_state (dum);
-       if (!list_empty(&dum->urbp_list))
-               mod_timer (&dum->timer, jiffies);
+       if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
+               dev_warn (&hcd->self.root_hub->dev, "HC isn't running!\n");
+               rc = -ENODEV;
+       } else {
+               dum->rh_state = DUMMY_RH_RUNNING;
+               set_link_state (dum);
+               if (!list_empty(&dum->urbp_list))
+                       mod_timer (&dum->timer, jiffies);
+               hcd->state = HC_STATE_RUNNING;
+       }
        spin_unlock_irq (&dum->lock);
-       return 0;
+       return rc;
 }
 
 /*-------------------------------------------------------------------------*/
@@ -1899,14 +1911,14 @@ static const struct hc_driver dummy_hcd = {
        .bus_resume =           dummy_bus_resume,
 };
 
-static int dummy_hcd_probe (struct platform_device *dev)
+static int dummy_hcd_probe(struct platform_device *pdev)
 {
        struct usb_hcd          *hcd;
        int                     retval;
 
-       dev_info(&dev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
+       dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
 
-       hcd = usb_create_hcd (&dummy_hcd, &dev->dev, dev->dev.bus_id);
+       hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, pdev->dev.bus_id);
        if (!hcd)
                return -ENOMEM;
        the_controller = hcd_to_dummy (hcd);
@@ -1919,36 +1931,43 @@ static int dummy_hcd_probe (struct platform_device *dev)
        return retval;
 }
 
-static int dummy_hcd_remove (struct platform_device *dev)
+static int dummy_hcd_remove (struct platform_device *pdev)
 {
        struct usb_hcd          *hcd;
 
-       hcd = platform_get_drvdata (dev);
+       hcd = platform_get_drvdata (pdev);
        usb_remove_hcd (hcd);
        usb_put_hcd (hcd);
        the_controller = NULL;
        return 0;
 }
 
-static int dummy_hcd_suspend (struct platform_device *dev, pm_message_t state)
+static int dummy_hcd_suspend (struct platform_device *pdev, pm_message_t state)
 {
        struct usb_hcd          *hcd;
+       struct dummy            *dum;
+       int                     rc = 0;
 
-       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
-       hcd = platform_get_drvdata (dev);
+       dev_dbg (&pdev->dev, "%s\n", __FUNCTION__);
 
-       hcd->state = HC_STATE_SUSPENDED;
-       return 0;
+       hcd = platform_get_drvdata (pdev);
+       dum = hcd_to_dummy (hcd);
+       if (dum->rh_state == DUMMY_RH_RUNNING) {
+               dev_warn(&pdev->dev, "Root hub isn't suspended!\n");
+               rc = -EBUSY;
+       } else
+               clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+       return rc;
 }
 
-static int dummy_hcd_resume (struct platform_device *dev)
+static int dummy_hcd_resume (struct platform_device *pdev)
 {
        struct usb_hcd          *hcd;
 
-       dev_dbg (&dev->dev, "%s\n", __FUNCTION__);
-       hcd = platform_get_drvdata (dev);
-       hcd->state = HC_STATE_RUNNING;
+       dev_dbg (&pdev->dev, "%s\n", __FUNCTION__);
 
+       hcd = platform_get_drvdata (pdev);
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        usb_hcd_poll_rh_status (hcd);
        return 0;
 }
index ea09aaa3cab69370d87ed49d5b9c2acc58eb4f35..0cea9782d7d428ed07fd34018e5df98e4fe6e9c1 100644 (file)
 #include <linux/fs.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/kref.h>
 #include <linux/kthread.h>
 #include <linux/limits.h>
 #include <linux/list.h>
 #include <linux/string.h>
 #include <linux/suspend.h>
 #include <linux/utsname.h>
-#include <linux/wait.h>
 
 #include <linux/usb_ch9.h>
 #include <linux/usb_gadget.h>
 
 #define DRIVER_DESC            "File-backed Storage Gadget"
 #define DRIVER_NAME            "g_file_storage"
-#define DRIVER_VERSION         "20 October 2004"
+#define DRIVER_VERSION         "28 November 2005"
 
 static const char longname[] = DRIVER_DESC;
 static const char shortname[] = DRIVER_NAME;
@@ -335,8 +335,8 @@ MODULE_LICENSE("Dual BSD/GPL");
 #define MAX_LUNS       8
 
        /* Arggh!  There should be a module_param_array_named macro! */
-static char            *file[MAX_LUNS] = {NULL, };
-static int             ro[MAX_LUNS] = {0, };
+static char            *file[MAX_LUNS];
+static int             ro[MAX_LUNS];
 
 static struct {
        int             num_filenames;
@@ -587,7 +587,7 @@ enum fsg_buffer_state {
 struct fsg_buffhd {
        void                            *buf;
        dma_addr_t                      dma;
-       volatile enum fsg_buffer_state  state;
+       enum fsg_buffer_state           state;
        struct fsg_buffhd               *next;
 
        /* The NetChip 2280 is faster, and handles some protocol faults
@@ -596,9 +596,9 @@ struct fsg_buffhd {
        unsigned int                    bulk_out_intended_length;
 
        struct usb_request              *inreq;
-       volatile int                    inreq_busy;
+       int                             inreq_busy;
        struct usb_request              *outreq;
-       volatile int                    outreq_busy;
+       int                             outreq_busy;
 };
 
 enum fsg_state {
@@ -631,13 +631,16 @@ struct fsg_dev {
        /* filesem protects: backing files in use */
        struct rw_semaphore     filesem;
 
+       /* reference counting: wait until all LUNs are released */
+       struct kref             ref;
+
        struct usb_ep           *ep0;           // Handy copy of gadget->ep0
        struct usb_request      *ep0req;        // For control responses
-       volatile unsigned int   ep0_req_tag;
+       unsigned int            ep0_req_tag;
        const char              *ep0req_name;
 
        struct usb_request      *intreq;        // For interrupt responses
-       volatile int            intreq_busy;
+       int                     intreq_busy;
        struct fsg_buffhd       *intr_buffhd;
 
        unsigned int            bulk_out_maxpacket;
@@ -667,7 +670,6 @@ struct fsg_dev {
        struct fsg_buffhd       *next_buffhd_to_drain;
        struct fsg_buffhd       buffhds[NUM_BUFFERS];
 
-       wait_queue_head_t       thread_wqh;
        int                     thread_wakeup_needed;
        struct completion       thread_notifier;
        struct task_struct      *thread_task;
@@ -694,7 +696,6 @@ struct fsg_dev {
        unsigned int            nluns;
        struct lun              *luns;
        struct lun              *curlun;
-       struct completion       lun_released;
 };
 
 typedef void (*fsg_routine_t)(struct fsg_dev *);
@@ -1073,11 +1074,13 @@ static int populate_config_buf(struct usb_gadget *gadget,
 
 /* These routines may be called in process context or in_irq */
 
+/* Caller must hold fsg->lock */
 static void wakeup_thread(struct fsg_dev *fsg)
 {
        /* Tell the main thread that something has happened */
        fsg->thread_wakeup_needed = 1;
-       wake_up_all(&fsg->thread_wqh);
+       if (fsg->thread_task)
+               wake_up_process(fsg->thread_task);
 }
 
 
@@ -1164,11 +1167,12 @@ static void bulk_in_complete(struct usb_ep *ep, struct usb_request *req)
                usb_ep_fifo_flush(ep);
 
        /* Hold the lock while we update the request and buffer states */
+       smp_wmb();
        spin_lock(&fsg->lock);
        bh->inreq_busy = 0;
        bh->state = BUF_STATE_EMPTY;
-       spin_unlock(&fsg->lock);
        wakeup_thread(fsg);
+       spin_unlock(&fsg->lock);
 }
 
 static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req)
@@ -1185,11 +1189,12 @@ static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req)
                usb_ep_fifo_flush(ep);
 
        /* Hold the lock while we update the request and buffer states */
+       smp_wmb();
        spin_lock(&fsg->lock);
        bh->outreq_busy = 0;
        bh->state = BUF_STATE_FULL;
-       spin_unlock(&fsg->lock);
        wakeup_thread(fsg);
+       spin_unlock(&fsg->lock);
 }
 
 
@@ -1206,11 +1211,12 @@ static void intr_in_complete(struct usb_ep *ep, struct usb_request *req)
                usb_ep_fifo_flush(ep);
 
        /* Hold the lock while we update the request and buffer states */
+       smp_wmb();
        spin_lock(&fsg->lock);
        fsg->intreq_busy = 0;
        bh->state = BUF_STATE_EMPTY;
-       spin_unlock(&fsg->lock);
        wakeup_thread(fsg);
+       spin_unlock(&fsg->lock);
 }
 
 #else
@@ -1261,8 +1267,8 @@ static void received_cbi_adsc(struct fsg_dev *fsg, struct fsg_buffhd *bh)
        fsg->cbbuf_cmnd_size = req->actual;
        memcpy(fsg->cbbuf_cmnd, req->buf, fsg->cbbuf_cmnd_size);
 
-       spin_unlock(&fsg->lock);
        wakeup_thread(fsg);
+       spin_unlock(&fsg->lock);
 }
 
 #else
@@ -1514,8 +1520,8 @@ static int fsg_setup(struct usb_gadget *gadget,
 
 /* Use this for bulk or interrupt transfers, not ep0 */
 static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
-               struct usb_request *req, volatile int *pbusy,
-               volatile enum fsg_buffer_state *state)
+               struct usb_request *req, int *pbusy,
+               enum fsg_buffer_state *state)
 {
        int     rc;
 
@@ -1523,8 +1529,11 @@ static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
                dump_msg(fsg, "bulk-in", req->buf, req->length);
        else if (ep == fsg->intr_in)
                dump_msg(fsg, "intr-in", req->buf, req->length);
+
+       spin_lock_irq(&fsg->lock);
        *pbusy = 1;
        *state = BUF_STATE_BUSY;
+       spin_unlock_irq(&fsg->lock);
        rc = usb_ep_queue(ep, req, GFP_KERNEL);
        if (rc != 0) {
                *pbusy = 0;
@@ -1544,14 +1553,23 @@ static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
 
 static int sleep_thread(struct fsg_dev *fsg)
 {
-       int     rc;
+       int     rc = 0;
 
        /* Wait until a signal arrives or we are woken up */
-       rc = wait_event_interruptible(fsg->thread_wqh,
-                       fsg->thread_wakeup_needed);
+       for (;;) {
+               try_to_freeze();
+               set_current_state(TASK_INTERRUPTIBLE);
+               if (signal_pending(current)) {
+                       rc = -EINTR;
+                       break;
+               }
+               if (fsg->thread_wakeup_needed)
+                       break;
+               schedule();
+       }
+       __set_current_state(TASK_RUNNING);
        fsg->thread_wakeup_needed = 0;
-       try_to_freeze();
-       return (rc ? -EINTR : 0);
+       return rc;
 }
 
 
@@ -1788,6 +1806,7 @@ static int do_write(struct fsg_dev *fsg)
                if (bh->state == BUF_STATE_EMPTY && !get_some_more)
                        break;                  // We stopped early
                if (bh->state == BUF_STATE_FULL) {
+                       smp_rmb();
                        fsg->next_buffhd_to_drain = bh->next;
                        bh->state = BUF_STATE_EMPTY;
 
@@ -2356,6 +2375,7 @@ static int throw_away_data(struct fsg_dev *fsg)
 
                /* Throw away the data in a filled buffer */
                if (bh->state == BUF_STATE_FULL) {
+                       smp_rmb();
                        bh->state = BUF_STATE_EMPTY;
                        fsg->next_buffhd_to_drain = bh->next;
 
@@ -3021,6 +3041,7 @@ static int get_next_command(struct fsg_dev *fsg)
                        if ((rc = sleep_thread(fsg)) != 0)
                                return rc;
                        }
+               smp_rmb();
                rc = received_cbw(fsg, bh);
                bh->state = BUF_STATE_EMPTY;
 
@@ -3642,11 +3663,19 @@ static DEVICE_ATTR(file, 0444, show_file, NULL);
 
 /*-------------------------------------------------------------------------*/
 
+static void fsg_release(struct kref *ref)
+{
+       struct fsg_dev  *fsg = container_of(ref, struct fsg_dev, ref);
+
+       kfree(fsg->luns);
+       kfree(fsg);
+}
+
 static void lun_release(struct device *dev)
 {
        struct fsg_dev  *fsg = (struct fsg_dev *) dev_get_drvdata(dev);
 
-       complete(&fsg->lun_released);
+       kref_put(&fsg->ref, fsg_release);
 }
 
 static void fsg_unbind(struct usb_gadget *gadget)
@@ -3660,14 +3689,12 @@ static void fsg_unbind(struct usb_gadget *gadget)
        clear_bit(REGISTERED, &fsg->atomic_bitflags);
 
        /* Unregister the sysfs attribute files and the LUNs */
-       init_completion(&fsg->lun_released);
        for (i = 0; i < fsg->nluns; ++i) {
                curlun = &fsg->luns[i];
                if (curlun->registered) {
                        device_remove_file(&curlun->dev, &dev_attr_ro);
                        device_remove_file(&curlun->dev, &dev_attr_file);
                        device_unregister(&curlun->dev);
-                       wait_for_completion(&fsg->lun_released);
                        curlun->registered = 0;
                }
        }
@@ -3846,6 +3873,7 @@ static int __init fsg_bind(struct usb_gadget *gadget)
                        curlun->dev.release = lun_release;
                        device_create_file(&curlun->dev, &dev_attr_ro);
                        device_create_file(&curlun->dev, &dev_attr_file);
+                       kref_get(&fsg->ref);
                }
 
                if (file[i] && *file[i]) {
@@ -4061,7 +4089,7 @@ static int __init fsg_alloc(void)
                return -ENOMEM;
        spin_lock_init(&fsg->lock);
        init_rwsem(&fsg->filesem);
-       init_waitqueue_head(&fsg->thread_wqh);
+       kref_init(&fsg->ref);
        init_completion(&fsg->thread_notifier);
 
        the_fsg = fsg;
@@ -4069,13 +4097,6 @@ static int __init fsg_alloc(void)
 }
 
 
-static void fsg_free(struct fsg_dev *fsg)
-{
-       kfree(fsg->luns);
-       kfree(fsg);
-}
-
-
 static int __init fsg_init(void)
 {
        int             rc;
@@ -4085,7 +4106,7 @@ static int __init fsg_init(void)
                return rc;
        fsg = the_fsg;
        if ((rc = usb_gadget_register_driver(&fsg_driver)) != 0)
-               fsg_free(fsg);
+               kref_put(&fsg->ref, fsg_release);
        return rc;
 }
 module_init(fsg_init);
@@ -4103,6 +4124,6 @@ static void __exit fsg_cleanup(void)
        wait_for_completion(&fsg->thread_notifier);
 
        close_all_backing_files(fsg);
-       fsg_free(fsg);
+       kref_put(&fsg->ref, fsg_release);
 }
 module_exit(fsg_cleanup);
index b35ac6d334f8e3aa5246c5d4d1e832349ce02994..65e084a2c87e13804d4a83c16bf8c0564bd26743 100644 (file)
@@ -890,10 +890,12 @@ static void gs_close(struct tty_struct *tty, struct file *file)
        /* wait for write buffer to drain, or */
        /* at most GS_CLOSE_TIMEOUT seconds */
        if (gs_buf_data_avail(port->port_write_buf) > 0) {
+               spin_unlock_irqrestore(&port->port_lock, flags);
                wait_cond_interruptible_timeout(port->port_write_wait,
                port->port_dev == NULL
                || gs_buf_data_avail(port->port_write_buf) == 0,
                &port->port_lock, flags, GS_CLOSE_TIMEOUT * HZ);
+               spin_lock_irqsave(&port->port_lock, flags);
        }
 
        /* free disconnected port on final close */
index 58321d3f314cffaeb5f6a7404dd9db5fce34de01..e3020f4b17be9a4ea8572768d234ac9301da33f3 100644 (file)
@@ -2,6 +2,10 @@
 # Makefile for USB Host Controller Drivers
 #
 
+ifeq ($(CONFIG_USB_DEBUG),y)
+       EXTRA_CFLAGS            += -DDEBUG
+endif
+
 obj-$(CONFIG_PCI)              += pci-quirks.o
 
 obj-$(CONFIG_USB_EHCI_HCD)     += ehci-hcd.o
index af3c05eb86fcd4ccc24d2908f7d65ca35b3a3570..9dd3d14c64f3cd6c04a4cb908b9a0ae618c81f86 100644 (file)
  */
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-       #define DEBUG
-#else
-       #undef DEBUG
-#endif
-
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/dmapool.h>
@@ -411,50 +404,39 @@ static void ehci_stop (struct usb_hcd *hcd)
        dbg_status (ehci, "ehci_stop completed", readl (&ehci->regs->status));
 }
 
-static int ehci_run (struct usb_hcd *hcd)
+/* one-time init, only for memory state */
+static int ehci_init(struct usb_hcd *hcd)
 {
-       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
+       struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
        u32                     temp;
        int                     retval;
        u32                     hcc_params;
-       int                     first;
-
-       /* skip some things on restart paths */
-       first = (ehci->watchdog.data == 0);
-       if (first) {
-               init_timer (&ehci->watchdog);
-               ehci->watchdog.function = ehci_watchdog;
-               ehci->watchdog.data = (unsigned long) ehci;
-       }
+
+       spin_lock_init(&ehci->lock);
+
+       init_timer(&ehci->watchdog);
+       ehci->watchdog.function = ehci_watchdog;
+       ehci->watchdog.data = (unsigned long) ehci;
 
        /*
         * hw default: 1K periodic list heads, one per frame.
         * periodic_size can shrink by USBCMD update if hcc_params allows.
         */
        ehci->periodic_size = DEFAULT_I_TDPS;
-       if (first && (retval = ehci_mem_init (ehci, GFP_KERNEL)) < 0)
+       if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
                return retval;
 
        /* controllers may cache some of the periodic schedule ... */
-       hcc_params = readl (&ehci->caps->hcc_params);
-       if (HCC_ISOC_CACHE (hcc_params))        // full frame cache
+       hcc_params = readl(&ehci->caps->hcc_params);
+       if (HCC_ISOC_CACHE(hcc_params))         // full frame cache
                ehci->i_thresh = 8;
        else                                    // N microframes cached
-               ehci->i_thresh = 2 + HCC_ISOC_THRES (hcc_params);
+               ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
 
        ehci->reclaim = NULL;
        ehci->reclaim_ready = 0;
        ehci->next_uframe = -1;
 
-       /* controller state:  unknown --> reset */
-
-       /* EHCI spec section 4.1 */
-       if ((retval = ehci_reset (ehci)) != 0) {
-               ehci_mem_cleanup (ehci);
-               return retval;
-       }
-       writel (ehci->periodic_dma, &ehci->regs->frame_list);
-
        /*
         * dedicate a qh for the async ring head, since we couldn't unlink
         * a 'real' qh without stopping the async schedule [4.8].  use it
@@ -462,37 +444,13 @@ static int ehci_run (struct usb_hcd *hcd)
         * its dummy is used in hw_alt_next of many tds, to prevent the qh
         * from automatically advancing to the next td after short reads.
         */
-       if (first) {
-               ehci->async->qh_next.qh = NULL;
-               ehci->async->hw_next = QH_NEXT (ehci->async->qh_dma);
-               ehci->async->hw_info1 = cpu_to_le32 (QH_HEAD);
-               ehci->async->hw_token = cpu_to_le32 (QTD_STS_HALT);
-               ehci->async->hw_qtd_next = EHCI_LIST_END;
-               ehci->async->qh_state = QH_STATE_LINKED;
-               ehci->async->hw_alt_next = QTD_NEXT (ehci->async->dummy->qtd_dma);
-       }
-       writel ((u32)ehci->async->qh_dma, &ehci->regs->async_next);
-
-       /*
-        * hcc_params controls whether ehci->regs->segment must (!!!)
-        * be used; it constrains QH/ITD/SITD and QTD locations.
-        * pci_pool consistent memory always uses segment zero.
-        * streaming mappings for I/O buffers, like pci_map_single(),
-        * can return segments above 4GB, if the device allows.
-        *
-        * NOTE:  the dma mask is visible through dma_supported(), so
-        * drivers can pass this info along ... like NETIF_F_HIGHDMA,
-        * Scsi_Host.highmem_io, and so forth.  It's readonly to all
-        * host side drivers though.
-        */
-       if (HCC_64BIT_ADDR (hcc_params)) {
-               writel (0, &ehci->regs->segment);
-#if 0
-// this is deeply broken on almost all architectures
-               if (!dma_set_mask (hcd->self.controller, DMA_64BIT_MASK))
-                       ehci_info (ehci, "enabled 64bit DMA\n");
-#endif
-       }
+       ehci->async->qh_next.qh = NULL;
+       ehci->async->hw_next = QH_NEXT(ehci->async->qh_dma);
+       ehci->async->hw_info1 = cpu_to_le32(QH_HEAD);
+       ehci->async->hw_token = cpu_to_le32(QTD_STS_HALT);
+       ehci->async->hw_qtd_next = EHCI_LIST_END;
+       ehci->async->qh_state = QH_STATE_LINKED;
+       ehci->async->hw_alt_next = QTD_NEXT(ehci->async->dummy->qtd_dma);
 
        /* clear interrupt enables, set irq latency */
        if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
@@ -507,13 +465,13 @@ static int ehci_run (struct usb_hcd *hcd)
                 * make problems:  throughput reduction (!), data errors...
                 */
                if (park) {
-                       park = min (park, (unsigned) 3);
+                       park = min(park, (unsigned) 3);
                        temp |= CMD_PARK;
                        temp |= park << 8;
                }
-               ehci_info (ehci, "park %d\n", park);
+               ehci_dbg(ehci, "park %d\n", park);
        }
-       if (HCC_PGM_FRAMELISTLEN (hcc_params)) {
+       if (HCC_PGM_FRAMELISTLEN(hcc_params)) {
                /* periodic schedule size can be smaller than default */
                temp &= ~(3 << 2);
                temp |= (EHCI_TUNE_FLS << 2);
@@ -521,16 +479,63 @@ static int ehci_run (struct usb_hcd *hcd)
                case 0: ehci->periodic_size = 1024; break;
                case 1: ehci->periodic_size = 512; break;
                case 2: ehci->periodic_size = 256; break;
-               default:        BUG ();
+               default:        BUG();
                }
        }
+       ehci->command = temp;
+
+       ehci->reboot_notifier.notifier_call = ehci_reboot;
+       register_reboot_notifier(&ehci->reboot_notifier);
+
+       return 0;
+}
+
+/* start HC running; it's halted, ehci_init() has been run (once) */
+static int ehci_run (struct usb_hcd *hcd)
+{
+       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
+       int                     retval;
+       u32                     temp;
+       u32                     hcc_params;
+
+       /* EHCI spec section 4.1 */
+       if ((retval = ehci_reset(ehci)) != 0) {
+               unregister_reboot_notifier(&ehci->reboot_notifier);
+               ehci_mem_cleanup(ehci);
+               return retval;
+       }
+       writel(ehci->periodic_dma, &ehci->regs->frame_list);
+       writel((u32)ehci->async->qh_dma, &ehci->regs->async_next);
+
+       /*
+        * hcc_params controls whether ehci->regs->segment must (!!!)
+        * be used; it constrains QH/ITD/SITD and QTD locations.
+        * pci_pool consistent memory always uses segment zero.
+        * streaming mappings for I/O buffers, like pci_map_single(),
+        * can return segments above 4GB, if the device allows.
+        *
+        * NOTE:  the dma mask is visible through dma_supported(), so
+        * drivers can pass this info along ... like NETIF_F_HIGHDMA,
+        * Scsi_Host.highmem_io, and so forth.  It's readonly to all
+        * host side drivers though.
+        */
+       hcc_params = readl(&ehci->caps->hcc_params);
+       if (HCC_64BIT_ADDR(hcc_params)) {
+               writel(0, &ehci->regs->segment);
+#if 0
+// this is deeply broken on almost all architectures
+               if (!dma_set_mask(hcd->self.controller, DMA_64BIT_MASK))
+                       ehci_info(ehci, "enabled 64bit DMA\n");
+#endif
+       }
+
+
        // Philips, Intel, and maybe others need CMD_RUN before the
        // root hub will detect new devices (why?); NEC doesn't
-       temp |= CMD_RUN;
-       writel (temp, &ehci->regs->command);
-       dbg_cmd (ehci, "init", temp);
-
-       /* set async sleep time = 10 us ... ? */
+       ehci->command &= ~(CMD_LRESET|CMD_IAAD|CMD_PSE|CMD_ASE|CMD_RESET);
+       ehci->command |= CMD_RUN;
+       writel (ehci->command, &ehci->regs->command);
+       dbg_cmd (ehci, "init", ehci->command);
 
        /*
         * Start, enabling full USB 2.0 functionality ... usb 1.1 devices
@@ -538,26 +543,23 @@ static int ehci_run (struct usb_hcd *hcd)
         * involved with the root hub.  (Except where one is integrated,
         * and there's no companion controller unless maybe for USB OTG.)
         */
-       if (first) {
-               ehci->reboot_notifier.notifier_call = ehci_reboot;
-               register_reboot_notifier (&ehci->reboot_notifier);
-       }
-
        hcd->state = HC_STATE_RUNNING;
        writel (FLAG_CF, &ehci->regs->configured_flag);
-       readl (&ehci->regs->command);   /* unblock posted write */
+       readl (&ehci->regs->command);   /* unblock posted writes */
 
        temp = HC_VERSION(readl (&ehci->caps->hc_capbase));
        ehci_info (ehci,
-               "USB %x.%x %s, EHCI %x.%02x, driver %s\n",
+               "USB %x.%x started, EHCI %x.%02x, driver %s\n",
                ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
-               first ? "initialized" : "restarted",
                temp >> 8, temp & 0xff, DRIVER_VERSION);
 
        writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */
 
-       if (first)
-               create_debug_files (ehci);
+       /* GRR this is run-once init(), being done every time the HC starts.
+        * So long as they're part of class devices, we can't do it init()
+        * since the class device isn't created that early.
+        */
+       create_debug_files(ehci);
 
        return 0;
 }
@@ -615,7 +617,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
        }
 
        /* remote wakeup [4.3.1] */
-       if ((status & STS_PCD) && hcd->remote_wakeup) {
+       if (status & STS_PCD) {
                unsigned        i = HCS_N_PORTS (ehci->hcs_params);
 
                /* resume root hub? */
@@ -636,9 +638,8 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
                         * stop that signaling.
                         */
                        ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
-                       mod_timer (&hcd->rh_timer,
-                                       ehci->reset_done [i] + 1);
                        ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
+                       usb_hcd_resume_root_hub(hcd);
                }
        }
 
index 88cb4ada686ed6df1637b1a775b1bf3975e28271..69b0b9be7a641fbdd670bb19683e684b7fe45db0 100644 (file)
@@ -59,7 +59,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
 
                if ((t1 & PORT_PE) && !(t1 & PORT_OWNER))
                        t2 |= PORT_SUSPEND;
-               if (hcd->remote_wakeup)
+               if (device_may_wakeup(&hcd->self.root_hub->dev))
                        t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E;
                else
                        t2 &= ~(PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E);
@@ -94,6 +94,13 @@ static int ehci_bus_resume (struct usb_hcd *hcd)
                msleep(5);
        spin_lock_irq (&ehci->lock);
 
+       /* Ideally and we've got a real resume here, and no port's power
+        * was lost.  (For PCI, that means Vaux was maintained.)  But we
+        * could instead be restoring a swsusp snapshot -- so that BIOS was
+        * the last user of the controller, not reset/pm hardware keeping
+        * state we gave to it.
+        */
+
        /* re-init operational registers in case we lost power */
        if (readl (&ehci->regs->intr_enable) == 0) {
                /* at least some APM implementations will try to deliver
@@ -510,7 +517,7 @@ static int ehci_hub_control (
                        if ((temp & PORT_PE) == 0
                                        || (temp & PORT_RESET) != 0)
                                goto error;
-                       if (hcd->remote_wakeup)
+                       if (device_may_wakeup(&hcd->self.root_hub->dev))
                                temp |= PORT_WAKE_BITS;
                        writel (temp | PORT_SUSPEND,
                                &ehci->regs->port_status [wIndex]);
index dfd9bd0b18284dbd6bd71d6348253f884b7f6b62..08ca0f849dab03ddbf9688aeb1e77dd811dbf8c6 100644 (file)
@@ -27,7 +27,7 @@
 /* EHCI 0.96 (and later) section 5.1 says how to kick BIOS/SMM/...
  * off the controller (maybe it can boot from highspeed USB disks).
  */
-static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
+static int bios_handoff(struct ehci_hcd *ehci, int where, u32 cap)
 {
        struct pci_dev *pdev = to_pci_dev(ehci_to_hcd(ehci)->self.controller);
 
@@ -48,7 +48,7 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
                                where, cap);
                        // some BIOS versions seem buggy...
                        // return 1;
-                       ehci_warn (ehci, "continuing after BIOS bug...\n");
+                       ehci_warn(ehci, "continuing after BIOS bug...\n");
                        /* disable all SMIs, and clear "BIOS owns" flag */
                        pci_write_config_dword(pdev, where + 4, 0);
                        pci_write_config_byte(pdev, where + 2, 0);
@@ -58,96 +58,47 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
        return 0;
 }
 
-/* called by khubd or root hub init threads */
-static int ehci_pci_reset (struct usb_hcd *hcd)
+/* called after powerup, by probe or system-pm "wakeup" */
+static int ehci_pci_reinit(struct ehci_hcd *ehci, struct pci_dev *pdev)
 {
-       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
        u32                     temp;
+       int                     retval;
        unsigned                count = 256/4;
 
-       spin_lock_init (&ehci->lock);
-
-       ehci->caps = hcd->regs;
-       ehci->regs = hcd->regs + HC_LENGTH (readl (&ehci->caps->hc_capbase));
-       dbg_hcs_params (ehci, "reset");
-       dbg_hcc_params (ehci, "reset");
-
-       /* cache this readonly data; minimize chip reads */
-       ehci->hcs_params = readl (&ehci->caps->hcs_params);
-
-       if (hcd->self.controller->bus == &pci_bus_type) {
-               struct pci_dev  *pdev = to_pci_dev(hcd->self.controller);
-
-               switch (pdev->vendor) {
-               case PCI_VENDOR_ID_TDI:
-                       if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
-                               ehci->is_tdi_rh_tt = 1;
-                               tdi_reset (ehci);
-                       }
-                       break;
-               case PCI_VENDOR_ID_AMD:
-                       /* AMD8111 EHCI doesn't work, according to AMD errata */
-                       if (pdev->device == 0x7463) {
-                               ehci_info (ehci, "ignoring AMD8111 (errata)\n");
-                               return -EIO;
-                       }
-                       break;
-               case PCI_VENDOR_ID_NVIDIA:
-                       /* NVidia reports that certain chips don't handle
-                        * QH, ITD, or SITD addresses above 2GB.  (But TD,
-                        * data buffer, and periodic schedule are normal.)
-                        */
-                       switch (pdev->device) {
-                       case 0x003c:    /* MCP04 */
-                       case 0x005b:    /* CK804 */
-                       case 0x00d8:    /* CK8 */
-                       case 0x00e8:    /* CK8S */
-                               if (pci_set_consistent_dma_mask(pdev,
-                                                       DMA_31BIT_MASK) < 0)
-                                       ehci_warn (ehci, "can't enable NVidia "
-                                               "workaround for >2GB RAM\n");
-                               break;
-                       }
-                       break;
-               }
-
-               /* optional debug port, normally in the first BAR */
-               temp = pci_find_capability (pdev, 0x0a);
-               if (temp) {
-                       pci_read_config_dword(pdev, temp, &temp);
-                       temp >>= 16;
-                       if ((temp & (3 << 13)) == (1 << 13)) {
-                               temp &= 0x1fff;
-                               ehci->debug = hcd->regs + temp;
-                               temp = readl (&ehci->debug->control);
-                               ehci_info (ehci, "debug port %d%s\n",
-                                       HCS_DEBUG_PORT(ehci->hcs_params),
-                                       (temp & DBGP_ENABLED)
-                                               ? " IN USE"
-                                               : "");
-                               if (!(temp & DBGP_ENABLED))
-                                       ehci->debug = NULL;
-                       }
+       /* optional debug port, normally in the first BAR */
+       temp = pci_find_capability(pdev, 0x0a);
+       if (temp) {
+               pci_read_config_dword(pdev, temp, &temp);
+               temp >>= 16;
+               if ((temp & (3 << 13)) == (1 << 13)) {
+                       temp &= 0x1fff;
+                       ehci->debug = ehci_to_hcd(ehci)->regs + temp;
+                       temp = readl(&ehci->debug->control);
+                       ehci_info(ehci, "debug port %d%s\n",
+                               HCS_DEBUG_PORT(ehci->hcs_params),
+                               (temp & DBGP_ENABLED)
+                                       ? " IN USE"
+                                       : "");
+                       if (!(temp & DBGP_ENABLED))
+                               ehci->debug = NULL;
                }
+       }
 
-               temp = HCC_EXT_CAPS (readl (&ehci->caps->hcc_params));
-       } else
-               temp = 0;
+       temp = HCC_EXT_CAPS(readl(&ehci->caps->hcc_params));
 
        /* EHCI 0.96 and later may have "extended capabilities" */
        while (temp && count--) {
                u32             cap;
 
-               pci_read_config_dword (to_pci_dev(hcd->self.controller),
-                               temp, &cap);
-               ehci_dbg (ehci, "capability %04x at %02x\n", cap, temp);
+               pci_read_config_dword(pdev, temp, &cap);
+               ehci_dbg(ehci, "capability %04x at %02x\n", cap, temp);
                switch (cap & 0xff) {
                case 1:                 /* BIOS/SMM/... handoff */
-                       if (bios_handoff (ehci, temp, cap) != 0)
+                       if (bios_handoff(ehci, temp, cap) != 0)
                                return -EOPNOTSUPP;
                        break;
                case 0:                 /* illegal reserved capability */
-                       ehci_warn (ehci, "illegal capability!\n");
+                       ehci_dbg(ehci, "illegal capability!\n");
                        cap = 0;
                        /* FALLTHROUGH */
                default:                /* unknown */
@@ -156,77 +107,123 @@ static int ehci_pci_reset (struct usb_hcd *hcd)
                temp = (cap >> 8) & 0xff;
        }
        if (!count) {
-               ehci_err (ehci, "bogus capabilities ... PCI problems!\n");
+               ehci_err(ehci, "bogus capabilities ... PCI problems!\n");
                return -EIO;
        }
-       if (ehci_is_TDI(ehci))
-               ehci_reset (ehci);
 
-       ehci_port_power (ehci, 0);
+       /* PCI Memory-Write-Invalidate cycle support is optional (uncommon) */
+       retval = pci_set_mwi(pdev);
+       if (!retval)
+               ehci_dbg(ehci, "MWI active\n");
+
+       ehci_port_power(ehci, 0);
+
+       return 0;
+}
+
+/* called during probe() after chip reset completes */
+static int ehci_pci_setup(struct usb_hcd *hcd)
+{
+       struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
+       struct pci_dev          *pdev = to_pci_dev(hcd->self.controller);
+       u32                     temp;
+       int                     retval;
+
+       ehci->caps = hcd->regs;
+       ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));
+       dbg_hcs_params(ehci, "reset");
+       dbg_hcc_params(ehci, "reset");
+
+       /* cache this readonly data; minimize chip reads */
+       ehci->hcs_params = readl(&ehci->caps->hcs_params);
+
+       retval = ehci_halt(ehci);
+       if (retval)
+               return retval;
+
+       /* data structure init */
+       retval = ehci_init(hcd);
+       if (retval)
+               return retval;
+
+       /* NOTE:  only the parts below this line are PCI-specific */
+
+       switch (pdev->vendor) {
+       case PCI_VENDOR_ID_TDI:
+               if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
+                       ehci->is_tdi_rh_tt = 1;
+                       tdi_reset(ehci);
+               }
+               break;
+       case PCI_VENDOR_ID_AMD:
+               /* AMD8111 EHCI doesn't work, according to AMD errata */
+               if (pdev->device == 0x7463) {
+                       ehci_info(ehci, "ignoring AMD8111 (errata)\n");
+                       retval = -EIO;
+                       goto done;
+               }
+               break;
+       case PCI_VENDOR_ID_NVIDIA:
+               /* NVidia reports that certain chips don't handle
+                * QH, ITD, or SITD addresses above 2GB.  (But TD,
+                * data buffer, and periodic schedule are normal.)
+                */
+               switch (pdev->device) {
+               case 0x003c:    /* MCP04 */
+               case 0x005b:    /* CK804 */
+               case 0x00d8:    /* CK8 */
+               case 0x00e8:    /* CK8S */
+                       if (pci_set_consistent_dma_mask(pdev,
+                                               DMA_31BIT_MASK) < 0)
+                               ehci_warn(ehci, "can't enable NVidia "
+                                       "workaround for >2GB RAM\n");
+                       break;
+               }
+               break;
+       }
+
+       if (ehci_is_TDI(ehci))
+               ehci_reset(ehci);
 
        /* at least the Genesys GL880S needs fixup here */
        temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
        temp &= 0x0f;
        if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
-               ehci_dbg (ehci, "bogus port configuration: "
+               ehci_dbg(ehci, "bogus port configuration: "
                        "cc=%d x pcc=%d < ports=%d\n",
                        HCS_N_CC(ehci->hcs_params),
                        HCS_N_PCC(ehci->hcs_params),
                        HCS_N_PORTS(ehci->hcs_params));
 
-               if (hcd->self.controller->bus == &pci_bus_type) {
-                       struct pci_dev  *pdev;
-
-                       pdev = to_pci_dev(hcd->self.controller);
-                       switch (pdev->vendor) {
-                       case 0x17a0:            /* GENESYS */
-                               /* GL880S: should be PORTS=2 */
-                               temp |= (ehci->hcs_params & ~0xf);
-                               ehci->hcs_params = temp;
-                               break;
-                       case PCI_VENDOR_ID_NVIDIA:
-                               /* NF4: should be PCC=10 */
-                               break;
-                       }
+               switch (pdev->vendor) {
+               case 0x17a0:            /* GENESYS */
+                       /* GL880S: should be PORTS=2 */
+                       temp |= (ehci->hcs_params & ~0xf);
+                       ehci->hcs_params = temp;
+                       break;
+               case PCI_VENDOR_ID_NVIDIA:
+                       /* NF4: should be PCC=10 */
+                       break;
                }
        }
 
-       /* force HC to halt state */
-       return ehci_halt (ehci);
-}
+       /* Serial Bus Release Number is at PCI 0x60 offset */
+       pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
 
-static int ehci_pci_start (struct usb_hcd *hcd)
-{
-       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
-       int result = 0;
-
-       if (hcd->self.controller->bus == &pci_bus_type) {
-               struct pci_dev          *pdev;
-               u16                     port_wake;
-
-               pdev = to_pci_dev(hcd->self.controller);
-
-               /* Serial Bus Release Number is at PCI 0x60 offset */
-               pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
+       /* Workaround current PCI init glitch:  wakeup bits aren't
+        * being set from PCI PM capability.
+        */
+       if (!device_can_wakeup(&pdev->dev)) {
+               u16     port_wake;
 
-               /* port wake capability, reported by boot firmware */
                pci_read_config_word(pdev, 0x62, &port_wake);
-               hcd->can_wakeup = (port_wake & 1) != 0;
-
-               /* help hc dma work well with cachelines */
-               result = pci_set_mwi(pdev);
-               if (result)
-                       ehci_dbg(ehci, "unable to enable MWI - not fatal.\n");
+               if (port_wake & 0x0001)
+                       device_init_wakeup(&pdev->dev, 1);
        }
 
-       return ehci_run (hcd);
-}
-
-/* always called by thread; normally rmmod */
-
-static void ehci_pci_stop (struct usb_hcd *hcd)
-{
-       ehci_stop (hcd);
+       retval = ehci_pci_reinit(ehci, pdev);
+done:
+       return retval;
 }
 
 /*-------------------------------------------------------------------------*/
@@ -235,90 +232,106 @@ static void ehci_pci_stop (struct usb_hcd *hcd)
 
 /* suspend/resume, section 4.3 */
 
-/* These routines rely on the bus (pci, platform, etc)
+/* These routines rely on the PCI bus glue
  * to handle powerdown and wakeup, and currently also on
  * transceivers that don't need any software attention to set up
  * the right sort of wakeup.
+ * Also they depend on separate root hub suspend/resume.
  */
 
-static int ehci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
+static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message)
 {
-       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
+       struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
+       unsigned long           flags;
+       int                     rc = 0;
+
+       if (time_before(jiffies, ehci->next_statechange))
+               msleep(10);
+
+       /* Root hub was already suspended. Disable irq emission and
+        * mark HW unaccessible, bail out if RH has been resumed. Use
+        * the spinlock to properly synchronize with possible pending
+        * RH suspend or resume activity.
+        *
+        * This is still racy as hcd->state is manipulated outside of
+        * any locks =P But that will be a different fix.
+        */
+       spin_lock_irqsave (&ehci->lock, flags);
+       if (hcd->state != HC_STATE_SUSPENDED) {
+               rc = -EINVAL;
+               goto bail;
+       }
+       writel (0, &ehci->regs->intr_enable);
+       (void)readl(&ehci->regs->intr_enable);
 
-       if (time_before (jiffies, ehci->next_statechange))
-               msleep (100);
+       clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+ bail:
+       spin_unlock_irqrestore (&ehci->lock, flags);
 
-#ifdef CONFIG_USB_SUSPEND
-       (void) usb_suspend_device (hcd->self.root_hub);
-#else
-       usb_lock_device (hcd->self.root_hub);
-       (void) ehci_bus_suspend (hcd);
-       usb_unlock_device (hcd->self.root_hub);
-#endif
-
-       // save (PCI) FLADJ in case of Vaux power loss
+       // could save FLADJ in case of Vaux power loss
        // ... we'd only use it to handle clock skew
 
-       return 0;
+       return rc;
 }
 
-static int ehci_pci_resume (struct usb_hcd *hcd)
+static int ehci_pci_resume(struct usb_hcd *hcd)
 {
-       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
+       struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
        unsigned                port;
-       struct usb_device       *root = hcd->self.root_hub;
+       struct pci_dev          *pdev = to_pci_dev(hcd->self.controller);
        int                     retval = -EINVAL;
 
-       // maybe restore (PCI) FLADJ
+       // maybe restore FLADJ
+
+       if (time_before(jiffies, ehci->next_statechange))
+               msleep(100);
+
+       /* Mark hardware accessible again as we are out of D3 state by now */
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
 
-       if (time_before (jiffies, ehci->next_statechange))
-               msleep (100);
+       /* If CF is clear, we lost PCI Vaux power and need to restart.  */
+       if (readl(&ehci->regs->configured_flag) != FLAG_CF)
+               goto restart;
 
        /* If any port is suspended (or owned by the companion),
         * we know we can/must resume the HC (and mustn't reset it).
+        * We just defer that to the root hub code.
         */
-       for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; ) {
+       for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) {
                u32     status;
                port--;
-               status = readl (&ehci->regs->port_status [port]);
+               status = readl(&ehci->regs->port_status [port]);
                if (!(status & PORT_POWER))
                        continue;
-               if (status & (PORT_SUSPEND | PORT_OWNER)) {
-                       down (&hcd->self.root_hub->serialize);
-                       retval = ehci_bus_resume (hcd);
-                       up (&hcd->self.root_hub->serialize);
-                       break;
+               if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) {
+                       usb_hcd_resume_root_hub(hcd);
+                       return 0;
                }
-               if (!root->children [port])
-                       continue;
-               dbg_port (ehci, __FUNCTION__, port + 1, status);
-               usb_set_device_state (root->children[port],
-                                       USB_STATE_NOTATTACHED);
        }
 
+restart:
+       ehci_dbg(ehci, "lost power, restarting\n");
+       usb_root_hub_lost_power(hcd->self.root_hub);
+
        /* Else reset, to cope with power loss or flush-to-storage
-        * style "resume" having activated BIOS during reboot.
+        * style "resume" having let BIOS kick in during reboot.
         */
-       if (port == 0) {
-               (void) ehci_halt (ehci);
-               (void) ehci_reset (ehci);
-               (void) ehci_pci_reset (hcd);
-
-               /* emptying the schedule aborts any urbs */
-               spin_lock_irq (&ehci->lock);
-               if (ehci->reclaim)
-                       ehci->reclaim_ready = 1;
-               ehci_work (ehci, NULL);
-               spin_unlock_irq (&ehci->lock);
-
-               /* restart; khubd will disconnect devices */
-               retval = ehci_run (hcd);
-
-               /* here we "know" root ports should always stay powered;
-                * but some controllers may lose all power.
-                */
-               ehci_port_power (ehci, 1);
-       }
+       (void) ehci_halt(ehci);
+       (void) ehci_reset(ehci);
+       (void) ehci_pci_reinit(ehci, pdev);
+
+       /* emptying the schedule aborts any urbs */
+       spin_lock_irq(&ehci->lock);
+       if (ehci->reclaim)
+               ehci->reclaim_ready = 1;
+       ehci_work(ehci, NULL);
+       spin_unlock_irq(&ehci->lock);
+
+       /* restart; khubd will disconnect devices */
+       retval = ehci_run(hcd);
+
+       /* here we "know" root ports should always stay powered */
+       ehci_port_power(ehci, 1);
 
        return retval;
 }
@@ -338,13 +351,13 @@ static const struct hc_driver ehci_pci_hc_driver = {
        /*
         * basic lifecycle operations
         */
-       .reset =                ehci_pci_reset,
-       .start =                ehci_pci_start,
+       .reset =                ehci_pci_setup,
+       .start =                ehci_run,
 #ifdef CONFIG_PM
        .suspend =              ehci_pci_suspend,
        .resume =               ehci_pci_resume,
 #endif
-       .stop =                 ehci_pci_stop,
+       .stop =                 ehci_stop,
 
        /*
         * managing i/o requests and associated device resources
@@ -377,7 +390,7 @@ static const struct pci_device_id pci_ids [] = { {
        },
        { /* end: all zeroes */ }
 };
-MODULE_DEVICE_TABLE (pci, pci_ids);
+MODULE_DEVICE_TABLE(pci, pci_ids);
 
 /* pci driver glue; this is a "new style" PCI driver module */
 static struct pci_driver ehci_pci_driver = {
@@ -393,22 +406,22 @@ static struct pci_driver ehci_pci_driver = {
 #endif
 };
 
-static int __init ehci_hcd_pci_init (void)
+static int __init ehci_hcd_pci_init(void)
 {
        if (usb_disabled())
                return -ENODEV;
 
-       pr_debug ("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
+       pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
                hcd_name,
-               sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
-               sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
+               sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
+               sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
 
-       return pci_register_driver (&ehci_pci_driver);
+       return pci_register_driver(&ehci_pci_driver);
 }
-module_init (ehci_hcd_pci_init);
+module_init(ehci_hcd_pci_init);
 
-static void __exit ehci_hcd_pci_cleanup (void)
+static void __exit ehci_hcd_pci_cleanup(void)
 {
-       pci_unregister_driver (&ehci_pci_driver);
+       pci_unregister_driver(&ehci_pci_driver);
 }
-module_exit (ehci_hcd_pci_cleanup);
+module_exit(ehci_hcd_pci_cleanup);
index 5bb872c3496d70c3767d1b4f40a8fdd2979ba354..9b13bf2fa98d2c3bab626642a1ea925e183ed9e9 100644 (file)
@@ -514,18 +514,18 @@ qh_urb_transaction (
                qtd->urb = urb;
                qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
                list_add_tail (&qtd->qtd_list, head);
+
+               /* for zero length DATA stages, STATUS is always IN */
+               if (len == 0)
+                       token |= (1 /* "in" */ << 8);
        } 
 
        /*
         * data transfer stage:  buffer setup
         */
-       if (likely (len > 0))
-               buf = urb->transfer_dma;
-       else
-               buf = 0;
+       buf = urb->transfer_dma;
 
-       /* for zero length DATA stages, STATUS is always IN */
-       if (!buf || is_input)
+       if (is_input)
                token |= (1 /* "in" */ << 8);
        /* else it's already initted to "out" pid (0 << 8) */
 
@@ -572,7 +572,7 @@ qh_urb_transaction (
         * control requests may need a terminating data "status" ack;
         * bulk ones may need a terminating short packet (zero length).
         */
-       if (likely (buf != 0)) {
+       if (likely (urb->transfer_buffer_length != 0)) {
                int     one_more = 0;
 
                if (usb_pipecontrol (urb->pipe)) {
@@ -912,6 +912,7 @@ submit_async (
        int                     epnum;
        unsigned long           flags;
        struct ehci_qh          *qh = NULL;
+       int                     rc = 0;
 
        qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list);
        epnum = ep->desc.bEndpointAddress;
@@ -926,21 +927,28 @@ submit_async (
 #endif
 
        spin_lock_irqsave (&ehci->lock, flags);
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
+                              &ehci_to_hcd(ehci)->flags))) {
+               rc = -ESHUTDOWN;
+               goto done;
+       }
+
        qh = qh_append_tds (ehci, urb, qtd_list, epnum, &ep->hcpriv);
+       if (unlikely(qh == NULL)) {
+               rc = -ENOMEM;
+               goto done;
+       }
 
        /* Control/bulk operations through TTs don't need scheduling,
         * the HC and TT handle it when the TT has a buffer ready.
         */
-       if (likely (qh != NULL)) {
-               if (likely (qh->qh_state == QH_STATE_IDLE))
-                       qh_link_async (ehci, qh_get (qh));
-       }
+       if (likely (qh->qh_state == QH_STATE_IDLE))
+               qh_link_async (ehci, qh_get (qh));
+ done:
        spin_unlock_irqrestore (&ehci->lock, flags);
-       if (unlikely (qh == NULL)) {
+       if (unlikely (qh == NULL))
                qtd_list_free (ehci, urb, qtd_list);
-               return -ENOMEM;
-       }
-       return 0;
+       return rc;
 }
 
 /*-------------------------------------------------------------------------*/
index f0c8aa1ccd5dc016aa8c61ea3b84944c99a25c1c..57e77374d228dd083053b78a26d331a44c4e20cd 100644 (file)
@@ -602,6 +602,12 @@ static int intr_submit (
 
        spin_lock_irqsave (&ehci->lock, flags);
 
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
+                              &ehci_to_hcd(ehci)->flags))) {
+               status = -ESHUTDOWN;
+               goto done;
+       }
+
        /* get qh and force any scheduling errors */
        INIT_LIST_HEAD (&empty);
        qh = qh_append_tds (ehci, urb, &empty, epnum, &ep->hcpriv);
@@ -1456,7 +1462,11 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb,
 
        /* schedule ... need to lock */
        spin_lock_irqsave (&ehci->lock, flags);
-       status = iso_stream_schedule (ehci, urb, stream);
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
+                              &ehci_to_hcd(ehci)->flags)))
+               status = -ESHUTDOWN;
+       else
+               status = iso_stream_schedule (ehci, urb, stream);
        if (likely (status == 0))
                itd_link_urb (ehci, urb, ehci->periodic_size << 3, stream);
        spin_unlock_irqrestore (&ehci->lock, flags);
@@ -1815,7 +1825,11 @@ static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb,
 
        /* schedule ... need to lock */
        spin_lock_irqsave (&ehci->lock, flags);
-       status = iso_stream_schedule (ehci, urb, stream);
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
+                              &ehci_to_hcd(ehci)->flags)))
+               status = -ESHUTDOWN;
+       else
+               status = iso_stream_schedule (ehci, urb, stream);
        if (status == 0)
                sitd_link_urb (ehci, urb, ehci->periodic_size << 3, stream);
        spin_unlock_irqrestore (&ehci->lock, flags);
index 82f64986bc2269c2a185bfb1d05169ff9479d0a4..584b8dc65119f80187efc3aa2368125bfba870f4 100644 (file)
 /* enqueuing/finishing log of urbs */
 //#define URB_TRACE
 
-#include <linux/config.h>
 #include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/ioport.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/smp_lock.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/list.h>
-#include <linux/interrupt.h>
 #include <linux/usb.h>
 #include <linux/usb_isp116x.h>
 #include <linux/platform_device.h>
 #include <asm/system.h>
 #include <asm/byteorder.h>
 
-#ifndef DEBUG
-#      define  STUB_DEBUG_FILE
-#endif
-
 #include "../core/hcd.h"
 #include "isp116x.h"
 
-#define DRIVER_VERSION "05 Aug 2005"
+#define DRIVER_VERSION "03 Nov 2005"
 #define DRIVER_DESC    "ISP116x USB Host Controller Driver"
 
 MODULE_DESCRIPTION(DRIVER_DESC);
@@ -164,13 +154,11 @@ static void pack_fifo(struct isp116x *isp116x)
        struct ptd *ptd;
        int buflen = isp116x->atl_last_dir == PTD_DIR_IN
            ? isp116x->atl_bufshrt : isp116x->atl_buflen;
-       int ptd_count = 0;
 
        isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
        isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
        isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET);
        for (ep = isp116x->atl_active; ep; ep = ep->active) {
-               ++ptd_count;
                ptd = &ep->ptd;
                dump_ptd(ptd);
                dump_ptd_out_data(ptd, ep->data);
@@ -305,9 +293,8 @@ static void postproc_atl_queue(struct isp116x *isp116x)
                udev = urb->dev;
                ptd = &ep->ptd;
                cc = PTD_GET_CC(ptd);
-
-               spin_lock(&urb->lock);
                short_not_ok = 1;
+               spin_lock(&urb->lock);
 
                /* Data underrun is special. For allowed underrun
                   we clear the error and continue as normal. For
@@ -420,7 +407,7 @@ static void postproc_atl_queue(struct isp116x *isp116x)
                        ep->nextpid = 0;
                        break;
                default:
-                       BUG_ON(1);
+                       BUG();
                }
                spin_unlock(&urb->lock);
        }
@@ -628,8 +615,12 @@ static irqreturn_t isp116x_irq(struct usb_hcd *hcd, struct pt_regs *regs)
                u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
                isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
                if (intstat & HCINT_UE) {
-                       ERR("Unrecoverable error\n");
-                       /* What should we do here? Reset?  */
+                       ERR("Unrecoverable error, HC is dead!\n");
+                       /* IRQ's are off, we do no DMA,
+                          perfectly ready to die ... */
+                       hcd->state = HC_STATE_HALT;
+                       ret = IRQ_HANDLED;
+                       goto done;
                }
                if (intstat & HCINT_RHSC)
                        /* When root hub or any of its ports is going
@@ -640,7 +631,6 @@ static irqreturn_t isp116x_irq(struct usb_hcd *hcd, struct pt_regs *regs)
                if (intstat & HCINT_RD) {
                        DBG("---- remote wakeup\n");
                        usb_hcd_resume_root_hub(hcd);
-                       ret = IRQ_HANDLED;
                }
                irqstat &= ~HCuPINT_OPR;
                ret = IRQ_HANDLED;
@@ -651,6 +641,7 @@ static irqreturn_t isp116x_irq(struct usb_hcd *hcd, struct pt_regs *regs)
        }
 
        isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
+      done:
        spin_unlock(&isp116x->lock);
        return ret;
 }
@@ -724,6 +715,7 @@ static int isp116x_urb_enqueue(struct usb_hcd *hcd,
 
        spin_lock_irqsave(&isp116x->lock, flags);
        if (!HC_IS_RUNNING(hcd->state)) {
+               kfree(ep);
                ret = -ENODEV;
                goto fail;
        }
@@ -888,7 +880,7 @@ static void isp116x_endpoint_disable(struct usb_hcd *hcd,
                                     struct usb_host_endpoint *hep)
 {
        int i;
-       struct isp116x_ep *ep = hep->hcpriv;;
+       struct isp116x_ep *ep = hep->hcpriv;
 
        if (!ep)
                return;
@@ -916,8 +908,6 @@ static int isp116x_get_frame(struct usb_hcd *hcd)
        return (int)fmnum;
 }
 
-/*----------------------------------------------------------------*/
-
 /*
   Adapted from ohci-hub.c. Currently we don't support autosuspend.
 */
@@ -968,11 +958,10 @@ static void isp116x_hub_descriptor(struct isp116x *isp116x,
        desc->bHubContrCurrent = 0;
        desc->bNbrPorts = (u8) (reg & 0x3);
        /* Power switching, device type, overcurrent. */
-       desc->wHubCharacteristics =
-           (__force __u16) cpu_to_le16((u16) ((reg >> 8) & 0x1f));
+       desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f));
        desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
        /* two bitmaps:  ports removable, and legacy PortPwrCtrlMask */
-       desc->bitmap[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1;
+       desc->bitmap[0] = 0;
        desc->bitmap[1] = ~0;
 }
 
@@ -1159,135 +1148,9 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
        return ret;
 }
 
-#ifdef CONFIG_PM
-
-static int isp116x_bus_suspend(struct usb_hcd *hcd)
-{
-       struct isp116x *isp116x = hcd_to_isp116x(hcd);
-       unsigned long flags;
-       u32 val;
-       int ret = 0;
-
-       spin_lock_irqsave(&isp116x->lock, flags);
-
-       val = isp116x_read_reg32(isp116x, HCCONTROL);
-       switch (val & HCCONTROL_HCFS) {
-       case HCCONTROL_USB_OPER:
-               hcd->state = HC_STATE_QUIESCING;
-               val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
-               val |= HCCONTROL_USB_SUSPEND;
-               if (hcd->remote_wakeup)
-                       val |= HCCONTROL_RWE;
-               /* Wait for usb transfers to finish */
-               mdelay(2);
-               isp116x_write_reg32(isp116x, HCCONTROL, val);
-               hcd->state = HC_STATE_SUSPENDED;
-               /* Wait for devices to suspend */
-               mdelay(5);
-       case HCCONTROL_USB_SUSPEND:
-               break;
-       case HCCONTROL_USB_RESUME:
-               isp116x_write_reg32(isp116x, HCCONTROL,
-                                   (val & ~HCCONTROL_HCFS) |
-                                   HCCONTROL_USB_RESET);
-       case HCCONTROL_USB_RESET:
-               ret = -EBUSY;
-               break;
-       default:
-               ret = -EINVAL;
-       }
-
-       spin_unlock_irqrestore(&isp116x->lock, flags);
-       return ret;
-}
-
-static int isp116x_bus_resume(struct usb_hcd *hcd)
-{
-       struct isp116x *isp116x = hcd_to_isp116x(hcd);
-       u32 val;
-       int ret = -EINPROGRESS;
-
-       msleep(5);
-       spin_lock_irq(&isp116x->lock);
-
-       val = isp116x_read_reg32(isp116x, HCCONTROL);
-       switch (val & HCCONTROL_HCFS) {
-       case HCCONTROL_USB_SUSPEND:
-               val &= ~HCCONTROL_HCFS;
-               val |= HCCONTROL_USB_RESUME;
-               isp116x_write_reg32(isp116x, HCCONTROL, val);
-       case HCCONTROL_USB_RESUME:
-               break;
-       case HCCONTROL_USB_OPER:
-               /* Without setting power_state here the
-                  SUSPENDED state won't be removed from
-                  sysfs/usbN/power.state as a response to remote
-                  wakeup. Maybe in the future. */
-               hcd->self.root_hub->dev.power.power_state = PMSG_ON;
-               ret = 0;
-               break;
-       default:
-               ret = -EBUSY;
-       }
-
-       if (ret != -EINPROGRESS) {
-               spin_unlock_irq(&isp116x->lock);
-               return ret;
-       }
-
-       val = isp116x->rhdesca & RH_A_NDP;
-       while (val--) {
-               u32 stat =
-                   isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
-               /* force global, not selective, resume */
-               if (!(stat & RH_PS_PSS))
-                       continue;
-               DBG("%s: Resuming port %d\n", __func__, val);
-               isp116x_write_reg32(isp116x, RH_PS_POCI, val
-                                   ? HCRHPORT2 : HCRHPORT1);
-       }
-       spin_unlock_irq(&isp116x->lock);
-
-       hcd->state = HC_STATE_RESUMING;
-       mdelay(20);
-
-       /* Go operational */
-       spin_lock_irq(&isp116x->lock);
-       val = isp116x_read_reg32(isp116x, HCCONTROL);
-       isp116x_write_reg32(isp116x, HCCONTROL,
-                           (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
-       spin_unlock_irq(&isp116x->lock);
-       /* see analogous comment above */
-       hcd->self.root_hub->dev.power.power_state = PMSG_ON;
-       hcd->state = HC_STATE_RUNNING;
-
-       return 0;
-}
-
-
-#else
-
-#define        isp116x_bus_suspend     NULL
-#define        isp116x_bus_resume      NULL
-
-#endif
-
 /*-----------------------------------------------------------------*/
 
-#ifdef STUB_DEBUG_FILE
-
-static inline void create_debug_file(struct isp116x *isp116x)
-{
-}
-
-static inline void remove_debug_file(struct isp116x *isp116x)
-{
-}
-
-#else
-
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
+#ifdef CONFIG_DEBUG_FS
 
 static void dump_irq(struct seq_file *s, char *label, u16 mask)
 {
@@ -1311,13 +1174,9 @@ static void dump_int(struct seq_file *s, char *label, u32 mask)
                   mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
 }
 
-static int proc_isp116x_show(struct seq_file *s, void *unused)
+static int isp116x_show_dbg(struct seq_file *s, void *unused)
 {
        struct isp116x *isp116x = s->private;
-       struct isp116x_ep *ep;
-       struct urb *urb;
-       unsigned i;
-       char *str;
 
        seq_printf(s, "%s\n%s version %s\n",
                   isp116x_to_hcd(isp116x)->product_desc, hcd_name,
@@ -1333,105 +1192,50 @@ static int proc_isp116x_show(struct seq_file *s, void *unused)
        }
 
        spin_lock_irq(&isp116x->lock);
-
        dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
        dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
        dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
        dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
-
-       list_for_each_entry(ep, &isp116x->async, schedule) {
-
-               switch (ep->nextpid) {
-               case USB_PID_IN:
-                       str = "in";
-                       break;
-               case USB_PID_OUT:
-                       str = "out";
-                       break;
-               case USB_PID_SETUP:
-                       str = "setup";
-                       break;
-               case USB_PID_ACK:
-                       str = "status";
-                       break;
-               default:
-                       str = "?";
-                       break;
-               };
-               seq_printf(s, "%p, ep%d%s, maxpacket %d:\n", ep,
-                          ep->epnum, str, ep->maxpacket);
-               list_for_each_entry(urb, &ep->hep->urb_list, urb_list) {
-                       seq_printf(s, "  urb%p, %d/%d\n", urb,
-                                  urb->actual_length,
-                                  urb->transfer_buffer_length);
-               }
-       }
-       if (!list_empty(&isp116x->async))
-               seq_printf(s, "\n");
-
-       seq_printf(s, "periodic size= %d\n", PERIODIC_SIZE);
-
-       for (i = 0; i < PERIODIC_SIZE; i++) {
-               ep = isp116x->periodic[i];
-               if (!ep)
-                       continue;
-               seq_printf(s, "%2d [%3d]:\n", i, isp116x->load[i]);
-
-               /* DUMB: prints shared entries multiple times */
-               do {
-                       seq_printf(s, "   %d/%p (%sdev%d ep%d%s max %d)\n",
-                                  ep->period, ep,
-                                  (ep->udev->speed ==
-                                   USB_SPEED_FULL) ? "" : "ls ",
-                                  ep->udev->devnum, ep->epnum,
-                                  (ep->epnum ==
-                                   0) ? "" : ((ep->nextpid ==
-                                               USB_PID_IN) ? "in" : "out"),
-                                  ep->maxpacket);
-                       ep = ep->next;
-               } while (ep);
-       }
+       isp116x_show_regs_seq(isp116x, s);
        spin_unlock_irq(&isp116x->lock);
        seq_printf(s, "\n");
 
        return 0;
 }
 
-static int proc_isp116x_open(struct inode *inode, struct file *file)
+static int isp116x_open_seq(struct inode *inode, struct file *file)
 {
-       return single_open(file, proc_isp116x_show, PDE(inode)->data);
+       return single_open(file, isp116x_show_dbg, inode->u.generic_ip);
 }
 
-static struct file_operations proc_ops = {
-       .open = proc_isp116x_open,
+static struct file_operations isp116x_debug_fops = {
+       .open = isp116x_open_seq,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-/* expect just one isp116x per system */
-static const char proc_filename[] = "driver/isp116x";
-
-static void create_debug_file(struct isp116x *isp116x)
+static int create_debug_file(struct isp116x *isp116x)
 {
-       struct proc_dir_entry *pde;
-
-       pde = create_proc_entry(proc_filename, 0, NULL);
-       if (pde == NULL)
-               return;
-
-       pde->proc_fops = &proc_ops;
-       pde->data = isp116x;
-       isp116x->pde = pde;
+       isp116x->dentry = debugfs_create_file(hcd_name,
+                                             S_IRUGO, NULL, isp116x,
+                                             &isp116x_debug_fops);
+       if (!isp116x->dentry)
+               return -ENOMEM;
+       return 0;
 }
 
 static void remove_debug_file(struct isp116x *isp116x)
 {
-       if (isp116x->pde)
-               remove_proc_entry(proc_filename, NULL);
+       debugfs_remove(isp116x->dentry);
 }
 
-#endif
+#else
+
+#define        create_debug_file(d)    0
+#define        remove_debug_file(d)    do{}while(0)
+
+#endif                         /* CONFIG_DEBUG_FS */
 
 /*-----------------------------------------------------------------*/
 
@@ -1466,7 +1270,7 @@ static int isp116x_reset(struct usb_hcd *hcd)
        struct isp116x *isp116x = hcd_to_isp116x(hcd);
        unsigned long t;
        u16 clkrdy = 0;
-       int ret = 0, timeout = 15 /* ms */ ;
+       int ret, timeout = 15 /* ms */ ;
 
        ret = isp116x_sw_reset(isp116x);
        if (ret)
@@ -1482,7 +1286,7 @@ static int isp116x_reset(struct usb_hcd *hcd)
                        break;
        }
        if (!clkrdy) {
-               ERR("Clock not ready after 20ms\n");
+               ERR("Clock not ready after %dms\n", timeout);
                /* After sw_reset the clock won't report to be ready, if
                   H_WAKEUP pin is high. */
                ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
@@ -1572,7 +1376,8 @@ static int isp116x_start(struct usb_hcd *hcd)
 
        val = 0;
        if (board->remote_wakeup_enable) {
-               hcd->can_wakeup = 1;
+               if (!device_can_wakeup(hcd->self.controller))
+                       device_init_wakeup(hcd->self.controller, 1);
                val |= RH_HS_DRWE;
        }
        isp116x_write_reg32(isp116x, HCRHSTATUS, val);
@@ -1600,12 +1405,126 @@ static int isp116x_start(struct usb_hcd *hcd)
        isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
        isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
 
-       isp116x_show_regs(isp116x);
+       isp116x_show_regs_log(isp116x);
        spin_unlock_irqrestore(&isp116x->lock, flags);
        return 0;
 }
 
-/*-----------------------------------------------------------------*/
+#ifdef CONFIG_PM
+
+static int isp116x_bus_suspend(struct usb_hcd *hcd)
+{
+       struct isp116x *isp116x = hcd_to_isp116x(hcd);
+       unsigned long flags;
+       u32 val;
+       int ret = 0;
+
+       spin_lock_irqsave(&isp116x->lock, flags);
+
+       val = isp116x_read_reg32(isp116x, HCCONTROL);
+       switch (val & HCCONTROL_HCFS) {
+       case HCCONTROL_USB_OPER:
+               val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
+               val |= HCCONTROL_USB_SUSPEND;
+               if (device_may_wakeup(&hcd->self.root_hub->dev))
+                       val |= HCCONTROL_RWE;
+               /* Wait for usb transfers to finish */
+               mdelay(2);
+               isp116x_write_reg32(isp116x, HCCONTROL, val);
+               /* Wait for devices to suspend */
+               mdelay(5);
+       case HCCONTROL_USB_SUSPEND:
+               break;
+       case HCCONTROL_USB_RESUME:
+               isp116x_write_reg32(isp116x, HCCONTROL,
+                                   (val & ~HCCONTROL_HCFS) |
+                                   HCCONTROL_USB_RESET);
+       case HCCONTROL_USB_RESET:
+               ret = -EBUSY;
+               break;
+       default:
+               ret = -EINVAL;
+       }
+
+       spin_unlock_irqrestore(&isp116x->lock, flags);
+       return ret;
+}
+
+static int isp116x_bus_resume(struct usb_hcd *hcd)
+{
+       struct isp116x *isp116x = hcd_to_isp116x(hcd);
+       u32 val;
+
+       msleep(5);
+       spin_lock_irq(&isp116x->lock);
+
+       val = isp116x_read_reg32(isp116x, HCCONTROL);
+       switch (val & HCCONTROL_HCFS) {
+       case HCCONTROL_USB_SUSPEND:
+               val &= ~HCCONTROL_HCFS;
+               val |= HCCONTROL_USB_RESUME;
+               isp116x_write_reg32(isp116x, HCCONTROL, val);
+       case HCCONTROL_USB_RESUME:
+               break;
+       case HCCONTROL_USB_OPER:
+               spin_unlock_irq(&isp116x->lock);
+               /* Without setting power_state here the
+                  SUSPENDED state won't be removed from
+                  sysfs/usbN/power.state as a response to remote
+                  wakeup. Maybe in the future. */
+               hcd->self.root_hub->dev.power.power_state = PMSG_ON;
+               return 0;
+       default:
+               /* HCCONTROL_USB_RESET: this may happen, when during
+                  suspension the HC lost power. Reinitialize completely */
+               spin_unlock_irq(&isp116x->lock);
+               DBG("Chip has been reset while suspended. Reinit from scratch.\n");
+               isp116x_reset(hcd);
+               isp116x_start(hcd);
+               isp116x_hub_control(hcd, SetPortFeature,
+                                   USB_PORT_FEAT_POWER, 1, NULL, 0);
+               if ((isp116x->rhdesca & RH_A_NDP) == 2)
+                       isp116x_hub_control(hcd, SetPortFeature,
+                                           USB_PORT_FEAT_POWER, 2, NULL, 0);
+               hcd->self.root_hub->dev.power.power_state = PMSG_ON;
+               return 0;
+       }
+
+       val = isp116x->rhdesca & RH_A_NDP;
+       while (val--) {
+               u32 stat =
+                   isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
+               /* force global, not selective, resume */
+               if (!(stat & RH_PS_PSS))
+                       continue;
+               DBG("%s: Resuming port %d\n", __func__, val);
+               isp116x_write_reg32(isp116x, RH_PS_POCI, val
+                                   ? HCRHPORT2 : HCRHPORT1);
+       }
+       spin_unlock_irq(&isp116x->lock);
+
+       hcd->state = HC_STATE_RESUMING;
+       msleep(20);
+
+       /* Go operational */
+       spin_lock_irq(&isp116x->lock);
+       val = isp116x_read_reg32(isp116x, HCCONTROL);
+       isp116x_write_reg32(isp116x, HCCONTROL,
+                           (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
+       spin_unlock_irq(&isp116x->lock);
+       /* see analogous comment above */
+       hcd->self.root_hub->dev.power.power_state = PMSG_ON;
+       hcd->state = HC_STATE_RUNNING;
+
+       return 0;
+}
+
+#else
+
+#define        isp116x_bus_suspend     NULL
+#define        isp116x_bus_resume      NULL
+
+#endif
 
 static struct hc_driver isp116x_hc_driver = {
        .description = hcd_name,
@@ -1735,12 +1654,19 @@ static int __init isp116x_probe(struct platform_device *pdev)
        }
 
        ret = usb_add_hcd(hcd, irq, SA_INTERRUPT);
-       if (ret != 0)
+       if (ret)
                goto err6;
 
-       create_debug_file(isp116x);
+       ret = create_debug_file(isp116x);
+       if (ret) {
+               ERR("Couldn't create debugfs entry\n");
+               goto err7;
+       }
+
        return 0;
 
+      err7:
+       usb_remove_hcd(hcd);
       err6:
        usb_put_hcd(hcd);
       err5:
@@ -1762,13 +1688,9 @@ static int __init isp116x_probe(struct platform_device *pdev)
 */
 static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
 {
-       int ret = 0;
-
-       VDBG("%s: state %x\n", __func__, state);
-
+       VDBG("%s: state %x\n", __func__, state.event);
        dev->dev.power.power_state = state;
-
-       return ret;
+       return 0;
 }
 
 /*
@@ -1776,13 +1698,9 @@ static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
 */
 static int isp116x_resume(struct platform_device *dev)
 {
-       int ret = 0;
-
-       VDBG("%s:  state %x\n", __func__, dev->dev.power.power_state);
-
+       VDBG("%s:  state %x\n", __func__, dev->power.power_state.event);
        dev->dev.power.power_state = PMSG_ON;
-
-       return ret;
+       return 0;
 }
 
 #else
index c6fec96785fefa2a27e7076468a177a3b28fdb12..a1b7c3813d3a955321d08961b0a5fc98faecbff4 100644 (file)
@@ -259,7 +259,7 @@ struct isp116x {
 
        struct isp116x_platform_data *board;
 
-       struct proc_dir_entry *pde;
+       struct dentry *dentry;
        unsigned long stat1, stat2, stat4, stat8, stat16;
 
        /* HC registers */
@@ -450,7 +450,7 @@ static void isp116x_write_reg32(struct isp116x *isp116x, unsigned reg,
        isp116x_write_data32(isp116x, (u32) val);
 }
 
-#define isp116x_show_reg(d,r) {                                        \
+#define isp116x_show_reg_log(d,r,s) {                          \
        if ((r) < 0x20) {                                       \
                DBG("%-12s[%02x]: %08x\n", #r,                  \
                        r, isp116x_read_reg32(d, r));           \
@@ -459,35 +459,60 @@ static void isp116x_write_reg32(struct isp116x *isp116x, unsigned reg,
                        r, isp116x_read_reg16(d, r));           \
        }                                                       \
 }
+#define isp116x_show_reg_seq(d,r,s) {                          \
+       if ((r) < 0x20) {                                       \
+               seq_printf(s, "%-12s[%02x]: %08x\n", #r,        \
+                       r, isp116x_read_reg32(d, r));           \
+       } else {                                                \
+               seq_printf(s, "%-12s[%02x]:     %04x\n", #r,    \
+                       r, isp116x_read_reg16(d, r));           \
+       }                                                       \
+}
 
-static inline void isp116x_show_regs(struct isp116x *isp116x)
+#define isp116x_show_regs(d,type,s) {                  \
+       isp116x_show_reg_##type(d, HCREVISION, s);      \
+       isp116x_show_reg_##type(d, HCCONTROL, s);       \
+       isp116x_show_reg_##type(d, HCCMDSTAT, s);       \
+       isp116x_show_reg_##type(d, HCINTSTAT, s);       \
+       isp116x_show_reg_##type(d, HCINTENB, s);        \
+       isp116x_show_reg_##type(d, HCFMINTVL, s);       \
+       isp116x_show_reg_##type(d, HCFMREM, s);         \
+       isp116x_show_reg_##type(d, HCFMNUM, s);         \
+       isp116x_show_reg_##type(d, HCLSTHRESH, s);      \
+       isp116x_show_reg_##type(d, HCRHDESCA, s);       \
+       isp116x_show_reg_##type(d, HCRHDESCB, s);       \
+       isp116x_show_reg_##type(d, HCRHSTATUS, s);      \
+       isp116x_show_reg_##type(d, HCRHPORT1, s);       \
+       isp116x_show_reg_##type(d, HCRHPORT2, s);       \
+       isp116x_show_reg_##type(d, HCHWCFG, s);         \
+       isp116x_show_reg_##type(d, HCDMACFG, s);        \
+       isp116x_show_reg_##type(d, HCXFERCTR, s);       \
+       isp116x_show_reg_##type(d, HCuPINT, s);         \
+       isp116x_show_reg_##type(d, HCuPINTENB, s);      \
+       isp116x_show_reg_##type(d, HCCHIPID, s);        \
+       isp116x_show_reg_##type(d, HCSCRATCH, s);       \
+       isp116x_show_reg_##type(d, HCITLBUFLEN, s);     \
+       isp116x_show_reg_##type(d, HCATLBUFLEN, s);     \
+       isp116x_show_reg_##type(d, HCBUFSTAT, s);       \
+       isp116x_show_reg_##type(d, HCRDITL0LEN, s);     \
+       isp116x_show_reg_##type(d, HCRDITL1LEN, s);     \
+}
+
+/*
+   Dump registers for debugfs.
+*/
+static inline void isp116x_show_regs_seq(struct isp116x *isp116x,
+                                         struct seq_file *s)
+{
+       isp116x_show_regs(isp116x, seq, s);
+}
+
+/*
+   Dump registers to syslog.
+*/
+static inline void isp116x_show_regs_log(struct isp116x *isp116x)
 {
-       isp116x_show_reg(isp116x, HCREVISION);
-       isp116x_show_reg(isp116x, HCCONTROL);
-       isp116x_show_reg(isp116x, HCCMDSTAT);
-       isp116x_show_reg(isp116x, HCINTSTAT);
-       isp116x_show_reg(isp116x, HCINTENB);
-       isp116x_show_reg(isp116x, HCFMINTVL);
-       isp116x_show_reg(isp116x, HCFMREM);
-       isp116x_show_reg(isp116x, HCFMNUM);
-       isp116x_show_reg(isp116x, HCLSTHRESH);
-       isp116x_show_reg(isp116x, HCRHDESCA);
-       isp116x_show_reg(isp116x, HCRHDESCB);
-       isp116x_show_reg(isp116x, HCRHSTATUS);
-       isp116x_show_reg(isp116x, HCRHPORT1);
-       isp116x_show_reg(isp116x, HCRHPORT2);
-       isp116x_show_reg(isp116x, HCHWCFG);
-       isp116x_show_reg(isp116x, HCDMACFG);
-       isp116x_show_reg(isp116x, HCXFERCTR);
-       isp116x_show_reg(isp116x, HCuPINT);
-       isp116x_show_reg(isp116x, HCuPINTENB);
-       isp116x_show_reg(isp116x, HCCHIPID);
-       isp116x_show_reg(isp116x, HCSCRATCH);
-       isp116x_show_reg(isp116x, HCITLBUFLEN);
-       isp116x_show_reg(isp116x, HCATLBUFLEN);
-       isp116x_show_reg(isp116x, HCBUFSTAT);
-       isp116x_show_reg(isp116x, HCRDITL0LEN);
-       isp116x_show_reg(isp116x, HCRDITL1LEN);
+       isp116x_show_regs(isp116x, log, NULL);
 }
 
 #if defined(URB_TRACE)
index 5c0c6c8a7a82a65da4ce6b2a3f70ecef0c1f4746..a4b12404ae085ed0cfb405c4d9958e2e647e60e1 100644 (file)
  */
  
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-#      define DEBUG
-#else
-#      undef DEBUG
-#endif
-
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/pci.h>
 
 /*-------------------------------------------------------------------------*/
 
-// #define OHCI_VERBOSE_DEBUG  /* not always helpful */
+#undef OHCI_VERBOSE_DEBUG      /* not always helpful */
 
 /* For initializing controller (mask in an HCFS mode too) */
 #define        OHCI_CONTROL_INIT       OHCI_CTRL_CBSR
@@ -253,6 +246,10 @@ static int ohci_urb_enqueue (
        spin_lock_irqsave (&ohci->lock, flags);
 
        /* don't submit to a dead HC */
+       if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
+               retval = -ENODEV;
+               goto fail;
+       }
        if (!HC_IS_RUNNING(hcd->state)) {
                retval = -ENODEV;
                goto fail;
@@ -798,7 +795,6 @@ static int ohci_restart (struct ohci_hcd *ohci)
        int temp;
        int i;
        struct urb_priv *priv;
-       struct usb_device *root = ohci_to_hcd(ohci)->self.root_hub;
 
        /* mark any devices gone, so they do nothing till khubd disconnects.
         * recycle any "live" eds/tds (and urbs) right away.
@@ -807,11 +803,7 @@ static int ohci_restart (struct ohci_hcd *ohci)
         */ 
        spin_lock_irq(&ohci->lock);
        disable (ohci);
-       for (i = 0; i < root->maxchild; i++) {
-               if (root->children [i])
-                       usb_set_device_state (root->children[i],
-                               USB_STATE_NOTATTACHED);
-       }
+       usb_root_hub_lost_power(ohci_to_hcd(ohci)->self.root_hub);
        if (!list_empty (&ohci->pending))
                ohci_dbg(ohci, "abort schedule...\n");
        list_for_each_entry (priv, &ohci->pending, pending) {
index e01e77bc324b190bdaf845a7606bed0b5e338c5f..4b2226d77b342dd68082733a2aac20e41be25fa9 100644 (file)
@@ -53,6 +53,11 @@ static int ohci_bus_suspend (struct usb_hcd *hcd)
 
        spin_lock_irqsave (&ohci->lock, flags);
 
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) {
+               spin_unlock_irqrestore (&ohci->lock, flags);
+               return -ESHUTDOWN;
+       }
+
        ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
        switch (ohci->hc_control & OHCI_CTRL_HCFS) {
        case OHCI_USB_RESUME:
@@ -140,11 +145,19 @@ static int ohci_bus_resume (struct usb_hcd *hcd)
        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
        u32                     temp, enables;
        int                     status = -EINPROGRESS;
+       unsigned long           flags;
 
        if (time_before (jiffies, ohci->next_statechange))
                msleep(5);
 
-       spin_lock_irq (&ohci->lock);
+       spin_lock_irqsave (&ohci->lock, flags);
+
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) {
+               spin_unlock_irqrestore (&ohci->lock, flags);
+               return -ESHUTDOWN;
+       }
+
+
        ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
 
        if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
@@ -179,7 +192,7 @@ static int ohci_bus_resume (struct usb_hcd *hcd)
                ohci_dbg (ohci, "lost power\n");
                status = -EBUSY;
        }
-       spin_unlock_irq (&ohci->lock);
+       spin_unlock_irqrestore (&ohci->lock, flags);
        if (status == -EBUSY) {
                (void) ohci_init (ohci);
                return ohci_restart (ohci);
@@ -297,8 +310,8 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
        /* handle autosuspended root:  finish resuming before
         * letting khubd or root hub timer see state changes.
         */
-       if ((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER
-                       || !HC_IS_RUNNING(hcd->state)) {
+       if (unlikely((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER
+                    || !HC_IS_RUNNING(hcd->state))) {
                can_suspend = 0;
                goto done;
        }
@@ -359,7 +372,7 @@ done:
                                        & ohci->hc_control)
                                == OHCI_USB_OPER
                        && time_after (jiffies, ohci->next_statechange)
-                       && usb_trylock_device (hcd->self.root_hub)
+                       && usb_trylock_device (hcd->self.root_hub) == 0
                        ) {
                ohci_vdbg (ohci, "autosuspend\n");
                (void) ohci_bus_suspend (hcd);
@@ -508,6 +521,9 @@ static int ohci_hub_control (
        u32             temp;
        int             retval = 0;
 
+       if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)))
+               return -ESHUTDOWN;
+
        switch (typeReq) {
        case ClearHubFeature:
                switch (wValue) {
index a59e536441e14771d95463982ccdbc4c050f751e..1b09dde068e11085e08830edc0a38f29c733eeab 100644 (file)
  * This file is licenced under the GPL.
  */
  
-#include <linux/jiffies.h>
-
-#ifdef CONFIG_PPC_PMAC
-#include <asm/machdep.h>
-#include <asm/pmac_feature.h>
-#include <asm/pci-bridge.h>
-#include <asm/prom.h>
-#endif
-
 #ifndef CONFIG_PCI
 #error "This file is PCI bus glue.  CONFIG_PCI must be defined."
 #endif
@@ -114,40 +105,36 @@ ohci_pci_start (struct usb_hcd *hcd)
 
 static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
 {
-       /* root hub was already suspended */
-
-       /* FIXME these PMAC things get called in the wrong places.  ASIC
-        * clocks should be turned off AFTER entering D3, and on BEFORE
-        * trying to enter D0.  Evidently the PCI layer doesn't currently
-        * provide the right sort of platform hooks for this ...
+       struct ohci_hcd *ohci = hcd_to_ohci (hcd);
+       unsigned long   flags;
+       int             rc = 0;
+
+       /* Root hub was already suspended. Disable irq emission and
+        * mark HW unaccessible, bail out if RH has been resumed. Use
+        * the spinlock to properly synchronize with possible pending
+        * RH suspend or resume activity.
+        *
+        * This is still racy as hcd->state is manipulated outside of
+        * any locks =P But that will be a different fix.
         */
-#ifdef CONFIG_PPC_PMAC
-       if (_machine == _MACH_Pmac) {
-               struct device_node      *of_node;
-               /* Disable USB PAD & cell clock */
-               of_node = pci_device_to_OF_node (to_pci_dev(hcd->self.controller));
-               if (of_node)
-                       pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0);
+       spin_lock_irqsave (&ohci->lock, flags);
+       if (hcd->state != HC_STATE_SUSPENDED) {
+               rc = -EINVAL;
+               goto bail;
        }
-#endif /* CONFIG_PPC_PMAC */
-       return 0;
+       ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
+       (void)ohci_readl(ohci, &ohci->regs->intrdisable);
+       clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+ bail:
+       spin_unlock_irqrestore (&ohci->lock, flags);
+
+       return rc;
 }
 
 
 static int ohci_pci_resume (struct usb_hcd *hcd)
 {
-#ifdef CONFIG_PPC_PMAC
-       if (_machine == _MACH_Pmac) {
-               struct device_node *of_node;
-
-               /* Re-enable USB PAD & cell clock */
-               of_node = pci_device_to_OF_node (to_pci_dev(hcd->self.controller));
-               if (of_node)
-                       pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1);
-       }
-#endif /* CONFIG_PPC_PMAC */
-
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        usb_hcd_resume_root_hub(hcd);
        return 0;
 }
index 9d65ec30799012730f8f939f6996e9904477250d..acde8868da21f959cf36a9ea28df3901434ade18 100644 (file)
 #include <asm/mach-types.h>
 #include <asm/hardware.h>
 #include <asm/arch/pxa-regs.h>
-
-
-#define PMM_NPS_MODE           1
-#define PMM_GLOBAL_MODE        2
-#define PMM_PERPORT_MODE       3
+#include <asm/arch/ohci.h>
 
 #define PXA_UHC_MAX_PORTNUM    3
 
 #define UHCRHPS(x)              __REG2( 0x4C000050, (x)<<2 )
 
-static int pxa27x_ohci_pmm_state;
-
 /*
   PMM_NPS_MODE -- PMM Non-power switching mode
       Ports are powered continuously.
@@ -50,8 +44,6 @@ static int pxa27x_ohci_pmm_state;
  */
 static int pxa27x_ohci_select_pmm( int mode )
 {
-       pxa27x_ohci_pmm_state = mode;
-
        switch ( mode ) {
        case PMM_NPS_MODE:
                UHCRHDA |= RH_A_NPS;
@@ -71,7 +63,6 @@ static int pxa27x_ohci_select_pmm( int mode )
                        "Invalid mode %d, set to non-power switch mode.\n", 
                        mode );
 
-               pxa27x_ohci_pmm_state = PMM_NPS_MODE;
                UHCRHDA |= RH_A_NPS;
        }
 
@@ -82,8 +73,13 @@ extern int usb_disabled(void);
 
 /*-------------------------------------------------------------------------*/
 
-static void pxa27x_start_hc(struct platform_device *dev)
+static int pxa27x_start_hc(struct device *dev)
 {
+       int retval = 0;
+       struct pxaohci_platform_data *inf;
+
+       inf = dev->platform_data;
+
        pxa_set_cken(CKEN10_USBHOST, 1);
 
        UHCHR |= UHCHR_FHR;
@@ -94,21 +90,11 @@ static void pxa27x_start_hc(struct platform_device *dev)
        while (UHCHR & UHCHR_FSBIR)
                cpu_relax();
 
-       /* This could be properly abstracted away through the
-          device data the day more machines are supported and
-          their differences can be figured out correctly. */
-       if (machine_is_mainstone()) {
-               /* setup Port1 GPIO pin. */
-               pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN);  /* USBHPWR1 */
-               pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */
-
-               /* Set the Power Control Polarity Low and Power Sense
-                  Polarity Low to active low. Supply power to USB ports. */
-               UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
-                       ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
+       if (inf->init)
+               retval = inf->init(dev);
 
-               pxa27x_ohci_pmm_state = PMM_PERPORT_MODE;
-       }
+       if (retval < 0)
+               return retval;
 
        UHCHR &= ~UHCHR_SSE;
 
@@ -117,10 +103,19 @@ static void pxa27x_start_hc(struct platform_device *dev)
        /* Clear any OTG Pin Hold */
        if (PSSR & PSSR_OTGPH)
                PSSR |= PSSR_OTGPH;
+
+       return 0;
 }
 
-static void pxa27x_stop_hc(struct platform_device *dev)
+static void pxa27x_stop_hc(struct device *dev)
 {
+       struct pxaohci_platform_data *inf;
+
+       inf = dev->platform_data;
+
+       if (inf->exit)
+               inf->exit(dev);
+
        UHCHR |= UHCHR_FHR;
        udelay(11);
        UHCHR &= ~UHCHR_FHR;
@@ -147,22 +142,27 @@ static void pxa27x_stop_hc(struct platform_device *dev)
  * through the hotplug entry's driver_data.
  *
  */
-int usb_hcd_pxa27x_probe (const struct hc_driver *driver,
-                         struct platform_device *dev)
+int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device *pdev)
 {
        int retval;
        struct usb_hcd *hcd;
+       struct pxaohci_platform_data *inf;
 
-       if (dev->resource[1].flags != IORESOURCE_IRQ) {
+       inf = pdev->dev.platform_data;
+
+       if (!inf)
+               return -ENODEV;
+
+       if (pdev->resource[1].flags != IORESOURCE_IRQ) {
                pr_debug ("resource[1] is not IORESOURCE_IRQ");
                return -ENOMEM;
        }
 
-       hcd = usb_create_hcd (driver, &dev->dev, "pxa27x");
+       hcd = usb_create_hcd (driver, &pdev->dev, "pxa27x");
        if (!hcd)
                return -ENOMEM;
-       hcd->rsrc_start = dev->resource[0].start;
-       hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
+       hcd->rsrc_start = pdev->resource[0].start;
+       hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
 
        if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
                pr_debug("request_mem_region failed");
@@ -177,18 +177,22 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver,
                goto err2;
        }
 
-       pxa27x_start_hc(dev);
+       if ((retval = pxa27x_start_hc(&pdev->dev)) < 0) {
+               pr_debug("pxa27x_start_hc failed");
+               goto err3;
+       }
 
        /* Select Power Management Mode */
-       pxa27x_ohci_select_pmm(pxa27x_ohci_pmm_state);
+       pxa27x_ohci_select_pmm(inf->port_mode);
 
        ohci_hcd_init(hcd_to_ohci(hcd));
 
-       retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT);
+       retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT);
        if (retval == 0)
                return retval;
 
-       pxa27x_stop_hc(dev);
+       pxa27x_stop_hc(&pdev->dev);
+ err3:
        iounmap(hcd->regs);
  err2:
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
@@ -211,10 +215,10 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver,
  * context, normally "rmmod", "apmd", or something similar.
  *
  */
-void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct platform_device *dev)
+void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct platform_device *pdev)
 {
        usb_remove_hcd(hcd);
-       pxa27x_stop_hc(dev);
+       pxa27x_stop_hc(&pdev->dev);
        iounmap(hcd->regs);
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
@@ -292,15 +296,12 @@ static const struct hc_driver ohci_pxa27x_hc_driver = {
 
 static int ohci_hcd_pxa27x_drv_probe(struct platform_device *pdev)
 {
-       int ret;
-
        pr_debug ("In ohci_hcd_pxa27x_drv_probe");
 
        if (usb_disabled())
                return -ENODEV;
 
-       ret = usb_hcd_pxa27x_probe(&ohci_pxa27x_hc_driver, pdev);
-       return ret;
+       return usb_hcd_pxa27x_probe(&ohci_pxa27x_hc_driver, pdev);
 }
 
 static int ohci_hcd_pxa27x_drv_remove(struct platform_device *pdev)
@@ -308,31 +309,55 @@ static int ohci_hcd_pxa27x_drv_remove(struct platform_device *pdev)
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
        usb_hcd_pxa27x_remove(hcd, pdev);
+       platform_set_drvdata(pdev, NULL);
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_suspend(struct platform_device *dev, pm_message_t state)
+#ifdef CONFIG_PM
+static int ohci_hcd_pxa27x_drv_suspend(struct platform_device *pdev, pm_message_t state)
 {
-//     struct usb_hcd *hcd = platform_get_drvdata(dev);
-       printk("%s: not implemented yet\n", __FUNCTION__);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
+       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       pxa27x_stop_hc(&pdev->dev);
+       hcd->state = HC_STATE_SUSPENDED;
+       pdev->dev.power.power_state = PMSG_SUSPEND;
 
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_resume(struct platform_device *dev)
+static int ohci_hcd_pxa27x_drv_resume(struct platform_device *pdev)
 {
-//     struct usb_hcd *hcd = platform_get_drvdata(dev);
-       printk("%s: not implemented yet\n", __FUNCTION__);
+       struct usb_hcd *hcd = platform_get_drvdata(pdev);
+       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+       int status;
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       if ((status = pxa27x_start_hc(&pdev->dev)) < 0)
+               return status;
+
+       pdev->dev.power.power_state = PMSG_ON;
+       usb_hcd_resume_root_hub(hcd);
 
        return 0;
 }
+#endif
 
 
 static struct platform_driver ohci_hcd_pxa27x_driver = {
        .probe          = ohci_hcd_pxa27x_drv_probe,
        .remove         = ohci_hcd_pxa27x_drv_remove,
+#ifdef CONFIG_PM
        .suspend        = ohci_hcd_pxa27x_drv_suspend, 
        .resume         = ohci_hcd_pxa27x_drv_resume,
+#endif
        .driver         = {
                .name   = "pxa27x-ohci",
        },
index e46528c825bfdc5183914a552a202d3c99999bc1..3ef2c0cdf1db2fe26c6235ea3410a36e543be617 100644 (file)
@@ -9,12 +9,6 @@
  */
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG
-#else
-#undef DEBUG
-#endif
-
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
index a7722a6a5a5b40cf7bf18dbd4fbfb75e4b15fe33..517360b77d8e68521995655d7c53c5dc2a7e59ee 100644 (file)
 #undef PACKET_TRACE
 
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-#      define DEBUG
-#else
-#      undef DEBUG
-#endif
-
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
@@ -1581,7 +1574,9 @@ sl811h_start(struct usb_hcd *hcd)
        hcd->state = HC_STATE_RUNNING;
 
        if (sl811->board) {
-               hcd->can_wakeup = sl811->board->can_wakeup;
+               if (!device_can_wakeup(hcd->self.controller))
+                       device_init_wakeup(hcd->self.controller,
+                               sl811->board->can_wakeup);
                hcd->power_budget = sl811->board->power * 2;
        }
 
@@ -1805,9 +1800,10 @@ sl811h_resume(struct platform_device *dev)
         * let's assume it'd only be powered to enable remote wakeup.
         */
        if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND
-                       || !hcd->can_wakeup) {
+                       || !device_can_wakeup(&hcd->self.root_hub->dev)) {
                sl811->port1 = 0;
                port_power(sl811, 1);
+               usb_root_hub_lost_power(hcd->self.root_hub);
                return 0;
        }
 
index e73faf831b24bce4c1a0a16a9b017cdaae274f16..5056b7459994d6c891297f8d45f946802aa4fc84 100644 (file)
@@ -38,7 +38,7 @@ MODULE_LICENSE("GPL");
 /* MACROS                                                             */
 /*====================================================================*/
 
-#if defined(DEBUG) || defined(CONFIG_USB_DEBUG) || defined(PCMCIA_DEBUG)
+#if defined(DEBUG) || defined(PCMCIA_DEBUG)
 
 static int pc_debug = 0;
 module_param(pc_debug, int, 0644);
@@ -129,7 +129,8 @@ static int sl811_hc_init(struct device *parent, ioaddr_t base_addr, int irq)
        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.
+        * initialized already because of the link order dependency created
+        * by referencing "sl811h_driver".
         */
        platform_dev.name = sl811h_driver.name;
        return platform_device_register(&platform_dev);
index 151154df37fa105bf62038b9e4e9c8ee1f03d7bf..5832953086f81987adb5b5566d51e51ce78b3015 100644 (file)
@@ -2,8 +2,8 @@
  * UHCI-specific debugging code. Invaluable when something
  * goes wrong, but don't get in my face.
  *
- * Kernel visible pointers are surrounded in []'s and bus
- * visible pointers are surrounded in ()'s
+ * Kernel visible pointers are surrounded in []s and bus
+ * visible pointers are surrounded in ()s
  *
  * (C) Copyright 1999 Linus Torvalds
  * (C) Copyright 1999-2001 Johannes Erdfelt
@@ -19,7 +19,7 @@
 
 static struct dentry *uhci_debugfs_root = NULL;
 
-/* Handle REALLY large printk's so we don't overflow buffers */
+/* Handle REALLY large printks so we don't overflow buffers */
 static inline void lprintk(char *buf)
 {
        char *p;
@@ -160,7 +160,7 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space)
                        }
 
                        if (active && ni > i) {
-                               out += sprintf(out, "%*s[skipped %d active TD's]\n", space, "", ni - i);
+                               out += sprintf(out, "%*s[skipped %d active TDs]\n", space, "", ni - i);
                                tmp = ntmp;
                                td = ntd;
                                i = ni;
@@ -173,7 +173,7 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space)
        if (list_empty(&urbp->queue_list) || urbp->queued)
                goto out;
 
-       out += sprintf(out, "%*sQueued QH's:\n", -space, "--");
+       out += sprintf(out, "%*sQueued QHs:\n", -space, "--");
 
        head = &urbp->queue_list;
        tmp = head->next;
@@ -197,7 +197,7 @@ out:
        }
 
 #ifdef CONFIG_PROC_FS
-static const char *qh_names[] = {
+static const char * const qh_names[] = {
   "skel_int128_qh", "skel_int64_qh",
   "skel_int32_qh", "skel_int16_qh",
   "skel_int8_qh", "skel_int4_qh",
@@ -464,7 +464,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len)
                } while (tmp != head);
        }
 
-       out += sprintf(out, "Skeleton QH's\n");
+       out += sprintf(out, "Skeleton QHs\n");
 
        for (i = 0; i < UHCI_NUM_SKELQH; ++i) {
                int shown = 0;
index d33ce3982a5f0e08f249ebb00697f3de22907fdc..dfe121d3588723b87bcfd891bcc9c908ff364392 100644 (file)
  */
 
 #include <linux/config.h>
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG
-#else
-#undef DEBUG
-#endif
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/kernel.h>
@@ -67,10 +62,10 @@ Alan Stern"
 
 /*
  * debug = 0, no debugging messages
- * debug = 1, dump failed URB's except for stalls
- * debug = 2, dump all failed URB's (including stalls)
+ * debug = 1, dump failed URBs except for stalls
+ * debug = 2, dump all failed URBs (including stalls)
  *            show all queues in /debug/uhci/[pci_addr]
- * debug = 3, show all TD's in URB's when dumping
+ * debug = 3, show all TDs in URBs when dumping
  */
 #ifdef DEBUG
 static int debug = 1;
@@ -93,7 +88,7 @@ static void uhci_get_current_frame_number(struct uhci_hcd *uhci);
 #define FSBR_DELAY     msecs_to_jiffies(50)
 
 /* When we timeout an idle transfer for FSBR, we'll switch it over to */
-/* depth first traversal. We'll do it in groups of this number of TD's */
+/* depth first traversal. We'll do it in groups of this number of TDs */
 /* to make sure it doesn't hog all of the bandwidth */
 #define DEPTH_INTERVAL 5
 
@@ -478,8 +473,6 @@ static int uhci_start(struct usb_hcd *hcd)
        struct dentry *dentry;
 
        hcd->uses_new_polling = 1;
-       if (pci_find_capability(to_pci_dev(uhci_dev(uhci)), PCI_CAP_ID_PM))
-               hcd->can_wakeup = 1;            /* Assume it supports PME# */
 
        dentry = debugfs_create_file(hcd->self.bus_name,
                        S_IFREG|S_IRUGO|S_IWUSR, uhci_debugfs_root, uhci,
@@ -573,7 +566,7 @@ static int uhci_start(struct usb_hcd *hcd)
        uhci->skel_bulk_qh->link = cpu_to_le32(uhci->skel_term_qh->dma_handle) | UHCI_PTR_QH;
 
        /* This dummy TD is to work around a bug in Intel PIIX controllers */
-       uhci_fill_td(uhci->term_td, 0, (UHCI_NULL_DATA_SIZE << 21) |
+       uhci_fill_td(uhci->term_td, 0, uhci_explen(0) |
                (0x7f << TD_TOKEN_DEVADDR_SHIFT) | USB_PID_IN, 0);
        uhci->term_td->link = cpu_to_le32(uhci->term_td->dma_handle);
 
@@ -717,6 +710,8 @@ static int uhci_suspend(struct usb_hcd *hcd, pm_message_t message)
         * at the source, so we must turn off PIRQ.
         */
        pci_write_config_word(to_pci_dev(uhci_dev(uhci)), USBLEGSUP, 0);
+       mb();
+       clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        uhci->hc_inaccessible = 1;
        hcd->poll_rh = 0;
 
@@ -733,6 +728,13 @@ static int uhci_resume(struct usb_hcd *hcd)
 
        dev_dbg(uhci_dev(uhci), "%s\n", __FUNCTION__);
 
+       /* Since we aren't in D3 any more, it's safe to set this flag
+        * even if the controller was dead.  It might not even be dead
+        * any more, if the firmware or quirks code has reset it.
+        */
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+       mb();
+
        if (uhci->rh_state == UHCI_RH_RESET)    /* Dead */
                return 0;
        spin_lock_irq(&uhci->lock);
@@ -747,8 +749,12 @@ static int uhci_resume(struct usb_hcd *hcd)
        check_and_reset_hc(uhci);
        configure_hc(uhci);
 
-       if (uhci->rh_state == UHCI_RH_RESET)
+       if (uhci->rh_state == UHCI_RH_RESET) {
+
+               /* The controller had to be reset */
+               usb_root_hub_lost_power(hcd->self.root_hub);
                suspend_rh(uhci, UHCI_RH_SUSPENDED);
+       }
 
        spin_unlock_irq(&uhci->lock);
 
@@ -874,7 +880,7 @@ static int __init uhci_hcd_init(void)
 
 init_failed:
        if (kmem_cache_destroy(uhci_up_cachep))
-               warn("not all urb_priv's were freed!");
+               warn("not all urb_privs were freed!");
 
 up_failed:
        debugfs_remove(uhci_debugfs_root);
@@ -892,7 +898,7 @@ static void __exit uhci_hcd_cleanup(void)
        pci_unregister_driver(&uhci_pci_driver);
        
        if (kmem_cache_destroy(uhci_up_cachep))
-               warn("not all urb_priv's were freed!");
+               warn("not all urb_privs were freed!");
 
        debugfs_remove(uhci_debugfs_root);
        kfree(errbuf);
index e576db57a926f3b6152b59e60b6b3df152263f4b..8b4b887a7d417715fe73edcfd3f223a26f2d8638 100644 (file)
@@ -71,8 +71,6 @@
 #define   USBLEGSUP_RWC                0x8f00  /* the R/WC bits */
 #define   USBLEGSUP_RO         0x5040  /* R/O and reserved bits */
 
-#define UHCI_NULL_DATA_SIZE    0x7FF   /* for UHCI controller TD */
-
 #define UHCI_PTR_BITS          cpu_to_le32(0x000F)
 #define UHCI_PTR_TERM          cpu_to_le32(0x0001)
 #define UHCI_PTR_QH            cpu_to_le32(0x0002)
@@ -168,9 +166,11 @@ static __le32 inline qh_element(struct uhci_qh *qh) {
 #define TD_TOKEN_EXPLEN_MASK   0x7FF           /* expected length, encoded as n - 1 */
 #define TD_TOKEN_PID_MASK      0xFF
 
-#define uhci_explen(len)       ((len) << TD_TOKEN_EXPLEN_SHIFT)
+#define uhci_explen(len)       ((((len) - 1) & TD_TOKEN_EXPLEN_MASK) << \
+                                       TD_TOKEN_EXPLEN_SHIFT)
 
-#define uhci_expected_length(token) ((((token) >> 21) + 1) & TD_TOKEN_EXPLEN_MASK)
+#define uhci_expected_length(token) ((((token) >> TD_TOKEN_EXPLEN_SHIFT) + \
+                                       1) & TD_TOKEN_EXPLEN_MASK)
 #define uhci_toggle(token)     (((token) >> TD_TOKEN_TOGGLE_SHIFT) & 1)
 #define uhci_endpoint(token)   (((token) >> 15) & 0xf)
 #define uhci_devaddr(token)    (((token) >> TD_TOKEN_DEVADDR_SHIFT) & 0x7f)
@@ -223,10 +223,10 @@ static u32 inline td_status(struct uhci_td *td) {
  */
 
 /*
- * The UHCI driver places Interrupt, Control and Bulk into QH's both
- * to group together TD's for one transfer, and also to faciliate queuing
- * of URB's. To make it easy to insert entries into the schedule, we have
- * a skeleton of QH's for each predefined Interrupt latency, low-speed
+ * The UHCI driver places Interrupt, Control and Bulk into QHs both
+ * to group together TDs for one transfer, and also to facilitate queuing
+ * of URBs. To make it easy to insert entries into the schedule, we have
+ * a skeleton of QHs for each predefined Interrupt latency, low-speed
  * control, full-speed control and terminating QH (see explanation for
  * the terminating QH below).
  *
@@ -257,8 +257,8 @@ static u32 inline td_status(struct uhci_td *td) {
  *   reclamation.
  *
  * Isochronous transfers are stored before the start of the skeleton
- * schedule and don't use QH's. While the UHCI spec doesn't forbid the
- * use of QH's for Isochronous, it doesn't use them either. And the spec
+ * schedule and don't use QHs. While the UHCI spec doesn't forbid the
+ * use of QHs for Isochronous, it doesn't use them either. And the spec
  * says that queues never advance on an error completion status, which
  * makes them totally unsuitable for Isochronous transfers.
  */
@@ -359,7 +359,7 @@ struct uhci_hcd {
        struct dma_pool *td_pool;
 
        struct uhci_td *term_td;        /* Terminating TD, see UHCI bug */
-       struct uhci_qh *skelqh[UHCI_NUM_SKELQH];        /* Skeleton QH's */
+       struct uhci_qh *skelqh[UHCI_NUM_SKELQH];        /* Skeleton QHs */
 
        spinlock_t lock;
 
@@ -389,22 +389,22 @@ struct uhci_hcd {
        unsigned long resuming_ports;
        unsigned long ports_timeout;            /* Time to stop signalling */
 
-       /* Main list of URB's currently controlled by this HC */
+       /* Main list of URBs currently controlled by this HC */
        struct list_head urb_list;
 
-       /* List of QH's that are done, but waiting to be unlinked (race) */
+       /* List of QHs that are done, but waiting to be unlinked (race) */
        struct list_head qh_remove_list;
        unsigned int qh_remove_age;             /* Age in frames */
 
-       /* List of TD's that are done, but waiting to be freed (race) */
+       /* List of TDs that are done, but waiting to be freed (race) */
        struct list_head td_remove_list;
        unsigned int td_remove_age;             /* Age in frames */
 
-       /* List of asynchronously unlinked URB's */
+       /* List of asynchronously unlinked URBs */
        struct list_head urb_remove_list;
        unsigned int urb_remove_age;            /* Age in frames */
 
-       /* List of URB's awaiting completion callback */
+       /* List of URBs awaiting completion callback */
        struct list_head complete_list;
 
        int rh_numports;                        /* Number of root-hub ports */
index 7e46887d9e126cee73feb311db535b03d92f8e6f..b6076004a4374d54c3ae641a5f606e8a0c0da529 100644 (file)
@@ -80,7 +80,7 @@ static inline void uhci_fill_td(struct uhci_td *td, u32 status,
 }
 
 /*
- * We insert Isochronous URB's directly into the frame list at the beginning
+ * We insert Isochronous URBs directly into the frame list at the beginning
  */
 static void uhci_insert_td_frame_list(struct uhci_hcd *uhci, struct uhci_td *td, unsigned framenum)
 {
@@ -369,7 +369,7 @@ static void uhci_append_queued_urb(struct uhci_hcd *uhci, struct urb *eurb, stru
                                uhci_fixup_toggle(urb,
                                        uhci_toggle(td_token(lltd)) ^ 1));
 
-       /* All qh's in the queue need to link to the next queue */
+       /* All qhs in the queue need to link to the next queue */
        urbp->qh->link = eurbp->qh->link;
 
        wmb();                  /* Make sure we flush everything */
@@ -502,7 +502,7 @@ static void uhci_destroy_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
        }
 
        /* Check to see if the remove list is empty. Set the IOC bit */
-       /* to force an interrupt so we can remove the TD's*/
+       /* to force an interrupt so we can remove the TDs*/
        if (list_empty(&uhci->td_remove_list))
                uhci_set_next_interrupt(uhci);
 
@@ -596,7 +596,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, struct ur
                return -ENOMEM;
 
        uhci_add_td_to_urb(urb, td);
-       uhci_fill_td(td, status, destination | uhci_explen(7),
+       uhci_fill_td(td, status, destination | uhci_explen(8),
                urb->setup_dma);
 
        /*
@@ -612,7 +612,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, struct ur
        }
 
        /*
-        * Build the DATA TD's
+        * Build the DATA TDs
         */
        while (len > 0) {
                int pktsze = len;
@@ -628,7 +628,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, struct ur
                destination ^= TD_TOKEN_TOGGLE;
        
                uhci_add_td_to_urb(urb, td);
-               uhci_fill_td(td, status, destination | uhci_explen(pktsze - 1),
+               uhci_fill_td(td, status, destination | uhci_explen(pktsze),
                        data);
 
                data += pktsze;
@@ -658,7 +658,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, struct ur
 
        uhci_add_td_to_urb(urb, td);
        uhci_fill_td(td, status | TD_CTRL_IOC,
-               destination | uhci_explen(UHCI_NULL_DATA_SIZE), 0);
+               destination | uhci_explen(0), 0);
 
        qh = uhci_alloc_qh(uhci);
        if (!qh)
@@ -744,7 +744,7 @@ static int uhci_result_control(struct uhci_hcd *uhci, struct urb *urb)
 
        urb->actual_length = 0;
 
-       /* The rest of the TD's (but the last) are data */
+       /* The rest of the TDs (but the last) are data */
        tmp = tmp->next;
        while (tmp != head && tmp->next != head) {
                unsigned int ctrlstat;
@@ -848,7 +848,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, struct urb
                status |= TD_CTRL_SPD;
 
        /*
-        * Build the DATA TD's
+        * Build the DATA TDs
         */
        do {    /* Allow zero length packets */
                int pktsze = maxsze;
@@ -864,7 +864,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, struct urb
                        return -ENOMEM;
 
                uhci_add_td_to_urb(urb, td);
-               uhci_fill_td(td, status, destination | uhci_explen(pktsze - 1) |
+               uhci_fill_td(td, status, destination | uhci_explen(pktsze) |
                        (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
                         usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT),
                        data);
@@ -890,7 +890,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, struct urb
                        return -ENOMEM;
 
                uhci_add_td_to_urb(urb, td);
-               uhci_fill_td(td, status, destination | uhci_explen(UHCI_NULL_DATA_SIZE) |
+               uhci_fill_td(td, status, destination | uhci_explen(0) |
                        (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
                         usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE_SHIFT),
                        data);
@@ -1025,7 +1025,7 @@ static int isochronous_find_limits(struct uhci_hcd *uhci, struct urb *urb, unsig
        list_for_each_entry(up, &uhci->urb_list, urb_list) {
                struct urb *u = up->urb;
 
-               /* look for pending URB's with identical pipe handle */
+               /* look for pending URBs with identical pipe handle */
                if ((urb->pipe == u->pipe) && (urb->dev == u->dev) &&
                    (u->status == -EINPROGRESS) && (u != urb)) {
                        if (!last_urb)
@@ -1092,7 +1092,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb)
                        return -ENOMEM;
 
                uhci_add_td_to_urb(urb, td);
-               uhci_fill_td(td, status, destination | uhci_explen(urb->iso_frame_desc[i].length - 1),
+               uhci_fill_td(td, status, destination | uhci_explen(urb->iso_frame_desc[i].length),
                        urb->transfer_dma + urb->iso_frame_desc[i].offset);
 
                if (i + 1 >= urb->number_of_packets)
@@ -1355,7 +1355,7 @@ static void uhci_unlink_generic(struct uhci_hcd *uhci, struct urb *urb)
 
        uhci_delete_queued_urb(uhci, urb);
 
-       /* The interrupt loop will reclaim the QH's */
+       /* The interrupt loop will reclaim the QHs */
        uhci_remove_qh(uhci, urbp->qh);
        urbp->qh = NULL;
 }
@@ -1413,7 +1413,7 @@ static int uhci_fsbr_timeout(struct uhci_hcd *uhci, struct urb *urb)
        list_for_each_entry(td, head, list) {
                /*
                 * Make sure we don't do the last one (since it'll have the
-                * TERM bit set) as well as we skip every so many TD's to
+                * TERM bit set) as well as we skip every so many TDs to
                 * make sure it doesn't hog the bandwidth
                 */
                if (td->list.next != head && (count % DEPTH_INTERVAL) ==
index 1d973bcf56aa983659938665573ca51c5be60100..049871145d63735bd1fff17ee55dcc23a4ffd826 100644 (file)
@@ -962,7 +962,6 @@ MODULE_DEVICE_TABLE (usb, mdc800_table);
  */
 static struct usb_driver mdc800_usb_driver =
 {
-       .owner =        THIS_MODULE,
        .name =         "mdc800",
        .probe =        mdc800_usb_probe,
        .disconnect =   mdc800_usb_disconnect,
index 950543aa5ac72a6c10f593136e6179c8ec053308..458f2acdeb0a5695a2754edb45a8e3a28c9ae32d 100644 (file)
@@ -160,7 +160,6 @@ static void mts_usb_disconnect(struct usb_interface *intf);
 static struct usb_device_id mts_usb_ids [];
 
 static struct usb_driver mts_usb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "microtekX6",
        .probe =        mts_usb_probe,
        .disconnect =   mts_usb_disconnect,
index 1e53934907c089b0067d13142e4c4356ee9ff3cc..509dd0a04c54f5e8e5bf9d4164a635133095c9ce 100644 (file)
@@ -273,6 +273,20 @@ config USB_ATI_REMOTE
          To compile this driver as a module, choose M here: the module will be
          called ati_remote.
 
+config USB_ATI_REMOTE2
+       tristate "ATI / Philips USB RF remote control"
+       depends on USB && INPUT
+       ---help---
+         Say Y here if you want to use an ATI or Philips USB RF remote control.
+         These are RF remotes with USB receivers.
+         ATI Remote Wonder II comes with some ATI's All-In-Wonder video cards
+         and is also available as a separate product.
+         This driver provides mouse pointer, left and right mouse buttons,
+         and maps all the other remote buttons to keypress events.
+
+         To compile this driver as a module, choose M here: the module will be
+         called ati_remote2.
+
 config USB_KEYSPAN_REMOTE
        tristate "Keyspan DMR USB remote control (EXPERIMENTAL)"
        depends on USB && INPUT && EXPERIMENTAL
index 07cb17db42fc1eb8d473649f45873f43d9d821b5..d512d9f488fe6aa7528f00e498af073d404d61d7 100644 (file)
@@ -28,6 +28,7 @@ endif
 
 obj-$(CONFIG_USB_AIPTEK)       += aiptek.o
 obj-$(CONFIG_USB_ATI_REMOTE)   += ati_remote.o
+obj-$(CONFIG_USB_ATI_REMOTE2)  += ati_remote2.o
 obj-$(CONFIG_USB_HID)          += usbhid.o
 obj-$(CONFIG_USB_KBD)          += usbkbd.o
 obj-$(CONFIG_USB_KBTAB)                += kbtab.o
index a32558b4048e5a98b0c698e18dd12abac43500eb..df29b8078b54b4e8452029d0e0c533359d4c8908 100644 (file)
@@ -261,7 +261,6 @@ static struct usb_device_id usb_acecad_id_table [] = {
 MODULE_DEVICE_TABLE(usb, usb_acecad_id_table);
 
 static struct usb_driver usb_acecad_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usb_acecad",
        .probe =        usb_acecad_probe,
        .disconnect =   usb_acecad_disconnect,
index 1c3b472a3bca9acdb54f2125380f514e420f75da..a6693b0d1c4cc92c20b04957c9630bac3a8224f5 100644 (file)
@@ -338,7 +338,7 @@ struct aiptek {
  * the bitmap which comes from the tablet. This hides the
  * issue that the F_keys are not sequentially numbered.
  */
-static int macroKeyEvents[] = {
+static const int macroKeyEvents[] = {
        KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5,
        KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11,
        KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17,
@@ -2093,7 +2093,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
        /* Programming the tablet macro keys needs to be done with a for loop
         * as the keycodes are discontiguous.
         */
-       for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i)
+       for (i = 0; i < ARRAY_SIZE(macroKeyEvents); ++i)
                set_bit(macroKeyEvents[i], inputdev->keybit);
 
        /*
@@ -2103,7 +2103,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
         * values.
         */
        input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0);
-       input_set_abs_params(inputdev, ABS_X, 0, 2249, 0, 0);
+       input_set_abs_params(inputdev, ABS_Y, 0, 2249, 0, 0);
        input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0);
        input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
        input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
@@ -2135,7 +2135,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
         * not an error :-)
         */
 
-       for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) {
+       for (i = 0; i < ARRAY_SIZE(speeds); ++i) {
                aiptek->curSetting.programmableDelay = speeds[i];
                (void)aiptek_program_tablet(aiptek);
                if (aiptek->inputdev->absmax[ABS_X] > 0) {
@@ -2190,7 +2190,6 @@ fail1:    input_free_device(inputdev);
 static void aiptek_disconnect(struct usb_interface *intf);
 
 static struct usb_driver aiptek_driver = {
-       .owner = THIS_MODULE,
        .name = "aiptek",
        .probe = aiptek_probe,
        .disconnect = aiptek_disconnect,
index 15840db092a5125ce5c8db20a5106428155e22e9..1949b54f41f2500abfdd24372fb5ea19e37df0f7 100644 (file)
@@ -452,7 +452,6 @@ static int atp_resume(struct usb_interface *iface)
 }
 
 static struct usb_driver atp_driver = {
-       .owner          = THIS_MODULE,
        .name           = "appletouch",
        .probe          = atp_probe,
        .disconnect     = atp_disconnect,
index 9a2a47db9494d62e595865ac02038e6ce9a04320..f7bdc506e6132785a100f557635c7f665adc7c29 100644 (file)
@@ -96,6 +96,7 @@
 #include <linux/usb.h>
 #include <linux/usb_input.h>
 #include <linux/wait.h>
+#include <linux/jiffies.h>
 
 /*
  * Module and Version Information, Module Parameters
@@ -146,7 +147,7 @@ static char init1[] = { 0x01, 0x00, 0x20, 0x14 };
 static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 };
 
 /* Acceleration curve for directional control pad */
-static char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
+static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
 
 /* Duplicate event filtering time.
  * Sequential, identical KIND_FILTERED inputs with less than
@@ -197,7 +198,7 @@ struct ati_remote {
 #define KIND_ACCEL      7   /* Directional keypad - left, right, up, down.*/
 
 /* Translation table from hardware messages to input events. */
-static struct {
+static const struct {
        short kind;
        unsigned char data1, data2;
        int type;
@@ -295,7 +296,6 @@ static void ati_remote_disconnect   (struct usb_interface *interface);
 
 /* usb specific object to register with the usb subsystem */
 static struct usb_driver ati_remote_driver = {
-       .owner        = THIS_MODULE,
        .name         = "ati_remote",
        .probe        = ati_remote_probe,
        .disconnect   = ati_remote_disconnect,
@@ -472,7 +472,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
                /* Filter duplicate events which happen "too close" together. */
                if ((ati_remote->old_data[0] == data[1]) &&
                        (ati_remote->old_data[1] == data[2]) &&
-                       ((ati_remote->old_jiffies + FILTER_TIME) > jiffies)) {
+                       time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) {
                        ati_remote->repeat_count++;
                } else {
                        ati_remote->repeat_count = 0;
@@ -507,16 +507,16 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
         * pad down, so we increase acceleration, ramping up over two seconds to
         * a maximum speed.  The acceleration curve is #defined above.
         */
-       if ((jiffies - ati_remote->old_jiffies) > (HZ >> 2)) {
+       if (time_after(jiffies, ati_remote->old_jiffies + (HZ >> 2))) {
                acc = 1;
                ati_remote->acc_jiffies = jiffies;
        }
-       else if ((jiffies - ati_remote->acc_jiffies) < (HZ >> 3))  acc = accel[0];
-       else if ((jiffies - ati_remote->acc_jiffies) < (HZ >> 2))  acc = accel[1];
-       else if ((jiffies - ati_remote->acc_jiffies) < (HZ >> 1))  acc = accel[2];
-       else if ((jiffies - ati_remote->acc_jiffies) < HZ )        acc = accel[3];
-       else if ((jiffies - ati_remote->acc_jiffies) < HZ+(HZ>>1)) acc = accel[4];
-       else if ((jiffies - ati_remote->acc_jiffies) < (HZ << 1))  acc = accel[5];
+       else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 3)))  acc = accel[0];
+       else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 2)))  acc = accel[1];
+       else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 1)))  acc = accel[2];
+       else if (time_before(jiffies, ati_remote->acc_jiffies + HZ))         acc = accel[3];
+       else if (time_before(jiffies, ati_remote->acc_jiffies + HZ+(HZ>>1))) acc = accel[4];
+       else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ << 1)))  acc = accel[5];
        else acc = accel[6];
 
        input_regs(dev, regs);
diff --git a/drivers/usb/input/ati_remote2.c b/drivers/usb/input/ati_remote2.c
new file mode 100644 (file)
index 0000000..ab1a1ae
--- /dev/null
@@ -0,0 +1,477 @@
+/*
+ * ati_remote2 - ATI/Philips USB RF remote driver
+ *
+ * Copyright (C) 2005 Ville Syrjala <syrjala@sci.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ */
+
+#include <linux/usb_input.h>
+
+#define DRIVER_DESC    "ATI/Philips USB RF remote driver"
+#define DRIVER_VERSION "0.1"
+
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_VERSION(DRIVER_VERSION);
+MODULE_AUTHOR("Ville Syrjala <syrjala@sci.fi>");
+MODULE_LICENSE("GPL");
+
+static unsigned int mode_mask = 0x1F;
+module_param(mode_mask, uint, 0644);
+MODULE_PARM_DESC(mode_mask, "Bitmask of modes to accept <4:PC><3:AUX4><2:AUX3><1:AUX2><0:AUX1>");
+
+static struct usb_device_id ati_remote2_id_table[] = {
+       { USB_DEVICE(0x0471, 0x0602) }, /* ATI Remote Wonder II */
+       { }
+};
+MODULE_DEVICE_TABLE(usb, ati_remote2_id_table);
+
+static struct {
+       int hw_code;
+       int key_code;
+} ati_remote2_key_table[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0c, KEY_POWER },
+       { 0x0d, KEY_MUTE },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x20, KEY_CHANNELUP },
+       { 0x21, KEY_CHANNELDOWN },
+       { 0x28, KEY_FORWARD },
+       { 0x29, KEY_REWIND },
+       { 0x2c, KEY_PLAY },
+       { 0x30, KEY_PAUSE },
+       { 0x31, KEY_STOP },
+       { 0x37, KEY_RECORD },
+       { 0x38, KEY_DVD },
+       { 0x39, KEY_TV },
+       { 0x54, KEY_MENU },
+       { 0x58, KEY_UP },
+       { 0x59, KEY_DOWN },
+       { 0x5a, KEY_LEFT },
+       { 0x5b, KEY_RIGHT },
+       { 0x5c, KEY_OK },
+       { 0x78, KEY_A },
+       { 0x79, KEY_B },
+       { 0x7a, KEY_C },
+       { 0x7b, KEY_D },
+       { 0x7c, KEY_E },
+       { 0x7d, KEY_F },
+       { 0x82, KEY_ENTER },
+       { 0x8e, KEY_VENDOR },
+       { 0x96, KEY_COFFEE },
+       { 0xa9, BTN_LEFT },
+       { 0xaa, BTN_RIGHT },
+       { 0xbe, KEY_QUESTION },
+       { 0xd5, KEY_FRONT },
+       { 0xd0, KEY_EDIT },
+       { 0xf9, KEY_INFO },
+       { (0x00 << 8) | 0x3f, KEY_PROG1 },
+       { (0x01 << 8) | 0x3f, KEY_PROG2 },
+       { (0x02 << 8) | 0x3f, KEY_PROG3 },
+       { (0x03 << 8) | 0x3f, KEY_PROG4 },
+       { (0x04 << 8) | 0x3f, KEY_PC },
+       { 0, KEY_RESERVED }
+};
+
+struct ati_remote2 {
+       struct input_dev *idev;
+       struct usb_device *udev;
+
+       struct usb_interface *intf[2];
+       struct usb_endpoint_descriptor *ep[2];
+       struct urb *urb[2];
+       void *buf[2];
+       dma_addr_t buf_dma[2];
+
+       unsigned long jiffies;
+       int mode;
+
+       char name[64];
+       char phys[64];
+};
+
+static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id);
+static void ati_remote2_disconnect(struct usb_interface *interface);
+
+static struct usb_driver ati_remote2_driver = {
+       .name       = "ati_remote2",
+       .probe      = ati_remote2_probe,
+       .disconnect = ati_remote2_disconnect,
+       .id_table   = ati_remote2_id_table,
+};
+
+static int ati_remote2_open(struct input_dev *idev)
+{
+       struct ati_remote2 *ar2 = idev->private;
+       int r;
+
+       r = usb_submit_urb(ar2->urb[0], GFP_KERNEL);
+       if (r) {
+               dev_err(&ar2->intf[0]->dev,
+                       "%s: usb_submit_urb() = %d\n", __FUNCTION__, r);
+               return r;
+       }
+       r = usb_submit_urb(ar2->urb[1], GFP_KERNEL);
+       if (r) {
+               usb_kill_urb(ar2->urb[0]);
+               dev_err(&ar2->intf[1]->dev,
+                       "%s: usb_submit_urb() = %d\n", __FUNCTION__, r);
+               return r;
+       }
+
+       return 0;
+}
+
+static void ati_remote2_close(struct input_dev *idev)
+{
+       struct ati_remote2 *ar2 = idev->private;
+
+       usb_kill_urb(ar2->urb[0]);
+       usb_kill_urb(ar2->urb[1]);
+}
+
+static void ati_remote2_input_mouse(struct ati_remote2 *ar2, struct pt_regs *regs)
+{
+       struct input_dev *idev = ar2->idev;
+       u8 *data = ar2->buf[0];
+
+       if (data[0] > 4) {
+               dev_err(&ar2->intf[0]->dev,
+                       "Unknown mode byte (%02x %02x %02x %02x)\n",
+                       data[3], data[2], data[1], data[0]);
+               return;
+       }
+
+       if (!((1 << data[0]) & mode_mask))
+               return;
+
+       input_regs(idev, regs);
+       input_event(idev, EV_REL, REL_X, (s8) data[1]);
+       input_event(idev, EV_REL, REL_Y, (s8) data[2]);
+       input_sync(idev);
+}
+
+static int ati_remote2_lookup(unsigned int hw_code)
+{
+       int i;
+
+       for (i = 0; ati_remote2_key_table[i].key_code != KEY_RESERVED; i++)
+               if (ati_remote2_key_table[i].hw_code == hw_code)
+                       return i;
+
+       return -1;
+}
+
+static void ati_remote2_input_key(struct ati_remote2 *ar2, struct pt_regs *regs)
+{
+       struct input_dev *idev = ar2->idev;
+       u8 *data = ar2->buf[1];
+       int hw_code, index;
+
+       if (data[0] > 4) {
+               dev_err(&ar2->intf[1]->dev,
+                       "Unknown mode byte (%02x %02x %02x %02x)\n",
+                       data[3], data[2], data[1], data[0]);
+               return;
+       }
+
+       hw_code = data[2];
+       /*
+        * Mode keys (AUX1-AUX4, PC) all generate the same code byte.
+        * Use the mode byte to figure out which one was pressed.
+        */
+       if (hw_code == 0x3f) {
+               /*
+                * For some incomprehensible reason the mouse pad generates
+                * events which look identical to the events from the last
+                * pressed mode key. Naturally we don't want to generate key
+                * events for the mouse pad so we filter out any subsequent
+                * events from the same mode key.
+                */
+               if (ar2->mode == data[0])
+                       return;
+
+               if (data[1] == 0)
+                       ar2->mode = data[0];
+
+               hw_code |= data[0] << 8;
+       }
+
+       if (!((1 << data[0]) & mode_mask))
+               return;
+
+       index = ati_remote2_lookup(hw_code);
+       if (index < 0) {
+               dev_err(&ar2->intf[1]->dev,
+                       "Unknown code byte (%02x %02x %02x %02x)\n",
+                       data[3], data[2], data[1], data[0]);
+               return;
+       }
+
+       switch (data[1]) {
+       case 0: /* release */
+               break;
+       case 1: /* press */
+               ar2->jiffies = jiffies + msecs_to_jiffies(idev->rep[REP_DELAY]);
+               break;
+       case 2: /* repeat */
+
+               /* No repeat for mouse buttons. */
+               if (ati_remote2_key_table[index].key_code == BTN_LEFT ||
+                   ati_remote2_key_table[index].key_code == BTN_RIGHT)
+                       return;
+
+               if (!time_after_eq(jiffies, ar2->jiffies))
+                       return;
+
+               ar2->jiffies = jiffies + msecs_to_jiffies(idev->rep[REP_PERIOD]);
+               break;
+       default:
+               dev_err(&ar2->intf[1]->dev,
+                       "Unknown state byte (%02x %02x %02x %02x)\n",
+                       data[3], data[2], data[1], data[0]);
+               return;
+       }
+
+       input_regs(idev, regs);
+       input_event(idev, EV_KEY, ati_remote2_key_table[index].key_code, data[1]);
+       input_sync(idev);
+}
+
+static void ati_remote2_complete_mouse(struct urb *urb, struct pt_regs *regs)
+{
+       struct ati_remote2 *ar2 = urb->context;
+       int r;
+
+       switch (urb->status) {
+       case 0:
+               ati_remote2_input_mouse(ar2, regs);
+               break;
+       case -ENOENT:
+       case -EILSEQ:
+       case -ECONNRESET:
+       case -ESHUTDOWN:
+               dev_dbg(&ar2->intf[0]->dev,
+                       "%s(): urb status = %d\n", __FUNCTION__, urb->status);
+               return;
+       default:
+               dev_err(&ar2->intf[0]->dev,
+                       "%s(): urb status = %d\n", __FUNCTION__, urb->status);
+       }
+
+       r = usb_submit_urb(urb, GFP_ATOMIC);
+       if (r)
+               dev_err(&ar2->intf[0]->dev,
+                       "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r);
+}
+
+static void ati_remote2_complete_key(struct urb *urb, struct pt_regs *regs)
+{
+       struct ati_remote2 *ar2 = urb->context;
+       int r;
+
+       switch (urb->status) {
+       case 0:
+               ati_remote2_input_key(ar2, regs);
+               break;
+       case -ENOENT:
+       case -EILSEQ:
+       case -ECONNRESET:
+       case -ESHUTDOWN:
+               dev_dbg(&ar2->intf[1]->dev,
+                       "%s(): urb status = %d\n", __FUNCTION__, urb->status);
+               return;
+       default:
+               dev_err(&ar2->intf[1]->dev,
+                       "%s(): urb status = %d\n", __FUNCTION__, urb->status);
+       }
+
+       r = usb_submit_urb(urb, GFP_ATOMIC);
+       if (r)
+               dev_err(&ar2->intf[1]->dev,
+                       "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r);
+}
+
+static int ati_remote2_input_init(struct ati_remote2 *ar2)
+{
+       struct input_dev *idev;
+       int i;
+
+       idev = input_allocate_device();
+       if (!idev)
+               return -ENOMEM;
+
+       ar2->idev = idev;
+       idev->private = ar2;
+
+       idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_REL);
+       idev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT);
+       idev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
+       for (i = 0; ati_remote2_key_table[i].key_code != KEY_RESERVED; i++)
+               set_bit(ati_remote2_key_table[i].key_code, idev->keybit);
+
+       idev->rep[REP_DELAY]  = 250;
+       idev->rep[REP_PERIOD] = 33;
+
+       idev->open = ati_remote2_open;
+       idev->close = ati_remote2_close;
+
+       idev->name = ar2->name;
+       idev->phys = ar2->phys;
+
+       usb_to_input_id(ar2->udev, &idev->id);
+       idev->cdev.dev = &ar2->udev->dev;
+
+       i = input_register_device(idev);
+       if (i)
+               input_free_device(idev);
+
+       return i;
+}
+
+static int ati_remote2_urb_init(struct ati_remote2 *ar2)
+{
+       struct usb_device *udev = ar2->udev;
+       int i, pipe, maxp;
+
+       for (i = 0; i < 2; i++) {
+               ar2->buf[i] = usb_buffer_alloc(udev, 4, GFP_KERNEL, &ar2->buf_dma[i]);
+               if (!ar2->buf[i])
+                       return -ENOMEM;
+
+               ar2->urb[i] = usb_alloc_urb(0, GFP_KERNEL);
+               if (!ar2->urb[i])
+                       return -ENOMEM;
+
+               pipe = usb_rcvintpipe(udev, ar2->ep[i]->bEndpointAddress);
+               maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
+               maxp = maxp > 4 ? 4 : maxp;
+
+               usb_fill_int_urb(ar2->urb[i], udev, pipe, ar2->buf[i], maxp,
+                                i ? ati_remote2_complete_key : ati_remote2_complete_mouse,
+                                ar2, ar2->ep[i]->bInterval);
+               ar2->urb[i]->transfer_dma = ar2->buf_dma[i];
+               ar2->urb[i]->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+       }
+
+       return 0;
+}
+
+static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2)
+{
+       int i;
+
+       for (i = 0; i < 2; i++) {
+               if (ar2->urb[i])
+                       usb_free_urb(ar2->urb[i]);
+
+               if (ar2->buf[i])
+                       usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]);
+       }
+}
+
+static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id)
+{
+       struct usb_device *udev = interface_to_usbdev(interface);
+       struct usb_host_interface *alt = interface->cur_altsetting;
+       struct ati_remote2 *ar2;
+       int r;
+
+       if (alt->desc.bInterfaceNumber)
+               return -ENODEV;
+
+       ar2 = kzalloc(sizeof (struct ati_remote2), GFP_KERNEL);
+       if (!ar2)
+               return -ENOMEM;
+
+       ar2->udev = udev;
+
+       ar2->intf[0] = interface;
+       ar2->ep[0] = &alt->endpoint[0].desc;
+
+       ar2->intf[1] = usb_ifnum_to_if(udev, 1);
+       r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2);
+       if (r)
+               goto fail1;
+       alt = ar2->intf[1]->cur_altsetting;
+       ar2->ep[1] = &alt->endpoint[0].desc;
+
+       r = ati_remote2_urb_init(ar2);
+       if (r)
+               goto fail2;
+
+       usb_make_path(udev, ar2->phys, sizeof(ar2->phys));
+       strlcat(ar2->phys, "/input0", sizeof(ar2->phys));
+
+       strlcat(ar2->name, "ATI Remote Wonder II", sizeof(ar2->name));
+
+       r = ati_remote2_input_init(ar2);
+       if (r)
+               goto fail2;
+
+       usb_set_intfdata(interface, ar2);
+
+       return 0;
+
+ fail2:
+       ati_remote2_urb_cleanup(ar2);
+
+       usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]);
+ fail1:
+       kfree(ar2);
+
+       return r;
+}
+
+static void ati_remote2_disconnect(struct usb_interface *interface)
+{
+       struct ati_remote2 *ar2;
+       struct usb_host_interface *alt = interface->cur_altsetting;
+
+       if (alt->desc.bInterfaceNumber)
+               return;
+
+       ar2 = usb_get_intfdata(interface);
+       usb_set_intfdata(interface, NULL);
+
+       input_unregister_device(ar2->idev);
+
+       ati_remote2_urb_cleanup(ar2);
+
+       usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]);
+
+       kfree(ar2);
+}
+
+static int __init ati_remote2_init(void)
+{
+       int r;
+
+       r = usb_register(&ati_remote2_driver);
+       if (r)
+               printk(KERN_ERR "ati_remote2: usb_register() = %d\n", r);
+       else
+               printk(KERN_INFO "ati_remote2: " DRIVER_DESC " " DRIVER_VERSION "\n");
+
+       return r;
+}
+
+static void __exit ati_remote2_exit(void)
+{
+       usb_deregister(&ati_remote2_driver);
+}
+
+module_init(ati_remote2_init);
+module_exit(ati_remote2_exit);
index 26ca5b890a610e5e7c396df218098638060fb983..b44d398de0714fb62533a0ac00df9ecbbbeb85eb 100644 (file)
@@ -38,7 +38,7 @@ typedef s16 fixp_t;
 #define FRAC_MASK ((1<<FRAC_N)-1)
 
 // Not to be used directly. Use fixp_{cos,sin}
-static fixp_t cos_table[45] = {
+static const fixp_t cos_table[45] = {
        0x0100, 0x00FF, 0x00FF, 0x00FE, 0x00FD, 0x00FC, 0x00FA, 0x00F8,
        0x00F6, 0x00F3, 0x00F0, 0x00ED, 0x00E9, 0x00E6, 0x00E2, 0x00DD,
        0x00D9, 0x00D4, 0x00CF, 0x00C9, 0x00C4, 0x00BE, 0x00B8, 0x00B1,
index 45f3130fadea9f9646a3212bda45bfb4ee2b3775..5f52979af1c736905ba0ed08f52dab03135a5d76 100644 (file)
@@ -893,8 +893,10 @@ static int hid_input_report(int type, struct urb *urb, int interrupt, struct pt_
 
        size = ((report->size - 1) >> 3) + 1;
 
-       if (len < size)
+       if (len < size) {
                dbg("report %d is too short, (%d < %d)", report->id, len, size);
+               memset(data + len, 0, size - len);
+       }
 
        if (hid->claimed & HID_CLAIMED_HIDDEV)
                hiddev_report_event(hid, report);
@@ -1452,7 +1454,7 @@ void hid_init_reports(struct hid_device *hid)
  * Alphabetically sorted blacklist by quirk type.
  */
 
-static struct hid_blacklist {
+static const struct hid_blacklist {
        __u16 idVendor;
        __u16 idProduct;
        unsigned quirks;
@@ -1928,7 +1930,6 @@ static struct usb_device_id hid_usb_ids [] = {
 MODULE_DEVICE_TABLE (usb, hid_usb_ids);
 
 static struct usb_driver hid_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbhid",
        .probe =        hid_probe,
        .disconnect =   hid_disconnect,
index 9ff25eb520a6dc1d4e4af840ecc43ce99a7a0761..192a03b2897145ba00155ebe8d5e74f887ae2cdd 100644 (file)
@@ -39,7 +39,7 @@
 
 #define unk    KEY_UNKNOWN
 
-static unsigned char hid_keyboard[256] = {
+static const unsigned char hid_keyboard[256] = {
          0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
         50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
          4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,
@@ -58,7 +58,7 @@ static unsigned char hid_keyboard[256] = {
        150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
 };
 
-static struct {
+static const struct {
        __s32 x;
        __s32 y;
 }  hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}};
@@ -137,6 +137,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                        switch (usage->hid & 0xffff) {
                                case 0xba: map_abs(ABS_RUDDER); break;
                                case 0xbb: map_abs(ABS_THROTTLE); break;
+                               default:   goto ignore;
                        }
                        break;
 
index 440377c7a0da733db0932bf15230b73e9f733ef0..4dff8473553dd9fc8eba3ebe33378741c8bc7898 100644 (file)
@@ -826,7 +826,6 @@ static int hiddev_usbd_probe(struct usb_interface *intf,
 
 
 static /* const */ struct usb_driver hiddev_driver = {
-       .owner =        THIS_MODULE,
        .name =         "hiddev",
        .probe =        hiddev_usbd_probe,
 };
index 4a50acb39d29acd9ebcdb470f482e402027719ac..7618ae5c104f7d7c999b4d37a51498e2358f80fc 100644 (file)
@@ -250,7 +250,6 @@ static void itmtouch_disconnect(struct usb_interface *intf)
 MODULE_DEVICE_TABLE(usb, itmtouch_ids);
 
 static struct usb_driver itmtouch_driver = {
-       .owner =        THIS_MODULE,
        .name =         "itmtouch",
        .probe =        itmtouch_probe,
        .disconnect =   itmtouch_disconnect,
index a248664b5d1d011549ad140d573cccb9ddad96a4..f6d5cead542bd734de71e58a1f0a0f5914697135 100644 (file)
@@ -159,7 +159,7 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
        input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
        input_dev->mscbit[0] |= BIT(MSC_SERIAL);
        input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0);
-       input_set_abs_params(input_dev, ABS_X, 0, 0x1750, 4, 0);
+       input_set_abs_params(input_dev, ABS_Y, 0, 0x1750, 4, 0);
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0);
 
        endpoint = &intf->cur_altsetting->endpoint[0].desc;
@@ -197,7 +197,6 @@ static void kbtab_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver kbtab_driver = {
-       .owner =        THIS_MODULE,
        .name =         "kbtab",
        .probe =        kbtab_probe,
        .disconnect =   kbtab_disconnect,
index a32cfe51b77de11236b98199ba00461784f479d6..b4a051b549d1543d36c6883f83aa21e7ef2cc991 100644 (file)
@@ -95,7 +95,7 @@ struct usb_keyspan {
  * Currently there are 15 and 17 button models so RESERVED codes
  * are blank areas in the mapping.
  */
-static int keyspan_key_table[] = {
+static const int keyspan_key_table[] = {
        KEY_RESERVED,           /* 0 is just a place holder. */
        KEY_RESERVED,
        KEY_STOP,
@@ -559,7 +559,6 @@ static void keyspan_disconnect(struct usb_interface *interface)
  */
 static struct usb_driver keyspan_driver =
 {
-       .owner =        THIS_MODULE,
        .name =         "keyspan_remote",
        .probe =        keyspan_probe,
        .disconnect =   keyspan_disconnect,
index 52cc18cd247d63e25f773c028813391410848a11..f018953a5485238e088ad1b9483177b077d3ae2b 100644 (file)
@@ -310,7 +310,6 @@ static void mtouchusb_disconnect(struct usb_interface *intf)
 MODULE_DEVICE_TABLE(usb, mtouchusb_devices);
 
 static struct usb_driver mtouchusb_driver = {
-       .owner          = THIS_MODULE,
        .name           = "mtouchusb",
        .probe          = mtouchusb_probe,
        .disconnect     = mtouchusb_disconnect,
index b7476233ef5d46bc8a3b1d5ca73192e66a267e61..fdf0f788062c3fadd64d520db8854cac1e6c0084 100644 (file)
@@ -441,7 +441,6 @@ static struct usb_device_id powermate_devices [] = {
 MODULE_DEVICE_TABLE (usb, powermate_devices);
 
 static struct usb_driver powermate_driver = {
-       .owner =        THIS_MODULE,
         .name =         "powermate",
         .probe =        powermate_probe,
         .disconnect =   powermate_disconnect,
index 7420c6b84284d34cfbad641216ce056d49f852aa..3b3c7b4120a26c51fb8e8af875f75aa02a201242 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
  * touchkitusb.c  --  Driver for eGalax TouchKit USB Touchscreens
  *
- * Copyright (C) 2004 by Daniel Ritz
+ * Copyright (C) 2004-2005 by Daniel Ritz <daniel.ritz@gmx.ch>
  * Copyright (C) by Todd E. Johnson (mtouchusb.c)
  *
  * This program is free software; you can redistribute it and/or
 #define TOUCHKIT_MAX_YC                        0x07ff
 #define TOUCHKIT_YC_FUZZ               0x0
 #define TOUCHKIT_YC_FLAT               0x0
-#define TOUCHKIT_REPORT_DATA_SIZE      8
+#define TOUCHKIT_REPORT_DATA_SIZE      16
 
 #define TOUCHKIT_DOWN                  0x01
-#define TOUCHKIT_POINT_TOUCH           0x81
-#define TOUCHKIT_POINT_NOTOUCH         0x80
 
-#define TOUCHKIT_GET_TOUCHED(dat)      ((((dat)[0]) & TOUCHKIT_DOWN) ? 1 : 0)
-#define TOUCHKIT_GET_X(dat)            (((dat)[3] << 7) | (dat)[4])
-#define TOUCHKIT_GET_Y(dat)            (((dat)[1] << 7) | (dat)[2])
+#define TOUCHKIT_PKT_TYPE_MASK         0xFE
+#define TOUCHKIT_PKT_TYPE_REPT         0x80
+#define TOUCHKIT_PKT_TYPE_DIAG         0x0A
 
 #define DRIVER_VERSION                 "v0.1"
 #define DRIVER_AUTHOR                  "Daniel Ritz <daniel.ritz@gmx.ch>"
@@ -62,6 +60,8 @@ MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
 struct touchkit_usb {
        unsigned char *data;
        dma_addr_t data_dma;
+       char buffer[TOUCHKIT_REPORT_DATA_SIZE];
+       int buf_len;
        struct urb *irq;
        struct usb_device *udev;
        struct input_dev *input;
@@ -77,11 +77,128 @@ static struct usb_device_id touchkit_devices[] = {
        {}
 };
 
+/* helpers to read the data */
+static inline int touchkit_get_touched(char *data)
+{
+       return (data[0] & TOUCHKIT_DOWN) ? 1 : 0;
+}
+
+static inline int touchkit_get_x(char *data)
+{
+       return ((data[3] & 0x0F) << 7) | (data[4] & 0x7F);
+}
+
+static inline int touchkit_get_y(char *data)
+{
+       return ((data[1] & 0x0F) << 7) | (data[2] & 0x7F);
+}
+
+
+/* processes one input packet. */
+static void touchkit_process_pkt(struct touchkit_usb *touchkit,
+                                 struct pt_regs *regs, char *pkt)
+{
+       int x, y;
+
+       /* only process report packets */
+       if ((pkt[0] & TOUCHKIT_PKT_TYPE_MASK) != TOUCHKIT_PKT_TYPE_REPT)
+               return;
+
+       if (swap_xy) {
+               y = touchkit_get_x(pkt);
+               x = touchkit_get_y(pkt);
+       } else {
+               x = touchkit_get_x(pkt);
+               y = touchkit_get_y(pkt);
+       }
+
+       input_regs(touchkit->input, regs);
+       input_report_key(touchkit->input, BTN_TOUCH, touchkit_get_touched(pkt));
+       input_report_abs(touchkit->input, ABS_X, x);
+       input_report_abs(touchkit->input, ABS_Y, y);
+       input_sync(touchkit->input);
+}
+
+
+static int touchkit_get_pkt_len(char *buf)
+{
+       switch (buf[0] & TOUCHKIT_PKT_TYPE_MASK) {
+       case TOUCHKIT_PKT_TYPE_REPT:
+               return 5;
+
+       case TOUCHKIT_PKT_TYPE_DIAG:
+               return buf[1] + 2;
+       }
+
+       return 0;
+}
+
+static void touchkit_process(struct touchkit_usb *touchkit, int len,
+                             struct pt_regs *regs)
+{
+       char *buffer;
+       int pkt_len, buf_len, pos;
+
+       /* if the buffer contains data, append */
+       if (unlikely(touchkit->buf_len)) {
+               int tmp;
+
+               /* if only 1 byte in buffer, add another one to get length */
+               if (touchkit->buf_len == 1)
+                       touchkit->buffer[1] = touchkit->data[0];
+
+               pkt_len = touchkit_get_pkt_len(touchkit->buffer);
+
+               /* unknown packet: drop everything */
+               if (!pkt_len)
+                       return;
+
+               /* append, process */
+               tmp = pkt_len - touchkit->buf_len;
+               memcpy(touchkit->buffer + touchkit->buf_len, touchkit->data, tmp);
+               touchkit_process_pkt(touchkit, regs, touchkit->buffer);
+
+               buffer = touchkit->data + tmp;
+               buf_len = len - tmp;
+       } else {
+               buffer = touchkit->data;
+               buf_len = len;
+       }
+
+       /* only one byte left in buffer */
+       if (unlikely(buf_len == 1)) {
+               touchkit->buffer[0] = buffer[0];
+               touchkit->buf_len = 1;
+               return;
+       }
+
+       /* loop over the buffer */
+       pos = 0;
+       while (pos < buf_len) {
+               /* get packet len */
+               pkt_len = touchkit_get_pkt_len(buffer + pos);
+
+               /* unknown packet: drop everything */
+               if (unlikely(!pkt_len))
+                       return;
+
+               /* full packet: process */
+               if (likely(pkt_len <= buf_len)) {
+                       touchkit_process_pkt(touchkit, regs, buffer + pos);
+               } else {
+                       /* incomplete packet: save in buffer */
+                       memcpy(touchkit->buffer, buffer + pos, buf_len - pos);
+                       touchkit->buf_len = buf_len - pos;
+               }
+               pos += pkt_len;
+       }
+}
+
+
 static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct touchkit_usb *touchkit = urb->context;
        int retval;
-       int x, y;
 
        switch (urb->status) {
        case 0:
@@ -105,20 +222,7 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
                goto exit;
        }
 
-       if (swap_xy) {
-               y = TOUCHKIT_GET_X(touchkit->data);
-               x = TOUCHKIT_GET_Y(touchkit->data);
-       } else {
-               x = TOUCHKIT_GET_X(touchkit->data);
-               y = TOUCHKIT_GET_Y(touchkit->data);
-       }
-
-       input_regs(touchkit->input, regs);
-       input_report_key(touchkit->input, BTN_TOUCH,
-                        TOUCHKIT_GET_TOUCHED(touchkit->data));
-       input_report_abs(touchkit->input, ABS_X, x);
-       input_report_abs(touchkit->input, ABS_Y, y);
-       input_sync(touchkit->input);
+       touchkit_process(touchkit, urb->actual_length, regs);
 
 exit:
        retval = usb_submit_urb(urb, GFP_ATOMIC);
@@ -267,7 +371,6 @@ static void touchkit_disconnect(struct usb_interface *intf)
 MODULE_DEVICE_TABLE(usb, touchkit_devices);
 
 static struct usb_driver touchkit_driver = {
-       .owner          = THIS_MODULE,
        .name           = "touchkitusb",
        .probe          = touchkit_probe,
        .disconnect     = touchkit_disconnect,
index 226b6f90a9072b2d95ea8315a821822c73363939..2f3edc26cb5057f2da7eba68e06b1482eb246b30 100644 (file)
@@ -345,7 +345,6 @@ static struct usb_device_id usb_kbd_id_table [] = {
 MODULE_DEVICE_TABLE (usb, usb_kbd_id_table);
 
 static struct usb_driver usb_kbd_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbkbd",
        .probe =        usb_kbd_probe,
        .disconnect =   usb_kbd_disconnect,
index 230f6b1b314a0019a153b526b973409513fab999..af526135d210752c09e346566c909fe046322c67 100644 (file)
@@ -226,7 +226,6 @@ static struct usb_device_id usb_mouse_id_table [] = {
 MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);
 
 static struct usb_driver usb_mouse_driver = {
-       .owner          = THIS_MODULE,
        .name           = "usbmouse",
        .probe          = usb_mouse_probe,
        .disconnect     = usb_mouse_disconnect,
index aea1cfae34ccce71c1f3345e80eb18c5f759a9da..48df4cfd5a42274b7a756f37ce6869c646a590e3 100644 (file)
@@ -854,7 +854,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
 
        input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS);
        input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS);
-       input_set_abs_params(input_dev, ABS_X, 0, wacom->features->y_max, 4, 0);
+       input_set_abs_params(input_dev, ABS_X, 0, wacom->features->x_max, 4, 0);
        input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0);
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0);
 
@@ -945,7 +945,6 @@ static void wacom_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver wacom_driver = {
-       .owner =        THIS_MODULE,
        .name =         "wacom",
        .probe =        wacom_probe,
        .disconnect =   wacom_disconnect,
index 43112f040b6de336bf9b2e3428aa3b49e44c115f..e278489a80c6520941fe30723ea50c305717bd72 100644 (file)
@@ -70,7 +70,7 @@
 
 #define XPAD_PKT_LEN 32
 
-static struct xpad_device {
+static const struct xpad_device {
        u16 idVendor;
        u16 idProduct;
        char *name;
@@ -81,13 +81,13 @@ static struct xpad_device {
        { 0x0000, 0x0000, "X-Box pad" }
 };
 
-static signed short xpad_btn[] = {
+static const signed short xpad_btn[] = {
        BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z,       /* "analog" buttons */
        BTN_START, BTN_BACK, BTN_THUMBL, BTN_THUMBR,    /* start/back/sticks */
        -1                                              /* terminating entry */
 };
 
-static signed short xpad_abs[] = {
+static const signed short xpad_abs[] = {
        ABS_X, ABS_Y,           /* left stick */
        ABS_RX, ABS_RY,         /* right stick */
        ABS_Z, ABS_RZ,          /* triggers left/right */
@@ -316,7 +316,6 @@ static void xpad_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver xpad_driver = {
-       .owner          = THIS_MODULE,
        .name           = "xpad",
        .probe          = xpad_probe,
        .disconnect     = xpad_disconnect,
index f526aebea5022526471d374313f182450e7f863b..1bfc105ad4d6811adda2d403870b591bb33c8a6b 100644 (file)
@@ -987,7 +987,6 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 }
 
 static struct usb_driver yealink_driver = {
-       .owner          = THIS_MODULE,
        .name           = "yealink",
        .probe          = usb_probe,
        .disconnect     = usb_disconnect,
index 27b23c55bbc70232023bd6f835ce5a8d736c6c8d..18d8eaf408d502224a00b37599b6dba5e335a58d 100644 (file)
@@ -812,7 +812,6 @@ static struct usb_device_id dabusb_ids [] = {
 MODULE_DEVICE_TABLE (usb, dabusb_ids);
 
 static struct usb_driver dabusb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "dabusb",
        .probe =        dabusb_probe,
        .disconnect =   dabusb_disconnect,
index 7503f5b96f59c2134d63feebf829ce4a752518f0..6a5700e9d4280eb7575426be882920953f1705dd 100644 (file)
@@ -150,7 +150,6 @@ MODULE_DEVICE_TABLE (usb, usb_dsbr100_device_table);
 
 /* USB subsystem interface */
 static struct usb_driver usb_dsbr100_driver = {
-       .owner =        THIS_MODULE,
        .name =         "dsbr100",
        .probe =        usb_dsbr100_probe,
        .disconnect =   usb_dsbr100_disconnect,
index ba41fc7b95c2168c7314b0d04f4d4f4177e9b9e5..a42c222941245b16088a8e45341e3e4cad7104be 100644 (file)
@@ -3457,7 +3457,7 @@ static void ibmcam_model3_setup_after_video_if(struct uvd *uvd)
        if(init_model3_input) {
                if (debug > 0)
                        info("Setting input to RCA.");
-               for (i=0; i < (sizeof(initData)/sizeof(initData[0])); i++) {
+               for (i=0; i < ARRAY_SIZE(initData); i++) {
                        ibmcam_veio(uvd, initData[i].req, initData[i].value, initData[i].index);
                }
        }
index 9fe2c2710d13d52ffe09e3ea2fafa7949e271772..e2ede583518f5acb41f23a540c3816f8639914cc 100644 (file)
@@ -77,14 +77,14 @@ static int saturation =     MAX_SATURATION/2;
 static int sharpness = MAX_SHARPNESS/2;
 static int whitebal =  3*(MAX_WHITEBAL/4);
 
-static int spd_to_iface[] = { 1, 0, 3, 2, 4, 5, 6 };
+static const int spd_to_iface[] = { 1, 0, 3, 2, 4, 5, 6 };
 
 /* These FPS speeds are from the windows config box. They are
  * indexed on size (0-2) and speed (0-6). Divide by 3 to get the
  * real fps.
  */
 
-static int spd_to_fps[][7] = { { 24, 40, 48, 60, 72, 80, 100 },
+static const int spd_to_fps[][7] = { { 24, 40, 48, 60, 72, 80, 100 },
                               { 24, 40, 48, 60, 72, 80, 100 },
                               { 18, 30, 36, 45, 54, 60, 75  },
                               { 6,  10, 12, 15, 18, 21, 25  } };
@@ -95,7 +95,7 @@ struct cam_size {
        u8      cmd;
 };
 
-static struct cam_size camera_sizes[] = { { 160, 120, 0x7 },
+static const struct cam_size camera_sizes[] = { { 160, 120, 0x7 },
                                          { 160, 136, 0xa },
                                          { 176, 144, 0x4 },
                                          { 320, 240, 0x5 } };
index 036c485d1d1eeb6ef582930f9f9356cc858f943e..3a0e8ce67ebedc10c22b38a224db5b3fcad63fc1 100644 (file)
@@ -211,7 +211,7 @@ static struct ov51x_decomp_ops *ov518_mmx_decomp_ops;
 
 /* Number of times to retry a failed I2C transaction. Increase this if you
  * are getting "Failed to read sensor ID..." */
-static int i2c_detect_tries = 5;
+static const int i2c_detect_tries = 5;
 
 /* MMX support is present in kernel and CPU. Checked upon decomp module load. */
 #if defined(__i386__) || defined(__x86_64__)
@@ -6008,7 +6008,6 @@ ov51x_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver ov511_driver = {
-       .owner =        THIS_MODULE,
        .name =         "ov511",
        .id_table =     device_table,
        .probe =        ov51x_probe,
index 53099190952ce022338b7fad0df8c82c941bcbcd..359c4b2df735917ff685920f160a1fa7ee1c7476 100644 (file)
 #define PT_RESET_CONTROL_FORMATTER             0x02
 #define PT_STATUS_FORMATTER                    0x03
 
-static char *size2name[PSZ_MAX] =
+static const char *size2name[PSZ_MAX] =
 {
        "subQCIF",
        "QSIF",
index 5524fd70210b3dc984b1160dd7a9a19249280404..09ca6128ac209a213ca76e2c656d1daca2d662ac 100644 (file)
@@ -111,7 +111,6 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
 static void usb_pwc_disconnect(struct usb_interface *intf);
 
 static struct usb_driver pwc_driver = {
-       .owner =                THIS_MODULE,
        .name =                 "Philips webcam",       /* name */
        .id_table =             pwc_device_table,
        .probe =                usb_pwc_probe,          /* probe() */
index f69e443cd1bcda63b6c4e4eb6396676f85a3124e..b2ae29af59404f89434b7e5d7f1f2d7cd229d7cc 100644 (file)
@@ -1401,7 +1401,6 @@ static void se401_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver se401_driver = {
-       .owner          = THIS_MODULE,
         .name          = "se401",
         .id_table      = device_table,
        .probe          = se401_probe,
index cf8cfbabefde8da01e8be66e0fe10434c224f1a7..8d1a1c357d5a6d7c01b39fc7b53036a5780f218a 100644 (file)
@@ -199,7 +199,7 @@ static void sn9c102_release_buffers(struct sn9c102_device* cam)
 {
        if (cam->nbuffers) {
                rvfree(cam->frame[0].bufmem,
-                      cam->nbuffers * cam->frame[0].buf.length);
+                      cam->nbuffers * PAGE_ALIGN(cam->frame[0].buf.length));
                cam->nbuffers = 0;
        }
 }
@@ -1316,7 +1316,7 @@ static int sn9c102_init(struct sn9c102_device* cam)
        struct v4l2_control ctrl;
        struct v4l2_queryctrl *qctrl;
        struct v4l2_rect* rect;
-       u8 i = 0, n = 0;
+       u8 i = 0;
        int err = 0;
 
        if (!(cam->state & DEV_INITIALIZED)) {
@@ -1352,7 +1352,7 @@ static int sn9c102_init(struct sn9c102_device* cam)
                return err;
 
        if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
-               DBG(3, "Compressed video format is active, quality %d", 
+               DBG(3, "Compressed video format is active, quality %d",
                    cam->compression.quality)
        else
                DBG(3, "Uncompressed video format is active")
@@ -1364,9 +1364,8 @@ static int sn9c102_init(struct sn9c102_device* cam)
                }
 
        if (s->set_ctrl) {
-               n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
-               for (i = 0; i < n; i++)
-                       if (s->qctrl[i].id != 0 && 
+               for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
+                       if (s->qctrl[i].id != 0 &&
                            !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) {
                                ctrl.id = s->qctrl[i].id;
                                ctrl.value = qctrl[i].default_value;
@@ -1388,7 +1387,7 @@ static int sn9c102_init(struct sn9c102_device* cam)
                init_waitqueue_head(&cam->wait_stream);
                cam->nreadbuffers = 2;
                memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl));
-               memcpy(&(s->_rect), &(s->cropcap.defrect), 
+               memcpy(&(s->_rect), &(s->cropcap.defrect),
                       sizeof(struct v4l2_rect));
                cam->state |= DEV_INITIALIZED;
        }
@@ -1810,13 +1809,12 @@ static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
        {
                struct sn9c102_sensor* s = cam->sensor;
                struct v4l2_queryctrl qc;
-               u8 i, n;
+               u8 i;
 
                if (copy_from_user(&qc, arg, sizeof(qc)))
                        return -EFAULT;
 
-               n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
-               for (i = 0; i < n; i++)
+               for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
                        if (qc.id && qc.id == s->qctrl[i].id) {
                                memcpy(&qc, &(s->qctrl[i]), sizeof(qc));
                                if (copy_to_user(arg, &qc, sizeof(qc)))
@@ -1852,7 +1850,7 @@ static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
        {
                struct sn9c102_sensor* s = cam->sensor;
                struct v4l2_control ctrl;
-               u8 i, n;
+               u8 i;
                int err = 0;
 
                if (!s->set_ctrl)
@@ -1861,8 +1859,7 @@ static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
                if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
                        return -EFAULT;
 
-               n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
-               for (i = 0; i < n; i++)
+               for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
                        if (ctrl.id == s->qctrl[i].id) {
                                if (ctrl.value < s->qctrl[i].minimum ||
                                    ctrl.value > s->qctrl[i].maximum)
@@ -2544,7 +2541,7 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
        unsigned int i, n;
        int err = 0, r;
 
-       n = sizeof(sn9c102_id_table)/sizeof(sn9c102_id_table[0]);
+       n = ARRAY_SIZE(sn9c102_id_table);
        for (i = 0; i < n-1; i++)
                if (le16_to_cpu(udev->descriptor.idVendor) == 
                    sn9c102_id_table[i].idVendor &&
@@ -2711,7 +2708,6 @@ static void sn9c102_usb_disconnect(struct usb_interface* intf)
 
 
 static struct usb_driver sn9c102_usb_driver = {
-       .owner =      THIS_MODULE,
        .name =       "sn9c102",
        .id_table =   sn9c102_id_table,
        .probe =      sn9c102_usb_probe,
index 0fd0fa9fec21f172d703f16fed7e34b246ed35a8..774038b352cd1e7644eb42c97fc0cbe9e877fc89 100644 (file)
@@ -1477,7 +1477,6 @@ static void stv680_disconnect (struct usb_interface *intf)
 }
 
 static struct usb_driver stv680_driver = {
-       .owner =        THIS_MODULE,
        .name =         "stv680",
        .probe =        stv680_probe,
        .disconnect =   stv680_disconnect,
index 4459406126036675c89ec2405d5feb64e5af59ad..b0551cdb280b236542735ce94e4a2fa85696501c 100644 (file)
@@ -151,7 +151,7 @@ struct usb_stv {
 };
 
 
-static unsigned char red[256] = { 
+static const unsigned char red[256] = {
        0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 
        18, 18, 18, 18, 18, 18, 18, 25, 30, 35, 38, 42, 
        44, 47, 50, 53, 54, 57, 59, 61, 63, 65, 67, 69, 
@@ -176,7 +176,7 @@ static unsigned char red[256] = {
        220, 220, 221, 221 
 }; 
 
-static unsigned char green[256] = {
+static const unsigned char green[256] = {
        0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 
        21, 21, 21, 21, 21, 21, 21, 28, 34, 39, 43, 47, 
        50, 53, 56, 59, 61, 64, 66, 68, 71, 73, 75, 77, 
@@ -201,7 +201,7 @@ static unsigned char green[256] = {
        245, 245, 246, 246 
 }; 
 
-static unsigned char blue[256] = {
+static const unsigned char blue[256] = {
        0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
        23, 23, 23, 23, 23, 23, 23, 30, 37, 42, 47, 51, 
        55, 58, 61, 64, 67, 70, 72, 74, 78, 80, 82, 84, 
index 24efb21969c6ce34d15490bb70c576b5879ce7a2..4bd113325ef9b1441d7b244a7cb2ea8b106a69e1 100644 (file)
@@ -725,7 +725,7 @@ int usbvideo_register(
                /* Allocate user_data separately because of kmalloc's limits */
                if (num_extra > 0) {
                        up->user_size = num_cams * num_extra;
-                       up->user_data = (char *) kmalloc(up->user_size, GFP_KERNEL);
+                       up->user_data = kmalloc(up->user_size, GFP_KERNEL);
                        if (up->user_data == NULL) {
                                err("%s: Failed to allocate user_data (%d. bytes)",
                                    __FUNCTION__, up->user_size);
@@ -955,7 +955,7 @@ static struct file_operations usbvideo_fops = {
        .ioctl =  usbvideo_v4l_ioctl,
        .llseek = no_llseek,
 };
-static struct video_device usbvideo_template = {
+static const struct video_device usbvideo_template = {
        .owner =      THIS_MODULE,
        .type =       VID_TYPE_CAPTURE,
        .hardware =   VID_HARDWARE_CPIA,
index 0bc0b1247a6bc69f4a6ce2fdf5c86a04b0509014..1c73155c8d772cda08a5ca0934021161488563bd 100644 (file)
@@ -1257,7 +1257,6 @@ static struct usb_device_id vicam_table[] = {
 MODULE_DEVICE_TABLE(usb, vicam_table);
 
 static struct usb_driver vicam_driver = {
-       .owner          = THIS_MODULE,
        .name           = "vicam",
        .probe          = vicam_probe,
        .disconnect     = vicam_disconnect,
index 67612c81cb9fda53cc2313d3cde8a7b8cb410246..04d69339c05442fe16d3af4d810271a3def209a7 100644 (file)
@@ -2958,7 +2958,7 @@ static int w9968cf_v4l_ioctl(struct inode* inode, struct file* filp,
        };
 
        #define V4L1_IOCTL(cmd) \
-               ((_IOC_NR((cmd)) < sizeof(v4l1_ioctls)/sizeof(char*)) ? \
+               ((_IOC_NR((cmd)) < ARRAY_SIZE(v4l1_ioctls)) ? \
                v4l1_ioctls[_IOC_NR((cmd))] : "?")
 
        cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
@@ -3554,7 +3554,7 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
 
 
        /* Allocate 2 bytes of memory for camera control USB transfers */
-       if (!(cam->control_buffer = (u16*)kmalloc(2, GFP_KERNEL))) {
+       if (!(cam->control_buffer = kmalloc(2, GFP_KERNEL))) {
                DBG(1,"Couldn't allocate memory for camera control transfers")
                err = -ENOMEM;
                goto fail;
@@ -3562,7 +3562,7 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
        memset(cam->control_buffer, 0, 2);
 
        /* Allocate 8 bytes of memory for USB data transfers to the FSB */
-       if (!(cam->data_buffer = (u16*)kmalloc(8, GFP_KERNEL))) {
+       if (!(cam->data_buffer = kmalloc(8, GFP_KERNEL))) {
                DBG(1, "Couldn't allocate memory for data "
                       "transfers to the FSB")
                err = -ENOMEM;
@@ -3668,7 +3668,6 @@ static void w9968cf_usb_disconnect(struct usb_interface* intf)
 
 
 static struct usb_driver w9968cf_usb_driver = {
-       .owner =      THIS_MODULE,
        .name =       "w9968cf",
        .id_table =   winbond_id_table,
        .probe =      w9968cf_usb_probe,
index 2a28ceeaa66a2e848e3596c41cfe8a65b0f4be5f..449b2501acf365ac0b105c0bfd4d15b0fa4bf8d5 100644 (file)
@@ -767,7 +767,7 @@ static int auerbuf_setup (pauerbufctl_t bcp, unsigned int numElements, unsigned
                memset (bep, 0, sizeof (auerbuf_t));
                 bep->list = bcp;
                 INIT_LIST_HEAD (&bep->buff_list);
-                bep->bufp = (char *) kmalloc (bufsize, GFP_KERNEL);
+                bep->bufp = kmalloc (bufsize, GFP_KERNEL);
                 if (!bep->bufp)
                        goto bl_fail;
                 bep->dr = (struct usb_ctrlrequest *) kmalloc (sizeof (struct usb_ctrlrequest), GFP_KERNEL);
@@ -1123,7 +1123,7 @@ static int auerswald_int_open (pauerswald_t cp)
                 }
         }
         if (!cp->intbufp) {
-                cp->intbufp = (char *) kmalloc (irqsize, GFP_KERNEL);
+                cp->intbufp = kmalloc (irqsize, GFP_KERNEL);
                 if (!cp->intbufp) {
                         ret = -ENOMEM;
                         goto intoend;
@@ -1696,7 +1696,7 @@ static ssize_t auerchar_write (struct file *file, const char __user *buf, size_t
        int ret;
        wait_queue_t wait;
 
-        dbg ("auerchar_write %d bytes", len);
+        dbg ("auerchar_write %zd bytes", len);
 
        /* Error checking */
        if (!ccp)
@@ -2103,7 +2103,6 @@ MODULE_DEVICE_TABLE (usb, auerswald_ids);
 
 /* Standard usb driver struct */
 static struct usb_driver auerswald_driver = {
-       .owner =        THIS_MODULE,
        .name =         "auerswald",
        .probe =        auerswald_probe,
        .disconnect =   auerswald_disconnect,
index b33044d56a1eaba415fbe8fc6a21537b14119229..6671317b495f4c996319463fd29796ae92a5b99e 100644 (file)
@@ -50,7 +50,6 @@ static void cytherm_disconnect(struct usb_interface *interface);
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver cytherm_driver = {
-       .owner =        THIS_MODULE,
        .name =         "cytherm",
        .probe =        cytherm_probe,
        .disconnect =   cytherm_disconnect,
index c8155209bf4b4dc07d1c4560c1ea3ac2643e6167..3824df33094e237d10a26058ebb91945f7ba2bad 100644 (file)
@@ -227,7 +227,6 @@ static void emi26_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver emi26_driver = {
-       .owner          = THIS_MODULE,
        .name           = "emi26 - firmware loader",
        .probe          = emi26_probe,
        .disconnect     = emi26_disconnect,
index 189986af2ac7db3c30e76be6055dbcfeea1f8d85..52fea2e08db87358f0d1073dfba5e2bc555b323b 100644 (file)
@@ -266,7 +266,6 @@ static void emi62_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver emi62_driver = {
-       .owner          = THIS_MODULE,
        .name           = "emi62 - firmware loader",
        .probe          = emi62_probe,
        .disconnect     = emi62_disconnect,
index 1dc3e0f73014eeb5efad58cb58193972738ed98e..d8cde1017985af8705868a23abcf3ca32cfa9f88 100644 (file)
@@ -114,7 +114,6 @@ static struct usb_class_driver idmouse_class = {
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver idmouse_driver = {
-       .owner = THIS_MODULE,
        .name = DRIVER_SHORT,
        .probe = idmouse_probe,
        .disconnect = idmouse_disconnect,
index 7e93ac96490f6176bfb143b99f7f15a9431fd00e..981d8a5fbfd9e9dd1a361e6939839d1cc629baaa 100644 (file)
@@ -763,7 +763,6 @@ static void ld_usb_disconnect(struct usb_interface *intf)
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver ld_usb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "ldusb",
        .probe =        ld_usb_probe,
        .disconnect =   ld_usb_disconnect,
index 2703e205bc8fd5d307efe2a3096fce34cc39ce4b..1336745b8f553e7b130fac742456111163529c54 100644 (file)
@@ -282,7 +282,6 @@ static struct usb_class_driver tower_class = {
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver tower_driver = {
-       .owner =        THIS_MODULE,
        .name =         "legousbtower",
        .probe =        tower_probe,
        .disconnect =   tower_disconnect,
index 067a81486921d1a393170ddf1f64a32033e73bd5..605a3c87e05c2ef106e0a156a06fc8480b1f857d 100644 (file)
@@ -555,7 +555,6 @@ static void interfacekit_disconnect(struct usb_interface *interface)
 }
 
 static struct usb_driver interfacekit_driver = {
-       .owner = THIS_MODULE,
        .name = "phidgetkit",
        .probe = interfacekit_probe,
        .disconnect = interfacekit_disconnect,
index a30d4a6ee8240237943f5ad009582ebc3a490150..b3418d2bcc699257e68698703e544d5a5a844bde 100644 (file)
@@ -306,7 +306,6 @@ servo_disconnect(struct usb_interface *interface)
 }
 
 static struct usb_driver servo_driver = {
-       .owner = THIS_MODULE,
        .name = "phidgetservo",
        .probe = servo_probe,
        .disconnect = servo_disconnect,
index 9590dbac5d9a55e78c268d77fdd87e65fa727aa5..384fa37698050bea738eaa3a37f4cf8428583677 100644 (file)
@@ -465,14 +465,14 @@ static int probe_rio(struct usb_interface *intf,
 
        rio->rio_dev = dev;
 
-       if (!(rio->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) {
+       if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
                err("probe_rio: Not enough memory for the output buffer");
                usb_deregister_dev(intf, &usb_rio_class);
                return -ENOMEM;
        }
        dbg("probe_rio: obuf address:%p", rio->obuf);
 
-       if (!(rio->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) {
+       if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
                err("probe_rio: Not enough memory for the input buffer");
                usb_deregister_dev(intf, &usb_rio_class);
                kfree(rio->obuf);
@@ -522,7 +522,6 @@ static struct usb_device_id rio_table [] = {
 MODULE_DEVICE_TABLE (usb, rio_table);
 
 static struct usb_driver rio_driver = {
-       .owner =        THIS_MODULE,
        .name =         "rio500",
        .probe =        probe_rio,
        .disconnect =   disconnect_rio,
index 41ef2b606751fc38c034ba8906809170fe78d9ec..3260d595441f5837323539b8add11ac5c997e28b 100644 (file)
@@ -863,9 +863,6 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
 
            switch (length) {
 
-               case 0:
-                       return ret;
-
                case 1:
                        if (userbuffer) {
                                if (get_user(swap8, (u8 __user *)userbuffer))
@@ -1221,9 +1218,6 @@ static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
 
            switch (length) {
 
-               case 0:
-                       return ret;
-
                case 1:
 
                        ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM,
@@ -2443,8 +2437,8 @@ sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init)
        u8 *tempbuf;
        u16 *tempbufb;
        size_t written;
-       static char bootstring[] = "SiSUSB VGA text console, (C) 2005 Thomas Winischhofer.";
-       static char bootlogo[] = "(o_ //\\ V_/_";
+       static const char bootstring[] = "SiSUSB VGA text console, (C) 2005 Thomas Winischhofer.";
+       static const char bootlogo[] = "(o_ //\\ V_/_";
 
        /* sisusb->lock is down */
 
@@ -3489,7 +3483,6 @@ static struct usb_device_id sisusb_table [] = {
 MODULE_DEVICE_TABLE (usb, sisusb_table);
 
 static struct usb_driver sisusb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "sisusb",
        .probe =        sisusb_probe,
        .disconnect =   sisusb_disconnect,
index 85f3725334b017a48c8ca5c0129becf0f97d8add..cc3dae3f34e0361ae6b0b70a7b574d3eaf929fce 100644 (file)
@@ -371,7 +371,6 @@ static void lcd_disconnect(struct usb_interface *interface)
 }
 
 static struct usb_driver lcd_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usblcd",
        .probe =        lcd_probe,
        .disconnect =   lcd_disconnect,
index 3c93921cb6b38e59a8d00ff9b20929feac98a06e..877b081a3a6e9edb708b0ec0cac27fe796136ebc 100644 (file)
@@ -148,7 +148,6 @@ static void led_disconnect(struct usb_interface *interface)
 }
 
 static struct usb_driver led_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbled",
        .probe =        led_probe,
        .disconnect =   led_disconnect,
index 605a2afe34ed614d485aea86195ef7550b073a31..84fa1728f052969d527ded2e85ffa31e78810784 100644 (file)
@@ -2134,7 +2134,6 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver usbtest_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbtest",
        .id_table =     id_table,
        .probe =        usbtest_probe,
index 1cabe7ed91f5a90386af744b3e757d3e8d15db6f..4081990b7d1a97626bb937fa6ae03f8f3dcf9e4d 100644 (file)
@@ -780,7 +780,6 @@ MODULE_DEVICE_TABLE (usb, uss720_table);
 
 
 static struct usb_driver uss720_driver = {
-       .owner =        THIS_MODULE,
        .name =         "uss720",
        .probe =        uss720_probe,
        .disconnect =   uss720_disconnect,
index 17d0190ef64ecce708999654a8e278c96d6a3558..611612146ae976ef4a2a48799d8da4db2969b1e8 100644 (file)
@@ -97,19 +97,12 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb,
        if (len >= DATA_MAX)
                len = DATA_MAX;
 
-       /*
-        * Bulk is easy to shortcut reliably. 
-        * XXX Other pipe types need consideration. Currently, we overdo it
-        * and collect garbage for them: better more than less.
-        */
-       if (usb_pipebulk(pipe) || usb_pipecontrol(pipe)) {
-               if (usb_pipein(pipe)) {
-                       if (ev_type == 'S')
-                               return '<';
-               } else {
-                       if (ev_type == 'C')
-                               return '>';
-               }
+       if (usb_pipein(pipe)) {
+               if (ev_type == 'S')
+                       return '<';
+       } else {
+               if (ev_type == 'C')
+                       return '>';
        }
 
        /*
index 542120ef1fd2891015255212e4df7be1c507449c..541181695040b865ec73fae31b2c8616c0875d38 100644 (file)
@@ -912,13 +912,16 @@ static const struct usb_device_id products [] = {
        // ASIX AX88772 10/100
         USB_DEVICE (0x0b95, 0x7720),
         .driver_info = (unsigned long) &ax88772_info,
+}, {
+       // Linksys USB200M Rev 2
+       USB_DEVICE (0x13b1, 0x0018),
+       .driver_info = (unsigned long) &ax88772_info,
 },
        { },            // END
 };
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver asix_driver = {
-       .owner =        THIS_MODULE,
        .name =         "asix",
        .id_table =     products,
        .probe =        usbnet_probe,
index 37ef365a2472323a190dc6e4d692558889418cae..be5f5e142dd0d9427d14c82eca0b51ea56e23aba 100644 (file)
@@ -934,7 +934,6 @@ static struct usb_device_id catc_id_table [] = {
 MODULE_DEVICE_TABLE(usb, catc_id_table);
 
 static struct usb_driver catc_driver = {
-       .owner =        THIS_MODULE,
        .name =         driver_name,
        .probe =        catc_probe,
        .disconnect =   catc_disconnect,
index c008c981862bfad424f70b7f33e2ff4703332454..63f1f3ba8e0b3576f2cee0918f369c433f9d8dc6 100644 (file)
@@ -476,7 +476,6 @@ static const struct usb_device_id   products [] = {
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver cdc_driver = {
-       .owner =        THIS_MODULE,
        .name =         "cdc_ether",
        .id_table =     products,
        .probe =        usbnet_probe,
index f05cfb83c82d99b57d76123dc3da2d2f95d0a0c9..ec801e8bb1bba093142449e956393e29f67bfe86 100644 (file)
@@ -306,7 +306,6 @@ MODULE_DEVICE_TABLE(usb, products);
 /*-------------------------------------------------------------------------*/
 
 static struct usb_driver cdc_subset_driver = {
-       .owner =        THIS_MODULE,
        .name =         "cdc_subset",
        .probe =        usbnet_probe,
        .suspend =      usbnet_suspend,
index 2455e9a85674584c976db10942e35577c7e1cd31..faf1e86be687db900e4aeb15965ca52b012971d3 100644 (file)
@@ -377,7 +377,6 @@ static const struct usb_device_id   products [] = {
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver gl620a_driver = {
-       .owner =        THIS_MODULE,
        .name =         "gl620a",
        .id_table =     products,
        .probe =        usbnet_probe,
index b5776518020f13dc0bfd680f2788900ecf3ede05..def3bb8e22901509bf35b618d14fb3402f8a2f43 100644 (file)
@@ -175,7 +175,6 @@ MODULE_DEVICE_TABLE (usb, usb_klsi_table);
  *     kaweth_driver
  ****************************************************************/
 static struct usb_driver kaweth_driver = {
-       .owner =        THIS_MODULE,
        .name =         driver_name,
        .probe =        kaweth_probe,
        .disconnect =   kaweth_disconnect,
index b3799b1a2b0d56910ab38f2633f64ea477d2ba18..78e6a43b1087037e81bdbb74b2489b590676ccdc 100644 (file)
@@ -593,7 +593,6 @@ static const struct usb_device_id   products [] = {
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver net1080_driver = {
-       .owner =        THIS_MODULE,
        .name =         "net1080",
        .id_table =     products,
        .probe =        usbnet_probe,
index 683e3df5d607de3c191f60d04562fcebb5ff030e..156a2f1cb39ae5869a67fab648038b45065fc132 100644 (file)
@@ -45,7 +45,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.6.12 (2005/01/13)"
+#define DRIVER_VERSION "v0.6.13 (2005/11/13)"
 #define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>"
 #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver"
 
@@ -57,12 +57,14 @@ static const char driver_name[] = "pegasus";
 
 static int loopback = 0;
 static int mii_mode = 0;
+static char *devid=NULL;
 
 static struct usb_eth_dev usb_dev_id[] = {
 #define        PEGASUS_DEV(pn, vid, pid, flags)        \
        {.name = pn, .vendor = vid, .device = pid, .private = flags},
 #include "pegasus.h"
 #undef PEGASUS_DEV
+       {NULL, 0, 0, 0},
        {NULL, 0, 0, 0}
 };
 
@@ -71,6 +73,7 @@ static struct usb_device_id pegasus_ids[] = {
        {.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = vid, .idProduct = pid},
 #include "pegasus.h"
 #undef PEGASUS_DEV
+       {},
        {}
 };
 
@@ -79,8 +82,10 @@ MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
 module_param(loopback, bool, 0);
 module_param(mii_mode, bool, 0);
+module_param(devid, charp, 0);
 MODULE_PARM_DESC(loopback, "Enable MAC loopback mode (bit 0)");
 MODULE_PARM_DESC(mii_mode, "Enable HomePNA mode (bit 0),default=MII mode = 0");
+MODULE_PARM_DESC(devid, "The format is: 'DEV_name:VendorID:DeviceID:Flags'");
 
 /* use ethtool to change the level for any given device */
 static int msg_level = -1;
@@ -113,7 +118,7 @@ static void ctrl_callback(struct urb *urb, struct pt_regs *regs)
                break;
        default:
                if (netif_msg_drv(pegasus))
-                       dev_err(&pegasus->intf->dev, "%s, status %d\n",
+                       dev_dbg(&pegasus->intf->dev, "%s, status %d\n",
                                __FUNCTION__, urb->status);
        }
        pegasus->flags &= ~ETH_REGS_CHANGED;
@@ -308,9 +313,9 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd)
        __le16 regdi;
        int ret;
 
-       ret = set_register(pegasus, PhyCtrl, 0);
-       ret = set_registers(pegasus, PhyAddr, sizeof (data), data);
-       ret = set_register(pegasus, PhyCtrl, (indx | PHY_READ));
+       set_register(pegasus, PhyCtrl, 0);
+       set_registers(pegasus, PhyAddr, sizeof (data), data);
+       set_register(pegasus, PhyCtrl, (indx | PHY_READ));
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, PhyCtrl, 1, data);
                if (data[0] & PHY_DONE)
@@ -319,12 +324,12 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd)
        if (i < REG_TIMEOUT) {
                ret = get_registers(pegasus, PhyData, 2, &regdi);
                *regd = le16_to_cpu(regdi);
-               return 1;
+               return ret;
        }
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
 
-       return 0;
+       return ret;
 }
 
 static int mdio_read(struct net_device *dev, int phy_id, int loc)
@@ -344,20 +349,20 @@ static int write_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 regd)
 
        data[1] = (u8) regd;
        data[2] = (u8) (regd >> 8);
-       ret = set_register(pegasus, PhyCtrl, 0);
-       ret = set_registers(pegasus, PhyAddr, sizeof(data), data);
-       ret = set_register(pegasus, PhyCtrl, (indx | PHY_WRITE));
+       set_register(pegasus, PhyCtrl, 0);
+       set_registers(pegasus, PhyAddr, sizeof(data), data);
+       set_register(pegasus, PhyCtrl, (indx | PHY_WRITE));
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, PhyCtrl, 1, data);
                if (data[0] & PHY_DONE)
                        break;
        }
        if (i < REG_TIMEOUT)
-               return 0;
+               return ret;
 
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
-       return 1;
+       return -ETIMEDOUT;
 }
 
 static void mdio_write(struct net_device *dev, int phy_id, int loc, int val)
@@ -374,9 +379,9 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata)
        __le16 retdatai;
        int ret;
 
-       ret = set_register(pegasus, EpromCtrl, 0);
-       ret = set_register(pegasus, EpromOffset, index);
-       ret = set_register(pegasus, EpromCtrl, EPROM_READ);
+       set_register(pegasus, EpromCtrl, 0);
+       set_register(pegasus, EpromOffset, index);
+       set_register(pegasus, EpromCtrl, EPROM_READ);
 
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
@@ -386,12 +391,12 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata)
        if (i < REG_TIMEOUT) {
                ret = get_registers(pegasus, EpromData, 2, &retdatai);
                *retdata = le16_to_cpu(retdatai);
-               return 0;
+               return ret;
        }
 
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
-       return -1;
+       return -ETIMEDOUT;
 }
 
 #ifdef PEGASUS_WRITE_EEPROM
@@ -400,8 +405,8 @@ static inline void enable_eprom_write(pegasus_t * pegasus)
        __u8 tmp;
        int ret;
 
-       ret = get_registers(pegasus, EthCtrl2, 1, &tmp);
-       ret = set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE);
+       get_registers(pegasus, EthCtrl2, 1, &tmp);
+       set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE);
 }
 
 static inline void disable_eprom_write(pegasus_t * pegasus)
@@ -409,9 +414,9 @@ static inline void disable_eprom_write(pegasus_t * pegasus)
        __u8 tmp;
        int ret;
 
-       ret = get_registers(pegasus, EthCtrl2, 1, &tmp);
-       ret = set_register(pegasus, EpromCtrl, 0);
-       ret = set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE);
+       get_registers(pegasus, EthCtrl2, 1, &tmp);
+       set_register(pegasus, EpromCtrl, 0);
+       set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE);
 }
 
 static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data)
@@ -420,11 +425,11 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data)
        __u8 tmp, d[4] = { 0x3f, 0, 0, EPROM_WRITE };
        int ret;
 
-       ret = set_registers(pegasus, EpromOffset, 4, d);
+       set_registers(pegasus, EpromOffset, 4, d);
        enable_eprom_write(pegasus);
-       ret = set_register(pegasus, EpromOffset, index);
-       ret = set_registers(pegasus, EpromData, 2, &data);
-       ret = set_register(pegasus, EpromCtrl, EPROM_WRITE);
+       set_register(pegasus, EpromOffset, index);
+       set_registers(pegasus, EpromData, 2, &data);
+       set_register(pegasus, EpromCtrl, EPROM_WRITE);
 
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
@@ -433,10 +438,10 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data)
        }
        disable_eprom_write(pegasus);
        if (i < REG_TIMEOUT)
-               return 0;
+               return ret;
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
-       return -1;
+       return -ETIMEDOUT;
 }
 #endif                         /* PEGASUS_WRITE_EEPROM */
 
@@ -454,10 +459,9 @@ static inline void get_node_id(pegasus_t * pegasus, __u8 * id)
 static void set_ethernet_addr(pegasus_t * pegasus)
 {
        __u8 node_id[6];
-       int ret;
 
        get_node_id(pegasus, node_id);
-       ret = set_registers(pegasus, EthID, sizeof (node_id), node_id);
+       set_registers(pegasus, EthID, sizeof (node_id), node_id);
        memcpy(pegasus->net->dev_addr, node_id, sizeof (node_id));
 }
 
@@ -465,30 +469,29 @@ static inline int reset_mac(pegasus_t * pegasus)
 {
        __u8 data = 0x8;
        int i;
-       int ret;
 
-       ret = set_register(pegasus, EthCtrl1, data);
+       set_register(pegasus, EthCtrl1, data);
        for (i = 0; i < REG_TIMEOUT; i++) {
-               ret = get_registers(pegasus, EthCtrl1, 1, &data);
+               get_registers(pegasus, EthCtrl1, 1, &data);
                if (~data & 0x08) {
                        if (loopback & 1)
                                break;
                        if (mii_mode && (pegasus->features & HAS_HOME_PNA))
-                               ret = set_register(pegasus, Gpio1, 0x34);
+                               set_register(pegasus, Gpio1, 0x34);
                        else
-                               ret = set_register(pegasus, Gpio1, 0x26);
-                       ret = set_register(pegasus, Gpio0, pegasus->features);
-                       ret = set_register(pegasus, Gpio0, DEFAULT_GPIO_SET);
+                               set_register(pegasus, Gpio1, 0x26);
+                       set_register(pegasus, Gpio0, pegasus->features);
+                       set_register(pegasus, Gpio0, DEFAULT_GPIO_SET);
                        break;
                }
        }
        if (i == REG_TIMEOUT)
-               return 1;
+               return -ETIMEDOUT;
 
        if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
            usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
-               ret = set_register(pegasus, Gpio0, 0x24);
-               ret = set_register(pegasus, Gpio0, 0x26);
+               set_register(pegasus, Gpio0, 0x24);
+               set_register(pegasus, Gpio0, 0x26);
        }
        if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) {
                __u16 auxmode;
@@ -527,7 +530,7 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
                write_mii_word(pegasus, 0, 0x1b, auxmode | 4);
        }
 
-       return 0;
+       return ret;
 }
 
 static void fill_skb_pool(pegasus_t * pegasus)
@@ -881,9 +884,8 @@ static struct net_device_stats *pegasus_netdev_stats(struct net_device *dev)
 static inline void disable_net_traffic(pegasus_t * pegasus)
 {
        int tmp = 0;
-       int ret;
 
-       ret = set_registers(pegasus, EthCtrl0, 2, &tmp);
+       set_registers(pegasus, EthCtrl0, 2, &tmp);
 }
 
 static inline void get_interrupt_interval(pegasus_t * pegasus)
@@ -1206,18 +1208,17 @@ static __u8 mii_phy_probe(pegasus_t * pegasus)
 static inline void setup_pegasus_II(pegasus_t * pegasus)
 {
        __u8 data = 0xa5;
-       int ret;
        
-       ret = set_register(pegasus, Reg1d, 0);
-       ret = set_register(pegasus, Reg7b, 1);
+       set_register(pegasus, Reg1d, 0);
+       set_register(pegasus, Reg7b, 1);
        mdelay(100);
        if ((pegasus->features & HAS_HOME_PNA) && mii_mode)
-               ret = set_register(pegasus, Reg7b, 0);
+               set_register(pegasus, Reg7b, 0);
        else
-               ret = set_register(pegasus, Reg7b, 2);
+               set_register(pegasus, Reg7b, 2);
 
-       ret = set_register(pegasus, 0x83, data);
-       ret = get_registers(pegasus, 0x83, 1, &data);
+       set_register(pegasus, 0x83, data);
+       get_registers(pegasus, 0x83, 1, &data);
 
        if (data == 0xa5) {
                pegasus->chip = 0x8513;
@@ -1225,14 +1226,14 @@ static inline void setup_pegasus_II(pegasus_t * pegasus)
                pegasus->chip = 0;
        }
 
-       ret = set_register(pegasus, 0x80, 0xc0);
-       ret = set_register(pegasus, 0x83, 0xff);
-       ret = set_register(pegasus, 0x84, 0x01);
+       set_register(pegasus, 0x80, 0xc0);
+       set_register(pegasus, 0x83, 0xff);
+       set_register(pegasus, 0x84, 0x01);
        
        if (pegasus->features & HAS_HOME_PNA && mii_mode)
-               ret = set_register(pegasus, Reg81, 6);
+               set_register(pegasus, Reg81, 6);
        else
-               ret = set_register(pegasus, Reg81, 2);
+               set_register(pegasus, Reg81, 2);
 }
 
 
@@ -1414,9 +1415,42 @@ static struct usb_driver pegasus_driver = {
        .resume = pegasus_resume,
 };
 
+static void parse_id(char *id)
+{
+       unsigned int vendor_id=0, device_id=0, flags=0, i=0;
+       char *token, *name=NULL;
+
+       if ((token = strsep(&id, ":")) != NULL)
+               name = token;
+       /* name now points to a null terminated string*/
+       if ((token = strsep(&id, ":")) != NULL)
+               vendor_id = simple_strtoul(token, NULL, 16);
+       if ((token = strsep(&id, ":")) != NULL)
+               device_id = simple_strtoul(token, NULL, 16);
+       flags = simple_strtoul(id, NULL, 16);
+       pr_info("%s: new device %s, vendor ID 0x%04x, device ID 0x%04x, flags: 0x%x\n",
+               driver_name, name, vendor_id, device_id, flags);
+
+       if (vendor_id > 0x10000 || vendor_id == 0)
+               return;
+       if (device_id > 0x10000 || device_id == 0)
+               return;
+
+       for (i=0; usb_dev_id[i].name; i++);
+       usb_dev_id[i].name = name;
+       usb_dev_id[i].vendor = vendor_id;
+       usb_dev_id[i].device = device_id;
+       usb_dev_id[i].private = flags;
+       pegasus_ids[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
+       pegasus_ids[i].idVendor = vendor_id;
+       pegasus_ids[i].idProduct = device_id;
+}
+
 static int __init pegasus_init(void)
 {
        pr_info("%s: %s, " DRIVER_DESC "\n", driver_name, DRIVER_VERSION);
+       if (devid)
+               parse_id(devid);
        pegasus_workqueue = create_singlethread_workqueue("pegasus");
        if (!pegasus_workqueue)
                return -ENOMEM;
index 89856aa0e3b8c5c5e4bd7f684ac035e66e68a56e..4fe863389cb76a522cb3a8437495efd521329664 100644 (file)
@@ -127,7 +127,6 @@ static const struct usb_device_id   products [] = {
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver plusb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "plusb",
        .id_table =     products,
        .probe =        usbnet_probe,
index c0ecbab6f6ba0d311ca26d84a74896e22da7b5c8..49991ac1bf3b843420543013c14df70dea443526 100644 (file)
@@ -586,7 +586,6 @@ static const struct usb_device_id   products [] = {
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver rndis_driver = {
-       .owner =        THIS_MODULE,
        .name =         "rndis_host",
        .id_table =     products,
        .probe =        usbnet_probe,
index 787dd3591d6a214efb038fc0d3a053fd06e8d864..8ca52be23976a93406b21ec99e45f4ef7ce0140a 100644 (file)
@@ -177,7 +177,6 @@ static int rtl8150_probe(struct usb_interface *intf,
 static const char driver_name [] = "rtl8150";
 
 static struct usb_driver rtl8150_driver = {
-       .owner =        THIS_MODULE,
        .name =         driver_name,
        .probe =        rtl8150_probe,
        .disconnect =   rtl8150_disconnect,
index 680d13957af4b27e8ffed4858eafbf8021ae861a..9c5ab251370c5b78e578b24e0d1aaafbe0d61744 100644 (file)
@@ -357,7 +357,6 @@ static const struct usb_device_id   products [] = {
 MODULE_DEVICE_TABLE(usb, products);
 
 static struct usb_driver zaurus_driver = {
-       .owner =        THIS_MODULE,
        .name =         "zaurus",
        .id_table =     products,
        .probe =        usbnet_probe,
index 2f52261c7cc13eb0e23dd7f8430dfe9df3fe4b9f..f3a8e2807c3b8afd87d605e12ff50849d1adcb28 100644 (file)
@@ -1722,7 +1722,7 @@ static const struct iw_priv_args zd1201_private_args[] = {
            IW_PRIV_TYPE_NONE, "sethostauth" },
        { ZD1201GIWHOSTAUTH, IW_PRIV_TYPE_NONE,
            IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethostauth" },
-       { ZD1201SIWAUTHSTA, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 
+       { ZD1201SIWAUTHSTA, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1,
            IW_PRIV_TYPE_NONE, "authstation" },
        { ZD1201SIWMAXASSOC, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
            IW_PRIV_TYPE_NONE, "setmaxassoc" },
@@ -1731,9 +1731,9 @@ static const struct iw_priv_args zd1201_private_args[] = {
 };
 
 static const struct iw_handler_def zd1201_iw_handlers = {
-       .num_standard           = sizeof(zd1201_iw_handler)/sizeof(iw_handler),
-       .num_private            = sizeof(zd1201_private_handler)/sizeof(iw_handler),
-       .num_private_args       = sizeof(zd1201_private_args)/sizeof(struct iw_priv_args),
+       .num_standard           = ARRAY_SIZE(zd1201_iw_handler),
+       .num_private            = ARRAY_SIZE(zd1201_private_handler),
+       .num_private_args       = ARRAY_SIZE(zd1201_private_args),
        .standard               = (iw_handler *)zd1201_iw_handler,
        .private                = (iw_handler *)zd1201_private_handler,
        .private_args           = (struct iw_priv_args *) zd1201_private_args,
@@ -1829,6 +1829,8 @@ static int zd1201_probe(struct usb_interface *interface,
        if (err)
                goto err_net;
 
+       SET_NETDEV_DEV(zd->dev, &usb->dev);
+
        err = register_netdev(zd->dev);
        if (err)
                goto err_net;
@@ -1923,7 +1925,6 @@ static int zd1201_resume(struct usb_interface *interface)
 #endif
 
 static struct usb_driver zd1201_usb = {
-       .owner = THIS_MODULE,
        .name = "zd1201",
        .probe = zd1201_probe,
        .disconnect = zd1201_disconnect,
index 1f29d883732720602336e341fd3cb2490f084cfe..dbf1f063098c58f7c6424bff49e4d8e56a34034b 100644 (file)
@@ -23,11 +23,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE(usb, id_table);
 
 static struct usb_driver airprime_driver = {
-       .owner =        THIS_MODULE,
        .name =         "airprime",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver airprime_device = {
index 18022a74a3dc72f4606f0c2af472520187e4b333..343f6f22822043c954cdeca1915d0b746152049a 100644 (file)
@@ -27,11 +27,11 @@ static int buffer_size;
 static int debug;
 
 static struct usb_driver anydata_driver = {
-       .owner =        THIS_MODULE,
        .name =         "anydata",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static int anydata_open(struct usb_serial_port *port, struct file *filp)
index 84bc0ee4f0616c890a687259fea73939413589ff..4144777ea18b29fc6bf9adbcb3dc667093b2ecb2 100644 (file)
@@ -113,11 +113,11 @@ static struct usb_device_id id_table_combined [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver belkin_driver = {
-       .owner =        THIS_MODULE,
        .name =         "belkin",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 /* All of the device info needed for the serial converters */
index c9787001cf2a1e97ced97d799fe902d83256b469..da46b351e188eed017254eb28dad90fb4d0cb4fa 100644 (file)
@@ -67,11 +67,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver cp2101_driver = {
-       .owner          = THIS_MODULE,
        .name           = "cp2101",
        .probe          = usb_serial_probe,
        .disconnect     = usb_serial_disconnect,
        .id_table       = id_table,
+       .no_dynamic_id  =       1,
 };
 
 static struct usb_serial_driver cp2101_device = {
index e581e4ae84830d82ac65f973c4fb1c781665fa21..6d18d4eaba358b94e3f73e75fd2bfc8f1963fc96 100644 (file)
@@ -76,11 +76,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver cyberjack_driver = {
-       .owner =        THIS_MODULE,
        .name =         "cyberjack",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver cyberjack_device = {
index af9290ed257bc17b3a5f1762ee1bd0411acb8745..af18355e94cc3fcc3e98bc684a18f191a712f24c 100644 (file)
@@ -112,6 +112,7 @@ static struct usb_driver cypress_driver = {
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 struct cypress_private {
index dc74644a603d6b72b051cd8387abe588515e43ae..8fc414bd5b24ba1bc7c6db856df06f8704470853 100644 (file)
@@ -493,11 +493,11 @@ static struct usb_device_id id_table_4 [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver digi_driver = {
-       .owner =        THIS_MODULE,
        .name =         "digi_acceleport",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 
index 0b0546dcc7b9346a72c5ba0388dfefd064f61908..79a766e9ca23170160c69f182f1cd69e28d313c2 100644 (file)
@@ -105,11 +105,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver empeg_driver = {
-       .owner =        THIS_MODULE,
        .name =         "empeg",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver empeg_device = {
index 61204bf7cd781e646fdbbed4d44af53cfac983b0..eb863b3f2d7950d3880ed78472328631ffda9bcd 100644 (file)
@@ -471,10 +471,15 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
        { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
+       { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
+       { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
+       { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
        { },                                    /* Optional parameter entry */
        { }                                     /* Terminating entry */
 };
@@ -486,9 +491,10 @@ static struct usb_driver ftdi_driver = {
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
-static char *ftdi_chip_name[] = {
+static const char *ftdi_chip_name[] = {
        [SIO] = "SIO",  /* the serial part of FT8U100AX */
        [FT8U232AM] = "FT8U232AM",
        [FT232BM] = "FT232BM",
index ddb63df31ce66c746c1f83678e1cd62d991642c5..00d45f8600deeccccfa398bd79606f9168ec6296 100644 (file)
 #define SEALEVEL_2803_7_PID    0X2873  /* SeaLINK+8 (2803) Port 7 */
 #define SEALEVEL_2803_8_PID    0X2883  /* SeaLINK+8 (2803) Port 8 */
 
+/*
+ * The following are the values for two KOBIL chipcard terminals.
+ */
+#define KOBIL_VID              0x0d46  /* KOBIL Vendor ID */
+#define KOBIL_CONV_B1_PID      0x2020  /* KOBIL Konverter for B1 */
+#define KOBIL_CONV_KAAN_PID    0x2021  /* KOBIL_Konverter for KAAN */
+
 /*
  * DSS-20 Sync Station for Sony Ericsson P800
  */
 #define XSENS_CONVERTER_6_PID  0xD38E
 #define XSENS_CONVERTER_7_PID  0xD38F
 
+/*
+ * Teratronik product ids.
+ * Submitted by O. Wölfelschneider.
+ */
+#define FTDI_TERATRONIK_VCP_PID         0xEC88 /* Teratronik device (preferring VCP driver on windows) */
+#define FTDI_TERATRONIK_D2XX_PID 0xEC89        /* Teratronik device (preferring D2XX driver on windows) */
+
 /*
  * Evolution Robotics products (http://www.evolution.com/).
  * Submitted by Shawn M. Lavelle.
 /* Pyramid Computer GmbH */
 #define FTDI_PYRAMID_PID       0xE6C8  /* Pyramid Appliance Display */
 
+/*
+ * Posiflex inc retail equipment (http://www.posiflex.com.tw)
+ */
+#define POSIFLEX_VID           0x0d3a  /* Vendor ID */
+#define POSIFLEX_PP7000_PID    0x0300  /* PP-7000II thermal printer */
+
 /* Commands */
 #define FTDI_SIO_RESET                 0 /* Reset the port */
 #define FTDI_SIO_MODEM_CTRL    1 /* Set the modem control register */
@@ -707,7 +727,7 @@ typedef enum {
  */
 
 /* FTDI_SIO_GET_MODEM_STATUS */
-/* Retreive the current value of the modem status register */
+/* Retrieve the current value of the modem status register */
 
 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0
 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS
index 35820bda7ae19bfe56b1d33528558f653cafde82..452efce72714aae72aedc2426d6a50a4b9dfabe5 100644 (file)
@@ -222,11 +222,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver garmin_driver = {
-       .owner =        THIS_MODULE,
        .name =         "garmin_gps",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 
index 53a47c31cd0ea32f6e2985e85fcb0304d0a49820..4ddac620fc0cbc23c8b8c44c5fcf4f11e8f114dc 100644 (file)
@@ -68,11 +68,11 @@ static int generic_probe(struct usb_interface *interface,
 }
 
 static struct usb_driver generic_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbserial_generic",
        .probe =        generic_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     generic_serial_ids,
+       .no_dynamic_id =        1,
 };
 #endif
 
index 8eadfb70560132a5224567be0804fdacd4d03385..e9719da2aca1ed2700e8b57467b9e9a672553e45 100644 (file)
@@ -37,11 +37,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE(usb, id_table);
 
 static struct usb_driver hp49gp_driver = {
-       .owner =        THIS_MODULE,
        .name =         "hp4X",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver hp49gp_device = {
index dc4c498bd1eded80f10e15bf7dbdf7753787bfe8..faedbeb6ba49a1a958f03cb182cb3780b7d71296 100644 (file)
@@ -184,7 +184,7 @@ struct divisor_table_entry {
 // These assume a 3.6864MHz crystal, the standard /16, and
 // MCR.7 = 0.
 //
-static struct divisor_table_entry divisor_table[] = {
+static const struct divisor_table_entry divisor_table[] = {
        {   50,         4608},  
        {   75,         3072},  
        {   110,        2095},          /* 2094.545455 => 230450   => .0217 % over */
@@ -242,11 +242,11 @@ static void edge_shutdown         (struct usb_serial *serial);
 #include "io_tables.h" /* all of the devices that this driver supports */
 
 static struct usb_driver io_driver = {
-       .owner =        THIS_MODULE,
        .name =         "io_edgeport",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 /* function prototypes for all of our local functions */
@@ -2353,7 +2353,7 @@ static int calc_baud_rate_divisor (int baudrate, int *divisor)
 
        dbg("%s - %d", __FUNCTION__, baudrate);
 
-       for (i = 0; i < NUM_ENTRIES(divisor_table); i++) {
+       for (i = 0; i < ARRAY_SIZE(divisor_table); i++) {
                if ( divisor_table[i].BaudRate == baudrate ) {
                        *divisor = divisor_table[i].Divisor;
                        return 0;
index 5112d7aac05506d6822c9b0b053d8592226d350b..123fa8a904e65a15a9c7a5eb7b0a44dc07e043e7 100644 (file)
@@ -31,9 +31,6 @@
 #ifndef HIGH8
        #define HIGH8(a)        ((unsigned char)((a & 0xff00) >> 8))
 #endif
-#ifndef NUM_ENTRIES
-       #define NUM_ENTRIES(x)  (sizeof(x)/sizeof((x)[0]))
-#endif
 
 #ifndef __KERNEL__
 #define __KERNEL__
index c7c3a3c305feae0bd7dcbb5bf4b1b8aaf7eae29f..e3463de99de41fc8f4fc47b38d097052fd46d9cc 100644 (file)
@@ -537,7 +537,7 @@ static unsigned char IMAGE_ARRAY_NAME[] = {
 
 };
 
-static struct edge_firmware_version_info IMAGE_VERSION_NAME = {
+static const struct edge_firmware_version_info IMAGE_VERSION_NAME = {
        2, 0, 3 };              // Major, Minor, Build
 
 #undef IMAGE_VERSION_NAME
index 832b6d6734c0f6c1886f2e8ad365234e32dab31c..2edf9cabad201d739e1209130af7c4df60e6e2dc 100644 (file)
@@ -216,11 +216,11 @@ static struct usb_device_id id_table_combined [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver io_driver = {
-       .owner =        THIS_MODULE,
        .name =         "io_ti",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 
@@ -2843,7 +2843,7 @@ static struct edge_buf *edge_buf_alloc(unsigned int size)
  * Free the buffer and all associated memory.
  */
 
-void edge_buf_free(struct edge_buf *eb)
+static void edge_buf_free(struct edge_buf *eb)
 {
        if (eb) {
                kfree(eb->buf_buf);
index d5d066488100202b88afe7f7e441a4db0adb50ff..06d07cea0b70a3a4a0a09f6265a247b4550e8013 100644 (file)
@@ -542,11 +542,11 @@ static struct usb_device_id ipaq_id_table [] = {
 MODULE_DEVICE_TABLE (usb, ipaq_id_table);
 
 static struct usb_driver ipaq_driver = {
-       .owner =        THIS_MODULE,
        .name =         "ipaq",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     ipaq_id_table,
+       .no_dynamic_id =        1,
 };
 
 
index a02fada853620b1b04d0797e9f8b04ae32e179ba..2dd191f5fe766962e37e9a0a5971334b216e7d1c 100644 (file)
@@ -46,7 +46,6 @@
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <linux/usb.h>
-#include <linux/usb.h>
 #include <asm/uaccess.h>
 #include "usb-serial.h"
 
@@ -153,11 +152,11 @@ static struct usb_device_id usb_ipw_ids[] = {
 MODULE_DEVICE_TABLE(usb, usb_ipw_ids);
 
 static struct usb_driver usb_ipw_driver = {
-       .owner =        THIS_MODULE,
        .name =         "ipwtty",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     usb_ipw_ids,
+       .no_dynamic_id =        1,
 };
 
 static int debug;
index 19f329e9bdcf5afb161dc17e8512a433945b09d3..a59010421444b9419bd0e3990f87cf8b2dd9edf5 100644 (file)
@@ -125,11 +125,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver ir_driver = {
-       .owner =        THIS_MODULE,
        .name =         "ir-usb",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 
index 5cfc13b5e56f59aecdc14191577aef116a572b70..7472ed6bf62653dd581af8d3eb8333b17be13e13 100644 (file)
@@ -520,11 +520,11 @@ static struct usb_device_id keyspan_ids_combined[] = {
 MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
 
 static struct usb_driver keyspan_driver = {
-       .owner =        THIS_MODULE,
        .name =         "keyspan",                
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     keyspan_ids_combined,
+       .no_dynamic_id =        1,
 };
 
 /* usb_device_id table for the pre-firmware download keyspan devices */
index cd4f48bd83b614552372d2c5669aa275ba55ccd0..b0441c35f98fcc8b708e5569623017b931be9b54 100644 (file)
@@ -150,11 +150,11 @@ static struct usb_device_id id_table_combined [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver keyspan_pda_driver = {
-       .owner =        THIS_MODULE,
        .name =         "keyspan_pda",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_device_id id_table_std [] = {
index a8951c0fd0209bdffc6d585715d3f58771a554f7..4e2f7dfb58b260960c9fd8658cca09a4459d39e0 100644 (file)
@@ -116,11 +116,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver kl5kusb105d_driver = {
-       .owner =        THIS_MODULE,
        .name =         "kl5kusb105d",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver kl5kusb105d_device = {
index 9456dd9dd13672047beb7d63cbec7ebdd37cfee5..d9c21e275130a59a76bdc89a9de7ae3bf35280c9 100644 (file)
@@ -97,11 +97,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver kobil_driver = {
-       .owner =        THIS_MODULE,
        .name =         "kobil",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 
index ca5dbadb9b7e821c73b4d0fa62ba7435439cf96c..b6d6cab9c85911831fd046d8926f8e0cbf1df084 100644 (file)
@@ -125,11 +125,11 @@ static struct usb_device_id id_table_combined [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver mct_u232_driver = {
-       .owner =        THIS_MODULE,
        .name =         "mct_u232",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver mct_u232_device = {
index 3caf97072ac014947cd036380f1a82ec8e824497..762d8ff9a1e4f808069cbd40dae6128d5f5e1521 100644 (file)
@@ -80,11 +80,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver omninet_driver = {
-       .owner =        THIS_MODULE,
        .name =         "omninet",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 
index 7716000045b73dd632d41f1104c9696b8d715077..3fd2405304fdc156c588772b692962057f849d29 100644 (file)
@@ -95,11 +95,11 @@ static struct usb_device_id option_ids[] = {
 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,
+       .no_dynamic_id =        1,
 };
 
 /* The card has three separate interfaces, wich the serial driver
index 41a45a5025b21275c818819ef77895468eba91fd..f037210561905ecd1149e31570a98a112f26dc27 100644 (file)
@@ -82,11 +82,11 @@ static struct usb_device_id id_table [] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver pl2303_driver = {
-       .owner =        THIS_MODULE,
        .name =         "pl2303",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 #define SET_LINE_REQUEST_TYPE          0x21
@@ -810,7 +810,7 @@ static void pl2303_update_line_status(struct usb_serial_port *port,
        struct pl2303_private *priv = usb_get_serial_port_data(port);
        unsigned long flags;
        u8 status_idx = UART_STATE;
-       u8 length = UART_STATE;
+       u8 length = UART_STATE + 1;
 
        if ((le16_to_cpu(port->serial->dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
            (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65 ||
index c22bdc0c4dfde9b02cdc13b490a0d7d6b3b1a446..f0215f850d2d3eea98faf2b6569075f596aec3cd 100644 (file)
@@ -160,14 +160,14 @@ static struct usb_device_id id_table[] = {
 MODULE_DEVICE_TABLE (usb, id_table);
 
 static struct usb_driver safe_driver = {
-       .owner =        THIS_MODULE,
        .name =         "safe_serial",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
-static __u16 crc10_table[256] = {
+static const __u16 crc10_table[256] = {
        0x000, 0x233, 0x255, 0x066, 0x299, 0x0aa, 0x0cc, 0x2ff, 0x301, 0x132, 0x154, 0x367, 0x198, 0x3ab, 0x3cd, 0x1fe,
        0x031, 0x202, 0x264, 0x057, 0x2a8, 0x09b, 0x0fd, 0x2ce, 0x330, 0x103, 0x165, 0x356, 0x1a9, 0x39a, 0x3fc, 0x1cf,
        0x062, 0x251, 0x237, 0x004, 0x2fb, 0x0c8, 0x0ae, 0x29d, 0x363, 0x150, 0x136, 0x305, 0x1fa, 0x3c9, 0x3af, 0x19c,
@@ -425,7 +425,7 @@ static int __init safe_init (void)
        if (vendor || product) {
                info ("vendor: %x product: %x\n", vendor, product);
 
-               for (i = 0; i < (sizeof (id_table) / sizeof (struct usb_device_id)); i++) {
+               for (i = 0; i < ARRAY_SIZE(id_table); i++) {
                        if (!id_table[i].idVendor && !id_table[i].idProduct) {
                                id_table[i].idVendor = vendor;
                                id_table[i].idProduct = product;
index 205dbf7201daa27f0fb366195d22798ff7d31fb5..abb830cb77bd926365d20c67ed5516b2d11d0b49 100644 (file)
@@ -248,11 +248,11 @@ static struct usb_device_id ti_id_table_combined[] = {
 };
 
 static struct usb_driver ti_usb_driver = {
-       .owner                  = THIS_MODULE,
        .name                   = "ti_usb_3410_5052",
        .probe                  = usb_serial_probe,
        .disconnect             = usb_serial_disconnect,
        .id_table               = ti_id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver ti_1port_device = {
@@ -351,17 +351,14 @@ static int __init ti_init(void)
        int i,j;
        int ret;
 
-
        /* insert extra vendor and product ids */
-       j = sizeof(ti_id_table_3410)/sizeof(struct usb_device_id)
-               - TI_EXTRA_VID_PID_COUNT - 1;
+       j = ARRAY_SIZE(ti_id_table_3410) - TI_EXTRA_VID_PID_COUNT - 1;
        for (i=0; i<min(vendor_3410_count,product_3410_count); i++,j++) {
                ti_id_table_3410[j].idVendor = vendor_3410[i];
                ti_id_table_3410[j].idProduct = product_3410[i];
                ti_id_table_3410[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
        }
-       j = sizeof(ti_id_table_5052)/sizeof(struct usb_device_id)
-               - TI_EXTRA_VID_PID_COUNT - 1;
+       j = ARRAY_SIZE(ti_id_table_5052) - TI_EXTRA_VID_PID_COUNT - 1;
        for (i=0; i<min(vendor_5052_count,product_5052_count); i++,j++) {
                ti_id_table_5052[j].idVendor = vendor_5052[i];
                ti_id_table_5052[j].idProduct = product_5052[i];
index 0c4881d18cd59b0c30f63b4a3401da3eb3813623..8bc8337c99c454f0db72816fbee43eec29475c3d 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/list.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
+#include <asm/semaphore.h>
 #include <linux/usb.h>
 #include "usb-serial.h"
 #include "pl2303.h"
 
 /* Driver structure we register with the USB core */
 static struct usb_driver usb_serial_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usbserial",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
+       .no_dynamic_id =        1,
 };
 
 /* There is no MODULE_DEVICE_TABLE for usbserial.c.  Instead
@@ -188,6 +189,11 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
 
        portNumber = tty->index - serial->minor;
        port = serial->port[portNumber];
+       if (!port)
+               return -ENODEV;
+
+       if (down_interruptible(&port->sem))
+               return -ERESTARTSYS;
         
        ++port->open_count;
 
@@ -213,6 +219,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
                        goto bailout_module_put;
        }
 
+       up(&port->sem);
        return 0;
 
 bailout_module_put:
@@ -220,6 +227,7 @@ bailout_module_put:
 bailout_kref_put:
        kref_put(&serial->kref, destroy_serial);
        port->open_count = 0;
+       up(&port->sem);
        return retval;
 }
 
@@ -232,8 +240,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
+       down(&port->sem);
+
        if (port->open_count == 0)
-               return;
+               goto out;
 
        --port->open_count;
        if (port->open_count == 0) {
@@ -251,6 +261,9 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
        }
 
        kref_put(&port->serial->kref, destroy_serial);
+
+out:
+       up(&port->sem);
 }
 
 static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count)
@@ -258,6 +271,9 @@ static int serial_write (struct tty_struct * tty, const unsigned char *buf, int
        struct usb_serial_port *port = tty->driver_data;
        int retval = -EINVAL;
 
+       if (!port)
+               goto exit;
+
        dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
 
        if (!port->open_count) {
@@ -277,6 +293,9 @@ static int serial_write_room (struct tty_struct *tty)
        struct usb_serial_port *port = tty->driver_data;
        int retval = -EINVAL;
 
+       if (!port)
+               goto exit;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -296,6 +315,9 @@ static int serial_chars_in_buffer (struct tty_struct *tty)
        struct usb_serial_port *port = tty->driver_data;
        int retval = -EINVAL;
 
+       if (!port)
+               goto exit;
+
        dbg("%s = port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -314,6 +336,9 @@ static void serial_throttle (struct tty_struct * tty)
 {
        struct usb_serial_port *port = tty->driver_data;
 
+       if (!port)
+               return;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -330,6 +355,9 @@ static void serial_unthrottle (struct tty_struct * tty)
 {
        struct usb_serial_port *port = tty->driver_data;
 
+       if (!port)
+               return;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -347,6 +375,9 @@ static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned in
        struct usb_serial_port *port = tty->driver_data;
        int retval = -ENODEV;
 
+       if (!port)
+               goto exit;
+
        dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
 
        if (!port->open_count) {
@@ -368,6 +399,9 @@ static void serial_set_termios (struct tty_struct *tty, struct termios * old)
 {
        struct usb_serial_port *port = tty->driver_data;
 
+       if (!port)
+               return;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -384,6 +418,9 @@ static void serial_break (struct tty_struct *tty, int break_state)
 {
        struct usb_serial_port *port = tty->driver_data;
 
+       if (!port)
+               return;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -445,6 +482,9 @@ static int serial_tiocmget (struct tty_struct *tty, struct file *file)
 {
        struct usb_serial_port *port = tty->driver_data;
 
+       if (!port)
+               goto exit;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -464,6 +504,9 @@ static int serial_tiocmset (struct tty_struct *tty, struct file *file,
 {
        struct usb_serial_port *port = tty->driver_data;
 
+       if (!port)
+               goto exit;
+
        dbg("%s - port %d", __FUNCTION__, port->number);
 
        if (!port->open_count) {
@@ -742,6 +785,7 @@ int usb_serial_probe(struct usb_interface *interface,
                port->number = i + serial->minor;
                port->serial = serial;
                spin_lock_init(&port->lock);
+               sema_init(&port->sem, 1);
                INIT_WORK(&port->work, usb_serial_port_softint, port);
                serial->port[i] = port;
        }
index 238a5a871ed665cd9ecd6a2f415c2314d9ead4e6..d7d27c3385b384ea090a033ebd6da14dc0512038 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <linux/config.h>
 #include <linux/kref.h>
+#include <asm/semaphore.h>
 
 #define SERIAL_TTY_MAJOR       188     /* Nice legal number now */
 #define SERIAL_TTY_MINORS      255     /* loads of devices :) */
@@ -30,6 +31,8 @@
  * @serial: pointer back to the struct usb_serial owner of this port.
  * @tty: pointer to the corresponding tty for this port.
  * @lock: spinlock to grab when updating portions of this structure.
+ * @sem: semaphore used to synchronize serial_open() and serial_close()
+ *     access for this port.
  * @number: the number of the port (the minor number).
  * @interrupt_in_buffer: pointer to the interrupt in buffer for this port.
  * @interrupt_in_urb: pointer to the interrupt in struct urb for this port.
@@ -60,6 +63,7 @@ struct usb_serial_port {
        struct usb_serial *     serial;
        struct tty_struct *     tty;
        spinlock_t              lock;
+       struct semaphore        sem;
        unsigned char           number;
 
        unsigned char *         interrupt_in_buffer;
index a473c1c345593453b6a1775a960f0e477c013197..49b1fbe61f25e446a60b8ecf8a8bc09780aeeb5d 100644 (file)
@@ -173,11 +173,11 @@ static struct usb_device_id id_table_combined [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver visor_driver = {
-       .owner =        THIS_MODULE,
        .name =         "visor",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 /* All of the device info needed for the Handspring Visor, and Palm 4.0 devices */
index 18c3183be769d3bea41cafce1e7b226bb29325b9..a7c3c4734d839ea83d8195374f81361e71ced15b 100644 (file)
@@ -127,11 +127,11 @@ static struct usb_device_id id_table_combined [] = {
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
 static struct usb_driver whiteheat_driver = {
-       .owner =        THIS_MODULE,
        .name =         "whiteheat",
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
 };
 
 /* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */
index c41d64dbb0f0ec39d50901ffe771715b31a62a48..92be101feba70882baea621b27adde4df0f153b5 100644 (file)
@@ -112,6 +112,15 @@ config USB_STORAGE_JUMPSHOT
          Say Y here to include additional code to support the Lexar Jumpshot
          USB CompactFlash reader.
 
+config USB_STORAGE_ALAUDA
+       bool "Olympus MAUSB-10/Fuji DPC-R1 support (EXPERIMENTAL)"
+       depends on USB_STORAGE && EXPERIMENTAL
+       help
+         Say Y here to include additional code to support the Olympus MAUSB-10
+         and Fujifilm DPC-R1 USB Card reader/writer devices.
+
+         These devices are based on the Alauda chip and support support both
+         XD and SmartMedia cards.
 
 config USB_STORAGE_ONETOUCH
        bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)"
@@ -124,3 +133,17 @@ config USB_STORAGE_ONETOUCH
          hard drive's as an input device. An action can be associated with
          this input in any keybinding software. (e.g. gnome's keyboard short-
          cuts)
+
+config USB_LIBUSUAL
+       bool "The shared table of common (or usual) storage devices"
+       depends on USB
+       help
+         This module contains a table of common (or usual) devices
+         for usb-storage and ub drivers, and allows to switch binding
+         of these devices without rebuilding modules.
+
+         Typical syntax of /etc/modprobe.conf is:
+
+               options libusual bias="ub"
+
+         If unsure, say N.
index 44ab8f9978fe9d3a44fd2675674f3395ac8949b0..8cbba22508a47d77d3a39897d4138e7be5a7f7ae 100644 (file)
@@ -18,7 +18,12 @@ usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM)   += dpcm.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200)   += isd200.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB)  += datafab.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_ALAUDA)   += alauda.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o
 
 usb-storage-objs :=    scsiglue.o protocol.o transport.o usb.o \
                        initializers.o $(usb-storage-obj-y)
+
+ifneq ($(CONFIG_USB_LIBUSUAL),)
+       obj-$(CONFIG_USB)       += libusual.o
+endif
diff --git a/drivers/usb/storage/alauda.c b/drivers/usb/storage/alauda.c
new file mode 100644 (file)
index 0000000..4d3cbb1
--- /dev/null
@@ -0,0 +1,1119 @@
+/*
+ * Driver for Alauda-based card readers
+ *
+ * Current development and maintenance by:
+ *   (c) 2005 Daniel Drake <dsd@gentoo.org>
+ *
+ * The 'Alauda' is a chip manufacturered by RATOC for OEM use.
+ *
+ * Alauda implements a vendor-specific command set to access two media reader
+ * ports (XD, SmartMedia). This driver converts SCSI commands to the commands
+ * which are accepted by these devices.
+ *
+ * The driver was developed through reverse-engineering, with the help of the
+ * sddr09 driver which has many similarities, and with some help from the
+ * (very old) vendor-supplied GPL sma03 driver.
+ *
+ * For protocol info, see http://alauda.sourceforge.net
+ *
+ * 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.
+ */
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+
+#include "usb.h"
+#include "transport.h"
+#include "protocol.h"
+#include "debug.h"
+#include "alauda.h"
+
+#define short_pack(lsb,msb) ( ((u16)(lsb)) | ( ((u16)(msb))<<8 ) )
+#define LSB_of(s) ((s)&0xFF)
+#define MSB_of(s) ((s)>>8)
+
+#define MEDIA_PORT(us) us->srb->device->lun
+#define MEDIA_INFO(us) ((struct alauda_info *)us->extra)->port[MEDIA_PORT(us)]
+
+#define PBA_LO(pba) ((pba & 0xF) << 5)
+#define PBA_HI(pba) (pba >> 3)
+#define PBA_ZONE(pba) (pba >> 11)
+
+/*
+ * Media handling
+ */
+
+struct alauda_card_info {
+       unsigned char id;               /* id byte */
+       unsigned char chipshift;        /* 1<<cs bytes total capacity */
+       unsigned char pageshift;        /* 1<<ps bytes in a page */
+       unsigned char blockshift;       /* 1<<bs pages per block */
+       unsigned char zoneshift;        /* 1<<zs blocks per zone */
+};
+
+static struct alauda_card_info alauda_card_ids[] = {
+       /* NAND flash */
+       { 0x6e, 20, 8, 4, 8},   /* 1 MB */
+       { 0xe8, 20, 8, 4, 8},   /* 1 MB */
+       { 0xec, 20, 8, 4, 8},   /* 1 MB */
+       { 0x64, 21, 8, 4, 9},   /* 2 MB */
+       { 0xea, 21, 8, 4, 9},   /* 2 MB */
+       { 0x6b, 22, 9, 4, 9},   /* 4 MB */
+       { 0xe3, 22, 9, 4, 9},   /* 4 MB */
+       { 0xe5, 22, 9, 4, 9},   /* 4 MB */
+       { 0xe6, 23, 9, 4, 10},  /* 8 MB */
+       { 0x73, 24, 9, 5, 10},  /* 16 MB */
+       { 0x75, 25, 9, 5, 10},  /* 32 MB */
+       { 0x76, 26, 9, 5, 10},  /* 64 MB */
+       { 0x79, 27, 9, 5, 10},  /* 128 MB */
+       { 0x71, 28, 9, 5, 10},  /* 256 MB */
+
+       /* MASK ROM */
+       { 0x5d, 21, 9, 4, 8},   /* 2 MB */
+       { 0xd5, 22, 9, 4, 9},   /* 4 MB */
+       { 0xd6, 23, 9, 4, 10},  /* 8 MB */
+       { 0x57, 24, 9, 4, 11},  /* 16 MB */
+       { 0x58, 25, 9, 4, 12},  /* 32 MB */
+       { 0,}
+};
+
+static struct alauda_card_info *alauda_card_find_id(unsigned char id) {
+       int i;
+
+       for (i = 0; alauda_card_ids[i].id != 0; i++)
+               if (alauda_card_ids[i].id == id)
+                       return &(alauda_card_ids[i]);
+       return NULL;
+}
+
+/*
+ * ECC computation.
+ */
+
+static unsigned char parity[256];
+static unsigned char ecc2[256];
+
+static void nand_init_ecc(void) {
+       int i, j, a;
+
+       parity[0] = 0;
+       for (i = 1; i < 256; i++)
+               parity[i] = (parity[i&(i-1)] ^ 1);
+
+       for (i = 0; i < 256; i++) {
+               a = 0;
+               for (j = 0; j < 8; j++) {
+                       if (i & (1<<j)) {
+                               if ((j & 1) == 0)
+                                       a ^= 0x04;
+                               if ((j & 2) == 0)
+                                       a ^= 0x10;
+                               if ((j & 4) == 0)
+                                       a ^= 0x40;
+                       }
+               }
+               ecc2[i] = ~(a ^ (a<<1) ^ (parity[i] ? 0xa8 : 0));
+       }
+}
+
+/* compute 3-byte ecc on 256 bytes */
+static void nand_compute_ecc(unsigned char *data, unsigned char *ecc) {
+       int i, j, a;
+       unsigned char par, bit, bits[8];
+
+       par = 0;
+       for (j = 0; j < 8; j++)
+               bits[j] = 0;
+
+       /* collect 16 checksum bits */
+       for (i = 0; i < 256; i++) {
+               par ^= data[i];
+               bit = parity[data[i]];
+               for (j = 0; j < 8; j++)
+                       if ((i & (1<<j)) == 0)
+                               bits[j] ^= bit;
+       }
+
+       /* put 4+4+4 = 12 bits in the ecc */
+       a = (bits[3] << 6) + (bits[2] << 4) + (bits[1] << 2) + bits[0];
+       ecc[0] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
+
+       a = (bits[7] << 6) + (bits[6] << 4) + (bits[5] << 2) + bits[4];
+       ecc[1] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
+
+       ecc[2] = ecc2[par];
+}
+
+static int nand_compare_ecc(unsigned char *data, unsigned char *ecc) {
+       return (data[0] == ecc[0] && data[1] == ecc[1] && data[2] == ecc[2]);
+}
+
+static void nand_store_ecc(unsigned char *data, unsigned char *ecc) {
+       memcpy(data, ecc, 3);
+}
+
+/*
+ * Alauda driver
+ */
+
+/*
+ * Forget our PBA <---> LBA mappings for a particular port
+ */
+static void alauda_free_maps (struct alauda_media_info *media_info)
+{
+       unsigned int shift = media_info->zoneshift
+               + media_info->blockshift + media_info->pageshift;
+       unsigned int num_zones = media_info->capacity >> shift;
+       unsigned int i;
+
+       if (media_info->lba_to_pba != NULL)
+               for (i = 0; i < num_zones; i++) {
+                       kfree(media_info->lba_to_pba[i]);
+                       media_info->lba_to_pba[i] = NULL;
+               }
+
+       if (media_info->pba_to_lba != NULL)
+               for (i = 0; i < num_zones; i++) {
+                       kfree(media_info->pba_to_lba[i]);
+                       media_info->pba_to_lba[i] = NULL;
+               }
+}
+
+/*
+ * Returns 2 bytes of status data
+ * The first byte describes media status, and second byte describes door status
+ */
+static int alauda_get_media_status(struct us_data *us, unsigned char *data)
+{
+       int rc;
+       unsigned char command;
+
+       if (MEDIA_PORT(us) == ALAUDA_PORT_XD)
+               command = ALAUDA_GET_XD_MEDIA_STATUS;
+       else
+               command = ALAUDA_GET_SM_MEDIA_STATUS;
+
+       rc = usb_stor_ctrl_transfer(us, us->recv_ctrl_pipe,
+               command, 0xc0, 0, 1, data, 2);
+
+       US_DEBUGP("alauda_get_media_status: Media status %02X %02X\n",
+               data[0], data[1]);
+
+       return rc;
+}
+
+/*
+ * Clears the "media was changed" bit so that we know when it changes again
+ * in the future.
+ */
+static int alauda_ack_media(struct us_data *us)
+{
+       unsigned char command;
+
+       if (MEDIA_PORT(us) == ALAUDA_PORT_XD)
+               command = ALAUDA_ACK_XD_MEDIA_CHANGE;
+       else
+               command = ALAUDA_ACK_SM_MEDIA_CHANGE;
+
+       return usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+               command, 0x40, 0, 1, NULL, 0);
+}
+
+/*
+ * Retrieves a 4-byte media signature, which indicates manufacturer, capacity,
+ * and some other details.
+ */
+static int alauda_get_media_signature(struct us_data *us, unsigned char *data)
+{
+       unsigned char command;
+
+       if (MEDIA_PORT(us) == ALAUDA_PORT_XD)
+               command = ALAUDA_GET_XD_MEDIA_SIG;
+       else
+               command = ALAUDA_GET_SM_MEDIA_SIG;
+
+       return usb_stor_ctrl_transfer(us, us->recv_ctrl_pipe,
+               command, 0xc0, 0, 0, data, 4);
+}
+
+/*
+ * Resets the media status (but not the whole device?)
+ */
+static int alauda_reset_media(struct us_data *us)
+{
+       unsigned char *command = us->iobuf;
+
+       memset(command, 0, 9);
+       command[0] = ALAUDA_BULK_CMD;
+       command[1] = ALAUDA_BULK_RESET_MEDIA;
+       command[8] = MEDIA_PORT(us);
+
+       return usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
+               command, 9, NULL);
+}
+
+/*
+ * Examines the media and deduces capacity, etc.
+ */
+static int alauda_init_media(struct us_data *us)
+{
+       unsigned char *data = us->iobuf;
+       int ready = 0;
+       struct alauda_card_info *media_info;
+       unsigned int num_zones;
+
+       while (ready == 0) {
+               msleep(20);
+
+               if (alauda_get_media_status(us, data) != USB_STOR_XFER_GOOD)
+                       return USB_STOR_TRANSPORT_ERROR;
+
+               if (data[0] & 0x10)
+                       ready = 1;
+       }
+
+       US_DEBUGP("alauda_init_media: We are ready for action!\n");
+
+       if (alauda_ack_media(us) != USB_STOR_XFER_GOOD)
+               return USB_STOR_TRANSPORT_ERROR;
+
+       msleep(10);
+
+       if (alauda_get_media_status(us, data) != USB_STOR_XFER_GOOD)
+               return USB_STOR_TRANSPORT_ERROR;
+
+       if (data[0] != 0x14) {
+               US_DEBUGP("alauda_init_media: Media not ready after ack\n");
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+
+       if (alauda_get_media_signature(us, data) != USB_STOR_XFER_GOOD)
+               return USB_STOR_TRANSPORT_ERROR;
+
+       US_DEBUGP("alauda_init_media: Media signature: %02X %02X %02X %02X\n",
+               data[0], data[1], data[2], data[3]);
+       media_info = alauda_card_find_id(data[1]);
+       if (media_info == NULL) {
+               printk("alauda_init_media: Unrecognised media signature: "
+                       "%02X %02X %02X %02X\n",
+                       data[0], data[1], data[2], data[3]);
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+
+       MEDIA_INFO(us).capacity = 1 << media_info->chipshift;
+       US_DEBUGP("Found media with capacity: %ldMB\n",
+               MEDIA_INFO(us).capacity >> 20);
+
+       MEDIA_INFO(us).pageshift = media_info->pageshift;
+       MEDIA_INFO(us).blockshift = media_info->blockshift;
+       MEDIA_INFO(us).zoneshift = media_info->zoneshift;
+
+       MEDIA_INFO(us).pagesize = 1 << media_info->pageshift;
+       MEDIA_INFO(us).blocksize = 1 << media_info->blockshift;
+       MEDIA_INFO(us).zonesize = 1 << media_info->zoneshift;
+
+       MEDIA_INFO(us).uzonesize = ((1 << media_info->zoneshift) / 128) * 125;
+       MEDIA_INFO(us).blockmask = MEDIA_INFO(us).blocksize - 1;
+
+       num_zones = MEDIA_INFO(us).capacity >> (MEDIA_INFO(us).zoneshift
+               + MEDIA_INFO(us).blockshift + MEDIA_INFO(us).pageshift);
+       MEDIA_INFO(us).pba_to_lba = kcalloc(num_zones, sizeof(u16*), GFP_NOIO);
+       MEDIA_INFO(us).lba_to_pba = kcalloc(num_zones, sizeof(u16*), GFP_NOIO);
+
+       if (alauda_reset_media(us) != USB_STOR_XFER_GOOD)
+               return USB_STOR_TRANSPORT_ERROR;
+
+       return USB_STOR_TRANSPORT_GOOD;
+}
+
+/*
+ * Examines the media status and does the right thing when the media has gone,
+ * appeared, or changed.
+ */
+static int alauda_check_media(struct us_data *us)
+{
+       struct alauda_info *info = (struct alauda_info *) us->extra;
+       unsigned char status[2];
+       int rc;
+
+       rc = alauda_get_media_status(us, status);
+
+       /* Check for no media or door open */
+       if ((status[0] & 0x80) || ((status[0] & 0x1F) == 0x10)
+               || ((status[1] & 0x01) == 0)) {
+               US_DEBUGP("alauda_check_media: No media, or door open\n");
+               alauda_free_maps(&MEDIA_INFO(us));
+               info->sense_key = 0x02;
+               info->sense_asc = 0x3A;
+               info->sense_ascq = 0x00;
+               return USB_STOR_TRANSPORT_FAILED;
+       }
+
+       /* Check for media change */
+       if (status[0] & 0x08) {
+               US_DEBUGP("alauda_check_media: Media change detected\n");
+               alauda_free_maps(&MEDIA_INFO(us));
+               alauda_init_media(us);
+
+               info->sense_key = UNIT_ATTENTION;
+               info->sense_asc = 0x28;
+               info->sense_ascq = 0x00;
+               return USB_STOR_TRANSPORT_FAILED;
+       }
+
+       return USB_STOR_TRANSPORT_GOOD;
+}
+
+/*
+ * Checks the status from the 2nd status register
+ * Returns 3 bytes of status data, only the first is known
+ */
+static int alauda_check_status2(struct us_data *us)
+{
+       int rc;
+       unsigned char command[] = {
+               ALAUDA_BULK_CMD, ALAUDA_BULK_GET_STATUS2,
+               0, 0, 0, 0, 3, 0, MEDIA_PORT(us)
+       };
+       unsigned char data[3];
+
+       rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
+               command, 9, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       rc = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
+               data, 3, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       US_DEBUGP("alauda_check_status2: %02X %02X %02X\n", data[0], data[1], data[2]);
+       if (data[0] & ALAUDA_STATUS_ERROR)
+               return USB_STOR_XFER_ERROR;
+
+       return USB_STOR_XFER_GOOD;
+}
+
+/*
+ * Gets the redundancy data for the first page of a PBA
+ * Returns 16 bytes.
+ */
+static int alauda_get_redu_data(struct us_data *us, u16 pba, unsigned char *data)
+{
+       int rc;
+       unsigned char command[] = {
+               ALAUDA_BULK_CMD, ALAUDA_BULK_GET_REDU_DATA,
+               PBA_HI(pba), PBA_ZONE(pba), 0, PBA_LO(pba), 0, 0, MEDIA_PORT(us)
+       };
+
+       rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
+               command, 9, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       return usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
+               data, 16, NULL);
+}
+
+/*
+ * Finds the first unused PBA in a zone
+ * Returns the absolute PBA of an unused PBA, or 0 if none found.
+ */
+static u16 alauda_find_unused_pba(struct alauda_media_info *info,
+       unsigned int zone)
+{
+       u16 *pba_to_lba = info->pba_to_lba[zone];
+       unsigned int i;
+
+       for (i = 0; i < info->zonesize; i++)
+               if (pba_to_lba[i] == UNDEF)
+                       return (zone << info->zoneshift) + i;
+
+       return 0;
+}
+
+/*
+ * Reads the redundancy data for all PBA's in a zone
+ * Produces lba <--> pba mappings
+ */
+static int alauda_read_map(struct us_data *us, unsigned int zone)
+{
+       unsigned char *data = us->iobuf;
+       int result;
+       int i, j;
+       unsigned int zonesize = MEDIA_INFO(us).zonesize;
+       unsigned int uzonesize = MEDIA_INFO(us).uzonesize;
+       unsigned int lba_offset, lba_real, blocknum;
+       unsigned int zone_base_lba = zone * uzonesize;
+       unsigned int zone_base_pba = zone * zonesize;
+       u16 *lba_to_pba = kcalloc(zonesize, sizeof(u16), GFP_NOIO);
+       u16 *pba_to_lba = kcalloc(zonesize, sizeof(u16), GFP_NOIO);
+       if (lba_to_pba == NULL || pba_to_lba == NULL) {
+               result = USB_STOR_TRANSPORT_ERROR;
+               goto error;
+       }
+
+       US_DEBUGP("alauda_read_map: Mapping blocks for zone %d\n", zone);
+
+       /* 1024 PBA's per zone */
+       for (i = 0; i < zonesize; i++)
+               lba_to_pba[i] = pba_to_lba[i] = UNDEF;
+
+       for (i = 0; i < zonesize; i++) {
+               blocknum = zone_base_pba + i;
+
+               result = alauda_get_redu_data(us, blocknum, data);
+               if (result != USB_STOR_XFER_GOOD) {
+                       result = USB_STOR_TRANSPORT_ERROR;
+                       goto error;
+               }
+
+               /* special PBAs have control field 0^16 */
+               for (j = 0; j < 16; j++)
+                       if (data[j] != 0)
+                               goto nonz;
+               pba_to_lba[i] = UNUSABLE;
+               US_DEBUGP("alauda_read_map: PBA %d has no logical mapping\n", blocknum);
+               continue;
+
+       nonz:
+               /* unwritten PBAs have control field FF^16 */
+               for (j = 0; j < 16; j++)
+                       if (data[j] != 0xff)
+                               goto nonff;
+               continue;
+
+       nonff:
+               /* normal PBAs start with six FFs */
+               if (j < 6) {
+                       US_DEBUGP("alauda_read_map: PBA %d has no logical mapping: "
+                              "reserved area = %02X%02X%02X%02X "
+                              "data status %02X block status %02X\n",
+                              blocknum, data[0], data[1], data[2], data[3],
+                              data[4], data[5]);
+                       pba_to_lba[i] = UNUSABLE;
+                       continue;
+               }
+
+               if ((data[6] >> 4) != 0x01) {
+                       US_DEBUGP("alauda_read_map: PBA %d has invalid address "
+                              "field %02X%02X/%02X%02X\n",
+                              blocknum, data[6], data[7], data[11], data[12]);
+                       pba_to_lba[i] = UNUSABLE;
+                       continue;
+               }
+
+               /* check even parity */
+               if (parity[data[6] ^ data[7]]) {
+                       printk("alauda_read_map: Bad parity in LBA for block %d"
+                              " (%02X %02X)\n", i, data[6], data[7]);
+                       pba_to_lba[i] = UNUSABLE;
+                       continue;
+               }
+
+               lba_offset = short_pack(data[7], data[6]);
+               lba_offset = (lba_offset & 0x07FF) >> 1;
+               lba_real = lba_offset + zone_base_lba;
+
+               /*
+                * Every 1024 physical blocks ("zone"), the LBA numbers
+                * go back to zero, but are within a higher block of LBA's.
+                * Also, there is a maximum of 1000 LBA's per zone.
+                * In other words, in PBA 1024-2047 you will find LBA 0-999
+                * which are really LBA 1000-1999. This allows for 24 bad
+                * or special physical blocks per zone.
+                */
+
+               if (lba_offset >= uzonesize) {
+                       printk("alauda_read_map: Bad low LBA %d for block %d\n",
+                              lba_real, blocknum);
+                       continue;
+               }
+
+               if (lba_to_pba[lba_offset] != UNDEF) {
+                       printk("alauda_read_map: LBA %d seen for PBA %d and %d\n",
+                              lba_real, lba_to_pba[lba_offset], blocknum);
+                       continue;
+               }
+
+               pba_to_lba[i] = lba_real;
+               lba_to_pba[lba_offset] = blocknum;
+               continue;
+       }
+
+       MEDIA_INFO(us).lba_to_pba[zone] = lba_to_pba;
+       MEDIA_INFO(us).pba_to_lba[zone] = pba_to_lba;
+       result = 0;
+       goto out;
+
+error:
+       kfree(lba_to_pba);
+       kfree(pba_to_lba);
+out:
+       return result;
+}
+
+/*
+ * Checks to see whether we have already mapped a certain zone
+ * If we haven't, the map is generated
+ */
+static void alauda_ensure_map_for_zone(struct us_data *us, unsigned int zone)
+{
+       if (MEDIA_INFO(us).lba_to_pba[zone] == NULL
+               || MEDIA_INFO(us).pba_to_lba[zone] == NULL)
+               alauda_read_map(us, zone);
+}
+
+/*
+ * Erases an entire block
+ */
+static int alauda_erase_block(struct us_data *us, u16 pba)
+{
+       int rc;
+       unsigned char command[] = {
+               ALAUDA_BULK_CMD, ALAUDA_BULK_ERASE_BLOCK, PBA_HI(pba),
+               PBA_ZONE(pba), 0, PBA_LO(pba), 0x02, 0, MEDIA_PORT(us)
+       };
+       unsigned char buf[2];
+
+       US_DEBUGP("alauda_erase_block: Erasing PBA %d\n", pba);
+
+       rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
+               command, 9, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       rc = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
+               buf, 2, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       US_DEBUGP("alauda_erase_block: Erase result: %02X %02X\n",
+               buf[0], buf[1]);
+       return rc;
+}
+
+/*
+ * Reads data from a certain offset page inside a PBA, including interleaved
+ * redundancy data. Returns (pagesize+64)*pages bytes in data.
+ */
+static int alauda_read_block_raw(struct us_data *us, u16 pba,
+               unsigned int page, unsigned int pages, unsigned char *data)
+{
+       int rc;
+       unsigned char command[] = {
+               ALAUDA_BULK_CMD, ALAUDA_BULK_READ_BLOCK, PBA_HI(pba),
+               PBA_ZONE(pba), 0, PBA_LO(pba) + page, pages, 0, MEDIA_PORT(us)
+       };
+
+       US_DEBUGP("alauda_read_block: pba %d page %d count %d\n",
+               pba, page, pages);
+
+       rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
+               command, 9, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       return usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
+               data, (MEDIA_INFO(us).pagesize + 64) * pages, NULL);
+}
+
+/*
+ * Reads data from a certain offset page inside a PBA, excluding redundancy
+ * data. Returns pagesize*pages bytes in data. Note that data must be big enough
+ * to hold (pagesize+64)*pages bytes of data, but you can ignore those 'extra'
+ * trailing bytes outside this function.
+ */
+static int alauda_read_block(struct us_data *us, u16 pba,
+               unsigned int page, unsigned int pages, unsigned char *data)
+{
+       int i, rc;
+       unsigned int pagesize = MEDIA_INFO(us).pagesize;
+
+       rc = alauda_read_block_raw(us, pba, page, pages, data);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       /* Cut out the redundancy data */
+       for (i = 0; i < pages; i++) {
+               int dest_offset = i * pagesize;
+               int src_offset = i * (pagesize + 64);
+               memmove(data + dest_offset, data + src_offset, pagesize);
+       }
+
+       return rc;
+}
+
+/*
+ * Writes an entire block of data and checks status after write.
+ * Redundancy data must be already included in data. Data should be
+ * (pagesize+64)*blocksize bytes in length.
+ */
+static int alauda_write_block(struct us_data *us, u16 pba, unsigned char *data)
+{
+       int rc;
+       struct alauda_info *info = (struct alauda_info *) us->extra;
+       unsigned char command[] = {
+               ALAUDA_BULK_CMD, ALAUDA_BULK_WRITE_BLOCK, PBA_HI(pba),
+               PBA_ZONE(pba), 0, PBA_LO(pba), 32, 0, MEDIA_PORT(us)
+       };
+
+       US_DEBUGP("alauda_write_block: pba %d\n", pba);
+
+       rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
+               command, 9, NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       rc = usb_stor_bulk_transfer_buf(us, info->wr_ep, data,
+               (MEDIA_INFO(us).pagesize + 64) * MEDIA_INFO(us).blocksize,
+               NULL);
+       if (rc != USB_STOR_XFER_GOOD)
+               return rc;
+
+       return alauda_check_status2(us);
+}
+
+/*
+ * Write some data to a specific LBA.
+ */
+static int alauda_write_lba(struct us_data *us, u16 lba,
+                unsigned int page, unsigned int pages,
+                unsigned char *ptr, unsigned char *blockbuffer)
+{
+       u16 pba, lbap, new_pba;
+       unsigned char *bptr, *cptr, *xptr;
+       unsigned char ecc[3];
+       int i, result;
+       unsigned int uzonesize = MEDIA_INFO(us).uzonesize;
+       unsigned int zonesize = MEDIA_INFO(us).zonesize;
+       unsigned int pagesize = MEDIA_INFO(us).pagesize;
+       unsigned int blocksize = MEDIA_INFO(us).blocksize;
+       unsigned int lba_offset = lba % uzonesize;
+       unsigned int new_pba_offset;
+       unsigned int zone = lba / uzonesize;
+
+       alauda_ensure_map_for_zone(us, zone);
+
+       pba = MEDIA_INFO(us).lba_to_pba[zone][lba_offset];
+       if (pba == 1) {
+               /* Maybe it is impossible to write to PBA 1.
+                  Fake success, but don't do anything. */
+               printk("alauda_write_lba: avoid writing to pba 1\n");
+               return USB_STOR_TRANSPORT_GOOD;
+       }
+
+       new_pba = alauda_find_unused_pba(&MEDIA_INFO(us), zone);
+       if (!new_pba) {
+               printk("alauda_write_lba: Out of unused blocks\n");
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+
+       /* read old contents */
+       if (pba != UNDEF) {
+               result = alauda_read_block_raw(us, pba, 0,
+                       blocksize, blockbuffer);
+               if (result != USB_STOR_XFER_GOOD)
+                       return result;
+       } else {
+               memset(blockbuffer, 0, blocksize * (pagesize + 64));
+       }
+
+       lbap = (lba_offset << 1) | 0x1000;
+       if (parity[MSB_of(lbap) ^ LSB_of(lbap)])
+               lbap ^= 1;
+
+       /* check old contents and fill lba */
+       for (i = 0; i < blocksize; i++) {
+               bptr = blockbuffer + (i * (pagesize + 64));
+               cptr = bptr + pagesize;
+               nand_compute_ecc(bptr, ecc);
+               if (!nand_compare_ecc(cptr+13, ecc)) {
+                       US_DEBUGP("Warning: bad ecc in page %d- of pba %d\n",
+                                 i, pba);
+                       nand_store_ecc(cptr+13, ecc);
+               }
+               nand_compute_ecc(bptr + (pagesize / 2), ecc);
+               if (!nand_compare_ecc(cptr+8, ecc)) {
+                       US_DEBUGP("Warning: bad ecc in page %d+ of pba %d\n",
+                                 i, pba);
+                       nand_store_ecc(cptr+8, ecc);
+               }
+               cptr[6] = cptr[11] = MSB_of(lbap);
+               cptr[7] = cptr[12] = LSB_of(lbap);
+       }
+
+       /* copy in new stuff and compute ECC */
+       xptr = ptr;
+       for (i = page; i < page+pages; i++) {
+               bptr = blockbuffer + (i * (pagesize + 64));
+               cptr = bptr + pagesize;
+               memcpy(bptr, xptr, pagesize);
+               xptr += pagesize;
+               nand_compute_ecc(bptr, ecc);
+               nand_store_ecc(cptr+13, ecc);
+               nand_compute_ecc(bptr + (pagesize / 2), ecc);
+               nand_store_ecc(cptr+8, ecc);
+       }
+
+       result = alauda_write_block(us, new_pba, blockbuffer);
+       if (result != USB_STOR_XFER_GOOD)
+               return result;
+
+       new_pba_offset = new_pba - (zone * zonesize);
+       MEDIA_INFO(us).pba_to_lba[zone][new_pba_offset] = lba;
+       MEDIA_INFO(us).lba_to_pba[zone][lba_offset] = new_pba;
+       US_DEBUGP("alauda_write_lba: Remapped LBA %d to PBA %d\n",
+               lba, new_pba);
+
+       if (pba != UNDEF) {
+               unsigned int pba_offset = pba - (zone * zonesize);
+               result = alauda_erase_block(us, pba);
+               if (result != USB_STOR_XFER_GOOD)
+                       return result;
+               MEDIA_INFO(us).pba_to_lba[zone][pba_offset] = UNDEF;
+       }
+
+       return USB_STOR_TRANSPORT_GOOD;
+}
+
+/*
+ * Read data from a specific sector address
+ */
+static int alauda_read_data(struct us_data *us, unsigned long address,
+               unsigned int sectors)
+{
+       unsigned char *buffer;
+       u16 lba, max_lba;
+       unsigned int page, len, index, offset;
+       unsigned int blockshift = MEDIA_INFO(us).blockshift;
+       unsigned int pageshift = MEDIA_INFO(us).pageshift;
+       unsigned int blocksize = MEDIA_INFO(us).blocksize;
+       unsigned int pagesize = MEDIA_INFO(us).pagesize;
+       unsigned int uzonesize = MEDIA_INFO(us).uzonesize;
+       int result;
+
+       /*
+        * Since we only read in one block at a time, we have to create
+        * a bounce buffer and move the data a piece at a time between the
+        * bounce buffer and the actual transfer buffer.
+        * We make this buffer big enough to hold temporary redundancy data,
+        * which we use when reading the data blocks.
+        */
+
+       len = min(sectors, blocksize) * (pagesize + 64);
+       buffer = kmalloc(len, GFP_NOIO);
+       if (buffer == NULL) {
+               printk("alauda_read_data: Out of memory\n");
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+
+       /* Figure out the initial LBA and page */
+       lba = address >> blockshift;
+       page = (address & MEDIA_INFO(us).blockmask);
+       max_lba = MEDIA_INFO(us).capacity >> (blockshift + pageshift);
+
+       result = USB_STOR_TRANSPORT_GOOD;
+       index = offset = 0;
+
+       while (sectors > 0) {
+               unsigned int zone = lba / uzonesize; /* integer division */
+               unsigned int lba_offset = lba - (zone * uzonesize);
+               unsigned int pages;
+               u16 pba;
+               alauda_ensure_map_for_zone(us, zone);
+
+               /* Not overflowing capacity? */
+               if (lba >= max_lba) {
+                       US_DEBUGP("Error: Requested lba %u exceeds "
+                                 "maximum %u\n", lba, max_lba);
+                       result = USB_STOR_TRANSPORT_ERROR;
+                       break;
+               }
+
+               /* Find number of pages we can read in this block */
+               pages = min(sectors, blocksize - page);
+               len = pages << pageshift;
+
+               /* Find where this lba lives on disk */
+               pba = MEDIA_INFO(us).lba_to_pba[zone][lba_offset];
+
+               if (pba == UNDEF) {     /* this lba was never written */
+                       US_DEBUGP("Read %d zero pages (LBA %d) page %d\n",
+                                 pages, lba, page);
+
+                       /* This is not really an error. It just means
+                          that the block has never been written.
+                          Instead of returning USB_STOR_TRANSPORT_ERROR
+                          it is better to return all zero data. */
+
+                       memset(buffer, 0, len);
+               } else {
+                       US_DEBUGP("Read %d pages, from PBA %d"
+                                 " (LBA %d) page %d\n",
+                                 pages, pba, lba, page);
+
+                       result = alauda_read_block(us, pba, page, pages, buffer);
+                       if (result != USB_STOR_TRANSPORT_GOOD)
+                               break;
+               }
+
+               /* Store the data in the transfer buffer */
+               usb_stor_access_xfer_buf(buffer, len, us->srb,
+                               &index, &offset, TO_XFER_BUF);
+
+               page = 0;
+               lba++;
+               sectors -= pages;
+       }
+
+       kfree(buffer);
+       return result;
+}
+
+/*
+ * Write data to a specific sector address
+ */
+static int alauda_write_data(struct us_data *us, unsigned long address,
+               unsigned int sectors)
+{
+       unsigned char *buffer, *blockbuffer;
+       unsigned int page, len, index, offset;
+       unsigned int blockshift = MEDIA_INFO(us).blockshift;
+       unsigned int pageshift = MEDIA_INFO(us).pageshift;
+       unsigned int blocksize = MEDIA_INFO(us).blocksize;
+       unsigned int pagesize = MEDIA_INFO(us).pagesize;
+       u16 lba, max_lba;
+       int result;
+
+       /*
+        * Since we don't write the user data directly to the device,
+        * we have to create a bounce buffer and move the data a piece
+        * at a time between the bounce buffer and the actual transfer buffer.
+        */
+
+       len = min(sectors, blocksize) * pagesize;
+       buffer = kmalloc(len, GFP_NOIO);
+       if (buffer == NULL) {
+               printk("alauda_write_data: Out of memory\n");
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+
+       /*
+        * We also need a temporary block buffer, where we read in the old data,
+        * overwrite parts with the new data, and manipulate the redundancy data
+        */
+       blockbuffer = kmalloc((pagesize + 64) * blocksize, GFP_NOIO);
+       if (blockbuffer == NULL) {
+               printk("alauda_write_data: Out of memory\n");
+               kfree(buffer);
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+
+       /* Figure out the initial LBA and page */
+       lba = address >> blockshift;
+       page = (address & MEDIA_INFO(us).blockmask);
+       max_lba = MEDIA_INFO(us).capacity >> (pageshift + blockshift);
+
+       result = USB_STOR_TRANSPORT_GOOD;
+       index = offset = 0;
+
+       while (sectors > 0) {
+               /* Write as many sectors as possible in this block */
+               unsigned int pages = min(sectors, blocksize - page);
+               len = pages << pageshift;
+
+               /* Not overflowing capacity? */
+               if (lba >= max_lba) {
+                       US_DEBUGP("alauda_write_data: Requested lba %u exceeds "
+                                 "maximum %u\n", lba, max_lba);
+                       result = USB_STOR_TRANSPORT_ERROR;
+                       break;
+               }
+
+               /* Get the data from the transfer buffer */
+               usb_stor_access_xfer_buf(buffer, len, us->srb,
+                               &index, &offset, FROM_XFER_BUF);
+
+               result = alauda_write_lba(us, lba, page, pages, buffer,
+                       blockbuffer);
+               if (result != USB_STOR_TRANSPORT_GOOD)
+                       break;
+
+               page = 0;
+               lba++;
+               sectors -= pages;
+       }
+
+       kfree(buffer);
+       kfree(blockbuffer);
+       return result;
+}
+
+/*
+ * Our interface with the rest of the world
+ */
+
+static void alauda_info_destructor(void *extra)
+{
+       struct alauda_info *info = (struct alauda_info *) extra;
+       int port;
+
+       if (!info)
+               return;
+
+       for (port = 0; port < 2; port++) {
+               struct alauda_media_info *media_info = &info->port[port];
+
+               alauda_free_maps(media_info);
+               kfree(media_info->lba_to_pba);
+               kfree(media_info->pba_to_lba);
+       }
+}
+
+/*
+ * Initialize alauda_info struct and find the data-write endpoint
+ */
+int init_alauda(struct us_data *us)
+{
+       struct alauda_info *info;
+       struct usb_host_interface *altsetting = us->pusb_intf->cur_altsetting;
+       nand_init_ecc();
+
+       us->extra = kzalloc(sizeof(struct alauda_info), GFP_NOIO);
+       if (!us->extra) {
+               US_DEBUGP("init_alauda: Gah! Can't allocate storage for"
+                       "alauda info struct!\n");
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+       info = (struct alauda_info *) us->extra;
+       us->extra_destructor = alauda_info_destructor;
+
+       info->wr_ep = usb_sndbulkpipe(us->pusb_dev,
+               altsetting->endpoint[0].desc.bEndpointAddress
+               & USB_ENDPOINT_NUMBER_MASK);
+
+       return USB_STOR_TRANSPORT_GOOD;
+}
+
+int alauda_transport(struct scsi_cmnd *srb, struct us_data *us)
+{
+       int rc;
+       struct alauda_info *info = (struct alauda_info *) us->extra;
+       unsigned char *ptr = us->iobuf;
+       static unsigned char inquiry_response[36] = {
+               0x00, 0x80, 0x00, 0x01, 0x1F, 0x00, 0x00, 0x00
+       };
+
+       if (srb->cmnd[0] == INQUIRY) {
+               US_DEBUGP("alauda_transport: INQUIRY. "
+                       "Returning bogus response.\n");
+               memcpy(ptr, inquiry_response, sizeof(inquiry_response));
+               fill_inquiry_response(us, ptr, 36);
+               return USB_STOR_TRANSPORT_GOOD;
+       }
+
+       if (srb->cmnd[0] == TEST_UNIT_READY) {
+               US_DEBUGP("alauda_transport: TEST_UNIT_READY.\n");
+               return alauda_check_media(us);
+       }
+
+       if (srb->cmnd[0] == READ_CAPACITY) {
+               unsigned int num_zones;
+               unsigned long capacity;
+
+               rc = alauda_check_media(us);
+               if (rc != USB_STOR_TRANSPORT_GOOD)
+                       return rc;
+
+               num_zones = MEDIA_INFO(us).capacity >> (MEDIA_INFO(us).zoneshift
+                       + MEDIA_INFO(us).blockshift + MEDIA_INFO(us).pageshift);
+
+               capacity = num_zones * MEDIA_INFO(us).uzonesize
+                       * MEDIA_INFO(us).blocksize;
+
+               /* Report capacity and page size */
+               ((__be32 *) ptr)[0] = cpu_to_be32(capacity - 1);
+               ((__be32 *) ptr)[1] = cpu_to_be32(512);
+
+               usb_stor_set_xfer_buf(ptr, 8, srb);
+               return USB_STOR_TRANSPORT_GOOD;
+       }
+
+       if (srb->cmnd[0] == READ_10) {
+               unsigned int page, pages;
+
+               rc = alauda_check_media(us);
+               if (rc != USB_STOR_TRANSPORT_GOOD)
+                       return rc;
+
+               page = short_pack(srb->cmnd[3], srb->cmnd[2]);
+               page <<= 16;
+               page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
+               pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
+
+               US_DEBUGP("alauda_transport: READ_10: page %d pagect %d\n",
+                         page, pages);
+
+               return alauda_read_data(us, page, pages);
+       }
+
+       if (srb->cmnd[0] == WRITE_10) {
+               unsigned int page, pages;
+
+               rc = alauda_check_media(us);
+               if (rc != USB_STOR_TRANSPORT_GOOD)
+                       return rc;
+
+               page = short_pack(srb->cmnd[3], srb->cmnd[2]);
+               page <<= 16;
+               page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
+               pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
+
+               US_DEBUGP("alauda_transport: WRITE_10: page %d pagect %d\n",
+                         page, pages);
+
+               return alauda_write_data(us, page, pages);
+       }
+
+       if (srb->cmnd[0] == REQUEST_SENSE) {
+               US_DEBUGP("alauda_transport: REQUEST_SENSE.\n");
+
+               memset(ptr, 0, 18);
+               ptr[0] = 0xF0;
+               ptr[2] = info->sense_key;
+               ptr[7] = 11;
+               ptr[12] = info->sense_asc;
+               ptr[13] = info->sense_ascq;
+               usb_stor_set_xfer_buf(ptr, 18, srb);
+
+               return USB_STOR_TRANSPORT_GOOD;
+       }
+
+       if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
+               /* sure.  whatever.  not like we can stop the user from popping
+                  the media out of the device (no locking doors, etc) */
+               return USB_STOR_TRANSPORT_GOOD;
+       }
+
+       US_DEBUGP("alauda_transport: Gah! Unknown command: %d (0x%x)\n",
+               srb->cmnd[0], srb->cmnd[0]);
+       info->sense_key = 0x05;
+       info->sense_asc = 0x20;
+       info->sense_ascq = 0x00;
+       return USB_STOR_TRANSPORT_FAILED;
+}
+
diff --git a/drivers/usb/storage/alauda.h b/drivers/usb/storage/alauda.h
new file mode 100644 (file)
index 0000000..a700f87
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Driver for Alauda-based card readers
+ *
+ * Current development and maintenance by:
+ *    (c) 2005 Daniel Drake <dsd@gentoo.org>
+ *
+ * See alauda.c for more explanation.
+ *
+ * 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.
+ */
+
+#ifndef _USB_ALAUDA_H
+#define _USB_ALAUDA_H
+
+/*
+ * Status bytes
+ */
+#define ALAUDA_STATUS_ERROR            0x01
+#define ALAUDA_STATUS_READY            0x40
+
+/*
+ * Control opcodes (for request field)
+ */
+#define ALAUDA_GET_XD_MEDIA_STATUS     0x08
+#define ALAUDA_GET_SM_MEDIA_STATUS     0x98
+#define ALAUDA_ACK_XD_MEDIA_CHANGE     0x0a
+#define ALAUDA_ACK_SM_MEDIA_CHANGE     0x9a
+#define ALAUDA_GET_XD_MEDIA_SIG                0x86
+#define ALAUDA_GET_SM_MEDIA_SIG                0x96
+
+/*
+ * Bulk command identity (byte 0)
+ */
+#define ALAUDA_BULK_CMD                        0x40
+
+/*
+ * Bulk opcodes (byte 1)
+ */
+#define ALAUDA_BULK_GET_REDU_DATA      0x85
+#define ALAUDA_BULK_READ_BLOCK         0x94
+#define ALAUDA_BULK_ERASE_BLOCK                0xa3
+#define ALAUDA_BULK_WRITE_BLOCK                0xb4
+#define ALAUDA_BULK_GET_STATUS2                0xb7
+#define ALAUDA_BULK_RESET_MEDIA                0xe0
+
+/*
+ * Port to operate on (byte 8)
+ */
+#define ALAUDA_PORT_XD                 0x00
+#define ALAUDA_PORT_SM                 0x01
+
+/*
+ * LBA and PBA are unsigned ints. Special values.
+ */
+#define UNDEF    0xffff
+#define SPARE    0xfffe
+#define UNUSABLE 0xfffd
+
+int init_alauda(struct us_data *us);
+int alauda_transport(struct scsi_cmnd *srb, struct us_data *us);
+
+struct alauda_media_info {
+       unsigned long capacity;         /* total media size in bytes */
+       unsigned int pagesize;          /* page size in bytes */
+       unsigned int blocksize;         /* number of pages per block */
+       unsigned int uzonesize;         /* number of usable blocks per zone */
+       unsigned int zonesize;          /* number of blocks per zone */
+       unsigned int blockmask;         /* mask to get page from address */
+
+       unsigned char pageshift;
+       unsigned char blockshift;
+       unsigned char zoneshift;
+
+       u16 **lba_to_pba;               /* logical to physical block map */
+       u16 **pba_to_lba;               /* physical to logical block map */
+};
+
+struct alauda_info {
+       struct alauda_media_info port[2];
+       int wr_ep;                      /* endpoint to write data out of */
+
+       unsigned char sense_key;
+       unsigned long sense_asc;        /* additional sense code */
+       unsigned long sense_ascq;       /* additional sense code qualifier */
+};
+
+#endif
+
index 5a9321705a7426000e1197813c35b54123c85f70..01e430654a131a5a353afd09c8639f6ddeb6cedb 100644 (file)
@@ -132,6 +132,7 @@ void usb_stor_show_command(struct scsi_cmnd *srb)
        case 0x5C: what = "READ BUFFER CAPACITY"; break;
        case 0x5D: what = "SEND CUE SHEET"; break;
        case GPCMD_BLANK: what = "BLANK"; break;
+       case REPORT_LUNS: what = "REPORT LUNS"; break;
        case MOVE_MEDIUM: what = "MOVE_MEDIUM or PLAY AUDIO (12)"; break;
        case READ_12: what = "READ_12"; break;
        case WRITE_12: what = "WRITE_12"; break;
index 7372386f33d5958298f1f868684ea918e81c07ab..4c1b2bd2e2e41edcc0378b2a8b8aadf90efe7319 100644 (file)
  * mode */
 int usb_stor_euscsi_init(struct us_data *us);
 
-#ifdef CONFIG_USB_STORAGE_SDDR09
-int sddr09_init(struct us_data *us);
-#endif
-
 /* This function is required to activate all four slots on the UCR-61S2B
  * flash reader */
 int usb_stor_ucr61s2b_init(struct us_data *us);
diff --git a/drivers/usb/storage/libusual.c b/drivers/usb/storage/libusual.c
new file mode 100644 (file)
index 0000000..b28151d
--- /dev/null
@@ -0,0 +1,266 @@
+/*
+ * libusual
+ *
+ * The libusual contains the table of devices common for ub and usb-storage.
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include <linux/usb_usual.h>
+#include <linux/vmalloc.h>
+
+/*
+ */
+#define USU_MOD_FL_THREAD   1  /* Thread is running */
+#define USU_MOD_FL_PRESENT  2  /* The module is loaded */
+
+struct mod_status {
+       unsigned long fls;
+};
+
+static struct mod_status stat[3];
+static DEFINE_SPINLOCK(usu_lock);
+
+/*
+ */
+#define USB_US_DEFAULT_BIAS    USB_US_TYPE_STOR
+static atomic_t usu_bias = ATOMIC_INIT(USB_US_DEFAULT_BIAS);
+
+#define BIAS_NAME_SIZE  (sizeof("usb-storage"))
+static const char *bias_names[3] = { "none", "usb-storage", "ub" };
+
+static DECLARE_MUTEX_LOCKED(usu_init_notify);
+static DECLARE_COMPLETION(usu_end_notify);
+static atomic_t total_threads = ATOMIC_INIT(0);
+
+static int usu_probe_thread(void *arg);
+
+/*
+ * The table.
+ */
+#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
+                   vendorName, productName,useProtocol, useTransport, \
+                   initFunction, flags) \
+{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax), \
+  .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
+
+#define USUAL_DEV(useProto, useTrans, useType) \
+{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \
+  .driver_info = ((useType)<<24) }
+
+struct usb_device_id storage_usb_ids [] = {
+#      include "unusual_devs.h"
+       { } /* Terminating entry */
+};
+
+#undef USUAL_DEV
+#undef UNUSUAL_DEV
+
+MODULE_DEVICE_TABLE(usb, storage_usb_ids);
+EXPORT_SYMBOL_GPL(storage_usb_ids);
+
+/*
+ * @type: the module type as an integer
+ */
+void usb_usual_set_present(int type)
+{
+       struct mod_status *st;
+       unsigned long flags;
+
+       if (type <= 0 || type >= 3)
+               return;
+       st = &stat[type];
+       spin_lock_irqsave(&usu_lock, flags);
+       st->fls |= USU_MOD_FL_PRESENT;
+       spin_unlock_irqrestore(&usu_lock, flags);
+}
+EXPORT_SYMBOL_GPL(usb_usual_set_present);
+
+void usb_usual_clear_present(int type)
+{
+       struct mod_status *st;
+       unsigned long flags;
+
+       if (type <= 0 || type >= 3)
+               return;
+       st = &stat[type];
+       spin_lock_irqsave(&usu_lock, flags);
+       st->fls &= ~USU_MOD_FL_PRESENT;
+       spin_unlock_irqrestore(&usu_lock, flags);
+}
+EXPORT_SYMBOL_GPL(usb_usual_clear_present);
+
+/*
+ * Match the calling driver type against the table.
+ * Returns: 0 if the device matches.
+ */
+int usb_usual_check_type(const struct usb_device_id *id, int caller_type)
+{
+       int id_type = USB_US_TYPE(id->driver_info);
+
+       if (caller_type <= 0 || caller_type >= 3)
+               return -EINVAL;
+
+       /* Drivers grab fixed assignment devices */
+       if (id_type == caller_type)
+               return 0;
+       /* Drivers grab devices biased to them */
+       if (id_type == USB_US_TYPE_NONE && caller_type == atomic_read(&usu_bias))
+               return 0;
+       return -ENODEV;
+}
+EXPORT_SYMBOL_GPL(usb_usual_check_type);
+
+/*
+ */
+static int usu_probe(struct usb_interface *intf,
+                        const struct usb_device_id *id)
+{
+       int type;
+       int rc;
+       unsigned long flags;
+
+       type = USB_US_TYPE(id->driver_info);
+       if (type == 0)
+               type = atomic_read(&usu_bias);
+
+       spin_lock_irqsave(&usu_lock, flags);
+       if ((stat[type].fls & (USU_MOD_FL_THREAD|USU_MOD_FL_PRESENT)) != 0) {
+               spin_unlock_irqrestore(&usu_lock, flags);
+               return -ENXIO;
+       }
+       stat[type].fls |= USU_MOD_FL_THREAD;
+       spin_unlock_irqrestore(&usu_lock, flags);
+
+       rc = kernel_thread(usu_probe_thread, (void*)type, CLONE_VM);
+       if (rc < 0) {
+               printk(KERN_WARNING "libusual: "
+                   "Unable to start the thread for %s: %d\n",
+                   bias_names[type], rc);
+               spin_lock_irqsave(&usu_lock, flags);
+               stat[type].fls &= ~USU_MOD_FL_THREAD;
+               spin_unlock_irqrestore(&usu_lock, flags);
+               return rc;      /* Not being -ENXIO causes a message printed */
+       }
+       atomic_inc(&total_threads);
+
+       return -ENXIO;
+}
+
+static void usu_disconnect(struct usb_interface *intf)
+{
+       ;       /* We should not be here. */
+}
+
+static struct usb_driver usu_driver = {
+       .name =         "libusual",
+       .probe =        usu_probe,
+       .disconnect =   usu_disconnect,
+       .id_table =     storage_usb_ids,
+};
+
+/*
+ * A whole new thread for a purpose of request_module seems quite stupid.
+ * The request_module forks once inside again. However, if we attempt
+ * to load a storage module from our own modprobe thread, that module
+ * references our symbols, which cannot be resolved until our module is
+ * initialized. I wish there was a way to wait for the end of initialization.
+ * The module notifier reports MODULE_STATE_COMING only.
+ * So, we wait until module->init ends as the next best thing.
+ */
+static int usu_probe_thread(void *arg)
+{
+       int type = (unsigned long) arg;
+       struct mod_status *st = &stat[type];
+       int rc;
+       unsigned long flags;
+
+       daemonize("libusual_%d", type); /* "usb-storage" is kinda too long */
+
+       /* A completion does not work here because it's counted. */
+       down(&usu_init_notify);
+       up(&usu_init_notify);
+
+       rc = request_module(bias_names[type]);
+       spin_lock_irqsave(&usu_lock, flags);
+       if (rc == 0 && (st->fls & USU_MOD_FL_PRESENT) == 0) {
+               /*
+                * This should not happen, but let us keep tabs on it.
+                */
+               printk(KERN_NOTICE "libusual: "
+                   "modprobe for %s succeeded, but module is not present\n",
+                   bias_names[type]);
+       }
+       st->fls &= ~USU_MOD_FL_THREAD;
+       spin_unlock_irqrestore(&usu_lock, flags);
+
+       complete_and_exit(&usu_end_notify, 0);
+}
+
+/*
+ */
+static int __init usb_usual_init(void)
+{
+       int rc;
+
+       rc = usb_register(&usu_driver);
+       up(&usu_init_notify);
+       return rc;
+}
+
+static void __exit usb_usual_exit(void)
+{
+       /*
+        * We do not check for any drivers present, because
+        * they keep us pinned with symbol references.
+        */
+
+       usb_deregister(&usu_driver);
+
+       while (atomic_read(&total_threads) > 0) {
+               wait_for_completion(&usu_end_notify);
+               atomic_dec(&total_threads);
+       }
+}
+
+/*
+ * Validate and accept the bias parameter.
+ */
+static int usu_set_bias(const char *bias_s, struct kernel_param *kp)
+{
+       int i;
+       int len;
+       int bias_n = 0;
+
+       len = strlen(bias_s);
+       if (len == 0)
+               return -EDOM;
+       if (bias_s[len-1] == '\n')
+               --len;
+
+       for (i = 1; i < 3; i++) {
+               if (strncmp(bias_s, bias_names[i], len) == 0) {
+                       bias_n = i;
+                       break;
+               }
+       }
+       if (bias_n == 0)
+               return -EINVAL;
+
+       atomic_set(&usu_bias, bias_n);
+       return 0;
+}
+
+static int usu_get_bias(char *buffer, struct kernel_param *kp)
+{
+       return strlen(strcpy(buffer, bias_names[atomic_read(&usu_bias)]));
+}
+
+module_init(usb_usual_init);
+module_exit(usb_usual_exit);
+
+module_param_call(bias, usu_set_bias, usu_get_bias, NULL, S_IRUGO|S_IWUSR);
+__MODULE_PARM_TYPE(bias, "string");
+MODULE_PARM_DESC(bias, "Bias to usb-storage or ub");
+
+MODULE_LICENSE("GPL");
index 89401a59f95273cc904688098c9179d082e78658..55ee2d36d585824a589113e29cea2f0e94a1bebc 100644 (file)
@@ -52,6 +52,7 @@ struct usb_onetouch {
        struct urb *irq;        /* urb for interrupt in report */
        unsigned char *data;    /* input data */
        dma_addr_t data_dma;
+       unsigned int is_open:1;
 };
 
 static void usb_onetouch_irq(struct urb *urb, struct pt_regs *regs)
@@ -89,6 +90,7 @@ static int usb_onetouch_open(struct input_dev *dev)
 {
        struct usb_onetouch *onetouch = dev->private;
 
+       onetouch->is_open = 1;
        onetouch->irq->dev = onetouch->udev;
        if (usb_submit_urb(onetouch->irq, GFP_KERNEL)) {
                err("usb_submit_urb failed");
@@ -103,8 +105,30 @@ static void usb_onetouch_close(struct input_dev *dev)
        struct usb_onetouch *onetouch = dev->private;
 
        usb_kill_urb(onetouch->irq);
+       onetouch->is_open = 0;
 }
 
+#ifdef CONFIG_PM
+static void usb_onetouch_pm_hook(struct us_data *us, int action)
+{
+       struct usb_onetouch *onetouch = (struct usb_onetouch *) us->extra;
+
+       if (onetouch->is_open) {
+               switch (action) {
+               case US_SUSPEND:
+                       usb_kill_urb(onetouch->irq);
+                       break;
+               case US_RESUME:
+                       if (usb_submit_urb(onetouch->irq, GFP_KERNEL) != 0)
+                               err("usb_submit_urb failed");
+                       break;
+               default:
+                       break;
+               }
+       }
+}
+#endif /* CONFIG_PM */
+
 int onetouch_connect_input(struct us_data *ss)
 {
        struct usb_device *udev = ss->pusb_dev;
@@ -185,6 +209,9 @@ int onetouch_connect_input(struct us_data *ss)
 
        ss->extra_destructor = onetouch_release_input;
        ss->extra = onetouch;
+#ifdef CONFIG_PM
+       ss->suspend_resume_hook = usb_onetouch_pm_hook;
+#endif
 
        input_register_device(onetouch->dev);
 
index 02bff01ab09c3721783242dec9dd9b279b808347..845bed4b80317fb336cbe14ca227f8fa41907a17 100644 (file)
 #ifndef _PROTOCOL_H_
 #define _PROTOCOL_H_
 
-/* Sub Classes */
-
-#define US_SC_RBC      0x01            /* Typically, flash devices */
-#define US_SC_8020     0x02            /* CD-ROM */
-#define US_SC_QIC      0x03            /* QIC-157 Tapes */
-#define US_SC_UFI      0x04            /* Floppy */
-#define US_SC_8070     0x05            /* Removable media */
-#define US_SC_SCSI     0x06            /* Transparent */
-#define US_SC_ISD200    0x07           /* ISD200 ATA */
-#define US_SC_MIN      US_SC_RBC
-#define US_SC_MAX      US_SC_ISD200
-
-#define US_SC_DEVICE   0xff            /* Use device's value */
-
 /* Protocol handling routines */
 extern void usb_stor_ATAPI_command(struct scsi_cmnd*, struct us_data*);
 extern void usb_stor_qic157_command(struct scsi_cmnd*, struct us_data*);
index 4837524eada7170049c78f61fdff0eab29fddd0a..4ef5527028c5e1fa03be05552cd8201a126c5236 100644 (file)
@@ -109,7 +109,7 @@ static int slave_configure(struct scsi_device *sdev)
         * data comes from.
         */
        if (sdev->scsi_level < SCSI_2)
-               sdev->scsi_level = SCSI_2;
+               sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;
 
        /* According to the technical support people at Genesys Logic,
         * devices using their chips have problems transferring more than
@@ -162,7 +162,7 @@ static int slave_configure(struct scsi_device *sdev)
                 * a Get-Max-LUN request, we won't lose much by setting the
                 * revision level down to 2.  The only devices that would be
                 * affected are those with sparse LUNs. */
-               sdev->scsi_level = SCSI_2;
+               sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;
 
                /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable
                 * Hardware Error) when any low-level error occurs,
index 0ea2f5ab66ba206a5d2113ebcecded8f34c207ef..fb8bacaae27cbcb5eaaf6f845fc5e10dc8ddaa7f 100644 (file)
@@ -133,13 +133,11 @@ static struct nand_flash_dev nand_flash_ids[] = {
        { 0,}
 };
 
-#define SIZE(a)        (sizeof(a)/sizeof((a)[0]))
-
 static struct nand_flash_dev *
 nand_find_id(unsigned char id) {
        int i;
 
-       for (i = 0; i < SIZE(nand_flash_ids); i++)
+       for (i = 0; i < ARRAY_SIZE(nand_flash_ids); i++)
                if (nand_flash_ids[i].model_id == id)
                        return &(nand_flash_ids[i]);
        return NULL;
@@ -214,6 +212,20 @@ static void nand_store_ecc(unsigned char *data, unsigned char *ecc) {
  * The actual driver starts here.
  */
 
+struct sddr09_card_info {
+       unsigned long   capacity;       /* Size of card in bytes */
+       int             pagesize;       /* Size of page in bytes */
+       int             pageshift;      /* log2 of pagesize */
+       int             blocksize;      /* Size of block in pages */
+       int             blockshift;     /* log2 of blocksize */
+       int             blockmask;      /* 2^blockshift - 1 */
+       int             *lba_to_pba;    /* logical to physical map */
+       int             *pba_to_lba;    /* physical to logical map */
+       int             lbact;          /* number of available pages */
+       int             flags;
+#define        SDDR09_WP       1               /* write protected */
+};
+
 /*
  * On my 16MB card, control blocks have size 64 (16 real control bytes,
  * and 48 junk bytes). In reality of course the card uses 16 control bytes,
@@ -237,7 +249,7 @@ static void nand_store_ecc(unsigned char *data, unsigned char *ecc) {
 #define SPARE    0xfffffffe
 #define UNUSABLE 0xfffffffd
 
-static int erase_bad_lba_entries = 0;
+static const int erase_bad_lba_entries = 0;
 
 /* send vendor interface command (0x41) */
 /* called for requests 0, 1, 8 */
@@ -260,8 +272,11 @@ sddr09_send_command(struct us_data *us,
 
        rc = usb_stor_ctrl_transfer(us, pipe, request, requesttype,
                                   0, 0, xfer_data, xfer_len);
-       return (rc == USB_STOR_XFER_GOOD ? USB_STOR_TRANSPORT_GOOD :
-                       USB_STOR_TRANSPORT_ERROR);
+       switch (rc) {
+               case USB_STOR_XFER_GOOD:        return 0;
+               case USB_STOR_XFER_STALLED:     return -EPIPE;
+               default:                        return -EIO;
+       }
 }
 
 static int
@@ -308,20 +323,12 @@ sddr09_request_sense(struct us_data *us, unsigned char *sensebuf, int buflen) {
        command[4] = buflen;
 
        result = sddr09_send_scsi_command(us, command, 12);
-       if (result != USB_STOR_TRANSPORT_GOOD) {
-               US_DEBUGP("request sense failed\n");
+       if (result)
                return result;
-       }
 
        result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
                        sensebuf, buflen, NULL);
-       if (result != USB_STOR_XFER_GOOD) {
-               US_DEBUGP("request sense bulk in failed\n");
-               return USB_STOR_TRANSPORT_ERROR;
-       } else {
-               US_DEBUGP("request sense worked\n");
-               return USB_STOR_TRANSPORT_GOOD;
-       }
+       return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
 }
 
 /*
@@ -369,7 +376,7 @@ sddr09_readX(struct us_data *us, int x, unsigned long fromaddress,
 
        result = sddr09_send_scsi_command(us, command, 12);
 
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("Result for send_control in sddr09_read2%d %d\n",
                          x, result);
                return result;
@@ -381,9 +388,9 @@ sddr09_readX(struct us_data *us, int x, unsigned long fromaddress,
        if (result != USB_STOR_XFER_GOOD) {
                US_DEBUGP("Result for bulk_transfer in sddr09_read2%d %d\n",
                          x, result);
-               return USB_STOR_TRANSPORT_ERROR;
+               return -EIO;
        }
-       return USB_STOR_TRANSPORT_GOOD;
+       return 0;
 }
 
 /*
@@ -497,7 +504,7 @@ sddr09_erase(struct us_data *us, unsigned long Eaddress) {
 
        result = sddr09_send_scsi_command(us, command, 12);
 
-       if (result != USB_STOR_TRANSPORT_GOOD)
+       if (result)
                US_DEBUGP("Result for send_control in sddr09_erase %d\n",
                          result);
 
@@ -555,7 +562,7 @@ sddr09_writeX(struct us_data *us,
 
        result = sddr09_send_scsi_command(us, command, 12);
 
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("Result for send_control in sddr09_writeX %d\n",
                          result);
                return result;
@@ -567,9 +574,9 @@ sddr09_writeX(struct us_data *us,
        if (result != USB_STOR_XFER_GOOD) {
                US_DEBUGP("Result for bulk_transfer in sddr09_writeX %d\n",
                          result);
-               return USB_STOR_TRANSPORT_ERROR;
+               return -EIO;
        }
-       return USB_STOR_TRANSPORT_GOOD;
+       return 0;
 }
 
 /* erase address, write same address */
@@ -633,7 +640,7 @@ sddr09_read_sg_test_only(struct us_data *us) {
 
        result = sddr09_send_scsi_command(us, command, 4*nsg+3);
 
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("Result for send_control in sddr09_read_sg %d\n",
                          result);
                return result;
@@ -641,7 +648,7 @@ sddr09_read_sg_test_only(struct us_data *us) {
 
        buf = (unsigned char *) kmalloc(bulklen, GFP_NOIO);
        if (!buf)
-               return USB_STOR_TRANSPORT_ERROR;
+               return -ENOMEM;
 
        result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
                                       buf, bulklen, NULL);
@@ -649,10 +656,10 @@ sddr09_read_sg_test_only(struct us_data *us) {
        if (result != USB_STOR_XFER_GOOD) {
                US_DEBUGP("Result for bulk_transfer in sddr09_read_sg %d\n",
                          result);
-               return USB_STOR_TRANSPORT_ERROR;
+               return -EIO;
        }
 
-       return USB_STOR_TRANSPORT_GOOD;
+       return 0;
 }
 #endif
 
@@ -681,14 +688,13 @@ sddr09_read_status(struct us_data *us, unsigned char *status) {
        command[1] = LUNBITS;
 
        result = sddr09_send_scsi_command(us, command, 12);
-       if (result != USB_STOR_TRANSPORT_GOOD)
+       if (result)
                return result;
 
        result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
                                       data, 64, NULL);
        *status = data[0];
-       return (result == USB_STOR_XFER_GOOD ?
-                       USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
+       return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
 }
 
 static int
@@ -703,6 +709,13 @@ sddr09_read_data(struct us_data *us,
        unsigned int len, index, offset;
        int result;
 
+       // Figure out the initial LBA and page
+       lba = address >> info->blockshift;
+       page = (address & info->blockmask);
+       maxlba = info->capacity >> (info->pageshift + info->blockshift);
+       if (lba >= maxlba)
+               return -EIO;
+
        // Since we only read in one block at a time, we have to create
        // a bounce buffer and move the data a piece at a time between the
        // bounce buffer and the actual transfer buffer.
@@ -711,18 +724,13 @@ sddr09_read_data(struct us_data *us,
        buffer = kmalloc(len, GFP_NOIO);
        if (buffer == NULL) {
                printk("sddr09_read_data: Out of memory\n");
-               return USB_STOR_TRANSPORT_ERROR;
+               return -ENOMEM;
        }
 
-       // Figure out the initial LBA and page
-       lba = address >> info->blockshift;
-       page = (address & info->blockmask);
-       maxlba = info->capacity >> (info->pageshift + info->blockshift);
-
        // This could be made much more efficient by checking for
        // contiguous LBA's. Another exercise left to the student.
 
-       result = USB_STOR_TRANSPORT_GOOD;
+       result = 0;
        index = offset = 0;
 
        while (sectors > 0) {
@@ -735,7 +743,7 @@ sddr09_read_data(struct us_data *us,
                if (lba >= maxlba) {
                        US_DEBUGP("Error: Requested lba %u exceeds "
                                  "maximum %u\n", lba, maxlba);
-                       result = USB_STOR_TRANSPORT_ERROR;
+                       result = -EIO;
                        break;
                }
 
@@ -749,7 +757,7 @@ sddr09_read_data(struct us_data *us,
 
                        /* This is not really an error. It just means
                           that the block has never been written.
-                          Instead of returning USB_STOR_TRANSPORT_ERROR
+                          Instead of returning an error
                           it is better to return all zero data. */
 
                        memset(buffer, 0, len);
@@ -764,7 +772,7 @@ sddr09_read_data(struct us_data *us,
 
                        result = sddr09_read20(us, address>>1,
                                        pages, info->pageshift, buffer, 0);
-                       if (result != USB_STOR_TRANSPORT_GOOD)
+                       if (result)
                                break;
                }
 
@@ -830,7 +838,7 @@ sddr09_write_lba(struct us_data *us, unsigned int lba,
                pba = sddr09_find_unused_pba(info, lba);
                if (!pba) {
                        printk("sddr09_write_lba: Out of unused blocks\n");
-                       return USB_STOR_TRANSPORT_ERROR;
+                       return -ENOSPC;
                }
                info->pba_to_lba[pba] = lba;
                info->lba_to_pba[lba] = pba;
@@ -841,7 +849,7 @@ sddr09_write_lba(struct us_data *us, unsigned int lba,
                /* Maybe it is impossible to write to PBA 1.
                   Fake success, but don't do anything. */
                printk("sddr09: avoid writing to pba 1\n");
-               return USB_STOR_TRANSPORT_GOOD;
+               return 0;
        }
 
        pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
@@ -850,7 +858,7 @@ sddr09_write_lba(struct us_data *us, unsigned int lba,
        address = (pba << (info->pageshift + info->blockshift));
        result = sddr09_read22(us, address>>1, info->blocksize,
                               info->pageshift, blockbuffer, 0);
-       if (result != USB_STOR_TRANSPORT_GOOD)
+       if (result)
                return result;
 
        /* check old contents and fill lba */
@@ -897,7 +905,7 @@ sddr09_write_lba(struct us_data *us, unsigned int lba,
        {
                unsigned char status = 0;
                int result2 = sddr09_read_status(us, &status);
-               if (result2 != USB_STOR_TRANSPORT_GOOD)
+               if (result2)
                        US_DEBUGP("sddr09_write_inplace: cannot read status\n");
                else if (status != 0xc0)
                        US_DEBUGP("sddr09_write_inplace: status after write: 0x%x\n",
@@ -920,13 +928,20 @@ sddr09_write_data(struct us_data *us,
                  unsigned int sectors) {
 
        struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
-       unsigned int lba, page, pages;
+       unsigned int lba, maxlba, page, pages;
        unsigned int pagelen, blocklen;
        unsigned char *blockbuffer;
        unsigned char *buffer;
        unsigned int len, index, offset;
        int result;
 
+       // Figure out the initial LBA and page
+       lba = address >> info->blockshift;
+       page = (address & info->blockmask);
+       maxlba = info->capacity >> (info->pageshift + info->blockshift);
+       if (lba >= maxlba)
+               return -EIO;
+
        // blockbuffer is used for reading in the old data, overwriting
        // with the new data, and performing ECC calculations
 
@@ -938,7 +953,7 @@ sddr09_write_data(struct us_data *us,
        blockbuffer = kmalloc(blocklen, GFP_NOIO);
        if (!blockbuffer) {
                printk("sddr09_write_data: Out of memory\n");
-               return USB_STOR_TRANSPORT_ERROR;
+               return -ENOMEM;
        }
 
        // Since we don't write the user data directly to the device,
@@ -950,14 +965,10 @@ sddr09_write_data(struct us_data *us,
        if (buffer == NULL) {
                printk("sddr09_write_data: Out of memory\n");
                kfree(blockbuffer);
-               return USB_STOR_TRANSPORT_ERROR;
+               return -ENOMEM;
        }
 
-       // Figure out the initial LBA and page
-       lba = address >> info->blockshift;
-       page = (address & info->blockmask);
-
-       result = USB_STOR_TRANSPORT_GOOD;
+       result = 0;
        index = offset = 0;
 
        while (sectors > 0) {
@@ -967,13 +978,21 @@ sddr09_write_data(struct us_data *us,
                pages = min(sectors, info->blocksize - page);
                len = (pages << info->pageshift);
 
+               /* Not overflowing capacity? */
+               if (lba >= maxlba) {
+                       US_DEBUGP("Error: Requested lba %u exceeds "
+                                 "maximum %u\n", lba, maxlba);
+                       result = -EIO;
+                       break;
+               }
+
                // Get the data from the transfer buffer
                usb_stor_access_xfer_buf(buffer, len, us->srb,
                                &index, &offset, FROM_XFER_BUF);
 
                result = sddr09_write_lba(us, lba, page, pages,
                                buffer, blockbuffer);
-               if (result != USB_STOR_TRANSPORT_GOOD)
+               if (result)
                        break;
 
                page = 0;
@@ -1022,7 +1041,7 @@ sddr09_read_deviceID(struct us_data *us, unsigned char *deviceID) {
        command[1] = LUNBITS;
 
        result = sddr09_send_scsi_command(us, command, 12);
-       if (result != USB_STOR_TRANSPORT_GOOD)
+       if (result)
                return result;
 
        result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
@@ -1031,8 +1050,7 @@ sddr09_read_deviceID(struct us_data *us, unsigned char *deviceID) {
        for (i = 0; i < 4; i++)
                deviceID[i] = content[i];
 
-       return (result == USB_STOR_XFER_GOOD ?
-                       USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
+       return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
 }
 
 static int
@@ -1041,7 +1059,7 @@ sddr09_get_wp(struct us_data *us, struct sddr09_card_info *info) {
        unsigned char status;
 
        result = sddr09_read_status(us, &status);
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("sddr09_get_wp: read_status fails\n");
                return result;
        }
@@ -1057,7 +1075,7 @@ sddr09_get_wp(struct us_data *us, struct sddr09_card_info *info) {
        if (status & 0x1)
                US_DEBUGP(" Error");
        US_DEBUGP("\n");
-       return USB_STOR_TRANSPORT_GOOD;
+       return 0;
 }
 
 #if 0
@@ -1089,7 +1107,7 @@ sddr09_get_cardinfo(struct us_data *us, unsigned char flags) {
 
        result = sddr09_read_deviceID(us, deviceID);
 
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("Result of read_deviceID is %d\n", result);
                printk("sddr09: could not read card info\n");
                return NULL;
@@ -1200,7 +1218,7 @@ sddr09_read_map(struct us_data *us) {
                                us, address>>1,
                                min(alloc_blocks, numblocks - i),
                                buffer, 0);
-                       if (result != USB_STOR_TRANSPORT_GOOD) {
+                       if (result) {
                                result = -1;
                                goto done;
                        }
@@ -1342,29 +1360,53 @@ sddr09_card_info_destructor(void *extra) {
        kfree(info->pba_to_lba);
 }
 
-static void
-sddr09_init_card_info(struct us_data *us) {
-       if (!us->extra) {
-               us->extra = kmalloc(sizeof(struct sddr09_card_info), GFP_NOIO);
-               if (us->extra) {
-                       memset(us->extra, 0, sizeof(struct sddr09_card_info));
-                       us->extra_destructor = sddr09_card_info_destructor;
-               }
+static int
+sddr09_common_init(struct us_data *us) {
+       int result;
+
+       /* set the configuration -- STALL is an acceptable response here */
+       if (us->pusb_dev->actconfig->desc.bConfigurationValue != 1) {
+               US_DEBUGP("active config #%d != 1 ??\n", us->pusb_dev
+                               ->actconfig->desc.bConfigurationValue);
+               return -EINVAL;
+       }
+
+       result = usb_reset_configuration(us->pusb_dev);
+       US_DEBUGP("Result of usb_reset_configuration is %d\n", result);
+       if (result == -EPIPE) {
+               US_DEBUGP("-- stall on control interface\n");
+       } else if (result != 0) {
+               /* it's not a stall, but another error -- time to bail */
+               US_DEBUGP("-- Unknown error.  Rejecting device\n");
+               return -EINVAL;
        }
+
+       us->extra = kzalloc(sizeof(struct sddr09_card_info), GFP_NOIO);
+       if (!us->extra)
+               return -ENOMEM;
+       us->extra_destructor = sddr09_card_info_destructor;
+
+       nand_init_ecc();
+       return 0;
 }
 
+
 /*
  * This is needed at a very early stage. If this is not listed in the
  * unusual devices list but called from here then LUN 0 of the combo reader
  * is not recognized. But I do not know what precisely these calls do.
  */
 int
-sddr09_init(struct us_data *us) {
+usb_stor_sddr09_dpcm_init(struct us_data *us) {
        int result;
        unsigned char *data = us->iobuf;
 
+       result = sddr09_common_init(us);
+       if (result)
+               return result;
+
        result = sddr09_send_command(us, 0x01, USB_DIR_IN, data, 2);
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("sddr09_init: send_command fails\n");
                return result;
        }
@@ -1373,7 +1415,7 @@ sddr09_init(struct us_data *us) {
        // get 07 02
 
        result = sddr09_send_command(us, 0x08, USB_DIR_IN, data, 2);
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("sddr09_init: 2nd send_command fails\n");
                return result;
        }
@@ -1382,7 +1424,7 @@ sddr09_init(struct us_data *us) {
        // get 07 00
 
        result = sddr09_request_sense(us, data, 18);
-       if (result == USB_STOR_TRANSPORT_GOOD && data[2] != 0) {
+       if (result == 0 && data[2] != 0) {
                int j;
                for (j=0; j<18; j++)
                        printk(" %02X", data[j]);
@@ -1398,7 +1440,7 @@ sddr09_init(struct us_data *us) {
 
        // test unit ready
 
-       return USB_STOR_TRANSPORT_GOOD;         /* not result */
+       return 0;               /* not result */
 }
 
 /*
@@ -1427,13 +1469,6 @@ int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
        };
 
        info = (struct sddr09_card_info *)us->extra;
-       if (!info) {
-               nand_init_ecc();
-               sddr09_init_card_info(us);
-               info = (struct sddr09_card_info *)us->extra;
-               if (!info)
-                       return USB_STOR_TRANSPORT_ERROR;
-       }
 
        if (srb->cmnd[0] == REQUEST_SENSE && havefakesense) {
                /* for a faked command, we have to follow with a faked sense */
@@ -1536,7 +1571,9 @@ int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
                US_DEBUGP("READ_10: read page %d pagect %d\n",
                          page, pages);
 
-               return sddr09_read_data(us, page, pages);
+               result = sddr09_read_data(us, page, pages);
+               return (result == 0 ? USB_STOR_TRANSPORT_GOOD :
+                               USB_STOR_TRANSPORT_ERROR);
        }
 
        if (srb->cmnd[0] == WRITE_10) {
@@ -1549,7 +1586,9 @@ int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
                US_DEBUGP("WRITE_10: write page %d pagect %d\n",
                          page, pages);
 
-               return sddr09_write_data(us, page, pages);
+               result = sddr09_write_data(us, page, pages);
+               return (result == 0 ? USB_STOR_TRANSPORT_GOOD :
+                               USB_STOR_TRANSPORT_ERROR);
        }
 
        /* catch-all for all other commands, except
@@ -1575,10 +1614,10 @@ int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
        US_DEBUGP("SDDR09: Send control for command %s\n", ptr);
 
        result = sddr09_send_scsi_command(us, srb->cmnd, 12);
-       if (result != USB_STOR_TRANSPORT_GOOD) {
+       if (result) {
                US_DEBUGP("sddr09_transport: sddr09_send_scsi_command "
                          "returns %d\n", result);
-               return result;
+               return USB_STOR_TRANSPORT_ERROR;
        }
 
        if (srb->request_bufflen == 0)
@@ -1606,3 +1645,10 @@ int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
        return USB_STOR_TRANSPORT_GOOD;
 }
 
+/*
+ * Initialization routine for the sddr09 subdriver
+ */
+int
+usb_stor_sddr09_init(struct us_data *us) {
+       return sddr09_common_init(us);
+}
index c9d78d6188b1b33ce9c21d22777e845e22047772..c03089a9ec3899b33e6582852b41e6bcd4127488 100644 (file)
 
 extern int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us);
 
-struct sddr09_card_info {
-       unsigned long   capacity;       /* Size of card in bytes */
-       int             pagesize;       /* Size of page in bytes */
-       int             pageshift;      /* log2 of pagesize */
-       int             blocksize;      /* Size of block in pages */
-       int             blockshift;     /* log2 of blocksize */
-       int             blockmask;      /* 2^blockshift - 1 */
-       int             *lba_to_pba;    /* logical to physical map */
-       int             *pba_to_lba;    /* physical to logical map */
-       int             lbact;          /* number of available pages */
-       int             flags;
-#define        SDDR09_WP       1               /* write protected */
-};
+extern int usb_stor_sddr09_dpcm_init(struct us_data *us);
+extern int usb_stor_sddr09_init(struct us_data *us);
 
 #endif
index 0a362cc781ad48676063d7b4b88dc0d2d90fc3bf..633a715850a43fe6f7654ee7cb659575b51c4acd 100644 (file)
 #ifndef _TRANSPORT_H_
 #define _TRANSPORT_H_
 
-#include <linux/config.h>
 #include <linux/blkdev.h>
 
-/* Protocols */
-
-#define US_PR_CBI      0x00            /* Control/Bulk/Interrupt */
-#define US_PR_CB       0x01            /* Control/Bulk w/o interrupt */
-#define US_PR_BULK     0x50            /* bulk only */
-#ifdef CONFIG_USB_STORAGE_USBAT
-#define US_PR_USBAT    0x80            /* SCM-ATAPI bridge */
-#endif
-#ifdef CONFIG_USB_STORAGE_SDDR09
-#define US_PR_EUSB_SDDR09      0x81    /* SCM-SCSI bridge for SDDR-09 */
-#endif
-#ifdef CONFIG_USB_STORAGE_SDDR55
-#define US_PR_SDDR55   0x82            /* SDDR-55 (made up) */
-#endif
-#define US_PR_DPCM_USB  0xf0           /* Combination CB/SDDR09 */
-
-#ifdef CONFIG_USB_STORAGE_FREECOM
-#define US_PR_FREECOM   0xf1           /* Freecom */
-#endif
-
-#ifdef CONFIG_USB_STORAGE_DATAFAB
-#define US_PR_DATAFAB   0xf2           /* Datafab chipsets */
-#endif
-
-#ifdef CONFIG_USB_STORAGE_JUMPSHOT
-#define US_PR_JUMPSHOT  0xf3           /* Lexar Jumpshot */
-#endif
-
-#define US_PR_DEVICE   0xff            /* Use device's value */
-
 /*
  * Bulk only data structures
  */
index 0a9858f69a9b86ac8363105069d3f46d64f7bc36..dc301e567cfc6c6ec5037b7ff26246d72276e09b 100644 (file)
@@ -79,13 +79,6 @@ UNUSUAL_DEV(  0x03f0, 0x0307, 0x0001, 0x0001,
                US_SC_8070, US_PR_USBAT, init_usbat, 0),
 #endif
 
-/* Patch submitted by Mihnea-Costin Grigore <mihnea@zulu.ro> */
-UNUSUAL_DEV(  0x040d, 0x6205, 0x0003, 0x0003,
-               "VIA Technologies Inc.",
-               "USB 2.0 Card Reader",
-               US_SC_DEVICE, US_PR_DEVICE, NULL,
-               US_FL_IGNORE_RESIDUE ),
-
 /* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net>
  * and Olaf Hering <olh@suse.de> (different bcd's, same vendor/product)
  * for USB floppies that need the SINGLE_LUN enforcement.
@@ -96,6 +89,13 @@ UNUSUAL_DEV(  0x0409, 0x0040, 0x0000, 0x9999,
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_SINGLE_LUN ),
 
+/* Patch submitted by Mihnea-Costin Grigore <mihnea@zulu.ro> */
+UNUSUAL_DEV(  0x040d, 0x6205, 0x0003, 0x0003,
+               "VIA Technologies Inc.",
+               "USB 2.0 Card Reader",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_IGNORE_RESIDUE ),
+
 /* Deduced by Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
  * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message
  * always fails and confuses drive.
@@ -187,6 +187,14 @@ UNUSUAL_DEV(  0x04b0, 0x0405, 0x0100, 0x0100,
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_FIX_CAPACITY),
 
+/* Patch for Nikon coolpix 2000
+ * Submitted by Fabien Cosse <fabien.cosse@wanadoo.fr>*/
+UNUSUAL_DEV(  0x04b0, 0x0301, 0x0010, 0x0010,
+               "NIKON",
+               "NIKON DSC E2000",
+               US_SC_DEVICE, US_PR_DEVICE,NULL,
+               US_FL_NOT_LOCKABLE ),
+
 /* BENQ DC5330
  * Reported by Manuel Fombuena <mfombuena@ya.com> and
  * Frank Copeland <fjc@thingy.apana.org.au> */
@@ -276,14 +284,14 @@ UNUSUAL_DEV(  0x04e6, 0x0002, 0x0100, 0x0100,
 UNUSUAL_DEV(  0x04e6, 0x0003, 0x0000, 0x9999, 
                "Sandisk",
                "ImageMate SDDR09",
-               US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
-               US_FL_SINGLE_LUN ),
+               US_SC_SCSI, US_PR_EUSB_SDDR09, usb_stor_sddr09_init,
+               0),
 
 /* This entry is from Andries.Brouwer@cwi.nl */
 UNUSUAL_DEV(  0x04e6, 0x0005, 0x0100, 0x0208,
                "SCM Microsystems",
                "eUSB SmartMedia / CompactFlash Adapter",
-               US_SC_SCSI, US_PR_DPCM_USB, sddr09_init, 
+               US_SC_SCSI, US_PR_DPCM_USB, usb_stor_sddr09_dpcm_init,
                0), 
 #endif
 
@@ -527,6 +535,13 @@ UNUSUAL_DEV(  0x057b, 0x0022, 0x0000, 0x9999,
                "Silicon Media R/W",
                US_SC_DEVICE, US_PR_DEVICE, NULL, 0),
 
+#ifdef CONFIG_USB_STORAGE_ALAUDA
+UNUSUAL_DEV(  0x0584, 0x0008, 0x0102, 0x0102,
+               "Fujifilm",
+               "DPC-R1 (Alauda)",
+               US_SC_SCSI, US_PR_ALAUDA, init_alauda, 0 ),
+#endif
+
 /* Fabrizio Fellini <fello@libero.it> */
 UNUSUAL_DEV(  0x0595, 0x4343, 0x0000, 0x2210,
                "Fujifilm",
@@ -673,8 +688,8 @@ UNUSUAL_DEV(  0x0644, 0x0000, 0x0100, 0x0100,
 UNUSUAL_DEV(  0x066b, 0x0105, 0x0100, 0x0100, 
                "Olympus",
                "Camedia MAUSB-2",
-               US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
-               US_FL_SINGLE_LUN ),
+               US_SC_SCSI, US_PR_EUSB_SDDR09, usb_stor_sddr09_init,
+               0),
 #endif
 
 /* Reported by Darsen Lu <darsen@micro.ee.nthu.edu.tw> */
@@ -739,8 +754,8 @@ UNUSUAL_DEV(  0x0781, 0x0100, 0x0100, 0x0100,
 UNUSUAL_DEV(  0x0781, 0x0200, 0x0000, 0x9999, 
                "Sandisk",
                "ImageMate SDDR-09",
-               US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
-               US_FL_SINGLE_LUN ),
+               US_SC_SCSI, US_PR_EUSB_SDDR09, usb_stor_sddr09_init,
+               0),
 #endif
 
 #ifdef CONFIG_USB_STORAGE_FREECOM
@@ -776,6 +791,13 @@ UNUSUAL_DEV(  0x07af, 0x0006, 0x0100, 0x0100,
                US_SC_SCSI, US_PR_DPCM_USB, NULL, 0 ),
 #endif
 
+#ifdef CONFIG_USB_STORAGE_ALAUDA
+UNUSUAL_DEV(  0x07b4, 0x010a, 0x0102, 0x0102,
+               "Olympus",
+               "MAUSB-10 (Alauda)",
+               US_SC_SCSI, US_PR_ALAUDA, init_alauda, 0 ),
+#endif
+
 #ifdef CONFIG_USB_STORAGE_DATAFAB
 UNUSUAL_DEV(  0x07c4, 0xa000, 0x0000, 0x0015,
                "Datafab",
@@ -1118,6 +1140,15 @@ UNUSUAL_DEV(  0x2735, 0x100b, 0x0000, 0x9999,
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_GO_SLOW ),
 
+/*
+ * David Härdeman <david@2gen.com>
+ * The key makes the SCSI stack print confusing (but harmless) messages
+ */
+UNUSUAL_DEV(  0x4146, 0xba01, 0x0100, 0x0100,
+               "Iomega",
+               "Micro Mini 1GB",
+               US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
+
 #ifdef CONFIG_USB_STORAGE_SDDR55
 UNUSUAL_DEV(  0x55aa, 0xa103, 0x0000, 0x9999, 
                "Sandisk",
@@ -1125,3 +1156,27 @@ UNUSUAL_DEV(  0x55aa, 0xa103, 0x0000, 0x9999,
                US_SC_SCSI, US_PR_SDDR55, NULL,
                US_FL_SINGLE_LUN),
 #endif
+
+/* Control/Bulk transport for all SubClass values */
+USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_QIC, US_PR_CB, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_UFI, US_PR_CB, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_8070, US_PR_CB, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_SCSI, US_PR_CB, USB_US_TYPE_STOR),
+
+/* Control/Bulk/Interrupt transport for all SubClass values */
+USUAL_DEV(US_SC_RBC, US_PR_CBI, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_8020, US_PR_CBI, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_QIC, US_PR_CBI, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_UFI, US_PR_CBI, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_8070, US_PR_CBI, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_SCSI, US_PR_CBI, USB_US_TYPE_STOR),
+
+/* Bulk-only transport for all SubClass values */
+USUAL_DEV(US_SC_RBC, US_PR_BULK, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_8020, US_PR_BULK, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_QIC, US_PR_BULK, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_UFI, US_PR_BULK, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_8070, US_PR_BULK, USB_US_TYPE_STOR),
+USUAL_DEV(US_SC_SCSI, US_PR_BULK, 0),
index 3847ebed2aa439792bbcd7c69dacdf47654fe1ae..dbcf23980ff13f3f305857b78f297c1838940d69 100644 (file)
@@ -94,6 +94,9 @@
 #ifdef CONFIG_USB_STORAGE_ONETOUCH
 #include "onetouch.h"
 #endif
+#ifdef CONFIG_USB_STORAGE_ALAUDA
+#include "alauda.h"
+#endif
 
 /* Some informational data */
 MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>");
@@ -112,49 +115,33 @@ static atomic_t total_threads = ATOMIC_INIT(0);
 static DECLARE_COMPLETION(threads_gone);
 
 
-/* The entries in this table, except for final ones here
- * (USB_MASS_STORAGE_CLASS and the empty entry), correspond,
- * line for line with the entries of us_unsuaul_dev_list[].
+/*
+ * The entries in this table correspond, line for line,
+ * with the entries of us_unusual_dev_list[].
  */
+#ifndef CONFIG_USB_LIBUSUAL
 
 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
                    vendorName, productName,useProtocol, useTransport, \
                    initFunction, flags) \
-{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax) }
+{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax), \
+  .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
+
+#define USUAL_DEV(useProto, useTrans, useType) \
+{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \
+  .driver_info = (USB_US_TYPE_STOR<<24) }
 
 static struct usb_device_id storage_usb_ids [] = {
 
 #      include "unusual_devs.h"
 #undef UNUSUAL_DEV
-       /* Control/Bulk transport for all SubClass values */
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_CB) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020, US_PR_CB) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC, US_PR_CB) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI, US_PR_CB) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070, US_PR_CB) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI, US_PR_CB) },
-
-       /* Control/Bulk/Interrupt transport for all SubClass values */
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_CBI) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020, US_PR_CBI) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC, US_PR_CBI) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI, US_PR_CBI) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070, US_PR_CBI) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI, US_PR_CBI) },
-
-       /* Bulk-only transport for all SubClass values */
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_BULK) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020, US_PR_BULK) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC, US_PR_BULK) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI, US_PR_BULK) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070, US_PR_BULK) },
-       { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI, US_PR_BULK) },
-
+#undef USUAL_DEV
        /* Terminating entry */
        { }
 };
 
 MODULE_DEVICE_TABLE (usb, storage_usb_ids);
+#endif /* CONFIG_USB_LIBUSUAL */
 
 /* This is the list of devices we recognize, along with their flag data */
 
@@ -167,7 +154,6 @@ MODULE_DEVICE_TABLE (usb, storage_usb_ids);
  * are free to use as many characters as you like.
  */
 
-#undef UNUSUAL_DEV
 #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
                    vendor_name, product_name, use_protocol, use_transport, \
                    init_function, Flags) \
@@ -177,53 +163,18 @@ MODULE_DEVICE_TABLE (usb, storage_usb_ids);
        .useProtocol = use_protocol,    \
        .useTransport = use_transport,  \
        .initFunction = init_function,  \
-       .flags = Flags, \
+}
+
+#define USUAL_DEV(use_protocol, use_transport, use_type) \
+{ \
+       .useProtocol = use_protocol,    \
+       .useTransport = use_transport,  \
 }
 
 static struct us_unusual_dev us_unusual_dev_list[] = {
 #      include "unusual_devs.h" 
 #      undef UNUSUAL_DEV
-       /* Control/Bulk transport for all SubClass values */
-       { .useProtocol = US_SC_RBC,
-         .useTransport = US_PR_CB},
-       { .useProtocol = US_SC_8020,
-         .useTransport = US_PR_CB},
-       { .useProtocol = US_SC_QIC,
-         .useTransport = US_PR_CB},
-       { .useProtocol = US_SC_UFI,
-         .useTransport = US_PR_CB},
-       { .useProtocol = US_SC_8070,
-         .useTransport = US_PR_CB},
-       { .useProtocol = US_SC_SCSI,
-         .useTransport = US_PR_CB},
-
-       /* Control/Bulk/Interrupt transport for all SubClass values */
-       { .useProtocol = US_SC_RBC,
-         .useTransport = US_PR_CBI},
-       { .useProtocol = US_SC_8020,
-         .useTransport = US_PR_CBI},
-       { .useProtocol = US_SC_QIC,
-         .useTransport = US_PR_CBI},
-       { .useProtocol = US_SC_UFI,
-         .useTransport = US_PR_CBI},
-       { .useProtocol = US_SC_8070,
-         .useTransport = US_PR_CBI},
-       { .useProtocol = US_SC_SCSI,
-         .useTransport = US_PR_CBI},
-
-       /* Bulk-only transport for all SubClass values */
-       { .useProtocol = US_SC_RBC,
-         .useTransport = US_PR_BULK},
-       { .useProtocol = US_SC_8020,
-         .useTransport = US_PR_BULK},
-       { .useProtocol = US_SC_QIC,
-         .useTransport = US_PR_BULK},
-       { .useProtocol = US_SC_UFI,
-         .useTransport = US_PR_BULK},
-       { .useProtocol = US_SC_8070,
-         .useTransport = US_PR_BULK},
-       { .useProtocol = US_SC_SCSI,
-         .useTransport = US_PR_BULK},
+#      undef USUAL_DEV
 
        /* Terminating entry */
        { NULL }
@@ -240,6 +191,8 @@ static int storage_suspend(struct usb_interface *iface, pm_message_t message)
        down(&us->dev_semaphore);
 
        US_DEBUGP("%s\n", __FUNCTION__);
+       if (us->suspend_resume_hook)
+               (us->suspend_resume_hook)(us, US_SUSPEND);
        iface->dev.power.power_state.event = message.event;
 
        /* When runtime PM is working, we'll set a flag to indicate
@@ -256,6 +209,8 @@ static int storage_resume(struct usb_interface *iface)
        down(&us->dev_semaphore);
 
        US_DEBUGP("%s\n", __FUNCTION__);
+       if (us->suspend_resume_hook)
+               (us->suspend_resume_hook)(us, US_RESUME);
        iface->dev.power.power_state.event = PM_EVENT_ON;
 
        up(&us->dev_semaphore);
@@ -484,14 +439,20 @@ static int associate_dev(struct us_data *us, struct usb_interface *intf)
        return 0;
 }
 
+/* Find an unusual_dev descriptor (always succeeds in the current code) */
+static struct us_unusual_dev *find_unusual(const struct usb_device_id *id)
+{
+       const int id_index = id - storage_usb_ids;
+       return &us_unusual_dev_list[id_index];
+}
+
 /* Get the unusual_devs entries and the string descriptors */
-static void get_device_info(struct us_data *us, int id_index)
+static void get_device_info(struct us_data *us, const struct usb_device_id *id)
 {
        struct usb_device *dev = us->pusb_dev;
        struct usb_interface_descriptor *idesc =
                &us->pusb_intf->cur_altsetting->desc;
-       struct us_unusual_dev *unusual_dev = &us_unusual_dev_list[id_index];
-       struct usb_device_id *id = &storage_usb_ids[id_index];
+       struct us_unusual_dev *unusual_dev = find_unusual(id);
 
        /* Store the entries */
        us->unusual_dev = unusual_dev;
@@ -501,7 +462,7 @@ static void get_device_info(struct us_data *us, int id_index)
        us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ?
                        idesc->bInterfaceProtocol :
                        unusual_dev->useTransport;
-       us->flags = unusual_dev->flags;
+       us->flags = USB_US_ORIG_FLAGS(id->driver_info);
 
        /*
         * This flag is only needed when we're in high-speed, so let's
@@ -516,7 +477,7 @@ static void get_device_info(struct us_data *us, int id_index)
         * from the unusual_devs.h table.
         */
        if (id->idVendor || id->idProduct) {
-               static char *msgs[3] = {
+               static const char *msgs[3] = {
                        "an unneeded SubClass entry",
                        "an unneeded Protocol entry",
                        "unneeded SubClass and Protocol entries"};
@@ -529,7 +490,7 @@ static void get_device_info(struct us_data *us, int id_index)
                if (unusual_dev->useTransport != US_PR_DEVICE &&
                        us->protocol == idesc->bInterfaceProtocol)
                        msg += 2;
-               if (msg >= 0 && !(unusual_dev->flags & US_FL_NEED_OVERRIDE))
+               if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE))
                        printk(KERN_NOTICE USB_STORAGE "This device "
                                "(%04x,%04x,%04x S %02x P %02x)"
                                " has %s in unusual_devs.h\n"
@@ -686,6 +647,15 @@ static int get_protocol(struct us_data *us)
                break;
 #endif
 
+#ifdef CONFIG_USB_STORAGE_ALAUDA
+       case US_PR_ALAUDA:
+               us->transport_name  = "Alauda Control/Bulk";
+               us->transport = alauda_transport;
+               us->transport_reset = usb_stor_Bulk_reset;
+               us->max_lun = 1;
+               break;
+#endif
+
        default:
                return -EIO;
        }
@@ -921,10 +891,12 @@ static int storage_probe(struct usb_interface *intf,
 {
        struct Scsi_Host *host;
        struct us_data *us;
-       const int id_index = id - storage_usb_ids; 
        int result;
        struct task_struct *th;
 
+       if (usb_usual_check_type(id, USB_US_TYPE_STOR))
+               return -ENXIO;
+
        US_DEBUGP("USB Mass Storage device detected\n");
 
        /*
@@ -957,29 +929,7 @@ static int storage_probe(struct usb_interface *intf,
         * of the match from the usb_device_id table, so we can find the
         * corresponding entry in the private table.
         */
-       get_device_info(us, id_index);
-
-#ifdef CONFIG_USB_STORAGE_SDDR09
-       if (us->protocol == US_PR_EUSB_SDDR09 ||
-                       us->protocol == US_PR_DPCM_USB) {
-               /* set the configuration -- STALL is an acceptable response here */
-               if (us->pusb_dev->actconfig->desc.bConfigurationValue != 1) {
-                       US_DEBUGP("active config #%d != 1 ??\n", us->pusb_dev
-                               ->actconfig->desc.bConfigurationValue);
-                       goto BadDevice;
-               }
-               result = usb_reset_configuration(us->pusb_dev);
-
-               US_DEBUGP("Result of usb_reset_configuration is %d\n", result);
-               if (result == -EPIPE) {
-                       US_DEBUGP("-- stall on control interface\n");
-               } else if (result != 0) {
-                       /* it's not a stall, but another error -- time to bail */
-                       US_DEBUGP("-- Unknown error.  Rejecting device\n");
-                       goto BadDevice;
-               }
-       }
-#endif
+       get_device_info(us, id);
 
        /* Get the transport, protocol, and pipe settings */
        result = get_transport(us);
@@ -1044,7 +994,6 @@ static void storage_disconnect(struct usb_interface *intf)
  ***********************************************************************/
 
 static struct usb_driver usb_storage_driver = {
-       .owner =        THIS_MODULE,
        .name =         "usb-storage",
        .probe =        storage_probe,
        .disconnect =   storage_disconnect,
@@ -1062,9 +1011,10 @@ static int __init usb_stor_init(void)
 
        /* register the driver, return usb_register return code if error */
        retval = usb_register(&usb_storage_driver);
-       if (retval == 0)
+       if (retval == 0) {
                printk(KERN_INFO "USB Mass Storage support registered.\n");
-
+               usb_usual_set_present(USB_US_TYPE_STOR);
+       }
        return retval;
 }
 
@@ -1088,6 +1038,8 @@ static void __exit usb_stor_exit(void)
                wait_for_completion(&threads_gone);
                atomic_dec(&total_threads);
        }
+
+       usb_usual_clear_present(USB_US_TYPE_STOR);
 }
 
 module_init(usb_stor_init);
index 98b09711a73957a8b02a32dccaf6d1c13312825c..7259fd1f6b0d2672a10567d41a3037b741903dda 100644 (file)
@@ -45,6 +45,7 @@
 #define _USB_H_
 
 #include <linux/usb.h>
+#include <linux/usb_usual.h>
 #include <linux/blkdev.h>
 #include <linux/smp_lock.h>
 #include <linux/completion.h>
@@ -63,38 +64,8 @@ struct us_unusual_dev {
        __u8  useProtocol;
        __u8  useTransport;
        int (*initFunction)(struct us_data *);
-       unsigned int flags;
 };
 
-/*
- * Static flag definitions.  We use this roundabout technique so that the
- * proc_info() routine can automatically display a message for each flag.
- */
-#define US_DO_ALL_FLAGS                                                \
-       US_FLAG(SINGLE_LUN,     0x00000001)                     \
-               /* allow access to only LUN 0 */                \
-       US_FLAG(NEED_OVERRIDE,  0x00000002)                     \
-               /* unusual_devs entry is necessary */           \
-       US_FLAG(SCM_MULT_TARG,  0x00000004)                     \
-               /* supports multiple targets */                 \
-       US_FLAG(FIX_INQUIRY,    0x00000008)                     \
-               /* INQUIRY response needs faking */             \
-       US_FLAG(FIX_CAPACITY,   0x00000010)                     \
-               /* READ CAPACITY response too big */            \
-       US_FLAG(IGNORE_RESIDUE, 0x00000020)                     \
-               /* reported residue is wrong */                 \
-       US_FLAG(BULK32,         0x00000040)                     \
-               /* Uses 32-byte CBW length */                   \
-       US_FLAG(NOT_LOCKABLE,   0x00000080)                     \
-               /* PREVENT/ALLOW not supported */               \
-       US_FLAG(GO_SLOW,        0x00000100)                     \
-               /* Need delay after Command phase */            \
-       US_FLAG(NO_WP_DETECT,   0x00000200)                     \
-               /* Don't check for write-protect */             \
-
-#define US_FLAG(name, value)   US_FL_##name = value ,
-enum { US_DO_ALL_FLAGS };
-#undef US_FLAG
 
 /* Dynamic flag definitions: used in set_bit() etc. */
 #define US_FLIDX_URB_ACTIVE    18  /* 0x00040000  current_urb is in use  */
@@ -122,7 +93,11 @@ enum { US_DO_ALL_FLAGS };
 typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*);
 typedef int (*trans_reset)(struct us_data*);
 typedef void (*proto_cmnd)(struct scsi_cmnd*, struct us_data*);
-typedef void (*extra_data_destructor)(void *);  /* extra data destructor   */
+typedef void (*extra_data_destructor)(void *); /* extra data destructor */
+typedef void (*pm_hook)(struct us_data *, int);        /* power management hook */
+
+#define US_SUSPEND     0
+#define US_RESUME      1
 
 /* we allocate one of these for every device that we remember */
 struct us_data {
@@ -178,6 +153,9 @@ struct us_data {
        /* subdriver information */
        void                    *extra;          /* Any extra data          */
        extra_data_destructor   extra_destructor;/* extra data destructor   */
+#ifdef CONFIG_PM
+       pm_hook                 suspend_resume_hook;
+#endif
 };
 
 /* Convert between us_data and the corresponding Scsi_Host */
index 6c3a53f8f26c6fcb0456c846d012a9f5989cddc8..5d02f16b7d0e7b007720486d7f2722b37f58f85e 100644 (file)
@@ -39,10 +39,15 @@ MODULE_DEVICE_TABLE (usb, skel_table);
 /* Get a minor range for your devices from the usb maintainer */
 #define USB_SKEL_MINOR_BASE    192
 
+/* our private defines. if this grows any larger, use your own .h file */
+#define MAX_TRANSFER           ( PAGE_SIZE - 512 )
+#define WRITES_IN_FLIGHT       8
+
 /* Structure to hold all of our device specific stuff */
 struct usb_skel {
        struct usb_device *     udev;                   /* the usb device for this device */
        struct usb_interface *  interface;              /* the interface for this device */
+       struct semaphore        limit_sem;              /* limiting the number of writes in progress */
        unsigned char *         bulk_in_buffer;         /* the buffer to receive data */
        size_t                  bulk_in_size;           /* the size of the receive buffer */
        __u8                    bulk_in_endpointAddr;   /* the address of the bulk in endpoint */
@@ -152,6 +157,7 @@ static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
        /* free up our allocated buffer */
        usb_buffer_free(urb->dev, urb->transfer_buffer_length, 
                        urb->transfer_buffer, urb->transfer_dma);
+       up(&dev->limit_sem);
 }
 
 static ssize_t skel_write(struct file *file, const char *user_buffer, size_t count, loff_t *ppos)
@@ -160,6 +166,7 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
        int retval = 0;
        struct urb *urb = NULL;
        char *buf = NULL;
+       size_t writesize = min(count, (size_t)MAX_TRANSFER);
 
        dev = (struct usb_skel *)file->private_data;
 
@@ -167,6 +174,12 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
        if (count == 0)
                goto exit;
 
+       /* limit the number of URBs in flight to stop a user from using up all RAM */
+       if (down_interruptible(&dev->limit_sem)) {
+               retval = -ERESTARTSYS;
+               goto exit;
+       }
+
        /* create a urb, and a buffer for it, and copy the data to the urb */
        urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!urb) {
@@ -174,13 +187,13 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
                goto error;
        }
 
-       buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
+       buf = usb_buffer_alloc(dev->udev, writesize, GFP_KERNEL, &urb->transfer_dma);
        if (!buf) {
                retval = -ENOMEM;
                goto error;
        }
 
-       if (copy_from_user(buf, user_buffer, count)) {
+       if (copy_from_user(buf, user_buffer, writesize)) {
                retval = -EFAULT;
                goto error;
        }
@@ -188,7 +201,7 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
        /* initialize the urb properly */
        usb_fill_bulk_urb(urb, dev->udev,
                          usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
-                         buf, count, skel_write_bulk_callback, dev);
+                         buf, writesize, skel_write_bulk_callback, dev);
        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
        /* send the data out the bulk port */
@@ -202,11 +215,12 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
        usb_free_urb(urb);
 
 exit:
-       return count;
+       return writesize;
 
 error:
-       usb_buffer_free(dev->udev, count, buf, urb->transfer_dma);
+       usb_buffer_free(dev->udev, writesize, buf, urb->transfer_dma);
        usb_free_urb(urb);
+       up(&dev->limit_sem);
        return retval;
 }
 
@@ -238,13 +252,13 @@ static int skel_probe(struct usb_interface *interface, const struct usb_device_i
        int retval = -ENOMEM;
 
        /* allocate memory for our device state and initialize it */
-       dev = kmalloc(sizeof(*dev), GFP_KERNEL);
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (dev == NULL) {
                err("Out of memory");
                goto error;
        }
-       memset(dev, 0x00, sizeof(*dev));
        kref_init(&dev->kref);
+       sema_init(&dev->limit_sem, WRITES_IN_FLIGHT);
 
        dev->udev = usb_get_dev(interface_to_usbdev(interface));
        dev->interface = interface;
@@ -330,7 +344,6 @@ static void skel_disconnect(struct usb_interface *interface)
 }
 
 static struct usb_driver skel_driver = {
-       .owner =        THIS_MODULE,
        .name =         "skeleton",
        .probe =        skel_probe,
        .disconnect =   skel_disconnect,
index 25b6ca6ad081a17d4c69ffe11cd388595a530291..cc8e3bf5001b44e5393ae7783427fe2ad3204cbf 100644 (file)
@@ -534,9 +534,15 @@ config FB_SUN3
        bool "Sun3 framebuffer support"
        depends on (FB = y) && (SUN3 || SUN3X) && BROKEN
 
+config FB_SBUS
+       bool "SBUS and UPA framebuffers"
+       depends on (FB = y) && SPARC
+       help
+         Say Y if you want support for SBUS or UPA based frame buffer device.
+
 config FB_BW2
        bool "BWtwo support"
-       depends on (FB = y) && ((SPARC32 || SPARC64) && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -545,7 +551,8 @@ config FB_BW2
 
 config FB_CG3
        bool "CGthree support"
-       depends on (FB = y) && ((SPARC32 || SPARC64) && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
        help
@@ -553,7 +560,7 @@ config FB_CG3
 
 config FB_CG6
        bool "CGsix (GX,TurboGX) support"
-       depends on (FB = y) && ((SPARC32 || SPARC64) && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
        help
@@ -1210,12 +1217,6 @@ config FB_AU1100
 
 source "drivers/video/geode/Kconfig"
 
-config FB_SBUS
-       bool "SBUS and UPA framebuffers"
-       depends on (FB = y) && (SPARC32 || SPARC64)
-       help
-         Say Y if you want support for SBUS or UPA based frame buffer device.
-
 config FB_FFB
        bool "Creator/Creator3D/Elite3D support"
        depends on FB_SBUS && SPARC64
@@ -1267,7 +1268,7 @@ config FB_LEO
 
 config FB_PCI
        bool "PCI framebuffers"
-       depends on (FB = y) && PCI && (SPARC64 || SPARC32)
+       depends on (FB = y) && PCI && SPARC
 
 config FB_IGA
        bool "IGA 168x display support"
index 080db812ca487a1a4febf2c0781e58524485e213..2784f0a9d693a20144d260468da19c8468003324 100644 (file)
@@ -441,7 +441,7 @@ static int arcfb_ioctl(struct inode *inode, struct file *file,
  * 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,
+static ssize_t arcfb_write(struct file *file, const char __user *buf, size_t count,
                                loff_t *ppos)
 {
        /* modded from epson 1355 */
index 4f01ccc02aa4c47750a22a5d338641aa86442b3e..156db84cb36371aa4709b293b25492e49b71f099 100644 (file)
@@ -594,7 +594,7 @@ static int __devinit radeon_probe_pll_params(struct radeonfb_info *rinfo)
 }
 
 /*
- * Retreive PLL infos by different means (BIOS, Open Firmware, register probing...)
+ * Retrieve PLL infos by different means (BIOS, Open Firmware, register probing...)
  */
 static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
 {
@@ -660,17 +660,17 @@ static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
 
 #ifdef CONFIG_PPC_OF
        /*
-        * Retreive PLL infos from Open Firmware first
+        * Retrieve PLL infos from Open Firmware first
         */
                if (!force_measure_pll && radeon_read_xtal_OF(rinfo) == 0) {
-                       printk(KERN_INFO "radeonfb: Retreived PLL infos from Open Firmware\n");
+                       printk(KERN_INFO "radeonfb: Retrieved PLL infos from Open Firmware\n");
                goto found;
        }
 #endif /* CONFIG_PPC_OF */
 
        /*
         * Check out if we have an X86 which gave us some PLL informations
-        * and if yes, retreive them
+        * and if yes, retrieve them
         */
        if (!force_measure_pll && rinfo->bios_seg) {
                u16 pll_info_block = BIOS_IN16(rinfo->fp_bios_start + 0x30);
@@ -682,7 +682,7 @@ static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
                rinfo->pll.ppll_min     = BIOS_IN32(pll_info_block + 0x12);
                rinfo->pll.ppll_max     = BIOS_IN32(pll_info_block + 0x16);
 
-               printk(KERN_INFO "radeonfb: Retreived PLL infos from BIOS\n");
+               printk(KERN_INFO "radeonfb: Retrieved PLL infos from BIOS\n");
                goto found;
        }
 
@@ -691,7 +691,7 @@ static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
         * probe them
         */
        if (radeon_probe_pll_params(rinfo) == 0) {
-               printk(KERN_INFO "radeonfb: Retreived PLL infos from registers\n");
+               printk(KERN_INFO "radeonfb: Retrieved PLL infos from registers\n");
                goto found;
        }
 
@@ -702,7 +702,7 @@ static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
 
 found:
        /*
-        * Some methods fail to retreive SCLK and MCLK values, we apply default
+        * Some methods fail to retrieve SCLK and MCLK values, we apply default
         * settings in this case (200Mhz). If that really happne often, we could
         * fetch from registers instead...
         */
@@ -2393,7 +2393,7 @@ static int radeonfb_pci_register (struct pci_dev *pdev,
               rinfo->mapped_vram/1024);
 
        /*
-        * Map the BIOS ROM if any and retreive PLL parameters from
+        * Map the BIOS ROM if any and retrieve PLL parameters from
         * the BIOS. We skip that on mobility chips as the real panel
         * values we need aren't in the ROM but in the BIOS image in
         * memory. This is definitely not the best meacnism though,
index d3728f60961e75230a466aa94172bdb52a64cd42..9248fe1fbb1a45e36e650058c566971f9aa232d3 100644 (file)
@@ -121,7 +121,6 @@ struct bw2_par {
        unsigned long           fbsize;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 /**
index cdc71572cf356d26955ec256d42e6c1149663108..74415325b016db9d6e9e4f2e6983e188f28f0816 100644 (file)
@@ -64,8 +64,8 @@ bitcpy(unsigned long __iomem *dst, int dst_idx, const unsigned long __iomem *src
        int const shift = dst_idx-src_idx;
        int left, right;
 
-       first = ~0UL >> dst_idx;
-       last = ~(~0UL >> ((dst_idx+n) % bits));
+       first = FB_SHIFT_HIGH(~0UL, dst_idx);
+       last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits));
 
        if (!shift) {
                // Same alignment for source and dest
@@ -216,8 +216,8 @@ bitcpy_rev(unsigned long __iomem *dst, int dst_idx, const unsigned long __iomem
 
        shift = dst_idx-src_idx;
 
-       first = ~0UL << (bits - 1 - dst_idx);
-       last = ~(~0UL << (bits - 1 - ((dst_idx-n) % bits)));
+       first = FB_SHIFT_LOW(~0UL, bits - 1 - dst_idx);
+       last = ~(FB_SHIFT_LOW(~0UL, bits - 1 - ((dst_idx-n) % bits)));
 
        if (!shift) {
                // Same alignment for source and dest
index 167d9314e6eb49c6ae25683e940563ef92f6ca1c..e5ff62e9cfb81c1952823c99ea4b4be17c8e9761 100644 (file)
@@ -110,8 +110,8 @@ bitfill_aligned(unsigned long __iomem *dst, int dst_idx, unsigned long pat, unsi
        if (!n)
                return;
 
-       first = ~0UL >> dst_idx;
-       last = ~(~0UL >> ((dst_idx+n) % bits));
+       first = FB_SHIFT_HIGH(~0UL, dst_idx);
+       last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits));
 
        if (dst_idx+n <= bits) {
                // Single word
@@ -167,8 +167,8 @@ bitfill_unaligned(unsigned long __iomem *dst, int dst_idx, unsigned long pat,
        if (!n)
                return;
 
-       first = ~0UL >> dst_idx;
-       last = ~(~0UL >> ((dst_idx+n) % bits));
+       first = FB_SHIFT_HIGH(~0UL, dst_idx);
+       last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits));
 
        if (dst_idx+n <= bits) {
                // Single word
@@ -221,8 +221,8 @@ bitfill_aligned_rev(unsigned long __iomem *dst, int dst_idx, unsigned long pat,
        if (!n)
                return;
 
-       first = ~0UL >> dst_idx;
-       last = ~(~0UL >> ((dst_idx+n) % bits));
+       first = FB_SHIFT_HIGH(~0UL, dst_idx);
+       last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits));
 
        if (dst_idx+n <= bits) {
                // Single word
@@ -290,8 +290,8 @@ bitfill_unaligned_rev(unsigned long __iomem *dst, int dst_idx, unsigned long pat
        if (!n)
                return;
 
-       first = ~0UL >> dst_idx;
-       last = ~(~0UL >> ((dst_idx+n) % bits));
+       first = FB_SHIFT_HIGH(~0UL, dst_idx);
+       last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits));
 
        if (dst_idx+n <= bits) {
                // Single word
index a7770c4f17d08f980c9e8724dc9e1d07ddd27ac5..910e2338a27e3a38c7c182bcfcfe6f7e9d9c2864 100644 (file)
@@ -76,18 +76,6 @@ static u32 cfb_tab32[] = {
 #define FB_WRITEL fb_writel
 #define FB_READL  fb_readl
 
-#if defined (__BIG_ENDIAN)
-#define LEFT_POS(bpp)          (32 - bpp)
-#define SHIFT_HIGH(val, bits)  ((val) >> (bits))
-#define SHIFT_LOW(val, bits)   ((val) << (bits))
-#define BIT_NR(b)              (7 - (b))
-#else
-#define LEFT_POS(bpp)          (0)
-#define SHIFT_HIGH(val, bits)  ((val) << (bits))
-#define SHIFT_LOW(val, bits)   ((val) >> (bits))
-#define BIT_NR(b)              (b)
-#endif
-
 static inline void color_imageblit(const struct fb_image *image, 
                                   struct fb_info *p, u8 __iomem *dst1, 
                                   u32 start_index,
@@ -109,7 +97,7 @@ static inline void color_imageblit(const struct fb_image *image,
                val = 0;
                
                if (start_index) {
-                       u32 start_mask = ~(SHIFT_HIGH(~(u32)0, start_index));
+                       u32 start_mask = ~(FB_SHIFT_HIGH(~(u32)0, start_index));
                        val = FB_READL(dst) & start_mask;
                        shift = start_index;
                }
@@ -119,20 +107,20 @@ static inline void color_imageblit(const struct fb_image *image,
                                color = palette[*src];
                        else
                                color = *src;
-                       color <<= LEFT_POS(bpp);
-                       val |= SHIFT_HIGH(color, shift);
+                       color <<= FB_LEFT_POS(bpp);
+                       val |= FB_SHIFT_HIGH(color, shift);
                        if (shift >= null_bits) {
                                FB_WRITEL(val, dst++);
        
                                val = (shift == null_bits) ? 0 : 
-                                       SHIFT_LOW(color, 32 - shift);
+                                       FB_SHIFT_LOW(color, 32 - shift);
                        }
                        shift += bpp;
                        shift &= (32 - 1);
                        src++;
                }
                if (shift) {
-                       u32 end_mask = SHIFT_HIGH(~(u32)0, shift);
+                       u32 end_mask = FB_SHIFT_HIGH(~(u32)0, shift);
 
                        FB_WRITEL((FB_READL(dst) & end_mask) | val, dst);
                }
@@ -162,6 +150,8 @@ static inline void slow_imageblit(const struct fb_image *image, struct fb_info *
        u32 i, j, l;
        
        dst2 = (u32 __iomem *) dst1;
+       fgcolor <<= FB_LEFT_POS(bpp);
+       bgcolor <<= FB_LEFT_POS(bpp);
 
        for (i = image->height; i--; ) {
                shift = val = 0;
@@ -172,22 +162,21 @@ static inline void slow_imageblit(const struct fb_image *image, struct fb_info *
 
                /* write leading bits */
                if (start_index) {
-                       u32 start_mask = ~(SHIFT_HIGH(~(u32)0, start_index));
+                       u32 start_mask = ~(FB_SHIFT_HIGH(~(u32)0,start_index));
                        val = FB_READL(dst) & start_mask;
                        shift = start_index;
                }
 
                while (j--) {
                        l--;
-                       color = (*s & 1 << (BIT_NR(l))) ? fgcolor : bgcolor;
-                       color <<= LEFT_POS(bpp);
-                       val |= SHIFT_HIGH(color, shift);
+                       color = (*s & 1 << (FB_BIT_NR(l))) ? fgcolor : bgcolor;
+                       val |= FB_SHIFT_HIGH(color, shift);
                        
                        /* Did the bitshift spill bits to the next long? */
                        if (shift >= null_bits) {
                                FB_WRITEL(val, dst++);
                                val = (shift == null_bits) ? 0 :
-                                        SHIFT_LOW(color,32 - shift);
+                                       FB_SHIFT_LOW(color,32 - shift);
                        }
                        shift += bpp;
                        shift &= (32 - 1);
@@ -196,7 +185,7 @@ static inline void slow_imageblit(const struct fb_image *image, struct fb_info *
 
                /* write trailing bits */
                if (shift) {
-                       u32 end_mask = SHIFT_HIGH(~(u32)0, shift);
+                       u32 end_mask = FB_SHIFT_HIGH(~(u32)0, shift);
 
                        FB_WRITEL((FB_READL(dst) & end_mask) | val, dst);
                }
index 1bed50f2a2767dbb1a7901b0dcd23faa81524060..a56147102abbbaebcdac2ca6d80d530234ae756e 100644 (file)
@@ -206,7 +206,6 @@ struct cg14_par {
        int                     mode;
        int                     ramsize;
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 static void __cg14_reset(struct cg14_par *par)
index a1354e7e0513e970b5ddf4bb10a3f305f900de70..9fcd89608ed7d6daa4ea4bd88ed4447b23845b59 100644 (file)
@@ -124,7 +124,6 @@ struct cg3_par {
        unsigned long           fbsize;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 /**
index 9debe642fd2f8825a0b394112d30ee8bc12c46c1..050835e39aa3569769e25e00bc18cfdeb2161b5a 100644 (file)
@@ -265,7 +265,6 @@ struct cg6_par {
        unsigned long           fbsize;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 static int cg6_sync(struct fb_info *info)
@@ -612,7 +611,7 @@ static void cg6_chip_init(struct fb_info *info)
        struct cg6_par *par = (struct cg6_par *) info->par;
        struct cg6_tec __iomem *tec = par->tec;
        struct cg6_fbc __iomem *fbc = par->fbc;
-       u32 rev, conf, mode, tmp;
+       u32 rev, conf, mode;
        int i;
        
        /* Turn off stuff in the Transform Engine. */
index 2858c5c8ba3c2fbca07c0cc4979f024d0853cd5a..e0dbdfc0c8b4289178d5dff1419992acd325cb78 100644 (file)
@@ -404,7 +404,7 @@ struct cirrusfb_info {
        struct cirrusfb_regs currentmode;
        int blank_mode;
 
-       u32     pseudo_palette[17];
+       u32     pseudo_palette[16];
        struct { u8 red, green, blue, pad; } palette[256];
 
 #ifdef CONFIG_ZORRO
@@ -1603,14 +1603,14 @@ static int cirrusfb_setcolreg (unsigned regno, unsigned red, unsigned green,
 
                switch (info->var.bits_per_pixel) {
                        case 8:
-                               ((u8*)(info->pseudo_palette))[regno] = v;
+                               cinfo->pseudo_palette[regno] = v;
                                break;
                        case 16:
-                               ((u16*)(info->pseudo_palette))[regno] = v;
+                               cinfo->pseudo_palette[regno] = v;
                                break;
                        case 24:
                        case 32:
-                               ((u32*)(info->pseudo_palette))[regno] = v;
+                               cinfo->pseudo_palette[regno] = v;
                                break;
                }
                return 0;
@@ -2020,18 +2020,21 @@ static void cirrusfb_prim_fillrect(struct cirrusfb_info *cinfo,
                                   const struct fb_fillrect *region)
 {
        int m; /* bytes per pixel */
+       u32 color = (cinfo->info->fix.visual == FB_VISUAL_TRUECOLOR) ?
+               cinfo->pseudo_palette[region->color] : region->color;
+
        if(cinfo->info->var.bits_per_pixel == 1) {
                cirrusfb_RectFill(cinfo->regbase, cinfo->info->var.bits_per_pixel,
                                  region->dx / 8, region->dy,
                                  region->width / 8, region->height,
-                                 region->color,
+                                 color,
                                  cinfo->currentmode.line_length);
        } else {
                m = ( cinfo->info->var.bits_per_pixel + 7 ) / 8;
                cirrusfb_RectFill(cinfo->regbase, cinfo->info->var.bits_per_pixel,
                                  region->dx * m, region->dy,
                                  region->width * m, region->height,
-                                 region->color,
+                                 color,
                                  cinfo->currentmode.line_length);
        }
        return;
index 5f74df993406073c883453364855da7281ca8ff8..a5d09e159cd111d80d12754e1f08afccc39e8268 100644 (file)
@@ -6,7 +6,7 @@ menu "Console display driver support"
 
 config VGA_CONSOLE
        bool "VGA text console" if EMBEDDED || !X86
-       depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC32 && !SPARC64 && !M68K && !PARISC && !ARCH_VERSATILE
+       depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC && !M68K && !PARISC && !ARCH_VERSATILE
        default y
        help
          Saying Y here will allow you to use Linux in text mode through a
@@ -68,7 +68,7 @@ config SGI_NEWPORT_CONSOLE
 
 config PROM_CONSOLE
        bool "PROM console"
-       depends on SPARC32 || SPARC64
+       depends on SPARC
        help
          Say Y to build a console driver for Sun machines that uses the
          terminal emulation built into their console PROMS.
@@ -136,7 +136,7 @@ config FONTS
 config FONT_8x8
        bool "VGA 8x8 font" if FONTS
        depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
-       default y if !SPARC32 && !SPARC64 && !FONTS
+       default y if !SPARC && !FONTS
        help
          This is the "high resolution" font for the VGA frame buffer (the one
          provided by the text console 80x50 (and higher) modes).
@@ -150,7 +150,7 @@ config FONT_8x8
 config FONT_8x16
        bool "VGA 8x16 font" if FONTS
        depends on FRAMEBUFFER_CONSOLE || SGI_NEWPORT_CONSOLE=y || STI_CONSOLE || USB_SISUSBVGA_CON 
-       default y if !SPARC32 && !SPARC64 && !FONTS
+       default y if !SPARC && !FONTS
        help
          This is the "high resolution" font for the VGA frame buffer (the one
          provided by the VGA text console 80x25 mode.
@@ -160,7 +160,7 @@ config FONT_8x16
 config FONT_6x11
        bool "Mac console 6x11 font (not supported by all drivers)" if FONTS
        depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
-       default y if !SPARC32 && !SPARC64 && !FONTS && MAC
+       default y if !SPARC && !FONTS && MAC
        help
          Small console font with Macintosh-style high-half glyphs.  Some Mac
          framebuffer drivers don't support this one at all.
@@ -176,7 +176,7 @@ config FONT_7x14
 config FONT_PEARL_8x8
        bool "Pearl (old m68k) console 8x8 font" if FONTS
        depends on FRAMEBUFFER_CONSOLE
-       default y if !SPARC32 && !SPARC64 && !FONTS && AMIGA
+       default y if !SPARC && !FONTS && AMIGA
        help
          Small console font with PC-style control-character and high-half
          glyphs.
@@ -184,24 +184,24 @@ config FONT_PEARL_8x8
 config FONT_ACORN_8x8
        bool "Acorn console 8x8 font" if FONTS
        depends on FRAMEBUFFER_CONSOLE
-       default y if !SPARC32 && !SPARC64 && !FONTS && ARM && ARCH_ACORN
+       default y if !SPARC && !FONTS && ARM && ARCH_ACORN
        help
          Small console font with PC-style control characters and high-half
          glyphs.
 
 config FONT_MINI_4x6
        bool "Mini 4x6 font"
-       depends on !SPARC32 && !SPARC64 && FONTS
+       depends on !SPARC && FONTS
 
 config FONT_SUN8x16
        bool "Sparc console 8x16 font"
-       depends on FRAMEBUFFER_CONSOLE && (!SPARC32 && !SPARC64 && FONTS || SPARC32 || SPARC64)
+       depends on FRAMEBUFFER_CONSOLE && (!SPARC && FONTS || SPARC)
        help
          This is the high resolution console font for Sun machines. Say Y.
 
 config FONT_SUN12x22
        bool "Sparc console 12x22 font (not supported by all drivers)"
-       depends on FRAMEBUFFER_CONSOLE && (!SPARC32 && !SPARC64 && FONTS || SPARC32 || SPARC64)
+       depends on FRAMEBUFFER_CONSOLE && (!SPARC && FONTS || SPARC)
        help
          This is the high resolution console font for Sun machines with very
          big letters (like the letters used in the SPARC PROM). If the
index bcea87c3cc068a5a696d51492c63b3d473659ff3..3660e51b2612996a80963137777db21b4e9f65a0 100644 (file)
@@ -2048,7 +2048,7 @@ static int fbcon_switch(struct vc_data *vc)
        struct fbcon_ops *ops;
        struct display *p = &fb_display[vc->vc_num];
        struct fb_var_screeninfo var;
-       int i, prev_console;
+       int i, prev_console, charcnt = 256;
 
        info = registered_fb[con2fb_map[vc->vc_num]];
        ops = info->fbcon_par;
@@ -2103,7 +2103,8 @@ static int fbcon_switch(struct vc_data *vc)
        fb_set_var(info, &var);
        ops->var = info->var;
 
-       if (old_info != NULL && old_info != info) {
+       if (old_info != NULL && (old_info != info ||
+                                info->flags & FBINFO_MISC_ALWAYS_SETPAR)) {
                if (info->fbops->fb_set_par)
                        info->fbops->fb_set_par(info);
                fbcon_del_cursor_timer(old_info);
@@ -2120,6 +2121,13 @@ static int fbcon_switch(struct vc_data *vc)
 
        vc->vc_can_do_color = (fb_get_color_depth(&info->var, &info->fix)!=1);
        vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
+
+       if (p->userfont)
+               charcnt = FNTCHARCNT(vc->vc_font.data);
+
+       if (charcnt > 256)
+               vc->vc_complement_mask <<= 1;
+
        updatescrollmode(p, info, vc);
 
        switch (p->scrollmode) {
@@ -2139,8 +2147,12 @@ static int fbcon_switch(struct vc_data *vc)
 
        scrollback_max = 0;
        scrollback_current = 0;
-       ops->var.xoffset = ops->var.yoffset = p->yscroll = 0;
-       ops->update_start(info);
+
+       if (!fbcon_is_inactive(vc, info)) {
+           ops->var.xoffset = ops->var.yoffset = p->yscroll = 0;
+           ops->update_start(info);
+       }
+
        fbcon_set_palette(vc, color_table);     
        fbcon_clear_margins(vc, 0);
 
@@ -2184,11 +2196,14 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
                ops->graphics = 1;
 
                if (!blank) {
+                       if (info->fbops->fb_save_state)
+                               info->fbops->fb_save_state(info);
                        var.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
                        fb_set_var(info, &var);
                        ops->graphics = 0;
                        ops->var = info->var;
-               }
+               } else if (info->fbops->fb_restore_state)
+                       info->fbops->fb_restore_state(info);
        }
 
        if (!fbcon_is_inactive(vc, info)) {
@@ -2736,8 +2751,12 @@ static void fbcon_modechanged(struct fb_info *info)
                updatescrollmode(p, info, vc);
                scrollback_max = 0;
                scrollback_current = 0;
-               ops->var.xoffset = ops->var.yoffset = p->yscroll = 0;
-               ops->update_start(info);
+
+               if (!fbcon_is_inactive(vc, info)) {
+                   ops->var.xoffset = ops->var.yoffset = p->yscroll = 0;
+                   ops->update_start(info);
+               }
+
                fbcon_set_palette(vc, color_table);
                update_screen(vc);
                if (softback_buf)
@@ -2774,8 +2793,13 @@ static void fbcon_set_all_vcs(struct fb_info *info)
                        updatescrollmode(p, info, vc);
                        scrollback_max = 0;
                        scrollback_current = 0;
-                       ops->var.xoffset = ops->var.yoffset = p->yscroll = 0;
-                       ops->update_start(info);
+
+                       if (!fbcon_is_inactive(vc, info)) {
+                           ops->var.xoffset = ops->var.yoffset =
+                               p->yscroll = 0;
+                           ops->update_start(info);
+                       }
+
                        fbcon_set_palette(vc, color_table);
                        update_screen(vc);
                        if (softback_buf)
index 3afd1eeb1adebc38b5432a36ecaca220a88eba88..4952b66ae2062996d13ce6efcbb0b7df29c68470 100644 (file)
@@ -34,7 +34,7 @@ static inline void ccw_update_attr(u8 *dst, u8 *src, int attribute,
                msk <<= (8 - mod);
 
        if (offset > mod)
-               set_bit(FBCON_BIT(7), (void *)&msk1);
+               msk1 |= 0x01;
 
        for (i = 0; i < vc->vc_font.width; i++) {
                for (j = 0; j < width; j++) {
index 90c672096c2e3e4e2340771a55930350b3521b03..1b8f92fdc6a82f3c02b8c02096832d053ba6e1d9 100644 (file)
         (s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \
         (i)->var.xres : (i)->var.xres_virtual; })
 
-/*
- * The bitmap is always big endian
- */
-#if defined(__LITTLE_ENDIAN)
-#define FBCON_BIT(b) (7 - (b))
-#else
-#define FBCON_BIT(b) (b)
-#endif
 
 static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat)
 {
        u32 tmp = (y * pitch) + x, index = tmp / 8,  bit = tmp % 8;
 
        pat +=index;
-       return (test_bit(FBCON_BIT(bit), (void *)pat));
+       return (*pat) & (0x80 >> bit);
 }
 
 static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)
@@ -43,13 +35,14 @@ static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)
        u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;
 
        pat += index;
-       set_bit(FBCON_BIT(bit), (void *)pat);
+
+       (*pat) |= 0x80 >> bit;
 }
 
 static inline void rotate_ud(const char *in, char *out, u32 width, u32 height)
 {
        int i, j;
-       int shift = width % 8;
+       int shift = (8 - (width % 8)) & 7;
 
        width = (width + 7) & ~7;
 
@@ -85,7 +78,7 @@ static inline void rotate_cw(const char *in, char *out, u32 width, u32 height)
 static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height)
 {
        int i, j, h = height, w = width;
-       int shift = width % 8;
+       int shift = (8 - (width % 8)) & 7;
 
        width = (width + 7) & ~7;
        height = (height + 7) & ~7;
index c4d7c89212b4bfaa116750c9111124d09bd65714..9dd059e8b64515f16f2b162adf91d465a1400b42 100644 (file)
@@ -420,13 +420,15 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info,
 int ud_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       u32 xoffset, yoffset;
+       int xoffset, yoffset;
        u32 vyres = GETVYRES(ops->p->scrollmode, info);
        u32 vxres = GETVXRES(ops->p->scrollmode, info);
        int err;
 
-       xoffset = (vxres - info->var.xres) - ops->var.xoffset;
-       yoffset = (vyres - info->var.yres) - ops->var.yoffset;
+       xoffset = vxres - info->var.xres - ops->var.xoffset;
+       yoffset = vyres - info->var.yres - ops->var.yoffset;
+       if (yoffset < 0)
+               yoffset += vyres;
        ops->var.xoffset = xoffset;
        ops->var.yoffset = yoffset;
        err = fb_pan_display(info, &ops->var);
index 274f90543e323b7014e6c61d25a555bd6aa180f6..167de397e4b430def9bb9b470153842a8d5803dc 100644 (file)
@@ -966,6 +966,7 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
        outb_p(0x12, vga_video_port_reg);       /* Vertical display limit */
        outb_p(vde, vga_video_port_val);
        spin_unlock_irq(&vga_lock);
+       vga_video_font_height = fontheight;
 
        for (i = 0; i < MAX_NR_CONSOLES; i++) {
                struct vc_data *c = vc_cons[i].d;
index c589d23e7f914e6301bc39b7ed0d91f4c30ee7a3..a9300f930ef2a3022390758efd4271606fc39f6b 100644 (file)
@@ -1512,7 +1512,7 @@ static int cyberpro_pci_enable_mmio(struct cfb_info *cfb)
         * I/O cycles storing into a reserved memory space at
         * physical address 0x3000000
         */
-       unsigned char *iop;
+       unsigned char __iomem *iop;
 
        iop = ioremap(0x3000000, 0x5000);
        if (iop == NULL) {
@@ -1526,7 +1526,7 @@ static int cyberpro_pci_enable_mmio(struct cfb_info *cfb)
        writeb(EXT_BIU_MISC, iop + 0x3ce);
        writeb(EXT_BIU_MISC_LIN_ENABLE, iop + 0x3cf);
 
-       iounmap((void *)iop);
+       iounmap(iop);
 #else
        /*
         * Most other machine types are "normal", so
index 9f180096c896f6330678adc74c78316aef458b0e..10dfdf0352644d296247f3a18f17c3302f615189 100644 (file)
@@ -452,13 +452,17 @@ int fb_prepare_logo(struct fb_info *info, int rotate)
 
        /* Return if no suitable logo was found */
        fb_logo.logo = fb_find_logo(depth);
+
+       if (!fb_logo.logo) {
+               return 0;
+       }
        
        if (rotate == FB_ROTATE_UR || rotate == FB_ROTATE_UD)
                yres = info->var.yres;
        else
                yres = info->var.xres;
 
-       if (fb_logo.logo && fb_logo.logo->height > yres) {
+       if (fb_logo.logo->height > yres) {
                fb_logo.logo = NULL;
                return 0;
        }
@@ -718,14 +722,30 @@ static void try_to_load(int fb)
 int
 fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
 {
+       struct fb_fix_screeninfo *fix = &info->fix;
         int xoffset = var->xoffset;
         int yoffset = var->yoffset;
-        int err;
+        int err = 0, yres = info->var.yres;
+
+       if (var->yoffset > 0) {
+               if (var->vmode & FB_VMODE_YWRAP) {
+                       if (!fix->ywrapstep || (var->yoffset % fix->ywrapstep))
+                               err = -EINVAL;
+                       else
+                               yres = 0;
+               } else if (!fix->ypanstep || (var->yoffset % fix->ypanstep))
+                       err = -EINVAL;
+       }
+
+       if (var->xoffset > 0 && (!fix->xpanstep ||
+                                (var->xoffset % fix->xpanstep)))
+               err = -EINVAL;
+
+        if (err || !info->fbops->fb_pan_display || xoffset < 0 ||
+           yoffset < 0 || var->yoffset + yres > info->var.yres_virtual ||
+           var->xoffset + info->var.xres > info->var.xres_virtual)
+               return -EINVAL;
 
-        if (xoffset < 0 || yoffset < 0 || !info->fbops->fb_pan_display ||
-            xoffset + info->var.xres > info->var.xres_virtual ||
-            yoffset + info->var.yres > info->var.yres_virtual)
-                return -EINVAL;
        if ((err = info->fbops->fb_pan_display(var, info)))
                return err;
         info->var.xoffset = var->xoffset;
index 2584daec7bbf2132c0df085ede3bcf4b2a692b21..c4870d559afc47d7a644d081ef548ef64717685c 100644 (file)
@@ -359,7 +359,6 @@ struct ffb_par {
        int                     prom_parent_node;
        int                     dac_rev;
        int                     board_type;
-       struct list_head        list;
 };
 
 static void FFBFifo(struct ffb_par *par, int n)
index f077ca34fabad6ed156a256d76908d5bc24a687b..da29d007f215d33103f2c9ea641c333df6704774 100644 (file)
 
 /*** hw-related values ***/
 
+/* Resource Allocation */
+#define INTELFB_FB_ACQUIRED                 1
+#define INTELFB_MMIO_ACQUIRED               2
+
 /* PCI ids for supported devices */
 #define PCI_DEVICE_ID_INTEL_830M       0x3577
 #define PCI_DEVICE_ID_INTEL_845G       0x2562
@@ -257,6 +261,7 @@ struct intelfb_info {
        int hwcursor;
        int fixed_mode;
        int ring_active;
+       int flag;
 
        /* hw cursor */
        int cursor_on;
index 427689e584da4745efd130960fd5ff2ae62ecc46..0090544842f5d672225b127c9f69f53ec31ebe63 100644 (file)
 static void __devinit get_initial_mode(struct intelfb_info *dinfo);
 static void update_dinfo(struct intelfb_info *dinfo,
                         struct fb_var_screeninfo *var);
-static int intelfb_get_fix(struct fb_fix_screeninfo *fix,
-                          struct fb_info *info);
-
 static int intelfb_check_var(struct fb_var_screeninfo *var,
                             struct fb_info *info);
 static int intelfb_set_par(struct fb_info *info);
@@ -473,9 +470,9 @@ cleanup(struct intelfb_info *dinfo)
        if (dinfo->aperture.virtual)
                iounmap((void __iomem *)dinfo->aperture.virtual);
 
-       if (dinfo->mmio_base_phys)
+       if (dinfo->flag & INTELFB_MMIO_ACQUIRED)
                release_mem_region(dinfo->mmio_base_phys, INTEL_REG_SIZE);
-       if (dinfo->aperture.physical)
+       if (dinfo->flag & INTELFB_FB_ACQUIRED)
                release_mem_region(dinfo->aperture.physical,
                                   dinfo->aperture.size);
        framebuffer_release(dinfo->info);
@@ -572,6 +569,9 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
                cleanup(dinfo);
                return -ENODEV;
        }
+
+       dinfo->flag |= INTELFB_FB_ACQUIRED;
+
        if (!request_mem_region(dinfo->mmio_base_phys,
                                INTEL_REG_SIZE,
                                INTELFB_MODULE_NAME)) {
@@ -580,6 +580,8 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENODEV;
        }
 
+       dinfo->flag |= INTELFB_MMIO_ACQUIRED;
+
        /* Get the chipset info. */
        dinfo->pci_chipset = pdev->device;
 
@@ -1091,7 +1093,17 @@ intelfb_set_fbinfo(struct intelfb_info *dinfo)
                return 1;
 
        info->pixmap.scan_align = 1;
-
+       strcpy(info->fix.id, dinfo->name);
+       info->fix.smem_start = dinfo->fb.physical;
+       info->fix.smem_len = dinfo->fb.size;
+       info->fix.type = FB_TYPE_PACKED_PIXELS;
+       info->fix.type_aux = 0;
+       info->fix.xpanstep = 8;
+       info->fix.ypanstep = 1;
+       info->fix.ywrapstep = 0;
+       info->fix.mmio_start = dinfo->mmio_base_phys;
+       info->fix.mmio_len = INTEL_REG_SIZE;
+       info->fix.accel = FB_ACCEL_I830;
        update_dinfo(dinfo, &info->var);
 
        return 0;
@@ -1109,7 +1121,8 @@ update_dinfo(struct intelfb_info *dinfo, struct fb_var_screeninfo *var)
        dinfo->yres = var->xres;
        dinfo->pixclock = var->pixclock;
 
-       intelfb_get_fix(&dinfo->info->fix, dinfo->info);
+       dinfo->info->fix.visual = dinfo->visual;
+       dinfo->info->fix.line_length = dinfo->pitch;
 
        switch (dinfo->bpp) {
        case 8:
@@ -1139,30 +1152,6 @@ update_dinfo(struct intelfb_info *dinfo, struct fb_var_screeninfo *var)
 
 /* fbops functions */
 
-static int
-intelfb_get_fix(struct fb_fix_screeninfo *fix, struct fb_info *info)
-{
-       struct intelfb_info *dinfo = GET_DINFO(info);
-
-       DBG_MSG("intelfb_get_fix\n");
-
-       memset(fix, 0, sizeof(*fix));
-       strcpy(fix->id, dinfo->name);
-       fix->smem_start = dinfo->fb.physical;
-       fix->smem_len = dinfo->fb.size;
-       fix->type = FB_TYPE_PACKED_PIXELS;
-       fix->type_aux = 0;
-       fix->visual = dinfo->visual;
-       fix->xpanstep = 8;
-       fix->ypanstep = 1;
-       fix->ywrapstep = 0;
-       fix->line_length = dinfo->pitch;
-       fix->mmio_start = dinfo->mmio_base_phys;
-       fix->mmio_len = INTEL_REG_SIZE;
-       fix->accel = FB_ACCEL_I830;
-       return 0;
-}
-
 /***************************************************************
  *                       fbdev interface                       *
  ***************************************************************/
index 376d4a171ec7bd4fb4d0ca6698d6fdb6522cfa72..494287f8f8bf5d3b3aced8b755f8e5def8598456 100644 (file)
@@ -197,7 +197,6 @@ struct leo_par {
        unsigned long           fbsize;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 static void leo_wait(struct leo_lx_krn __iomem *lx_krn)
index 8cb7fb4db4418b8815b6be81d374ef65343afa35..f0e6512c87ff4bd8e0acfdb3e7576c4e5405b428 100644 (file)
@@ -47,7 +47,7 @@ config LOGO_SGI_CLUT224
 
 config LOGO_SUN_CLUT224
        bool "224-color Sun Linux logo"
-       depends on LOGO && (SPARC32 || SPARC64)
+       depends on LOGO && SPARC
        default y
 
 config LOGO_SUPERH_MONO
index 18bcda23d2cf7b7a2a9d39ae03b87b4cad91799f..b251e754e16cff62afdc08b4c96883df031060a6 100644 (file)
@@ -140,7 +140,6 @@ struct p9100_par {
        unsigned long           fbsize;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 /**
index 7b4cd250bec8fd9fca0bf6961b8a21a96a4902f6..9fc10b9e6f578115ce97d28ac7503cb477bfecf3 100644 (file)
@@ -1396,7 +1396,8 @@ static struct platform_driver pxafb_driver = {
 int __devinit pxafb_setup(char *options)
 {
 # ifdef CONFIG_FB_PXA_PARAMETERS
-       strlcpy(g_options, options, sizeof(g_options));
+       if (options)
+               strlcpy(g_options, options, sizeof(g_options));
 # endif
        return 0;
 }
index 646c43f921c55b3bc0774fecbd92cb38778b3b33..3a74a63dd4f228a4cb0691d24d796b65b25348d9 100644 (file)
@@ -46,6 +46,9 @@ int sbusfb_mmap_helper(struct sbus_mmap_map *map,
        unsigned long off;
        int i;
                                         
+       if (!(vma->vm_flags & (VM_SHARED | VM_MAYSHARE)))
+               return -EINVAL;
+
        size = vma->vm_end - vma->vm_start;
        if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
                return -EINVAL;
index fe4f63f3849d530b9511da463050bcb74cb174c2..2b27b4474001d66020a28fadc2b42080b82d620b 100644 (file)
@@ -125,7 +125,6 @@ struct tcx_par {
        int                     lowdepth;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 /* Reset control plane so that WID is 8-bit plane. */
@@ -444,7 +443,7 @@ static void tcx_init_one(struct sbus_dev *sdev)
 
        tcx_reset(&all->info);
 
-       tcx_blank(0, &all->info);
+       tcx_blank(FB_BLANK_UNBLANK, &all->info);
 
        if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
                printk(KERN_ERR "tcx: Could not allocate color map.\n");
index 15fb250451e59a0628029819dfebbfc62d7fede9..b9146306df49a94df1b6443baa48a9fb17417ce3 100644 (file)
@@ -52,7 +52,6 @@ static int ds_send_control_cmd(struct ds_device *, u16, u16);
 
 
 static struct usb_driver ds_driver = {
-       .owner =        THIS_MODULE,
        .name =         "DS9490R",
        .probe =        ds_probe,
        .disconnect =   ds_disconnect,
index a93c2bf94c331a7b20326caa5a36c217fab3f023..6a9a75d40f735c209c4e95aefab71178f07990fd 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/in.h>
 #include <linux/module.h>
 #include <linux/net.h>
 #include <linux/ipv6.h>
index be7288184fa9de0a580f7ec64d86f29fec5d3ce3..0ea965c3bb7d0d7233e320a8957be96aaefb33ad 100644 (file)
@@ -427,6 +427,8 @@ v9fs_create(struct inode *dir,
 
        v9fs_mistat2inode(fcall->params.rstat.stat, file_inode, sb);
        kfree(fcall);
+       fcall = NULL;
+       file_dentry->d_op = &v9fs_dentry_operations;
        d_instantiate(file_dentry, file_inode);
 
        if (perm & V9FS_DMDIR) {
index 460554b07ff91501739ae7b2f21ea14392ea5e51..38d3e8023a0795273595b46ef8647ebaee9952e6 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -313,7 +313,8 @@ int bio_get_nr_vecs(struct block_device *bdev)
 }
 
 static int __bio_add_page(request_queue_t *q, struct bio *bio, struct page
-                         *page, unsigned int len, unsigned int offset)
+                         *page, unsigned int len, unsigned int offset,
+                         unsigned short max_sectors)
 {
        int retried_segments = 0;
        struct bio_vec *bvec;
@@ -327,7 +328,7 @@ static int __bio_add_page(request_queue_t *q, struct bio *bio, struct page
        if (bio->bi_vcnt >= bio->bi_max_vecs)
                return 0;
 
-       if (((bio->bi_size + len) >> 9) > q->max_sectors)
+       if (((bio->bi_size + len) >> 9) > max_sectors)
                return 0;
 
        /*
@@ -385,6 +386,25 @@ static int __bio_add_page(request_queue_t *q, struct bio *bio, struct page
        return len;
 }
 
+/**
+ *     bio_add_pc_page -       attempt to add page to bio
+ *     @bio: destination bio
+ *     @page: page to add
+ *     @len: vec entry length
+ *     @offset: vec entry offset
+ *
+ *     Attempt to add a page to the bio_vec maplist. This can fail for a
+ *     number of reasons, such as the bio being full or target block
+ *     device limitations. The target block device must allow bio's
+ *      smaller than PAGE_SIZE, so it is always possible to add a single
+ *      page to an empty bio. This should only be used by REQ_PC bios.
+ */
+int bio_add_pc_page(request_queue_t *q, struct bio *bio, struct page *page,
+                   unsigned int len, unsigned int offset)
+{
+       return __bio_add_page(q, bio, page, len, offset, q->max_hw_sectors);
+}
+
 /**
  *     bio_add_page    -       attempt to add page to bio
  *     @bio: destination bio
@@ -401,8 +421,8 @@ static int __bio_add_page(request_queue_t *q, struct bio *bio, struct page
 int bio_add_page(struct bio *bio, struct page *page, unsigned int len,
                 unsigned int offset)
 {
-       return __bio_add_page(bdev_get_queue(bio->bi_bdev), bio, page,
-                             len, offset);
+       struct request_queue *q = bdev_get_queue(bio->bi_bdev);
+       return __bio_add_page(q, bio, page, len, offset, q->max_sectors);
 }
 
 struct bio_map_data {
@@ -514,7 +534,7 @@ struct bio *bio_copy_user(request_queue_t *q, unsigned long uaddr,
                        break;
                }
 
-               if (__bio_add_page(q, bio, page, bytes, 0) < bytes) {
+               if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes) {
                        ret = -EINVAL;
                        break;
                }
@@ -628,7 +648,8 @@ static struct bio *__bio_map_user_iov(request_queue_t *q,
                        /*
                         * sorry...
                         */
-                       if (__bio_add_page(q, bio, pages[j], bytes, offset) < bytes)
+                       if (bio_add_pc_page(q, bio, pages[j], bytes, offset) <
+                                           bytes)
                                break;
 
                        len -= bytes;
@@ -801,8 +822,8 @@ static struct bio *__bio_map_kern(request_queue_t *q, void *data,
                if (bytes > len)
                        bytes = len;
 
-               if (__bio_add_page(q, bio, virt_to_page(data), bytes,
-                                  offset) < bytes)
+               if (bio_add_pc_page(q, bio, virt_to_page(data), bytes,
+                                   offset) < bytes)
                        break;
 
                data += bytes;
@@ -1228,6 +1249,7 @@ EXPORT_SYMBOL(bio_clone);
 EXPORT_SYMBOL(bio_phys_segments);
 EXPORT_SYMBOL(bio_hw_segments);
 EXPORT_SYMBOL(bio_add_page);
+EXPORT_SYMBOL(bio_add_pc_page);
 EXPORT_SYMBOL(bio_get_nr_vecs);
 EXPORT_SYMBOL(bio_map_user);
 EXPORT_SYMBOL(bio_unmap_user);
index eab3750cf3048507a8785958139c00e512e1b76c..943ef9b82244ef9b71a3211e24bb1a1899f51409 100644 (file)
@@ -1,8 +1,12 @@
 Version 1.39
 ------------
-Defer close of a file handle slightly if pending writes depend on that file handle
+Defer close of a file handle slightly if pending writes depend on that handle
 (this reduces the EBADF bad file handle errors that can be logged under heavy
 stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 
+Fix SFU style symlinks and mknod needed for servers which do not support the
+CIFS Unix Extensions.  Fix setfacl/getfacl on bigendian. Timeout negative
+dentries so files that the client sees as deleted but that later get created
+on the server will be recognized.  Add client side permission check on setattr.
 
 Version 1.38
 ------------
index bb90941826adb4e60d662d930aa293055c42cd2b..e5d09a2fc7a5eccf7a7b8f15b56de07173a5d535 100644 (file)
@@ -278,7 +278,9 @@ A partial list of the supported mount options follows:
                (such as Windows), permissions can also be checked at the
                client, and a crude form of client side permission checking 
                can be enabled by specifying file_mode and dir_mode on 
-               the client
+               the client.  Note that the mount.cifs helper must be
+               at version 1.10 or higher to support specifying the uid
+               (or gid) in non-numberic form.
   gid          If CIFS Unix extensions are not supported by the server
                this overrides the default gid for inodes.
   file_mode     If CIFS Unix extensions are not supported by the server
@@ -345,7 +347,10 @@ A partial list of the supported mount options follows:
                client system. It is typically only needed when the server
                supports the CIFS Unix Extensions but the UIDs/GIDs on the
                client and server system do not match closely enough to allow
-               access by the user doing the mount.
+               access by the user doing the mount, but it may be useful with
+               non CIFS Unix Extension mounts for cases in which the default
+               mode is specified on the mount but is not to be enforced on the
+               client (e.g. perhaps when MultiUserMount is enabled)
                Note that this does not affect the normal ACL check on the
                target machine done by the server software (of the server
                ACL against the user name provided at mount time).
@@ -368,15 +373,21 @@ A partial list of the supported mount options follows:
   setuids       If the CIFS Unix extensions are negotiated with the server
                the client will attempt to set the effective uid and gid of
                the local process on newly created files, directories, and
-               devices (create, mkdir, mknod).
+               devices (create, mkdir, mknod).  If the CIFS Unix Extensions
+               are not negotiated, for newly created files and directories
+               instead of using the default uid and gid specified on the
+               the mount, cache the new file's uid and gid locally which means
+               that the uid for the file can change when the inode is
+               reloaded (or the user remounts the share).
   nosetuids     The client will not attempt to set the uid and gid on
                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
                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.
+               the client) set the uid and gid is the default. If the CIFS
+               Unix Extensions are not negotiated then the uid and gid for
+               new files will appear to be the uid (gid) of the mounter or the
+               uid (gid) parameter specified on the mount.
   netbiosname   When mounting to servers via port 139, specifies the RFC1001
                source name to use to represent the client netbios machine 
                name when doing the RFC1001 netbios session initialize.
@@ -418,6 +429,13 @@ A partial list of the supported mount options follows:
                byte range locks).
  remount        remount the share (often used to change from ro to rw mounts
                or vice versa)
+ sfu            When the CIFS Unix Extensions are not negotiated, attempt to
+               create device files and fifos in a format compatible with
+               Services for Unix (SFU).  In addition retrieve bits 10-12
+               of the mode via the SETFILEBITS extended attribute (as
+               SFU does).  In the future the bottom 9 bits of the mode
+               mode also will be emulated using queries of the security
+               descriptor (ACL).
                
 The mount.cifs mount helper also accepts a few mount options before -o
 including:
index c909298d11ed60deba5809a8e3346130019e63bf..fc34c74ec4bef91ed0c686ebe451b8787db26375 100644 (file)
@@ -1,4 +1,4 @@
-version 1.37 October 9, 2005
+Version 1.39 November 30, 2005
 
 A Partial List of Missing Features
 ==================================
@@ -58,7 +58,7 @@ o) Improve performance of readpages by sending more than one read
 at a time when 8 pages or more are requested. In conjuntion
 add support for async_cifs_readpages.
 
-p) Add support for storing symlink and fifo info to Windows servers 
+p) Add support for storing symlink info to Windows servers 
 in the Extended Attribute format their SFU clients would recognize.
 
 q) Finish fcntl D_NOTIFY support so kde and gnome file list windows
index 4e12053f0806bed870906a3280d428ad8a9d9186..d2b128255944269506f5395506528a4009d7d6dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   fs/cifs/cifs_unicode.c
  *
- *   Copyright (c) International Business Machines  Corp., 2000,2002
+ *   Copyright (c) International Business Machines  Corp., 2000,2005
  *   Modified by Steve French (sfrench@us.ibm.com)
  *
  *   This program is free software;  you can redistribute it and/or modify
@@ -31,7 +31,7 @@
  *
  */
 int
-cifs_strfromUCS_le(char *to, const wchar_t * from,     /* LITTLE ENDIAN */
+cifs_strfromUCS_le(char *to, const __le16 * from,      
                   int len, const struct nls_table *codepage)
 {
        int i;
@@ -60,25 +60,26 @@ cifs_strfromUCS_le(char *to, const wchar_t * from,  /* LITTLE ENDIAN */
  *
  */
 int
-cifs_strtoUCS(wchar_t * to, const char *from, int len,
+cifs_strtoUCS(__le16 * to, const char *from, int len,
              const struct nls_table *codepage)
 {
        int charlen;
        int i;
+       wchar_t * wchar_to = (wchar_t *)to; /* needed to quiet sparse */  
 
        for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
 
                /* works for 2.4.0 kernel or later */
-               charlen = codepage->char2uni(from, len, &to[i]);
+               charlen = codepage->char2uni(from, len, &wchar_to[i]);
                if (charlen < 1) {
                        cERROR(1,
                               ("cifs_strtoUCS: char2uni returned %d",
                                charlen));
                        /* A question mark */
-                       to[i] = (wchar_t)cpu_to_le16(0x003f);
+                       to[i] = cpu_to_le16(0x003f);
                        charlen = 1;
                } else 
-                       to[i] = (wchar_t)cpu_to_le16(to[i]);
+                       to[i] = cpu_to_le16(wchar_to[i]);
 
        }
 
index da8dde9652751b4506af896b0b528c532f4a9e30..39e5b970325f6a14428eef357e98da44808356d1 100644 (file)
@@ -5,7 +5,7 @@
  *     Convert a unicode character to upper or lower case using
  *     compressed tables.
  *
- *   Copyright (c) International Business Machines  Corp., 2000,2002
+ *   Copyright (c) International Business Machines  Corp., 2000,2005555555555555555555555555555555555555555555555555555555
  *
  *   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,8 +59,8 @@ extern struct UniCaseRange UniLowerRange[];
 #endif                         /* UNIUPR_NOLOWER */
 
 #ifdef __KERNEL__
-int cifs_strfromUCS_le(char *, const wchar_t *, int, const struct nls_table *);
-int cifs_strtoUCS(wchar_t *, const char *, int, const struct nls_table *);
+int cifs_strfromUCS_le(char *, const __le16 *, int, const struct nls_table *);
+int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
 #endif
 
 /*
index 1959c7c4b185b48793ed81aee9d1cd61b50cc070..fe2bb7c4c9121c4bcc2cfeeb5ca9ec9669bcc944 100644 (file)
@@ -149,7 +149,7 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, struct nls_table * nls_
        char temp_hash[16];
        struct HMACMD5Context ctx;
        char * ucase_buf;
-       wchar_t * unicode_buf;
+       __le16 * unicode_buf;
        unsigned int i,user_name_len,dom_name_len;
 
        if(ses == NULL)
index 682b0235ad9a170df904563eea37d9a132291ce2..2a13a2bac8f18f9d957ac289c703d3e2e2904fe7 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/seq_file.h>
 #include <linux/vfs.h>
 #include <linux/mempool.h>
+#include <linux/delay.h>
 #include "cifsfs.h"
 #include "cifspdu.h"
 #define DECLARE_GLOBALS_HERE
@@ -429,6 +430,11 @@ static void cifs_umount_begin(struct super_block * sblock)
        {
                cFYI(1,("wake up tasks now - umount begin not complete"));
                wake_up_all(&tcon->ses->server->request_q);
+               wake_up_all(&tcon->ses->server->response_q);
+               msleep(1); /* yield */
+               /* we have to kick the requests once more */
+               wake_up_all(&tcon->ses->server->response_q);
+               msleep(1);
        }
 /* BB FIXME - finish add checks for tidStatus BB */
 
@@ -483,57 +489,30 @@ cifs_get_sb(struct file_system_type *fs_type,
        return sb;
 }
 
-static ssize_t
-cifs_read_wrapper(struct file * file, char __user *read_data, size_t read_size,
-          loff_t * poffset)
+static ssize_t cifs_file_writev(struct file *file, const struct iovec *iov,
+                               unsigned long nr_segs, loff_t *ppos)
 {
-       if(file->f_dentry == NULL)
-               return -EIO;
-       else if(file->f_dentry->d_inode == NULL)
-               return -EIO;
-
-       cFYI(1,("In read_wrapper size %zd at %lld",read_size,*poffset));
+       struct inode *inode = file->f_dentry->d_inode;
+       ssize_t written;
 
-       if(CIFS_I(file->f_dentry->d_inode)->clientCanCacheRead) {
-               return generic_file_read(file,read_data,read_size,poffset);
-       } else {
-               /* BB do we need to lock inode from here until after invalidate? */
-/*             if(file->f_dentry->d_inode->i_mapping) {
-                       filemap_fdatawrite(file->f_dentry->d_inode->i_mapping);
-                       filemap_fdatawait(file->f_dentry->d_inode->i_mapping);
-               }*/
-/*             cifs_revalidate(file->f_dentry);*/ /* BB fixme */
-
-               /* BB we should make timer configurable - perhaps 
-                  by simply calling cifs_revalidate here */
-               /* invalidate_remote_inode(file->f_dentry->d_inode);*/
-               return generic_file_read(file,read_data,read_size,poffset);
-       }
+       written = generic_file_writev(file, iov, nr_segs, ppos);
+       if (!CIFS_I(inode)->clientCanCacheAll)
+               filemap_fdatawrite(inode->i_mapping);
+       return written;
 }
 
-static ssize_t
-cifs_write_wrapper(struct file * file, const char __user *write_data,
-           size_t write_size, loff_t * poffset) 
+static ssize_t cifs_file_aio_write(struct kiocb *iocb, const char __user *buf,
+                                  size_t count, loff_t pos)
 {
+       struct inode *inode = iocb->ki_filp->f_dentry->d_inode;
        ssize_t written;
 
-       if(file->f_dentry == NULL)
-               return -EIO;
-       else if(file->f_dentry->d_inode == NULL)
-               return -EIO;
-
-       cFYI(1,("In write_wrapper size %zd at %lld",write_size,*poffset));
-
-       written = generic_file_write(file,write_data,write_size,poffset);
-       if(!CIFS_I(file->f_dentry->d_inode)->clientCanCacheAll)  {
-               if(file->f_dentry->d_inode->i_mapping) {
-                       filemap_fdatawrite(file->f_dentry->d_inode->i_mapping);
-               }
-       }
+       written = generic_file_aio_write(iocb, buf, count, pos);
+       if (!CIFS_I(inode)->clientCanCacheAll)
+               filemap_fdatawrite(inode->i_mapping);
        return written;
 }
 
-
 static struct file_system_type cifs_fs_type = {
        .owner = THIS_MODULE,
        .name = "cifs",
@@ -594,8 +573,12 @@ struct inode_operations cifs_symlink_inode_ops = {
 };
 
 struct file_operations cifs_file_ops = {
-       .read = cifs_read_wrapper,
-       .write = cifs_write_wrapper, 
+       .read = do_sync_read,
+       .write = do_sync_write,
+       .readv = generic_file_readv,
+       .writev = cifs_file_writev,
+       .aio_read = generic_file_aio_read,
+       .aio_write = cifs_file_aio_write,
        .open = cifs_open,
        .release = cifs_close,
        .lock = cifs_lock,
@@ -608,10 +591,6 @@ struct file_operations cifs_file_ops = {
 #endif /* CONFIG_CIFS_POSIX */
 
 #ifdef CONFIG_CIFS_EXPERIMENTAL
-       .readv = generic_file_readv,
-       .writev = generic_file_writev,
-       .aio_read = generic_file_aio_read,
-       .aio_write = generic_file_aio_write,
        .dir_notify = cifs_dir_notify,
 #endif /* CONFIG_CIFS_EXPERIMENTAL */
 };
@@ -631,6 +610,46 @@ struct file_operations cifs_file_direct_ops = {
        .ioctl  = cifs_ioctl,
 #endif /* CONFIG_CIFS_POSIX */
 
+#ifdef CONFIG_CIFS_EXPERIMENTAL
+       .dir_notify = cifs_dir_notify,
+#endif /* CONFIG_CIFS_EXPERIMENTAL */
+};
+struct file_operations cifs_file_nobrl_ops = {
+       .read = do_sync_read,
+       .write = do_sync_write,
+       .readv = generic_file_readv,
+       .writev = cifs_file_writev,
+       .aio_read = generic_file_aio_read,
+       .aio_write = cifs_file_aio_write,
+       .open = cifs_open,
+       .release = cifs_close,
+       .fsync = cifs_fsync,
+       .flush = cifs_flush,
+       .mmap  = cifs_file_mmap,
+       .sendfile = generic_file_sendfile,
+#ifdef CONFIG_CIFS_POSIX
+       .ioctl  = cifs_ioctl,
+#endif /* CONFIG_CIFS_POSIX */
+
+#ifdef CONFIG_CIFS_EXPERIMENTAL
+       .dir_notify = cifs_dir_notify,
+#endif /* CONFIG_CIFS_EXPERIMENTAL */
+};
+
+struct file_operations cifs_file_direct_nobrl_ops = {
+       /* no mmap, no aio, no readv - 
+          BB reevaluate whether they can be done with directio, no cache */
+       .read = cifs_user_read,
+       .write = cifs_user_write,
+       .open = cifs_open,
+       .release = cifs_close,
+       .fsync = cifs_fsync,
+       .flush = cifs_flush,
+       .sendfile = generic_file_sendfile, /* BB removeme BB */
+#ifdef CONFIG_CIFS_POSIX
+       .ioctl  = cifs_ioctl,
+#endif /* CONFIG_CIFS_POSIX */
+
 #ifdef CONFIG_CIFS_EXPERIMENTAL
        .dir_notify = cifs_dir_notify,
 #endif /* CONFIG_CIFS_EXPERIMENTAL */
@@ -882,6 +901,9 @@ static int cifs_oplock_thread(void * dummyarg)
 
 static int cifs_dnotify_thread(void * dummyarg)
 {
+       struct list_head *tmp;
+       struct cifsSesInfo *ses;
+
        daemonize("cifsdnotifyd");
        allow_signal(SIGTERM);
 
@@ -890,7 +912,19 @@ static int cifs_dnotify_thread(void * dummyarg)
                if(try_to_freeze())
                        continue;
                set_current_state(TASK_INTERRUPTIBLE);
-               schedule_timeout(39*HZ);
+               schedule_timeout(15*HZ);
+               read_lock(&GlobalSMBSeslock);
+               /* check if any stuck requests that need
+                  to be woken up and wakeq so the
+                  thread can wake up and error out */
+               list_for_each(tmp, &GlobalSMBSessionList) {
+                       ses = list_entry(tmp, struct cifsSesInfo, 
+                               cifsSessionList);
+                       if(ses && ses->server && 
+                            atomic_read(&ses->server->inFlight))
+                               wake_up_all(&ses->server->response_q);
+               }
+               read_unlock(&GlobalSMBSeslock);
        } while(!signal_pending(current));
        complete_and_exit (&cifs_dnotify_exited, 0);
 }
index 1223fa81dbd269fc696e90951787e29426273f64..9ec40e0e54fc4eed289eb9070aeb0c8120f610cd 100644 (file)
@@ -63,6 +63,8 @@ extern struct inode_operations cifs_symlink_inode_ops;
 /* Functions related to files and directories */
 extern struct file_operations cifs_file_ops;
 extern struct file_operations cifs_file_direct_ops; /* if directio mount */
+extern struct file_operations cifs_file_nobrl_ops;
+extern struct file_operations cifs_file_direct_nobrl_ops; /* if directio mount */
 extern int cifs_open(struct inode *inode, struct file *file);
 extern int cifs_close(struct inode *inode, struct file *file);
 extern int cifs_closedir(struct inode *inode, struct file *file);
index 48a05b9df7eb5f6ef8d66e8b252ee534dbfd257f..33e1859fd2f67ced969247e6a6bc365a941a8895 100644 (file)
@@ -603,7 +603,9 @@ typedef struct smb_com_logoff_andx_rsp {
        __u16 ByteCount;
 } __attribute__((packed)) LOGOFF_ANDX_RSP;
 
-typedef union smb_com_tree_disconnect {        /* as an altetnative can use flag on tree_connect PDU to effect disconnect *//* probably the simplest SMB PDU */
+typedef union smb_com_tree_disconnect {        /* as an altetnative can use flag on 
+                                       tree_connect PDU to effect disconnect */
+                                       /* tdis is probably simplest SMB PDU */
        struct {
                struct smb_hdr hdr;     /* wct = 0 */
                __u16 ByteCount;        /* bcc = 0 */
@@ -2025,6 +2027,12 @@ typedef struct {
 } __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO;   /* level 0x104 FF response data area */
 
 
+struct win_dev {
+       unsigned char type[8]; /* IntxCHR or IntxBLK */
+       __le64 major;
+       __le64 minor;   
+} __attribute__((packed));
+
 struct gea {
        unsigned char name_len;
        char name[1];
index a53c596e1082fe3c90bc6e93c4736b120ef9d277..6867e556d37e51485a4e9d35fb7ea332fc971b6d 100644 (file)
@@ -90,6 +90,18 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
           check for tcp and smb session status done differently
           for those three - in the calling routine */
        if(tcon) {
+               if(tcon->tidStatus == CifsExiting) {
+                       /* only tree disconnect, open, and write,
+                       (and ulogoff which does not have tcon)
+                       are allowed as we start force umount */
+                       if((smb_command != SMB_COM_WRITE_ANDX) && 
+                          (smb_command != SMB_COM_OPEN_ANDX) && 
+                          (smb_command != SMB_COM_TREE_DISCONNECT)) {
+                               cFYI(1,("can not send cmd %d while umounting",
+                                       smb_command));
+                               return -ENODEV;
+                       }
+               }
                if((tcon->ses) && (tcon->ses->status != CifsExiting) &&
                                  (tcon->ses->server)){
                        struct nls_table *nls_codepage;
@@ -187,6 +199,19 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
           check for tcp and smb session status done differently
           for those three - in the calling routine */
        if(tcon) {
+               if(tcon->tidStatus == CifsExiting) {
+                       /* only tree disconnect, open, and write,
+                         (and ulogoff which does not have tcon)
+                         are allowed as we start force umount */
+                       if((smb_command != SMB_COM_WRITE_ANDX) &&
+                          (smb_command != SMB_COM_OPEN_ANDX) &&
+                          (smb_command != SMB_COM_TREE_DISCONNECT)) {
+                               cFYI(1,("can not send cmd %d while umounting",
+                                       smb_command));
+                               return -ENODEV;
+                       }
+               }
+
                if((tcon->ses) && (tcon->ses->status != CifsExiting) && 
                                  (tcon->ses->server)){
                        struct nls_table *nls_codepage;
@@ -1142,7 +1167,9 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
        int bytes_returned, wct;
        int smb_hdr_len;
 
-       cFYI(1,("write2 at %lld %d bytes",offset,count)); /* BB removeme BB */
+       /* BB removeme BB */
+       cFYI(1,("write2 at %lld %d bytes", (long long)offset, count));
+
        if(tcon->ses->capabilities & CAP_LARGE_FILES)
                wct = 14;
        else
@@ -1553,7 +1580,7 @@ createSymLinkRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifs_strtoUCS((wchar_t *) pSMB->FileName, fromName, PATH_MAX
+                   cifs_strtoUCS((__le16 *) pSMB->FileName, fromName, PATH_MAX
                                  /* find define for this maxpathcomponent */
                                  , nls_codepage);
                name_len++;     /* trailing null */
@@ -1577,7 +1604,7 @@ createSymLinkRetry:
        data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len_target =
-                   cifs_strtoUCS((wchar_t *) data_offset, toName, PATH_MAX
+                   cifs_strtoUCS((__le16 *) data_offset, toName, PATH_MAX
                                  /* find define for this maxpathcomponent */
                                  , nls_codepage);
                name_len_target++;      /* trailing null */
@@ -1803,7 +1830,7 @@ querySymLinkRetry:
 
        if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
                name_len =
-                   cifs_strtoUCS((wchar_t *) pSMB->FileName, searchName, PATH_MAX
+                   cifs_strtoUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX
                                  /* find define for this maxpathcomponent */
                                  , nls_codepage);
                name_len++;     /* trailing null */
@@ -1860,7 +1887,7 @@ querySymLinkRetry:
                                        min_t(const int, buflen,count) / 2);
                        /* BB FIXME investigate remapping reserved chars here */
                                cifs_strfromUCS_le(symlinkinfo,
-                                       (wchar_t *) ((char *)&pSMBr->hdr.Protocol +
+                                       (__le16 *) ((char *)&pSMBr->hdr.Protocol +
                                                data_offset),
                                        name_len, nls_codepage);
                        } else {
@@ -1951,7 +1978,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
                                                        reparse_buf->TargetNameOffset),
                                                        min(buflen/2, reparse_buf->TargetNameLen / 2)); 
                                        cifs_strfromUCS_le(symlinkinfo,
-                                               (wchar_t *) (reparse_buf->LinkNamesBuf + 
+                                               (__le16 *) (reparse_buf->LinkNamesBuf + 
                                                reparse_buf->TargetNameOffset),
                                                name_len, nls_codepage);
                                } else { /* ASCII names */
@@ -1983,9 +2010,9 @@ qreparse_out:
 static void cifs_convert_ace(posix_acl_xattr_entry * ace, struct cifs_posix_ace * cifs_ace)
 {
        /* u8 cifs fields do not need le conversion */
-       ace->e_perm = (__u16)cifs_ace->cifs_e_perm; 
-       ace->e_tag  = (__u16)cifs_ace->cifs_e_tag;
-       ace->e_id   = (__u32)le64_to_cpu(cifs_ace->cifs_uid);
+       ace->e_perm = cpu_to_le16(cifs_ace->cifs_e_perm);
+       ace->e_tag  = cpu_to_le16(cifs_ace->cifs_e_tag);
+       ace->e_id   = cpu_to_le32(le64_to_cpu(cifs_ace->cifs_uid));
        /* cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id)); */
 
        return;
@@ -2037,7 +2064,7 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen,
        } else if(size > buflen) {
                return -ERANGE;
        } else /* buffer big enough */ {
-               local_acl->a_version = POSIX_ACL_XATTR_VERSION;
+               local_acl->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION);
                for(i = 0;i < count ;i++) {
                        cifs_convert_ace(&local_acl->a_entries[i],pACE);
                        pACE ++;
@@ -2051,14 +2078,14 @@ static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace,
 {
        __u16 rc = 0; /* 0 = ACL converted ok */
 
-       cifs_ace->cifs_e_perm = (__u8)cpu_to_le16(local_ace->e_perm);
-       cifs_ace->cifs_e_tag =  (__u8)cpu_to_le16(local_ace->e_tag);
+       cifs_ace->cifs_e_perm = le16_to_cpu(local_ace->e_perm);
+       cifs_ace->cifs_e_tag =  le16_to_cpu(local_ace->e_tag);
        /* BB is there a better way to handle the large uid? */
-       if(local_ace->e_id == -1) {
+       if(local_ace->e_id == cpu_to_le32(-1)) {
        /* Probably no need to le convert -1 on any arch but can not hurt */
                cifs_ace->cifs_uid = cpu_to_le64(-1);
        } else 
-               cifs_ace->cifs_uid = (__u64)cpu_to_le32(local_ace->e_id);
+               cifs_ace->cifs_uid = cpu_to_le64(le32_to_cpu(local_ace->e_id));
         /*cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id));*/
        return rc;
 }
@@ -2078,16 +2105,17 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl
 
        count = posix_acl_xattr_count((size_t)buflen);
        cFYI(1,("setting acl with %d entries from buf of length %d and version of %d",
-               count,buflen,local_acl->a_version));
-       if(local_acl->a_version != 2) {
-               cFYI(1,("unknown POSIX ACL version %d",local_acl->a_version));
+               count, buflen, le32_to_cpu(local_acl->a_version)));
+       if(le32_to_cpu(local_acl->a_version) != 2) {
+               cFYI(1,("unknown POSIX ACL version %d",
+                    le32_to_cpu(local_acl->a_version)));
                return 0;
        }
        cifs_acl->version = cpu_to_le16(1);
        if(acl_type == ACL_TYPE_ACCESS) 
-               cifs_acl->access_entry_count = count;
+               cifs_acl->access_entry_count = cpu_to_le16(count);
        else if(acl_type == ACL_TYPE_DEFAULT)
-               cifs_acl->default_entry_count = count;
+               cifs_acl->default_entry_count = cpu_to_le16(count);
        else {
                cFYI(1,("unknown ACL type %d",acl_type));
                return 0;
@@ -3203,7 +3231,7 @@ getDFSRetry:
                                temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset);
                                if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
                                        cifs_strfromUCS_le(*targetUNCs,
-                                               (wchar_t *) temp, name_len, nls_codepage);
+                                               (__le16 *) temp, name_len, nls_codepage);
                                } else {
                                        strncpy(*targetUNCs,temp,name_len);
                                }
index 2cb620716bc14661295a8c4fe6782d0e9ac99f62..c467de8576105bdd3bdb4d1983b591be53609b2e 100644 (file)
@@ -1986,32 +1986,32 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                        bytes_returned = 0; /* skill null user */
                else
                        bytes_returned =
-                               cifs_strtoUCS((wchar_t *) bcc_ptr, user, 100,
+                               cifs_strtoUCS((__le16 *) bcc_ptr, user, 100,
                                        nls_codepage);
                /* convert number of 16 bit words to bytes */
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;   /* trailing null */
                if (domain == NULL)
                        bytes_returned =
-                           cifs_strtoUCS((wchar_t *) bcc_ptr,
+                           cifs_strtoUCS((__le16 *) bcc_ptr,
                                          "CIFS_LINUX_DOM", 32, nls_codepage);
                else
                        bytes_returned =
-                           cifs_strtoUCS((wchar_t *) bcc_ptr, domain, 64,
+                           cifs_strtoUCS((__le16 *) bcc_ptr, domain, 64,
                                          nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ",
+                   cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ",
                                  32, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release,
                                  32, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
                                  64, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;
@@ -2081,7 +2081,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                if(ses->serverOS == NULL)
                                        goto sesssetup_nomem;
                                cifs_strfromUCS_le(ses->serverOS,
-                                          (wchar_t *)bcc_ptr, len,nls_codepage);
+                                          (__le16 *)bcc_ptr, len,nls_codepage);
                                bcc_ptr += 2 * (len + 1);
                                remaining_words -= len + 1;
                                ses->serverOS[2 * len] = 0;
@@ -2093,7 +2093,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                        if(ses->serverNOS == NULL)
                                                goto sesssetup_nomem;
                                        cifs_strfromUCS_le(ses->serverNOS,
-                                                          (wchar_t *)bcc_ptr,len,nls_codepage);
+                                                          (__le16 *)bcc_ptr,len,nls_codepage);
                                        bcc_ptr += 2 * (len + 1);
                                        ses->serverNOS[2 * len] = 0;
                                        ses->serverNOS[1 + (2 * len)] = 0;
@@ -2111,7 +2111,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                                if(ses->serverDomain == NULL)
                                                        goto sesssetup_nomem;
                                                cifs_strfromUCS_le(ses->serverDomain,
-                                                    (wchar_t *)bcc_ptr,len,nls_codepage);
+                                                    (__le16 *)bcc_ptr,len,nls_codepage);
                                                bcc_ptr += 2 * (len + 1);
                                                ses->serverDomain[2*len] = 0;
                                                ses->serverDomain[1+(2*len)] = 0;
@@ -2255,30 +2255,30 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                        bcc_ptr++;
                }
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, user, 100, nls_codepage);
+                   cifs_strtoUCS((__le16 *) bcc_ptr, user, 100, nls_codepage);
                bcc_ptr += 2 * bytes_returned;  /* convert num of 16 bit words to bytes */
                bcc_ptr += 2;   /* trailing null */
                if (domain == NULL)
                        bytes_returned =
-                           cifs_strtoUCS((wchar_t *) bcc_ptr,
+                           cifs_strtoUCS((__le16 *) bcc_ptr,
                                          "CIFS_LINUX_DOM", 32, nls_codepage);
                else
                        bytes_returned =
-                           cifs_strtoUCS((wchar_t *) bcc_ptr, domain, 64,
+                           cifs_strtoUCS((__le16 *) bcc_ptr, domain, 64,
                                          nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ",
+                   cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ",
                                  32, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, 32,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32,
                                  nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
                                  64, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;
@@ -2357,7 +2357,7 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                        ses->serverOS =
                                            kzalloc(2 * (len + 1), GFP_KERNEL);
                                        cifs_strfromUCS_le(ses->serverOS,
-                                                          (wchar_t *)
+                                                          (__le16 *)
                                                           bcc_ptr, len,
                                                           nls_codepage);
                                        bcc_ptr += 2 * (len + 1);
@@ -2372,7 +2372,7 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                                    kzalloc(2 * (len + 1),
                                                            GFP_KERNEL);
                                                cifs_strfromUCS_le(ses->serverNOS,
-                                                                  (wchar_t *)bcc_ptr,
+                                                                  (__le16 *)bcc_ptr,
                                                                   len,
                                                                   nls_codepage);
                                                bcc_ptr += 2 * (len + 1);
@@ -2384,9 +2384,8 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                             /* last string is not always null terminated (for e.g. for Windows XP & 2000) */
                                                        ses->serverDomain = kzalloc(2*(len+1),GFP_KERNEL);
                                                        cifs_strfromUCS_le(ses->serverDomain,
-                                                            (wchar_t *)bcc_ptr, 
-                                 len,
-                                                            nls_codepage);
+                                                            (__le16 *)bcc_ptr, 
+                                                            len, nls_codepage);
                                                        bcc_ptr += 2*(len+1);
                                                        ses->serverDomain[2*len] = 0;
                                                        ses->serverDomain[1+(2*len)] = 0;
@@ -2560,16 +2559,16 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
                }
 
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ",
+                   cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ",
                                  32, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, 32,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32,
                                  nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;   /* null terminate Linux version */
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
                                  64, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                *(bcc_ptr + 1) = 0;
@@ -2673,7 +2672,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
                                        ses->serverOS =
                                            kzalloc(2 * (len + 1), GFP_KERNEL);
                                        cifs_strfromUCS_le(ses->serverOS,
-                                                          (wchar_t *)
+                                                          (__le16 *)
                                                           bcc_ptr, len,
                                                           nls_codepage);
                                        bcc_ptr += 2 * (len + 1);
@@ -2690,7 +2689,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
                                                            GFP_KERNEL);
                                                cifs_strfromUCS_le(ses->
                                                                   serverNOS,
-                                                                  (wchar_t *)
+                                                                  (__le16 *)
                                                                   bcc_ptr,
                                                                   len,
                                                                   nls_codepage);
@@ -2708,23 +2707,15 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
                                                                     1),
                                                                    GFP_KERNEL);
                                                        cifs_strfromUCS_le
-                                                           (ses->
-                                                            serverDomain,
-                                                            (wchar_t *)
-                                                            bcc_ptr, len,
-                                                            nls_codepage);
+                                                           (ses->serverDomain,
+                                                            (__le16 *)bcc_ptr,
+                                                            len, nls_codepage);
                                                        bcc_ptr +=
                                                            2 * (len + 1);
-                                                       ses->
-                                                           serverDomain[2
-                                                                        * len]
+                                                       ses->serverDomain[2*len]
                                                            = 0;
-                                                       ses->
-                                                           serverDomain[1
-                                                                        +
-                                                                        (2
-                                                                         *
-                                                                         len)]
+                                                       ses->serverDomain
+                                                               [1 + (2 * len)]
                                                            = 0;
                                                } /* else no more room so create dummy domain string */
                                                else
@@ -2903,7 +2894,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                        SecurityBlob->DomainName.MaximumLength = 0;
                } else {
                        __u16 len =
-                           cifs_strtoUCS((wchar_t *) bcc_ptr, domain, 64,
+                           cifs_strtoUCS((__le16 *) bcc_ptr, domain, 64,
                                          nls_codepage);
                        len *= 2;
                        SecurityBlob->DomainName.MaximumLength =
@@ -2921,7 +2912,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                        SecurityBlob->UserName.MaximumLength = 0;
                } else {
                        __u16 len =
-                           cifs_strtoUCS((wchar_t *) bcc_ptr, user, 64,
+                           cifs_strtoUCS((__le16 *) bcc_ptr, user, 64,
                                          nls_codepage);
                        len *= 2;
                        SecurityBlob->UserName.MaximumLength =
@@ -2934,7 +2925,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                            cpu_to_le16(len);
                }
 
-               /* SecurityBlob->WorkstationName.Length = cifs_strtoUCS((wchar_t *) bcc_ptr, "AMACHINE",64, nls_codepage);
+               /* SecurityBlob->WorkstationName.Length = cifs_strtoUCS((__le16 *) bcc_ptr, "AMACHINE",64, nls_codepage);
                   SecurityBlob->WorkstationName.Length *= 2;
                   SecurityBlob->WorkstationName.MaximumLength = cpu_to_le16(SecurityBlob->WorkstationName.Length);
                   SecurityBlob->WorkstationName.Buffer = cpu_to_le32(SecurityBlobLength);
@@ -2947,16 +2938,16 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                        bcc_ptr++;
                }
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ",
+                   cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ",
                                  32, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, 32,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32,
                                  nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                bcc_ptr += 2;   /* null term version string */
                bytes_returned =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS,
+                   cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
                                  64, nls_codepage);
                bcc_ptr += 2 * bytes_returned;
                *(bcc_ptr + 1) = 0;
@@ -3069,7 +3060,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                        ses->serverOS =
                                            kzalloc(2 * (len + 1), GFP_KERNEL);
                                        cifs_strfromUCS_le(ses->serverOS,
-                                                          (wchar_t *)
+                                                          (__le16 *)
                                                           bcc_ptr, len,
                                                           nls_codepage);
                                        bcc_ptr += 2 * (len + 1);
@@ -3086,7 +3077,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                                            GFP_KERNEL);
                                                cifs_strfromUCS_le(ses->
                                                                   serverNOS,
-                                                                  (wchar_t *)
+                                                                  (__le16 *)
                                                                   bcc_ptr,
                                                                   len,
                                                                   nls_codepage);
@@ -3105,7 +3096,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
                                                        cifs_strfromUCS_le
                                                            (ses->
                                                             serverDomain,
-                                                            (wchar_t *)
+                                                            (__le16 *)
                                                             bcc_ptr, len,
                                                             nls_codepage);
                                                        bcc_ptr +=
@@ -3227,7 +3218,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
        if (ses->capabilities & CAP_UNICODE) {
                smb_buffer->Flags2 |= SMBFLG2_UNICODE;
                length =
-                   cifs_strtoUCS((wchar_t *) bcc_ptr, tree, 100, nls_codepage);
+                   cifs_strtoUCS((__le16 *) bcc_ptr, tree, 100, nls_codepage);
                bcc_ptr += 2 * length;  /* convert num of 16 bit words to bytes */
                bcc_ptr += 2;   /* skip trailing null */
        } else {                /* ASCII */
@@ -3263,7 +3254,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
                                tcon->nativeFileSystem =
                                    kzalloc(length + 2, GFP_KERNEL);
                                cifs_strfromUCS_le(tcon->nativeFileSystem,
-                                                  (wchar_t *) bcc_ptr,
+                                                  (__le16 *) bcc_ptr,
                                                   length, nls_codepage);
                                bcc_ptr += 2 * length;
                                bcc_ptr[0] = 0; /* null terminate the string */
index 8dfe717a332abaef46800beae64c781b26bdb831..32cc96cafa3eb050d19871f85cf4e089c68b7562 100644 (file)
@@ -228,8 +228,15 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
                else {
                        rc = cifs_get_inode_info(&newinode, full_path,
                                                 buf, inode->i_sb,xid);
-                       if(newinode)
+                       if(newinode) {
                                newinode->i_mode = mode;
+                               if((oplock & CIFS_CREATE_ACTION) &&
+                                 (cifs_sb->mnt_cifs_flags & 
+                                    CIFS_MOUNT_SET_UID)) {
+                                       newinode->i_uid = current->fsuid;
+                                       newinode->i_gid = current->fsgid;
+                               }
+                       }
                }
 
                if (rc != 0) {
@@ -292,7 +299,8 @@ cifs_create_out:
        return rc;
 }
 
-int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t device_number) 
+int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, 
+               dev_t device_number) 
 {
        int rc = -EPERM;
        int xid;
@@ -368,7 +376,34 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev
 
                        if(!rc) {
                                /* BB Do not bother to decode buf since no
-                                  local inode yet to put timestamps in */
+                                  local inode yet to put timestamps in,
+                                  but we can reuse it safely */
+                               int bytes_written;
+                               struct win_dev *pdev;
+                               pdev = (struct win_dev *)buf;
+                               if(S_ISCHR(mode)) {
+                                       memcpy(pdev->type, "IntxCHR", 8);
+                                       pdev->major =
+                                             cpu_to_le64(MAJOR(device_number));
+                                       pdev->minor = 
+                                             cpu_to_le64(MINOR(device_number));
+                                       rc = CIFSSMBWrite(xid, pTcon,
+                                               fileHandle,
+                                               sizeof(struct win_dev),
+                                               0, &bytes_written, (char *)pdev,
+                                               NULL, 0);
+                               } else if(S_ISBLK(mode)) {
+                                       memcpy(pdev->type, "IntxBLK", 8);
+                                       pdev->major =
+                                             cpu_to_le64(MAJOR(device_number));
+                                       pdev->minor =
+                                             cpu_to_le64(MINOR(device_number));
+                                       rc = CIFSSMBWrite(xid, pTcon,
+                                               fileHandle,
+                                               sizeof(struct win_dev),
+                                               0, &bytes_written, (char *)pdev,
+                                               NULL, 0);
+                               } /* else if(S_ISFIFO */
                                CIFSSMBClose(xid, pTcon, fileHandle);
                                d_drop(direntry);
                        }
@@ -437,12 +472,20 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct name
                        direntry->d_op = &cifs_dentry_ops;
                d_add(direntry, newInode);
 
-               /* since paths are not looked up by component - the parent directories are presumed to be good here */
+               /* since paths are not looked up by component - the parent 
+                  directories are presumed to be good here */
                renew_parental_timestamps(direntry);
 
        } else if (rc == -ENOENT) {
                rc = 0;
+               direntry->d_time = jiffies;
+               if (pTcon->nocase)
+                       direntry->d_op = &cifs_ci_dentry_ops;
+               else
+                       direntry->d_op = &cifs_dentry_ops;
                d_add(direntry, NULL);
+       /*      if it was once a directory (but how can we tell?) we could do  
+                       shrink_dcache_parent(direntry); */
        } else {
                cERROR(1,("Error 0x%x on cifs_get_inode_info in lookup of %s",
                           rc,full_path));
@@ -461,21 +504,20 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)
 {
        int isValid = 1;
 
-/*     lock_kernel(); *//* surely we do not want to lock the kernel for a whole network round trip which could take seconds */
-
        if (direntry->d_inode) {
                if (cifs_revalidate(direntry)) {
-                       /* unlock_kernel(); */
                        return 0;
                }
        } else {
-               cFYI(1,
-                    ("In cifs_d_revalidate with no inode but name = %s and dentry 0x%p",
-                     direntry->d_name.name, direntry));
+               cFYI(1, ("neg dentry 0x%p name = %s",
+                        direntry, direntry->d_name.name));
+               if(time_after(jiffies, direntry->d_time + HZ) || 
+                       !lookupCacheEnabled) {
+                       d_drop(direntry);
+                       isValid = 0;
+               } 
        }
 
-/*    unlock_kernel(); */
-
        return isValid;
 }
 
index da4f5e10b3cc0f84c922660e89745bb14631cff1..14a1c72ced92e1cc98024494ea217b2a7413921d 100644 (file)
@@ -489,8 +489,10 @@ int cifs_close(struct inode *inode, struct file *file)
                                        the struct would be in each open file,
                                        but this should give enough time to 
                                        clear the socket */
+                                       write_unlock(&file->f_owner.lock);
                                        cERROR(1,("close with pending writes"));
                                        msleep(timeout);
+                                       write_lock(&file->f_owner.lock);
                                        timeout *= 4;
                                } 
                                write_unlock(&file->f_owner.lock);
index 923d071163b2769f86e4a5b47d2e77878d13a072..411c1f7f84da6074efd483e27df1221db4647df1 100644 (file)
@@ -41,7 +41,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
        char *tmp_path;
 
        pTcon = cifs_sb->tcon;
-       cFYI(1, (" Getting info on %s ", search_path));
+       cFYI(1, ("Getting info on %s ", search_path));
        /* could have done a find first instead but this returns more info */
        rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData,
                                  cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
@@ -97,9 +97,9 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                inode = *pinode;
                cifsInfo = CIFS_I(inode);
 
-               cFYI(1, (" Old time %ld ", cifsInfo->time));
+               cFYI(1, ("Old time %ld ", cifsInfo->time));
                cifsInfo->time = jiffies;
-               cFYI(1, (" New time %ld ", cifsInfo->time));
+               cFYI(1, ("New time %ld ", cifsInfo->time));
                /* this is ok to set on every inode revalidate */
                atomic_set(&cifsInfo->inUse,1);
 
@@ -111,6 +111,9 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                inode->i_ctime =
                    cifs_NTtimeToUnix(le64_to_cpu(findData.LastStatusChange));
                inode->i_mode = le64_to_cpu(findData.Permissions);
+               /* since we set the inode type below we need to mask off
+                   to avoid strange results if bits set above */
+                        inode->i_mode &= ~S_IFMT;
                if (type == UNIX_FILE) {
                        inode->i_mode |= S_IFREG;
                } else if (type == UNIX_SYMLINK) {
@@ -129,6 +132,10 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                        inode->i_mode |= S_IFIFO;
                } else if (type == UNIX_SOCKET) {
                        inode->i_mode |= S_IFSOCK;
+               } else {
+                       /* safest to call it a file if we do not know */
+                       inode->i_mode |= S_IFREG;
+                       cFYI(1,("unknown type %d",type));
                }
                inode->i_uid = le64_to_cpu(findData.Uid);
                inode->i_gid = le64_to_cpu(findData.Gid);
@@ -155,34 +162,39 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                }
 
                if (num_of_bytes < end_of_file)
-                       cFYI(1, ("allocation size less than end of file "));
+                       cFYI(1, ("allocation size less than end of file"));
                cFYI(1,
                     ("Size %ld and blocks %ld",
                      (unsigned long) inode->i_size, inode->i_blocks));
                if (S_ISREG(inode->i_mode)) {
-                       cFYI(1, (" File inode "));
+                       cFYI(1, ("File inode"));
                        inode->i_op = &cifs_file_inode_ops;
-                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
-                               inode->i_fop = &cifs_file_direct_ops;
-                       else
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
+                               if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
+                                       inode->i_fop = 
+                                               &cifs_file_direct_nobrl_ops;
+                               else
+                                       inode->i_fop = &cifs_file_direct_ops;
+                       } else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
+                               inode->i_fop = &cifs_file_nobrl_ops;
+                       else /* not direct, send byte range locks */ 
                                inode->i_fop = &cifs_file_ops;
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
-                               inode->i_fop->lock = NULL;
+
                        inode->i_data.a_ops = &cifs_addr_ops;
                        /* check if server can support readpages */
                        if(pTcon->ses->server->maxBuf < 
                            4096 + MAX_CIFS_HDR_SIZE)
                                inode->i_data.a_ops->readpages = NULL;
                } else if (S_ISDIR(inode->i_mode)) {
-                       cFYI(1, (" Directory inode"));
+                       cFYI(1, ("Directory inode"));
                        inode->i_op = &cifs_dir_inode_ops;
                        inode->i_fop = &cifs_dir_ops;
                } else if (S_ISLNK(inode->i_mode)) {
-                       cFYI(1, (" Symbolic Link inode "));
+                       cFYI(1, ("Symbolic Link inode"));
                        inode->i_op = &cifs_symlink_inode_ops;
                /* tmp_inode->i_fop = */ /* do not need to set to anything */
                } else {
-                       cFYI(1, (" Init special inode "));
+                       cFYI(1, ("Init special inode"));
                        init_special_inode(inode, inode->i_mode,
                                           inode->i_rdev);
                }
@@ -190,6 +202,111 @@ int cifs_get_inode_info_unix(struct inode **pinode,
        return rc;
 }
 
+static int decode_sfu_inode(struct inode * inode, __u64 size,
+                           const unsigned char *path,
+                           struct cifs_sb_info *cifs_sb, int xid)
+{
+       int rc;
+       int oplock = FALSE;
+       __u16 netfid;
+       struct cifsTconInfo *pTcon = cifs_sb->tcon;
+       char buf[24];
+       unsigned int bytes_read;
+       char * pbuf;
+
+       pbuf = buf;
+
+       if(size == 0) {
+               inode->i_mode |= S_IFIFO;
+               return 0;
+       } else if (size < 8) {
+               return -EINVAL;  /* EOPNOTSUPP? */
+       }
+               
+       rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ,
+                        CREATE_NOT_DIR, &netfid, &oplock, NULL,
+                        cifs_sb->local_nls,
+                        cifs_sb->mnt_cifs_flags &
+                               CIFS_MOUNT_MAP_SPECIAL_CHR);
+       if (rc==0) {
+                       /* Read header */
+               rc = CIFSSMBRead(xid, pTcon,
+                                netfid,
+                                24 /* length */, 0 /* offset */,
+                                &bytes_read, &pbuf);
+               if((rc == 0) && (bytes_read >= 8)) {
+                       if(memcmp("IntxBLK", pbuf, 8) == 0) {
+                               cFYI(1,("Block device"));
+                               inode->i_mode |= S_IFBLK;
+                               if(bytes_read == 24) {
+                                       /* we have enough to decode dev num */
+                                       __u64 mjr; /* major */
+                                       __u64 mnr; /* minor */
+                                       mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
+                                       mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
+                                       inode->i_rdev = MKDEV(mjr, mnr);
+                               }
+                       } else if(memcmp("IntxCHR", pbuf, 8) == 0) {
+                               cFYI(1,("Char device"));
+                               inode->i_mode |= S_IFCHR;
+                               if(bytes_read == 24) {
+                                       /* we have enough to decode dev num */
+                                       __u64 mjr; /* major */
+                                       __u64 mnr; /* minor */
+                                       mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
+                                       mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
+                                       inode->i_rdev = MKDEV(mjr, mnr);
+                                }
+                       } else if(memcmp("IntxLNK", pbuf, 7) == 0) {
+                               cFYI(1,("Symlink"));
+                               inode->i_mode |= S_IFLNK;
+                       } else {
+                               inode->i_mode |= S_IFREG; /* file? */
+                               rc = -EOPNOTSUPP; 
+                       }
+               } else {
+                       inode->i_mode |= S_IFREG; /* then it is a file */
+                       rc = -EOPNOTSUPP; /* or some unknown SFU type */        
+               }
+               CIFSSMBClose(xid, pTcon, netfid);
+       }
+       return rc;
+       
+}
+
+#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID)  /* SETFILEBITS valid bits */
+
+static int get_sfu_uid_mode(struct inode * inode,
+                       const unsigned char *path,
+                       struct cifs_sb_info *cifs_sb, int xid)
+{
+#ifdef CONFIG_CIFS_XATTR
+       ssize_t rc;
+       char ea_value[4];
+       __u32 mode;
+
+       rc = CIFSSMBQueryEA(xid, cifs_sb->tcon, path, "SETFILEBITS",
+                       ea_value, 4 /* size of buf */, cifs_sb->local_nls,
+                        cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+       if(rc < 0)
+               return (int)rc;
+       else if (rc > 3) {
+               mode = le32_to_cpu(*((__le32 *)ea_value));
+               inode->i_mode &= ~SFBITS_MASK; 
+               cFYI(1,("special bits 0%o org mode 0%o", mode, inode->i_mode));
+               inode->i_mode = (mode &  SFBITS_MASK) | inode->i_mode;
+               cFYI(1,("special mode bits 0%o", mode));
+               return 0;
+       } else {
+               return 0;
+       }
+#else
+       return -EOPNOTSUPP;
+#endif
+
+               
+}
+
 int cifs_get_inode_info(struct inode **pinode,
        const unsigned char *search_path, FILE_ALL_INFO *pfindData,
        struct super_block *sb, int xid)
@@ -202,7 +319,7 @@ int cifs_get_inode_info(struct inode **pinode,
        char *buf = NULL;
 
        pTcon = cifs_sb->tcon;
-       cFYI(1,("Getting info on %s ", search_path));
+       cFYI(1,("Getting info on %s", search_path));
 
        if ((pfindData == NULL) && (*pinode != NULL)) {
                if (CIFS_I(*pinode)->clientCanCacheRead) {
@@ -303,9 +420,9 @@ int cifs_get_inode_info(struct inode **pinode,
                inode = *pinode;
                cifsInfo = CIFS_I(inode);
                cifsInfo->cifsAttrs = attr;
-               cFYI(1, (" Old time %ld ", cifsInfo->time));
+               cFYI(1, ("Old time %ld ", cifsInfo->time));
                cifsInfo->time = jiffies;
-               cFYI(1, (" New time %ld ", cifsInfo->time));
+               cFYI(1, ("New time %ld ", cifsInfo->time));
 
                /* blksize needs to be multiple of two. So safer to default to
                blksize and blkbits set in superblock so 2**blkbits and blksize
@@ -319,13 +436,15 @@ int cifs_get_inode_info(struct inode **pinode,
                    cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastWriteTime));
                inode->i_ctime =
                    cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
-               cFYI(0, (" Attributes came in as 0x%x ", attr));
+               cFYI(0, ("Attributes came in as 0x%x ", attr));
 
                /* set default mode. will override for dirs below */
                if (atomic_read(&cifsInfo->inUse) == 0)
                        /* new inode, can safely set these fields */
                        inode->i_mode = cifs_sb->mnt_file_mode;
-
+               else /* since we set the inode type below we need to mask off
+                    to avoid strange results if type changes and both get orred in */ 
+                       inode->i_mode &= ~S_IFMT; 
 /*             if (attr & ATTR_REPARSE)  */
                /* We no longer handle these as symlinks because we could not
                   follow them due to the absolute path with drive letter */
@@ -340,10 +459,16 @@ int cifs_get_inode_info(struct inode **pinode,
                           (pfindData->EndOfFile == 0)) {
                        inode->i_mode = cifs_sb->mnt_file_mode;
                        inode->i_mode |= S_IFIFO;
-/* BB Finish for SFU style symlinks and devies */
-/*             } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
-                          (cifsInfo->cifsAttrs & ATTR_SYSTEM) && ) */
-
+/* BB Finish for SFU style symlinks and devices */
+               } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
+                          (cifsInfo->cifsAttrs & ATTR_SYSTEM)) {
+                       if (decode_sfu_inode(inode, 
+                                        le64_to_cpu(pfindData->EndOfFile),
+                                        search_path,
+                                        cifs_sb, xid)) {
+                               cFYI(1,("Unrecognized sfu inode type"));
+                       }
+                       cFYI(1,("sfu mode 0%o",inode->i_mode));
                } else {
                        inode->i_mode |= S_IFREG;
                        /* treat the dos attribute of read-only as read-only
@@ -368,7 +493,10 @@ int cifs_get_inode_info(struct inode **pinode,
 
                /* BB fill in uid and gid here? with help from winbind? 
                   or retrieve from NTFS stream extended attribute */
-               if (atomic_read(&cifsInfo->inUse) == 0) {
+               if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
+                       /* fill in uid, gid, mode from server ACL */
+                       get_sfu_uid_mode(inode, search_path, cifs_sb, xid);
+               } else if (atomic_read(&cifsInfo->inUse) == 0) {
                        inode->i_uid = cifs_sb->mnt_uid;
                        inode->i_gid = cifs_sb->mnt_gid;
                        /* set so we do not keep refreshing these fields with
@@ -377,24 +505,29 @@ int cifs_get_inode_info(struct inode **pinode,
                }
 
                if (S_ISREG(inode->i_mode)) {
-                       cFYI(1, (" File inode "));
+                       cFYI(1, ("File inode"));
                        inode->i_op = &cifs_file_inode_ops;
-                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
-                               inode->i_fop = &cifs_file_direct_ops;
-                       else
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
+                               if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
+                                       inode->i_fop =
+                                               &cifs_file_direct_nobrl_ops;
+                               else
+                                       inode->i_fop = &cifs_file_direct_ops;
+                       } else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
+                               inode->i_fop = &cifs_file_nobrl_ops;
+                       else /* not direct, send byte range locks */
                                inode->i_fop = &cifs_file_ops;
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
-                               inode->i_fop->lock = NULL;
+
                        inode->i_data.a_ops = &cifs_addr_ops;
                        if(pTcon->ses->server->maxBuf < 
                             4096 + MAX_CIFS_HDR_SIZE)
                                inode->i_data.a_ops->readpages = NULL;
                } else if (S_ISDIR(inode->i_mode)) {
-                       cFYI(1, (" Directory inode "));
+                       cFYI(1, ("Directory inode"));
                        inode->i_op = &cifs_dir_inode_ops;
                        inode->i_fop = &cifs_dir_ops;
                } else if (S_ISLNK(inode->i_mode)) {
-                       cFYI(1, (" Symbolic Link inode "));
+                       cFYI(1, ("Symbolic Link inode"));
                        inode->i_op = &cifs_symlink_inode_ops;
                } else {
                        init_special_inode(inode, inode->i_mode,
@@ -431,7 +564,7 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
        struct cifsInodeInfo *cifsInode;
        FILE_BASIC_INFO *pinfo_buf;
 
-       cFYI(1, (" cifs_unlink, inode = 0x%p with ", inode));
+       cFYI(1, ("cifs_unlink, inode = 0x%p with ", inode));
 
        xid = GetXid();
 
@@ -577,7 +710,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
        char *full_path = NULL;
        struct inode *newinode = NULL;
 
-       cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p ", mode, inode));
+       cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p", mode, inode));
 
        xid = GetXid();
 
@@ -635,6 +768,17 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
                        /* BB to be implemented via Windows secrty descriptors
                           eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode,
                                                 -1, -1, local_nls); */
+                       if(direntry->d_inode) {
+                               direntry->d_inode->i_mode = mode;
+                               direntry->d_inode->i_mode |= S_IFDIR;
+                               if(cifs_sb->mnt_cifs_flags & 
+                                    CIFS_MOUNT_SET_UID) {
+                                       direntry->d_inode->i_uid = 
+                                               current->fsuid;
+                                       direntry->d_inode->i_gid = 
+                                               current->fsgid;
+                               }
+                       }
                }
        }
        kfree(full_path);
@@ -651,7 +795,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
        char *full_path = NULL;
        struct cifsInodeInfo *cifsInode;
 
-       cFYI(1, (" cifs_rmdir, inode = 0x%p with ", inode));
+       cFYI(1, ("cifs_rmdir, inode = 0x%p with ", inode));
 
        xid = GetXid();
 
@@ -906,14 +1050,20 @@ int cifs_revalidate(struct dentry *direntry)
                filemap_fdatawrite(direntry->d_inode->i_mapping);
        }
        if (invalidate_inode) {
-               if (direntry->d_inode->i_mapping)
-                       filemap_fdatawait(direntry->d_inode->i_mapping);
-               /* may eventually have to do this for open files too */
-               if (list_empty(&(cifsInode->openFileList))) {
-                       /* Has changed on server - flush read ahead pages */
-                       cFYI(1, ("Invalidating read ahead data on "
-                                "closed file"));
-                       invalidate_remote_inode(direntry->d_inode);
+       /* shrink_dcache not necessary now that cifs dentry ops
+       are exported for negative dentries */
+/*             if(S_ISDIR(direntry->d_inode->i_mode)) 
+                       shrink_dcache_parent(direntry); */
+               if (S_ISREG(direntry->d_inode->i_mode)) {
+                       if (direntry->d_inode->i_mapping)
+                               filemap_fdatawait(direntry->d_inode->i_mapping);
+                       /* may eventually have to do this for open files too */
+                       if (list_empty(&(cifsInode->openFileList))) {
+                               /* changed on server - flush read ahead pages */
+                               cFYI(1, ("Invalidating read ahead data on "
+                                        "closed file"));
+                               invalidate_remote_inode(direntry->d_inode);
+                       }
                }
        }
 /*     up(&direntry->d_inode->i_sem); */
@@ -970,11 +1120,22 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
 
        xid = GetXid();
 
-       cFYI(1, (" In cifs_setattr, name = %s attrs->iavalid 0x%x ",
+       cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ",
                 direntry->d_name.name, attrs->ia_valid));
+
        cifs_sb = CIFS_SB(direntry->d_inode->i_sb);
        pTcon = cifs_sb->tcon;
 
+       if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) {
+               /* check if we have permission to change attrs */
+               rc = inode_change_ok(direntry->d_inode, attrs);
+               if(rc < 0) {
+                       FreeXid(xid);
+                       return rc;
+               } else
+                       rc = 0;
+       }
+               
        down(&direntry->d_sb->s_vfs_rename_sem);
        full_path = build_path_from_dentry(direntry);
        up(&direntry->d_sb->s_vfs_rename_sem);
@@ -1014,7 +1175,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                                                  1 /* 45 seconds */);
                                cFYI(1,("Wrt seteof rc %d", rc));
                        }
-               }
+               } else 
+                       rc = -EINVAL;
+
                if (rc != 0) {
                        /* Set file size by pathname rather than by handle
                           either because no valid, writeable file handle for
@@ -1086,6 +1249,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                                         cifs_sb->mnt_cifs_flags & 
                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
        else if (attrs->ia_valid & ATTR_MODE) {
+               rc = 0;
                if ((mode & S_IWUGO) == 0) /* not writeable */ {
                        if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0)
                                time_buf.Attributes =
index 34a06692e4fa9461e624e8ace35de0536d4240d9..94baf6c8ecbda85946984cd2e4d524034cc94644 100644 (file)
@@ -397,12 +397,12 @@ checkSMBhdr(struct smb_hdr *smb, __u16 mid)
                        if(smb->Command == SMB_COM_LOCKING_ANDX)
                                return 0;
                        else
-                               cERROR(1, ("Rcvd Request not response "));         
+                               cERROR(1, ("Rcvd Request not response"));         
                }
        } else { /* bad signature or mid */
                if (*(__le32 *) smb->Protocol != cpu_to_le32(0x424d53ff))
                        cERROR(1,
-                              ("Bad protocol string signature header %x ",
+                              ("Bad protocol string signature header %x",
                                *(unsigned int *) smb->Protocol));
                if (mid != smb->Mid)
                        cERROR(1, ("Mids do not match"));
@@ -417,7 +417,7 @@ checkSMB(struct smb_hdr *smb, __u16 mid, int length)
        __u32 len = smb->smb_buf_length;
        __u32 clc_len;  /* calculated length */
        cFYI(0,
-            ("Entering checkSMB with Length: %x, smb_buf_length: %x ",
+            ("Entering checkSMB with Length: %x, smb_buf_length: %x",
              length, len));
        if (((unsigned int)length < 2 + sizeof (struct smb_hdr)) ||
            (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4)) {
@@ -451,9 +451,16 @@ checkSMB(struct smb_hdr *smb, __u16 mid, int length)
                cERROR(1, ("bad smb size detected for Mid=%d", smb->Mid));
                /* Windows XP can return a few bytes too much, presumably
                an illegal pad, at the end of byte range lock responses 
-               so we allow for up to eight byte pad, as long as actual
+               so we allow for that three byte pad, as long as actual
                received length is as long or longer than calculated length */
-               if((4+len > clc_len) && (len <= clc_len + 3))
+               /* We have now had to extend this more, since there is a 
+               case in which it needs to be bigger still to handle a
+               malformed response to transact2 findfirst from WinXP when
+               access denied is returned and thus bcc and wct are zero
+               but server says length is 0x21 bytes too long as if the server
+               forget to reset the smb rfc1001 length when it reset the
+               wct and bcc to minimum size and drop the t2 parms and data */
+               if((4+len > clc_len) && (len <= clc_len + 512))
                        return 0;
                else
                        return 1;
@@ -678,7 +685,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
        __u16 temp;
 
        if(!mapChars) 
-               return cifs_strtoUCS((wchar_t *) target, source, PATH_MAX, cp);
+               return cifs_strtoUCS(target, source, PATH_MAX, cp);
 
        for(i = 0, j = 0; i < maxlen; j++) {
                src_char = source[i];
index f7814689844b2f4440b374024f92d7899349b29b..5de74d216fdd75533f23e89ef465823ea63d5ffc 100644 (file)
@@ -330,7 +330,7 @@ static const struct {
        ERRHRD, ERRgeneral, NT_STATUS_ACCOUNT_RESTRICTION}, {
        ERRSRV, 2241, NT_STATUS_INVALID_LOGON_HOURS}, {
        ERRSRV, 2240, NT_STATUS_INVALID_WORKSTATION}, {
-       ERRSRV, 2242, NT_STATUS_PASSWORD_EXPIRED}, {
+       ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_EXPIRED}, {
        ERRSRV, 2239, NT_STATUS_ACCOUNT_DISABLED}, {
        ERRHRD, ERRgeneral, NT_STATUS_NONE_MAPPED}, {
        ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_LUIDS_REQUESTED}, {
@@ -676,7 +676,7 @@ static const struct {
        ERRDOS, 193, NT_STATUS_IMAGE_CHECKSUM_MISMATCH}, {
        ERRHRD, ERRgeneral, NT_STATUS_LOST_WRITEBEHIND_DATA}, {
        ERRHRD, ERRgeneral, NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID}, {
-       ERRSRV, 2242, NT_STATUS_PASSWORD_MUST_CHANGE}, {
+       ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_MUST_CHANGE}, {
        ERRHRD, ERRgeneral, NT_STATUS_NOT_FOUND}, {
        ERRHRD, ERRgeneral, NT_STATUS_NOT_TINY_STREAM}, {
        ERRHRD, ERRgeneral, NT_STATUS_RECOVERY_FAILURE}, {
index a86bd1c076021bb88bec0da95a4d939b0785d69d..9bdaaecae36f683ef52196b4d54cee256b006029 100644 (file)
@@ -142,6 +142,11 @@ static void fill_in_inode(struct inode *tmp_inode,
                tmp_inode->i_gid = cifs_sb->mnt_gid;
                /* set default mode. will override for dirs below */
                tmp_inode->i_mode = cifs_sb->mnt_file_mode;
+       } else {
+               /* mask off the type bits since it gets set
+               below and we do not want to get two type
+               bits set */
+               tmp_inode->i_mode &= ~S_IFMT;
        }
 
        if (attr & ATTR_DIRECTORY) {
@@ -152,12 +157,18 @@ static void fill_in_inode(struct inode *tmp_inode,
                }
                tmp_inode->i_mode |= S_IFDIR;
        } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && 
-                  (attr & ATTR_SYSTEM) && (end_of_file == 0)) {
-               *pobject_type = DT_FIFO;
-               tmp_inode->i_mode |= S_IFIFO;
-/* BB Finish for SFU style symlinks and devies */
-/*     } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
-               (attr & ATTR_SYSTEM) && ) { */
+                  (attr & ATTR_SYSTEM)) {
+               if (end_of_file == 0)  {
+                       *pobject_type = DT_FIFO;
+                       tmp_inode->i_mode |= S_IFIFO;
+               } else {
+                       /* rather than get the type here, we mark the
+                       inode as needing revalidate and get the real type
+                       (blk vs chr vs. symlink) later ie in lookup */
+                       *pobject_type = DT_REG;
+                       tmp_inode->i_mode |= S_IFREG; 
+                       cifsInfo->time = 0;     
+               }
 /* we no longer mark these because we could not follow them */
 /*        } else if (attr & ATTR_REPARSE) {
                 *pobject_type = DT_LNK;
@@ -193,8 +204,14 @@ static void fill_in_inode(struct inode *tmp_inode,
        if (S_ISREG(tmp_inode->i_mode)) {
                cFYI(1, ("File inode"));
                tmp_inode->i_op = &cifs_file_inode_ops;
-               if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
-                       tmp_inode->i_fop = &cifs_file_direct_ops;
+               if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
+                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
+                               tmp_inode->i_fop = &cifs_file_direct_nobrl_ops;
+                       else
+                               tmp_inode->i_fop = &cifs_file_direct_ops;
+               
+               } else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
+                       tmp_inode->i_fop = &cifs_file_nobrl_ops;
                else
                        tmp_inode->i_fop = &cifs_file_ops;
                if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
@@ -258,6 +275,9 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
            cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastStatusChange));
 
        tmp_inode->i_mode = le64_to_cpu(pfindData->Permissions);
+       /* since we set the inode type below we need to mask off type
+           to avoid strange results if bits above were corrupt */
+        tmp_inode->i_mode &= ~S_IFMT;
        if (type == UNIX_FILE) {
                *pobject_type = DT_REG;
                tmp_inode->i_mode |= S_IFREG;
@@ -283,6 +303,11 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
        } else if (type == UNIX_SOCKET) {
                *pobject_type = DT_SOCK;
                tmp_inode->i_mode |= S_IFSOCK;
+       } else {
+               /* safest to just call it a file */
+               *pobject_type = DT_REG;
+               tmp_inode->i_mode |= S_IFREG;
+               cFYI(1,("unknown inode type %d",type)); 
        }
 
        tmp_inode->i_uid = le64_to_cpu(pfindData->Uid);
@@ -699,7 +724,7 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst,
                                        (__le16 *)filename, len/2, nlt);
                else
                        pqst->len = cifs_strfromUCS_le((char *)pqst->name,
-                                       (wchar_t *)filename,len/2,nlt);
+                                       (__le16 *)filename,len/2,nlt);
        } else {
                pqst->name = filename;
                pqst->len = len;
index 981ea0d8b9cdaa4b06f53f7fdae975b41a1bffa6..f8871196098c9abe371a64a1df5d269cb407f503 100644 (file)
@@ -515,6 +515,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
                        *pbytes_returned = in_buf->smb_buf_length;
 
                        /* BB special case reconnect tid and uid here? */
+                       /* BB special case Errbadpassword and pwdexpired here */
                        rc = map_smb_to_linux_error(in_buf);
 
                        /* convert ByteCount if necessary */
@@ -522,7 +523,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
                            sizeof (struct smb_hdr) -
                            4 /* do not count RFC1001 header */  +
                            (2 * in_buf->WordCount) + 2 /* bcc */ )
-                               BCC(in_buf) = le16_to_cpu(BCC(in_buf));
+                               BCC(in_buf) = le16_to_cpu(BCC_LE(in_buf));
                } else {
                        rc = -EIO;
                        cFYI(1,("Bad MID state?"));
@@ -786,7 +787,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
                            sizeof (struct smb_hdr) -
                            4 /* do not count RFC1001 header */  +
                            (2 * out_buf->WordCount) + 2 /* bcc */ )
-                               BCC(out_buf) = le16_to_cpu(BCC(out_buf));
+                               BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf));
                } else {
                        rc = -EIO;
                        cERROR(1,("Bad MID state? "));
index 8e71cdbecc7c78cc18f2e14f758b8493e767a07c..55ac0324aaf1649f1326994f31267ad90e542063 100644 (file)
@@ -168,8 +168,8 @@ asmlinkage long compat_sys_statfs(const char __user *path, struct compat_statfs
        if (!error) {
                struct kstatfs tmp;
                error = vfs_statfs(nd.dentry->d_inode->i_sb, &tmp);
-               if (!error && put_compat_statfs(buf, &tmp))
-                       error = -EFAULT;
+               if (!error)
+                       error = put_compat_statfs(buf, &tmp);
                path_release(&nd);
        }
        return error;
@@ -186,8 +186,8 @@ asmlinkage long compat_sys_fstatfs(unsigned int fd, struct compat_statfs __user
        if (!file)
                goto out;
        error = vfs_statfs(file->f_dentry->d_inode->i_sb, &tmp);
-       if (!error && put_compat_statfs(buf, &tmp))
-               error = -EFAULT;
+       if (!error)
+               error = put_compat_statfs(buf, &tmp);
        fput(file);
 out:
        return error;
@@ -236,8 +236,8 @@ asmlinkage long compat_sys_statfs64(const char __user *path, compat_size_t sz, s
        if (!error) {
                struct kstatfs tmp;
                error = vfs_statfs(nd.dentry->d_inode->i_sb, &tmp);
-               if (!error && put_compat_statfs64(buf, &tmp))
-                       error = -EFAULT;
+               if (!error)
+                       error = put_compat_statfs64(buf, &tmp);
                path_release(&nd);
        }
        return error;
@@ -257,8 +257,8 @@ asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz, struct c
        if (!file)
                goto out;
        error = vfs_statfs(file->f_dentry->d_inode->i_sb, &tmp);
-       if (!error && put_compat_statfs64(buf, &tmp))
-               error = -EFAULT;
+       if (!error)
+               error = put_compat_statfs64(buf, &tmp);
        fput(file);
 out:
        return error;
@@ -268,7 +268,6 @@ out:
 
 #define IOCTL_HASHSIZE 256
 static struct ioctl_trans *ioctl32_hash_table[IOCTL_HASHSIZE];
-static DECLARE_RWSEM(ioctl32_sem);
 
 extern struct ioctl_trans ioctl_start[];
 extern int ioctl_table_size;
@@ -390,14 +389,10 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
                break;
        }
 
-       /* When register_ioctl32_conversion is finally gone remove
-          this lock! -AK */
-       down_read(&ioctl32_sem);
        for (t = ioctl32_hash_table[ioctl32_hash(cmd)]; t; t = t->next) {
                if (t->cmd == cmd)
                        goto found_handler;
        }
-       up_read(&ioctl32_sem);
 
        if (S_ISSOCK(filp->f_dentry->d_inode->i_mode) &&
            cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
@@ -417,11 +412,9 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
                lock_kernel();
                error = t->handler(fd, cmd, arg, filp);
                unlock_kernel();
-               up_read(&ioctl32_sem);
                goto out_fput;
        }
 
-       up_read(&ioctl32_sem);
  do_ioctl:
        error = vfs_ioctl(filp, fd, cmd, arg);
  out_fput:
@@ -1177,7 +1170,7 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
        }
 
        ret = rw_verify_area(type, file, pos, tot_len);
-       if (ret)
+       if (ret < 0)
                goto out;
 
        fnv = NULL;
index 31b7efd94d668f2eb2aa91027fde56ac89d16326..43a2508ac69670d972516a0f5d2ad96f8e7bfa02 100644 (file)
@@ -686,7 +686,8 @@ static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
 
        ifr = ifc.ifc_req;
        ifr32 = compat_ptr(ifc32.ifcbuf);
-       for (i = 0, j = 0; i < ifc32.ifc_len && j < ifc.ifc_len;
+       for (i = 0, j = 0;
+             i + sizeof (struct ifreq32) < ifc32.ifc_len && j < ifc.ifc_len;
             i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) {
                if (copy_in_user(ifr32, ifr, sizeof (struct ifreq32)))
                        return -EFAULT;
@@ -702,10 +703,7 @@ static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
                i = ((i / sizeof(struct ifreq)) * sizeof(struct ifreq32));
                ifc32.ifc_len = i;
        } else {
-               if (i <= ifc32.ifc_len)
-                       ifc32.ifc_len = i;
-               else
-                       ifc32.ifc_len = i - sizeof (struct ifreq32);
+               ifc32.ifc_len = i;
        }
        if (copy_to_user(compat_ptr(arg), &ifc32, sizeof(struct ifconf32)))
                return -EFAULT;
index 05b60283c9c2710d65fa96ccfe20d47f1da13f64..2a62b3dc20ec00a76c665a8f1e9dda9808e715b6 100644 (file)
@@ -1513,10 +1513,16 @@ int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
 
+       if (!dentry->d_inode) {
+               error = -ENOENT;
+               goto out;
+       }
+
        error = security_quota_on(dentry);
        if (!error)
                error = vfs_quota_on_inode(dentry->d_inode, type, format_id);
 
+out:
        dput(dentry);
        return error;
 }
index c466fec5de2005cee77acfc7a2f120afefcd33f8..22533cce061165023d43cfedac7310c2e4d414b7 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -306,9 +306,6 @@ void install_arg_page(struct vm_area_struct *vma,
                        struct page *page, unsigned long address)
 {
        struct mm_struct *mm = vma->vm_mm;
-       pgd_t * pgd;
-       pud_t * pud;
-       pmd_t * pmd;
        pte_t * pte;
        spinlock_t *ptl;
 
@@ -316,14 +313,7 @@ void install_arg_page(struct vm_area_struct *vma,
                goto out;
 
        flush_dcache_page(page);
-       pgd = pgd_offset(mm, address);
-       pud = pud_alloc(mm, pgd, address);
-       if (!pud)
-               goto out;
-       pmd = pmd_alloc(mm, pud, address);
-       if (!pmd)
-               goto out;
-       pte = pte_alloc_map_lock(mm, pmd, address, &ptl);
+       pte = get_locked_pte(mm, address, &ptl);
        if (!pte)
                goto out;
        if (!pte_none(*pte)) {
@@ -668,7 +658,7 @@ static inline int de_thread(struct task_struct *tsk)
        if (!thread_group_leader(current)) {
                struct task_struct *parent;
                struct dentry *proc_dentry1, *proc_dentry2;
-               unsigned long exit_state, ptrace;
+               unsigned long ptrace;
 
                /*
                 * Wait for the thread group leader to be a zombie.
@@ -726,15 +716,15 @@ static inline int de_thread(struct task_struct *tsk)
                list_del(&current->tasks);
                list_add_tail(&current->tasks, &init_task.tasks);
                current->exit_signal = SIGCHLD;
-               exit_state = leader->exit_state;
+
+               BUG_ON(leader->exit_state != EXIT_ZOMBIE);
+               leader->exit_state = EXIT_DEAD;
 
                write_unlock_irq(&tasklist_lock);
                spin_unlock(&leader->proc_lock);
                spin_unlock(&current->proc_lock);
                proc_pid_flush(proc_dentry1);
                proc_pid_flush(proc_dentry2);
-
-               BUG_ON(exit_state != EXIT_ZOMBIE);
         }
 
        /*
index 1be78b4b4de956f7bb9e831a7f3e1c1c489b997b..6104ad3105077ec7a14e5da4f24a261d116035a0 100644 (file)
@@ -767,6 +767,7 @@ int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input)
        if (input->group != EXT3_SB(sb)->s_groups_count) {
                ext3_warning(sb, __FUNCTION__,
                             "multiple resizers run on filesystem!\n");
+               err = -EBUSY;
                goto exit_journal;
        }
 
index c045cc70c74931864e01763c3573eeae19c2d1e8..51f5da6527719c31ab3a7316c0ba99812e85809b 100644 (file)
@@ -74,6 +74,24 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
        return 1;
 }
 
+static int dir_alias(struct inode *inode)
+{
+       if (S_ISDIR(inode->i_mode)) {
+               /* Don't allow creating an alias to a directory  */
+               struct dentry *alias = d_find_alias(inode);
+               if (alias) {
+                       dput(alias);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+static inline int invalid_nodeid(u64 nodeid)
+{
+       return !nodeid || nodeid == FUSE_ROOT_ID;
+}
+
 static struct dentry_operations fuse_dentry_operations = {
        .d_revalidate   = fuse_dentry_revalidate,
 };
@@ -97,7 +115,7 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry,
        fuse_lookup_init(req, dir, entry, &outarg);
        request_send(fc, req);
        err = req->out.h.error;
-       if (!err && (!outarg.nodeid || outarg.nodeid == FUSE_ROOT_ID))
+       if (!err && invalid_nodeid(outarg.nodeid))
                err = -EIO;
        if (!err) {
                inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
@@ -193,7 +211,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
        }
 
        err = -EIO;
-       if (!S_ISREG(outentry.attr.mode))
+       if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
                goto out_free_ff;
 
        inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
@@ -250,7 +268,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
                fuse_put_request(fc, req);
                return err;
        }
-       if (!outarg.nodeid || outarg.nodeid == FUSE_ROOT_ID) {
+       if (invalid_nodeid(outarg.nodeid)) {
                fuse_put_request(fc, req);
                return -EIO;
        }
@@ -263,7 +281,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
        fuse_put_request(fc, req);
 
        /* Don't allow userspace to do really stupid things... */
-       if ((inode->i_mode ^ mode) & S_IFMT) {
+       if (((inode->i_mode ^ mode) & S_IFMT) || dir_alias(inode)) {
                iput(inode);
                return -EIO;
        }
@@ -874,14 +892,9 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
        err = fuse_lookup_iget(dir, entry, &inode);
        if (err)
                return ERR_PTR(err);
-       if (inode && S_ISDIR(inode->i_mode)) {
-               /* Don't allow creating an alias to a directory  */
-               struct dentry *alias = d_find_alias(inode);
-               if (alias) {
-                       dput(alias);
-                       iput(inode);
-                       return ERR_PTR(-EIO);
-               }
+       if (inode && dir_alias(inode)) {
+               iput(inode);
+               return ERR_PTR(-EIO);
        }
        d_add(entry, inode);
        return NULL;
index c60e5635498dd8936a2e6f43ba0a8b2557360f28..df16fcbff3fbd00a6ff8876187b651c085f9679c 100644 (file)
@@ -151,6 +151,7 @@ struct hfsplus_sb_info {
 
 #define HFSPLUS_SB_WRITEBACKUP 0x0001
 #define HFSPLUS_SB_NODECOMPOSE 0x0002
+#define HFSPLUS_SB_FORCE       0x0004
 
 
 struct hfsplus_inode_info {
index 5bad37cfdb29f41ce91825585560d0e724f85763..b4fbed63321944dac1ff47676845e808512d0efb 100644 (file)
@@ -123,11 +123,13 @@ struct hfsplus_vh {
 } __packed;
 
 /* HFS+ volume attributes */
-#define HFSPLUS_VOL_UNMNT     (1 << 8)
-#define HFSPLUS_VOL_SPARE_BLK (1 << 9)
-#define HFSPLUS_VOL_NOCACHE   (1 << 10)
-#define HFSPLUS_VOL_INCNSTNT  (1 << 11)
-#define HFSPLUS_VOL_SOFTLOCK  (1 << 15)
+#define HFSPLUS_VOL_UNMNT              (1 << 8)
+#define HFSPLUS_VOL_SPARE_BLK          (1 << 9)
+#define HFSPLUS_VOL_NOCACHE            (1 << 10)
+#define HFSPLUS_VOL_INCNSTNT           (1 << 11)
+#define HFSPLUS_VOL_NODEID_REUSED      (1 << 12)
+#define HFSPLUS_VOL_JOURNALED          (1 << 13)
+#define HFSPLUS_VOL_SOFTLOCK           (1 << 15)
 
 /* HFS+ BTree node descriptor */
 struct hfs_bnode_desc {
index cca0818aa4ca3dbd18fe842e802e38b558fa4d90..935dafba007855aadc16b42b0a5e0831a987afb8 100644 (file)
@@ -22,7 +22,7 @@ enum {
        opt_umask, opt_uid, opt_gid,
        opt_part, opt_session, opt_nls,
        opt_nodecompose, opt_decompose,
-       opt_err
+       opt_force, opt_err
 };
 
 static match_table_t tokens = {
@@ -36,6 +36,7 @@ static match_table_t tokens = {
        { opt_nls, "nls=%s" },
        { opt_decompose, "decompose" },
        { opt_nodecompose, "nodecompose" },
+       { opt_force, "force" },
        { opt_err, NULL }
 };
 
@@ -145,6 +146,9 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi)
                case opt_nodecompose:
                        sbi->flags |= HFSPLUS_SB_NODECOMPOSE;
                        break;
+               case opt_force:
+                       sbi->flags |= HFSPLUS_SB_FORCE;
+                       break;
                default:
                        return 0;
                }
index 0ce1c455ae555f2d8f73262be6089063608e9ffd..8093351bd7c3b0a9cefcb73ce1879a0527655c6e 100644 (file)
@@ -251,16 +251,28 @@ static int hfsplus_remount(struct super_block *sb, int *flags, char *data)
                return 0;
        if (!(*flags & MS_RDONLY)) {
                struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr;
+               struct hfsplus_sb_info sbi;
+
+               memset(&sbi, 0, sizeof(struct hfsplus_sb_info));
+               sbi.nls = HFSPLUS_SB(sb).nls;
+               if (!hfsplus_parse_options(data, &sbi))
+                       return -EINVAL;
 
                if (!(vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_UNMNT))) {
                        printk("HFS+-fs warning: Filesystem was not cleanly unmounted, "
                               "running fsck.hfsplus is recommended.  leaving read-only.\n");
                        sb->s_flags |= MS_RDONLY;
                        *flags |= MS_RDONLY;
+               } else if (sbi.flags & HFSPLUS_SB_FORCE) {
+                       /* nothing */
                } else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {
                        printk("HFS+-fs: Filesystem is marked locked, leaving read-only.\n");
                        sb->s_flags |= MS_RDONLY;
                        *flags |= MS_RDONLY;
+               } else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_JOURNALED)) {
+                       printk("HFS+-fs: Filesystem is marked journaled, leaving read-only.\n");
+                       sb->s_flags |= MS_RDONLY;
+                       *flags |= MS_RDONLY;
                }
        }
        return 0;
@@ -352,11 +364,19 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
                        printk("HFS+-fs warning: Filesystem was not cleanly unmounted, "
                               "running fsck.hfsplus is recommended.  mounting read-only.\n");
                sb->s_flags |= MS_RDONLY;
+       } else if (sbi->flags & HFSPLUS_SB_FORCE) {
+               /* nothing */
        } else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {
                if (!silent)
                        printk("HFS+-fs: Filesystem is marked locked, mounting read-only.\n");
                sb->s_flags |= MS_RDONLY;
+       } else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_JOURNALED)) {
+               if (!silent)
+                       printk("HFS+-fs: write access to a jounaled filesystem is not supported, "
+                              "use the force option at your own risk, mounting read-only.\n");
+               sb->s_flags |= MS_RDONLY;
        }
+       sbi->flags &= ~HFSPLUS_SB_FORCE;
 
        /* Load metadata objects (B*Trees) */
        HFSPLUS_SB(sb).ext_tree = hfs_btree_open(sb, HFSPLUS_EXT_CNID);
index 4684eb7d48c6ff15338083b4797558094b61be30..b3ad0bd0312f2ecc7e9ab8ea2dc37639a3a7b0d0 100644 (file)
@@ -501,11 +501,16 @@ int hostfs_commit_write(struct file *file, struct page *page, unsigned from,
        long long start;
        int err = 0;
 
-       start = (long long) (page->index << PAGE_CACHE_SHIFT) + from;
+       start = (((long long) page->index) << PAGE_CACHE_SHIFT) + from;
        buffer = kmap(page);
        err = write_file(FILE_HOSTFS_I(file)->fd, &start, buffer + from,
                         to - from);
        if(err > 0) err = 0;
+
+       /* Actually, if !err, write_file has added to-from to start, so, despite
+        * the appearance, we are comparing i_size against the _last_ written
+        * location, as we should. */
+
        if(!err && (start > inode->i_size))
                inode->i_size = start;
 
@@ -910,10 +915,8 @@ static struct inode_operations hostfs_dir_iops = {
 int hostfs_link_readpage(struct file *file, struct page *page)
 {
        char *buffer, *name;
-       long long start;
        int err;
 
-       start = page->index << PAGE_CACHE_SHIFT;
        buffer = kmap(page);
        name = inode_name(page->mapping->host, 0);
        if(name == NULL) return(-ENOMEM);
index 64983ab55586856ae06a93393d1ea38c907853e9..8c1cef3bb677015bb1de08922b6b21cc35055f2e 100644 (file)
@@ -512,10 +512,14 @@ static int hugetlbfs_statfs(struct super_block *sb, struct kstatfs *buf)
        buf->f_bsize = HPAGE_SIZE;
        if (sbinfo) {
                spin_lock(&sbinfo->stat_lock);
-               buf->f_blocks = sbinfo->max_blocks;
-               buf->f_bavail = buf->f_bfree = sbinfo->free_blocks;
-               buf->f_files = sbinfo->max_inodes;
-               buf->f_ffree = sbinfo->free_inodes;
+               /* If no limits set, just report 0 for max/free/used
+                * blocks, like simple_statfs() */
+               if (sbinfo->max_blocks >= 0) {
+                       buf->f_blocks = sbinfo->max_blocks;
+                       buf->f_bavail = buf->f_bfree = sbinfo->free_blocks;
+                       buf->f_files = sbinfo->max_inodes;
+                       buf->f_ffree = sbinfo->free_inodes;
+               }
                spin_unlock(&sbinfo->stat_lock);
        }
        buf->f_namelen = NAME_MAX;
index bf7ce1d2412bb43928b908527287668eb59fb90d..2fecb7af4a77d6316171f0e25a40fd9027a71647 100644 (file)
@@ -364,11 +364,12 @@ static int inotify_dev_get_wd(struct inotify_device *dev,
 /*
  * find_inode - resolve a user-given path to a specific inode and return a nd
  */
-static int find_inode(const char __user *dirname, struct nameidata *nd)
+static int find_inode(const char __user *dirname, struct nameidata *nd,
+                     unsigned flags)
 {
        int error;
 
-       error = __user_walk(dirname, LOOKUP_FOLLOW, nd);
+       error = __user_walk(dirname, flags, nd);
        if (error)
                return error;
        /* you can only watch an inode if you have read permissions on it */
@@ -933,6 +934,7 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
        struct file *filp;
        int ret, fput_needed;
        int mask_add = 0;
+       unsigned flags = 0;
 
        filp = fget_light(fd, &fput_needed);
        if (unlikely(!filp))
@@ -944,7 +946,12 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
                goto fput_and_out;
        }
 
-       ret = find_inode(path, &nd);
+       if (!(mask & IN_DONT_FOLLOW))
+               flags |= LOOKUP_FOLLOW;
+       if (mask & IN_ONLYDIR)
+               flags |= LOOKUP_DIRECTORY;
+
+       ret = find_inode(path, &nd, flags);
        if (unlikely(ret))
                goto fput_and_out;
 
index f193d43a8a595a14dbe2bbe67b5815365357e452..162af6dfe292c216f0c61f9a1db301b3ceb630b4 100644 (file)
        do {                                                            \
                printk(JFFS2_ERR_MSG_PREFIX                             \
                        " (%d) %s: " fmt, current->pid,                 \
-                       __FUNCTION__, ##__VA_ARGS__);                   \
+                       __FUNCTION__ , ##__VA_ARGS__);                  \
        } while(0)
 
 #define JFFS2_WARNING(fmt, ...)                                                \
        do {                                                            \
                printk(JFFS2_WARN_MSG_PREFIX                            \
                        " (%d) %s: " fmt, current->pid,                 \
-                       __FUNCTION__, ##__VA_ARGS__);                   \
+                       __FUNCTION__ , ##__VA_ARGS__);                  \
        } while(0)
 
 #define JFFS2_NOTICE(fmt, ...)                                         \
        do {                                                            \
                printk(JFFS2_NOTICE_MSG_PREFIX                          \
                        " (%d) %s: " fmt, current->pid,                 \
-                       __FUNCTION__, ##__VA_ARGS__);                   \
+                       __FUNCTION__ , ##__VA_ARGS__);                  \
        } while(0)
 
 #define JFFS2_DEBUG(fmt, ...)                                          \
        do {                                                            \
                printk(JFFS2_DBG_MSG_PREFIX                             \
                        " (%d) %s: " fmt, current->pid,                 \
-                       __FUNCTION__, ##__VA_ARGS__);                   \
+                       __FUNCTION__ , ##__VA_ARGS__);                  \
        } while(0)
 
 /*
index 543420665c5be2f641eacc6fa52062b15b4bcd0f..d0fcc5f3497ed1e757f6b420b78d3ba7193c3c3d 100644 (file)
@@ -234,6 +234,7 @@ void jffs2_read_inode (struct inode *inode)
        c = JFFS2_SB_INFO(inode->i_sb);
 
        jffs2_init_inode_info(f);
+       down(&f->sem);
 
        ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node);
 
@@ -400,6 +401,7 @@ struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_i
 
        f = JFFS2_INODE_INFO(inode);
        jffs2_init_inode_info(f);
+       down(&f->sem);
 
        memset(ri, 0, sizeof(*ri));
        /* Set OS-specific defaults for new inodes */
index 9e0b5458d9c072bc76e4fa6825e2b02163e4e0c4..93883817cbd0332df2d2e2652c7781baece90cde 100644 (file)
@@ -51,7 +51,7 @@ static void jffs2_i_init_once(void * foo, kmem_cache_t * cachep, unsigned long f
 
        if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
            SLAB_CTOR_CONSTRUCTOR) {
-               init_MUTEX_LOCKED(&ei->sem);
+               init_MUTEX(&ei->sem);
                inode_init_once(&ei->vfs_inode);
        }
 }
index 006bb9e14579e42c37cd5954dac3a34b1eacf25c..3eaf6e70108781fec63c61a32141b435532faae3 100644 (file)
@@ -157,6 +157,8 @@ void nlmclnt_mark_reclaim(struct nlm_host *host)
                inode = fl->fl_file->f_dentry->d_inode;
                if (inode->i_sb->s_magic != NFS_SUPER_MAGIC)
                        continue;
+               if (fl->fl_u.nfs_fl.owner == NULL)
+                       continue;
                if (fl->fl_u.nfs_fl.owner->host != host)
                        continue;
                if (!(fl->fl_u.nfs_fl.flags & NFS_LCK_GRANTED))
@@ -226,6 +228,8 @@ restart:
                inode = fl->fl_file->f_dentry->d_inode;
                if (inode->i_sb->s_magic != NFS_SUPER_MAGIC)
                        continue;
+               if (fl->fl_u.nfs_fl.owner == NULL)
+                       continue;
                if (fl->fl_u.nfs_fl.owner->host != host)
                        continue;
                if (!(fl->fl_u.nfs_fl.flags & NFS_LCK_RECLAIM))
index f2ca782aba33d23a52b7c6ff93e3a5c03577beb1..30cae3602867b532773fb6c0074f5663c04d2734 100644 (file)
@@ -14,6 +14,9 @@
 #include <linux/sunrpc/svc.h>
 #include <linux/sunrpc/svcsock.h>
 #include <linux/nfs_fs.h>
+
+#include <net/inet_sock.h>
+
 #include "nfs4_fs.h"
 #include "callback.h"
 
index 7370583b61e59e4fe685cac08ccb143e1f168e56..c0d1a214572ce9e2a2b804b7fee7eab44e4963ff 100644 (file)
@@ -1287,6 +1287,7 @@ dentry->d_parent->d_name.name, dentry->d_name.name);
                nfs_begin_data_update(dentry->d_inode);
                error = NFS_PROTO(dir)->rename(dir, &dentry->d_name,
                                dir, &qsilly);
+               nfs_mark_for_revalidate(dentry->d_inode);
                nfs_end_data_update(dentry->d_inode);
        } else
                error = NFS_PROTO(dir)->rename(dir, &dentry->d_name,
@@ -1334,6 +1335,7 @@ static int nfs_safe_remove(struct dentry *dentry)
                /* The VFS may want to delete this inode */
                if (error == 0)
                        inode->i_nlink--;
+               nfs_mark_for_revalidate(inode);
                nfs_end_data_update(inode);
        } else
                error = NFS_PROTO(dir)->remove(dir, &dentry->d_name);
@@ -1556,6 +1558,7 @@ go_ahead:
        nfs_begin_data_update(old_inode);
        error = NFS_PROTO(old_dir)->rename(old_dir, &old_dentry->d_name,
                                           new_dir, &new_dentry->d_name);
+       nfs_mark_for_revalidate(old_inode);
        nfs_end_data_update(old_inode);
        nfs_end_data_update(new_dir);
        nfs_end_data_update(old_dir);
index b497c71384e8df038b7059a447216b706117aa59..07922881760339f15e907e340c787cf78d888bca 100644 (file)
@@ -678,15 +678,9 @@ nfs_file_direct_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t
        if (!count)
                goto out;
 
-       if (mapping->nrpages) {
-               retval = filemap_fdatawrite(mapping);
-               if (retval == 0)
-                       retval = nfs_wb_all(inode);
-               if (retval == 0)
-                       retval = filemap_fdatawait(mapping);
-               if (retval)
-                       goto out;
-       }
+       retval = nfs_sync_mapping(mapping);
+       if (retval)
+               goto out;
 
        retval = nfs_direct_read(inode, ctx, &iov, pos, 1);
        if (retval > 0)
@@ -764,15 +758,9 @@ nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t count,
        if (!count)
                goto out;
 
-       if (mapping->nrpages) {
-               retval = filemap_fdatawrite(mapping);
-               if (retval == 0)
-                       retval = nfs_wb_all(inode);
-               if (retval == 0)
-                       retval = filemap_fdatawait(mapping);
-               if (retval)
-                       goto out;
-       }
+       retval = nfs_sync_mapping(mapping);
+       if (retval)
+               goto out;
 
        retval = nfs_direct_write(inode, ctx, &iov, pos, 1);
        if (mapping->nrpages)
index 57d3e77d97ee1eb2e9c291695078d8b06f902d24..7a79fbe9f5394c67dd53b01526d37e29fae0ce4e 100644 (file)
@@ -433,11 +433,7 @@ static int do_unlk(struct file *filp, int cmd, struct file_lock *fl)
         * Flush all pending writes before doing anything
         * with locks..
         */
-       filemap_fdatawrite(filp->f_mapping);
-       down(&inode->i_sem);
-       nfs_wb_all(inode);
-       up(&inode->i_sem);
-       filemap_fdatawait(filp->f_mapping);
+       nfs_sync_mapping(filp->f_mapping);
 
        /* NOTE: special case
         *      If we're signalled while cleaning up locks on process exit, we
@@ -465,15 +461,8 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
         * Flush all pending writes before doing anything
         * with locks..
         */
-       status = filemap_fdatawrite(filp->f_mapping);
-       if (status == 0) {
-               down(&inode->i_sem);
-               status = nfs_wb_all(inode);
-               up(&inode->i_sem);
-               if (status == 0)
-                       status = filemap_fdatawait(filp->f_mapping);
-       }
-       if (status < 0)
+       status = nfs_sync_mapping(filp->f_mapping);
+       if (status != 0)
                goto out;
 
        lock_kernel();
@@ -497,11 +486,7 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
         * Make sure we clear the cache whenever we try to get the lock.
         * This makes locking act as a cache coherency point.
         */
-       filemap_fdatawrite(filp->f_mapping);
-       down(&inode->i_sem);
-       nfs_wb_all(inode);      /* we may have slept */
-       up(&inode->i_sem);
-       filemap_fdatawait(filp->f_mapping);
+       nfs_sync_mapping(filp->f_mapping);
        nfs_zap_caches(inode);
 out:
        rpc_clnt_sigunmask(NFS_CLIENT(inode), &oldset);
@@ -524,7 +509,8 @@ static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl)
                return -EINVAL;
 
        /* No mandatory locks over NFS */
-       if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID)
+       if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
+           fl->fl_type != F_UNLCK)
                return -ENOLCK;
 
        if (IS_GETLK(cmd))
index 6391d89642144366591df7e7c0e6733b12916899..432f41cd75e6c9258035d01440720175008d3ebb 100644 (file)
@@ -54,7 +54,7 @@
 #define NFS_MAX_READAHEAD      (RPC_DEF_SLOT_TABLE - 1)
 
 static void nfs_invalidate_inode(struct inode *);
-static int nfs_update_inode(struct inode *, struct nfs_fattr *, unsigned long);
+static int nfs_update_inode(struct inode *, struct nfs_fattr *);
 
 static struct inode *nfs_alloc_inode(struct super_block *sb);
 static void nfs_destroy_inode(struct inode *);
@@ -640,17 +640,35 @@ static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt)
        return 0;
 }
 
+/**
+ * nfs_sync_mapping - helper to flush all mmapped dirty data to disk
+ */
+int nfs_sync_mapping(struct address_space *mapping)
+{
+       int ret;
+
+       if (mapping->nrpages == 0)
+               return 0;
+       unmap_mapping_range(mapping, 0, 0, 0);
+       ret = filemap_fdatawrite(mapping);
+       if (ret != 0)
+               goto out;
+       ret = filemap_fdatawait(mapping);
+       if (ret != 0)
+               goto out;
+       ret = nfs_wb_all(mapping->host);
+out:
+       return ret;
+}
+
 /*
  * Invalidate the local caches
  */
-void
-nfs_zap_caches(struct inode *inode)
+static void nfs_zap_caches_locked(struct inode *inode)
 {
        struct nfs_inode *nfsi = NFS_I(inode);
        int mode = inode->i_mode;
 
-       spin_lock(&inode->i_lock);
-
        NFS_ATTRTIMEO(inode) = NFS_MINATTRTIMEO(inode);
        NFS_ATTRTIMEO_UPDATE(inode) = jiffies;
 
@@ -659,7 +677,12 @@ nfs_zap_caches(struct inode *inode)
                nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
        else
                nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
+}
 
+void nfs_zap_caches(struct inode *inode)
+{
+       spin_lock(&inode->i_lock);
+       nfs_zap_caches_locked(inode);
        spin_unlock(&inode->i_lock);
 }
 
@@ -676,16 +699,13 @@ static void nfs_zap_acl_cache(struct inode *inode)
 }
 
 /*
- * Invalidate, but do not unhash, the inode
+ * Invalidate, but do not unhash, the inode.
+ * NB: must be called with inode->i_lock held!
  */
-static void
-nfs_invalidate_inode(struct inode *inode)
+static void nfs_invalidate_inode(struct inode *inode)
 {
-       umode_t save_mode = inode->i_mode;
-
-       make_bad_inode(inode);
-       inode->i_mode = save_mode;
-       nfs_zap_caches(inode);
+       set_bit(NFS_INO_STALE, &NFS_FLAGS(inode));
+       nfs_zap_caches_locked(inode);
 }
 
 struct nfs_find_desc {
@@ -1081,8 +1101,6 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
        int              status = -ESTALE;
        struct nfs_fattr fattr;
        struct nfs_inode *nfsi = NFS_I(inode);
-       unsigned long verifier;
-       unsigned long cache_validity;
 
        dfprintk(PAGECACHE, "NFS: revalidating (%s/%Ld)\n",
                inode->i_sb->s_id, (long long)NFS_FILEID(inode));
@@ -1107,8 +1125,6 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
                }
        }
 
-       /* Protect against RPC races by saving the change attribute */
-       verifier = nfs_save_change_attribute(inode);
        status = NFS_PROTO(inode)->getattr(server, NFS_FH(inode), &fattr);
        if (status != 0) {
                dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Ld) getattr failed, error=%d\n",
@@ -1123,7 +1139,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
        }
 
        spin_lock(&inode->i_lock);
-       status = nfs_update_inode(inode, &fattr, verifier);
+       status = nfs_update_inode(inode, &fattr);
        if (status) {
                spin_unlock(&inode->i_lock);
                dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Ld) refresh failed, error=%d\n",
@@ -1131,20 +1147,11 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
                         (long long)NFS_FILEID(inode), status);
                goto out;
        }
-       cache_validity = nfsi->cache_validity;
-       nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
-
-       /*
-        * We may need to keep the attributes marked as invalid if
-        * we raced with nfs_end_attr_update().
-        */
-       if (time_after_eq(verifier, nfsi->cache_change_attribute))
-               nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME);
        spin_unlock(&inode->i_lock);
 
        nfs_revalidate_mapping(inode, inode->i_mapping);
 
-       if (cache_validity & NFS_INO_INVALID_ACL)
+       if (nfsi->cache_validity & NFS_INO_INVALID_ACL)
                nfs_zap_acl_cache(inode);
 
        dfprintk(PAGECACHE, "NFS: (%s/%Ld) revalidation complete\n",
@@ -1193,11 +1200,8 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
        struct nfs_inode *nfsi = NFS_I(inode);
 
        if (nfsi->cache_validity & NFS_INO_INVALID_DATA) {
-               if (S_ISREG(inode->i_mode)) {
-                       if (filemap_fdatawrite(mapping) == 0)
-                               filemap_fdatawait(mapping);
-                       nfs_wb_all(inode);
-               }
+               if (S_ISREG(inode->i_mode))
+                       nfs_sync_mapping(mapping);
                invalidate_inode_pages2(mapping);
 
                spin_lock(&inode->i_lock);
@@ -1347,10 +1351,8 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
                return 0;
        spin_lock(&inode->i_lock);
        nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
-       if (nfs_verify_change_attribute(inode, fattr->time_start))
-               nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME);
        if (time_after(fattr->time_start, nfsi->last_updated))
-               status = nfs_update_inode(inode, fattr, fattr->time_start);
+               status = nfs_update_inode(inode, fattr);
        else
                status = nfs_check_inode_attributes(inode, fattr);
 
@@ -1376,10 +1378,7 @@ int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                nfsi->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
                goto out;
        }
-       status = nfs_update_inode(inode, fattr, fattr->time_start);
-       if (time_after_eq(fattr->time_start, nfsi->cache_change_attribute))
-               nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME|NFS_INO_REVAL_PAGECACHE);
-       nfsi->cache_change_attribute = jiffies;
+       status = nfs_update_inode(inode, fattr);
 out:
        spin_unlock(&inode->i_lock);
        return status;
@@ -1397,12 +1396,12 @@ out:
  *
  * A very similar scenario holds for the dir cache.
  */
-static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsigned long verifier)
+static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
 {
        struct nfs_inode *nfsi = NFS_I(inode);
        loff_t cur_isize, new_isize;
        unsigned int    invalid = 0;
-       int data_unstable;
+       int data_stable;
 
        dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n",
                        __FUNCTION__, inode->i_sb->s_id, inode->i_ino,
@@ -1433,8 +1432,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
        nfsi->last_updated = jiffies;
 
        /* Are we racing with known updates of the metadata on the server? */
-       data_unstable = ! (nfs_verify_change_attribute(inode, verifier) ||
-               (nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE));
+       data_stable = nfs_verify_change_attribute(inode, fattr->time_start);
+       if (data_stable)
+               nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME);
 
        /* Check if our cached file size is stale */
        new_isize = nfs_size_to_loff_t(fattr->size);
@@ -1443,7 +1443,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
                /* Do we perhaps have any outstanding writes? */
                if (nfsi->npages == 0) {
                        /* No, but did we race with nfs_end_data_update()? */
-                       if (time_after_eq(verifier,  nfsi->cache_change_attribute)) {
+                       if (data_stable) {
                                inode->i_size = new_isize;
                                invalid |= NFS_INO_INVALID_DATA;
                        }
@@ -1452,6 +1452,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
                        inode->i_size = new_isize;
                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
                }
+               nfsi->cache_change_attribute = jiffies;
                dprintk("NFS: isize change on server for file %s/%ld\n",
                                inode->i_sb->s_id, inode->i_ino);
        }
@@ -1461,8 +1462,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
                memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
                dprintk("NFS: mtime change on server for file %s/%ld\n",
                                inode->i_sb->s_id, inode->i_ino);
-               if (!data_unstable)
-                       invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
+               invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
+               nfsi->cache_change_attribute = jiffies;
        }
 
        if ((fattr->valid & NFS_ATTR_FATTR_V4)
@@ -1470,15 +1471,15 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
                dprintk("NFS: change_attr change on server for file %s/%ld\n",
                       inode->i_sb->s_id, inode->i_ino);
                nfsi->change_attr = fattr->change_attr;
-               if (!data_unstable)
-                       invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
+               invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
+               nfsi->cache_change_attribute = jiffies;
        }
 
        /* If ctime has changed we should definitely clear access+acl caches */
        if (!timespec_equal(&inode->i_ctime, &fattr->ctime)) {
-               if (!data_unstable)
-                       invalid |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
+               invalid |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
                memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
+               nfsi->cache_change_attribute = jiffies;
        }
        memcpy(&inode->i_atime, &fattr->atime, sizeof(inode->i_atime));
 
@@ -1516,6 +1517,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
                                || S_ISLNK(inode->i_mode)))
                invalid &= ~NFS_INO_INVALID_DATA;
+       if (data_stable)
+               invalid &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME|NFS_INO_REVAL_PAGECACHE);
        if (!nfs_have_delegation(inode, FMODE_READ))
                nfsi->cache_validity |= invalid;
 
@@ -1528,14 +1531,13 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
        printk(KERN_DEBUG "%s: inode %ld mode changed, %07o to %07o\n",
                        __FUNCTION__, inode->i_ino, inode->i_mode, fattr->mode);
 #endif
+ out_err:
        /*
         * No need to worry about unhashing the dentry, as the
         * lookup validation will know that the inode is bad.
         * (But we fall through to invalidate the caches.)
         */
        nfs_invalidate_inode(inode);
- out_err:
-       set_bit(NFS_INO_STALE, &NFS_FLAGS(inode));
        return -ESTALE;
 }
 
@@ -2068,6 +2070,7 @@ static struct inode *nfs_alloc_inode(struct super_block *sb)
                return NULL;
        nfsi->flags = 0UL;
        nfsi->cache_validity = 0UL;
+       nfsi->cache_change_attribute = jiffies;
 #ifdef CONFIG_NFS_V3_ACL
        nfsi->acl_access = ERR_PTR(-EAGAIN);
        nfsi->acl_default = ERR_PTR(-EAGAIN);
index 21482b2518f61799a53b85ecba768b0de2ef056c..f988a9417b13dc7d7e73c18dbd79f9b1b1eab6d5 100644 (file)
@@ -1506,10 +1506,15 @@ static int _nfs4_proc_write(struct nfs_write_data *wdata)
        dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
                        (long long) wdata->args.offset);
 
+       wdata->args.bitmask = server->attr_bitmask;
+       wdata->res.server = server;
        nfs_fattr_init(fattr);
        status = rpc_call_sync(server->client, &msg, rpcflags);
        dprintk("NFS reply write: %d\n", status);
-       return status;
+       if (status < 0)
+               return status;
+       nfs_post_op_update_inode(inode, fattr);
+       return wdata->res.count;
 }
 
 static int nfs4_proc_write(struct nfs_write_data *wdata)
@@ -1540,9 +1545,13 @@ static int _nfs4_proc_commit(struct nfs_write_data *cdata)
        dprintk("NFS call  commit %d @ %Ld\n", cdata->args.count,
                        (long long) cdata->args.offset);
 
+       cdata->args.bitmask = server->attr_bitmask;
+       cdata->res.server = server;
        nfs_fattr_init(fattr);
        status = rpc_call_sync(server->client, &msg, 0);
        dprintk("NFS reply commit: %d\n", status);
+       if (status >= 0)
+               nfs_post_op_update_inode(inode, fattr);
        return status;
 }
 
@@ -3071,15 +3080,15 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock
        struct nfs4_client *clp = state->owner->so_client;
        int status;
 
-       down_read(&clp->cl_sem);
        /* Is this a delegated open? */
-       if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
+       if (NFS_I(state->inode)->delegation_state != 0) {
                /* Yes: cache locks! */
                status = do_vfs_lock(request->fl_file, request);
                /* ...but avoid races with delegation recall... */
                if (status < 0 || test_bit(NFS_DELEGATED_STATE, &state->flags))
-                       goto out;
+                       return status;
        }
+       down_read(&clp->cl_sem);
        status = nfs4_set_lock_state(state, request);
        if (status != 0)
                goto out;
index 0675f3215e0a4fb7512f4950b007dfcb98420489..5ef4c57618fe8507da03dd4dbbd3d9de3aa84dca 100644 (file)
@@ -644,12 +644,15 @@ void nfs4_copy_stateid(nfs4_stateid *dst, struct nfs4_state *state, fl_owner_t f
 
 struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter)
 {
+       struct rpc_sequence *sequence = counter->sequence;
        struct nfs_seqid *new;
 
        new = kmalloc(sizeof(*new), GFP_KERNEL);
        if (new != NULL) {
                new->sequence = counter;
-               INIT_LIST_HEAD(&new->list);
+               spin_lock(&sequence->lock);
+               list_add_tail(&new->list, &sequence->list);
+               spin_unlock(&sequence->lock);
        }
        return new;
 }
@@ -658,12 +661,10 @@ void nfs_free_seqid(struct nfs_seqid *seqid)
 {
        struct rpc_sequence *sequence = seqid->sequence->sequence;
 
-       if (!list_empty(&seqid->list)) {
-               spin_lock(&sequence->lock);
-               list_del(&seqid->list);
-               spin_unlock(&sequence->lock);
-       }
-       rpc_wake_up_next(&sequence->wait);
+       spin_lock(&sequence->lock);
+       list_del(&seqid->list);
+       spin_unlock(&sequence->lock);
+       rpc_wake_up(&sequence->wait);
        kfree(seqid);
 }
 
@@ -722,11 +723,10 @@ int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
        if (sequence->list.next == &seqid->list)
                goto out;
        spin_lock(&sequence->lock);
-       if (!list_empty(&sequence->list)) {
+       if (sequence->list.next != &seqid->list) {
                rpc_sleep_on(&sequence->wait, task, NULL, NULL);
                status = -EAGAIN;
-       } else
-               list_add(&seqid->list, &sequence->list);
+       }
        spin_unlock(&sequence->lock);
 out:
        return status;
index a48a003242c006c94f8823fdc081d3c03289289e..e1e3ca5d746be50946fd1a833402765f511e436a 100644 (file)
@@ -375,6 +375,7 @@ nfs_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
 
        dprintk("NFS call  link %s\n", name->name);
        status = rpc_call(NFS_CLIENT(inode), NFSPROC_LINK, &arg, NULL, 0);
+       nfs_mark_for_revalidate(inode);
        nfs_mark_for_revalidate(dir);
        dprintk("NFS reply link: %d\n", status);
        return status;
index 8f71e766cc5d98813b80efc70ce48cba335c5514..3107908e5f3f98e3e264c05e4c8329f4649f1ce4 100644 (file)
@@ -189,6 +189,7 @@ static int nfs_writepage_sync(struct nfs_open_context *ctx, struct inode *inode,
                (long long)NFS_FILEID(inode),
                count, (long long)(page_offset(page) + offset));
 
+       set_page_writeback(page);
        nfs_begin_data_update(inode);
        do {
                if (count < wsize)
@@ -221,6 +222,7 @@ static int nfs_writepage_sync(struct nfs_open_context *ctx, struct inode *inode,
 
 io_error:
        nfs_end_data_update(inode);
+       end_page_writeback(page);
        nfs_writedata_free(wdata);
        return written ? written : result;
 }
@@ -929,7 +931,7 @@ static int nfs_flush_multi(struct list_head *head, struct inode *inode, int how)
        atomic_set(&req->wb_complete, requests);
 
        ClearPageError(page);
-       SetPageWriteback(page);
+       set_page_writeback(page);
        offset = 0;
        nbytes = req->wb_bytes;
        do {
@@ -992,7 +994,7 @@ static int nfs_flush_one(struct list_head *head, struct inode *inode, int how)
                nfs_list_remove_request(req);
                nfs_list_add_request(req, &data->pages);
                ClearPageError(req->wb_page);
-               SetPageWriteback(req->wb_page);
+               set_page_writeback(req->wb_page);
                *pages++ = req->wb_page;
                count += req->wb_bytes;
        }
index 7cbf0682b2f0d63d5cd53b22908ab06f87e7e002..fc95c4df66934e4fe420aada6f1feac601ee8f92 100644 (file)
@@ -107,7 +107,7 @@ static int nfsacld_proc_setacl(struct svc_rqst * rqstp,
        dprintk("nfsd: SETACL(2acl)   %s\n", SVCFH_fmt(&argp->fh));
 
        fh = fh_copy(&resp->fh, &argp->fh);
-       nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_NOP);
+       nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_SATTR);
 
        if (!nfserr) {
                nfserr = nfserrno( nfsd_set_posix_acl(
index 64ba40572feab034329809c97f5c37a68630b34a..16e10c170aedf33276def7ad26711bbe5ad4f6cc 100644 (file)
@@ -101,7 +101,7 @@ static int nfsd3_proc_setacl(struct svc_rqst * rqstp,
        int nfserr = 0;
 
        fh = fh_copy(&resp->fh, &argp->fh);
-       nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_NOP);
+       nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_SATTR);
 
        if (!nfserr) {
                nfserr = nfserrno( nfsd_set_posix_acl(
index 50a7749cfca1bc73c0331ca032db93adaf5f348f..02f44094bda9da4d0fc21b8c798243cc29750f05 100644 (file)
@@ -884,7 +884,7 @@ ToDo/Notes:
 
        - Add handling for initialized_size != data_size in compressed files.
        - Reduce function local stack usage from 0x3d4 bytes to just noise in
-         fs/ntfs/upcase.c. (Randy Dunlap <rddunlap@osdl.ord>)
+         fs/ntfs/upcase.c. (Randy Dunlap <rdunlap@xenotime.net>)
        - Remove compiler warnings for newer gcc.
        - Pages are no longer kmapped by mm/filemap.c::generic_file_write()
          around calls to ->{prepare,commit}_write.  Adapt NTFS appropriately
index deb25b661f048467f828f6a671c988d1acf1cf10..656bc43431b9cb362829a150bf7532bbebd087bd 100644 (file)
@@ -203,7 +203,7 @@ config ULTRIX_PARTITION
 
 config SUN_PARTITION
        bool "Sun partition tables support" if PARTITION_ADVANCED
-       default y if (SPARC32 || SPARC64 || SUN3 || SUN3X)
+       default y if (SPARC || SUN3 || SUN3X)
        ---help---
          Like most systems, SunOS uses its own hard disk partition table
          format, incompatible with all others. Saying Y here allows you to
index b638fb500743406a55d3e24c0671882ddec68261..72b431d0a0a4124d0dbbc52fae842d622bffc3fc 100644 (file)
@@ -54,6 +54,18 @@ proc_file_read(struct file *file, char __user *buf, size_t nbytes,
        ssize_t n, count;
        char    *start;
        struct proc_dir_entry * dp;
+       unsigned long long pos;
+
+       /*
+        * Gaah, please just use "seq_file" instead. The legacy /proc
+        * interfaces cut loff_t down to off_t for reads, and ignore
+        * the offset entirely for writes..
+        */
+       pos = *ppos;
+       if (pos > MAX_NON_LFS)
+               return 0;
+       if (nbytes > MAX_NON_LFS - pos)
+               nbytes = MAX_NON_LFS - pos;
 
        dp = PDE(inode);
        if (!(page = (char*) __get_free_page(GFP_KERNEL)))
@@ -202,30 +214,17 @@ proc_file_write(struct file *file, const char __user *buffer,
 static loff_t
 proc_file_lseek(struct file *file, loff_t offset, int orig)
 {
-    lock_kernel();
-
-    switch (orig) {
-    case 0:
-       if (offset < 0)
-           goto out;
-       file->f_pos = offset;
-       unlock_kernel();
-       return(file->f_pos);
-    case 1:
-       if (offset + file->f_pos < 0)
-           goto out;
-       file->f_pos += offset;
-       unlock_kernel();
-       return(file->f_pos);
-    case 2:
-       goto out;
-    default:
-       goto out;
-    }
-
-out:
-    unlock_kernel();
-    return -EINVAL;
+       loff_t retval = -EINVAL;
+       switch (orig) {
+       case 1:
+               offset += file->f_pos;
+       /* fallthrough */
+       case 0:
+               if (offset < 0 || offset > MAX_NON_LFS)
+                       break;
+               file->f_pos = retval = offset;
+       }
+       return retval;
 }
 
 static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
index 9ab97cef0daa001dded3c6d667e95ea4134fc0a7..50bd5a8f0446d902cc6161032fde8ac5fcadd7a6 100644 (file)
@@ -402,12 +402,11 @@ struct numa_maps {
 /*
  * Calculate numa node maps for a vma
  */
-static struct numa_maps *get_numa_maps(const struct vm_area_struct *vma)
+static struct numa_maps *get_numa_maps(struct vm_area_struct *vma)
 {
+       int i;
        struct page *page;
        unsigned long vaddr;
-       struct mm_struct *mm = vma->vm_mm;
-       int i;
        struct numa_maps *md = kmalloc(sizeof(struct numa_maps), GFP_KERNEL);
 
        if (!md)
@@ -420,7 +419,7 @@ static struct numa_maps *get_numa_maps(const struct vm_area_struct *vma)
                md->node[i] =0;
 
        for (vaddr = vma->vm_start; vaddr < vma->vm_end; vaddr += PAGE_SIZE) {
-               page = follow_page(mm, vaddr, 0);
+               page = follow_page(vma, vaddr, 0);
                if (page) {
                        int count = page_mapcount(page);
 
index 991253927658bf2a2673c70c8ec99789f709f59f..46efbf52cbeca2c1962c1222bde634393193206c 100644 (file)
 #include <linux/buffer_head.h>
 #include <linux/bitops.h>
 
+#if 0
 int qnx4_new_block(struct super_block *sb)
 {
        return 0;
 }
+#endif  /*  0  */
 
 static void count_bits(register const char *bmPart, register int size,
                       int *const tf)
index a091ee4f430df6cc83317b59c4a2fc363c005080..df3468a22fea498889a5af4523556439d9f880bf 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/security.h>
 #include <linux/module.h>
 #include <linux/syscalls.h>
+#include <linux/pagemap.h>
 
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -182,22 +183,33 @@ bad:
 }
 #endif
 
+/*
+ * rw_verify_area doesn't like huge counts. We limit
+ * them to something that fits in "int" so that others
+ * won't have to do range checks all the time.
+ */
+#define MAX_RW_COUNT (INT_MAX & PAGE_CACHE_MASK)
 
 int rw_verify_area(int read_write, struct file *file, loff_t *ppos, size_t count)
 {
        struct inode *inode;
        loff_t pos;
 
-       if (unlikely(count > INT_MAX))
+       if (unlikely((ssize_t) count < 0))
                goto Einval;
        pos = *ppos;
        if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
                goto Einval;
 
        inode = file->f_dentry->d_inode;
-       if (inode->i_flock && MANDATORY_LOCK(inode))
-               return locks_mandatory_area(read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE, inode, file, pos, count);
-       return 0;
+       if (inode->i_flock && MANDATORY_LOCK(inode)) {
+               int retval = locks_mandatory_area(
+                       read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE,
+                       inode, file, pos, count);
+               if (retval < 0)
+                       return retval;
+       }
+       return count > MAX_RW_COUNT ? MAX_RW_COUNT : count;
 
 Einval:
        return -EINVAL;
@@ -244,7 +256,8 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
                return -EFAULT;
 
        ret = rw_verify_area(READ, file, pos, count);
-       if (!ret) {
+       if (ret >= 0) {
+               count = ret;
                ret = security_file_permission (file, MAY_READ);
                if (!ret) {
                        if (file->f_op->read)
@@ -295,7 +308,8 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
                return -EFAULT;
 
        ret = rw_verify_area(WRITE, file, pos, count);
-       if (!ret) {
+       if (ret >= 0) {
+               count = ret;
                ret = security_file_permission (file, MAY_WRITE);
                if (!ret) {
                        if (file->f_op->write)
@@ -497,7 +511,7 @@ static ssize_t do_readv_writev(int type, struct file *file,
        }
 
        ret = rw_verify_area(type, file, pos, tot_len);
-       if (ret)
+       if (ret < 0)
                goto out;
        ret = security_file_permission(file, type == READ ? MAY_READ : MAY_WRITE);
        if (ret)
@@ -653,8 +667,9 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
                if (!(in_file->f_mode & FMODE_PREAD))
                        goto fput_in;
        retval = rw_verify_area(READ, in_file, ppos, count);
-       if (retval)
+       if (retval < 0)
                goto fput_in;
+       count = retval;
 
        retval = security_file_permission (in_file, MAY_READ);
        if (retval)
@@ -674,8 +689,9 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
                goto fput_out;
        out_inode = out_file->f_dentry->d_inode;
        retval = rw_verify_area(WRITE, out_file, &out_file->f_pos, count);
-       if (retval)
+       if (retval < 0)
                goto fput_out;
+       count = retval;
 
        retval = security_file_permission (out_file, MAY_WRITE);
        if (retval)
index 5f82352b97e179c263366e550ab8f7564ebf1d16..a5e3a0ddbe53a0cd5e6b731985ad3c87d033db99 100644 (file)
@@ -32,6 +32,7 @@ void reiserfs_delete_inode(struct inode *inode)
            JOURNAL_PER_BALANCE_CNT * 2 +
            2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb);
        struct reiserfs_transaction_handle th;
+       int err;
 
        truncate_inode_pages(&inode->i_data, 0);
 
@@ -49,15 +50,13 @@ void reiserfs_delete_inode(struct inode *inode)
                }
                reiserfs_update_inode_transaction(inode);
 
-               if (reiserfs_delete_object(&th, inode)) {
-                       up(&inode->i_sem);
-                       goto out;
-               }
+               err = reiserfs_delete_object(&th, inode);
 
                /* Do quota update inside a transaction for journaled quotas. We must do that
                 * after delete_object so that quota updates go into the same transaction as
                 * stat data deletion */
-               DQUOT_FREE_INODE(inode);
+               if (!err) 
+                       DQUOT_FREE_INODE(inode);
 
                if (journal_end(&th, inode->i_sb, jbegin_count)) {
                        up(&inode->i_sem);
@@ -66,6 +65,12 @@ void reiserfs_delete_inode(struct inode *inode)
 
                up(&inode->i_sem);
 
+               /* check return value from reiserfs_delete_object after
+                * ending the transaction
+                */
+               if (err)
+                   goto out;
+
                /* all items of file are deleted, so we can remove "save" link */
                remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything
                                                                 * about an error here */
@@ -2099,6 +2104,7 @@ int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps)
        struct page *page = NULL;
        int error;
        struct buffer_head *bh = NULL;
+       int err2;
 
        reiserfs_write_lock(p_s_inode->i_sb);
 
@@ -2136,14 +2142,18 @@ int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps)
                   transaction of truncating gets committed - on reboot the file
                   either appears truncated properly or not truncated at all */
                add_save_link(&th, p_s_inode, 1);
-       error = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps);
-       if (error)
-               goto out;
+       err2 = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps);
        error =
            journal_end(&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1);
        if (error)
                goto out;
 
+       /* check reiserfs_do_truncate after ending the transaction */
+       if (err2) {
+               error = err2;
+               goto out;
+       }
+       
        if (update_timestamps) {
                error = remove_save_link(p_s_inode, 1 /* truncate */ );
                if (error)
@@ -2194,7 +2204,7 @@ static int map_block_for_writepage(struct inode *inode,
        INITIALIZE_PATH(path);
        int pos_in_item;
        int jbegin_count = JOURNAL_PER_BALANCE_CNT;
-       loff_t byte_offset = (block << inode->i_sb->s_blocksize_bits) + 1;
+       loff_t byte_offset = ((loff_t)block << inode->i_sb->s_blocksize_bits)+1;
        int retval;
        int use_get_block = 0;
        int bytes_copied = 0;
index 4b15761434bc7fac7c494703267995a9b49a6ff2..3f17ef844fb65ad61b373c2b746ae832a53d0aba 100644 (file)
@@ -1039,6 +1039,10 @@ static int flush_commit_list(struct super_block *s,
        }
        atomic_dec(&journal->j_async_throttle);
 
+       /* We're skipping the commit if there's an error */
+       if (retval || reiserfs_is_journal_aborted(journal))
+               barrier = 0;
+
        /* wait on everything written so far before writing the commit
         * if we are in barrier mode, send the commit down now
         */
@@ -1077,10 +1081,16 @@ static int flush_commit_list(struct super_block *s,
        BUG_ON(atomic_read(&(jl->j_commit_left)) != 1);
 
        if (!barrier) {
-               if (buffer_dirty(jl->j_commit_bh))
-                       BUG();
-               mark_buffer_dirty(jl->j_commit_bh);
-               sync_dirty_buffer(jl->j_commit_bh);
+               /* If there was a write error in the journal - we can't commit
+                * this transaction - it will be invalid and, if successful,
+                * will just end up propogating the write error out to
+                * the file system. */
+               if (likely(!retval && !reiserfs_is_journal_aborted (journal))) {
+                       if (buffer_dirty(jl->j_commit_bh))
+                               BUG();
+                       mark_buffer_dirty(jl->j_commit_bh) ;
+                       sync_dirty_buffer(jl->j_commit_bh) ;
+               }
        } else
                wait_on_buffer(jl->j_commit_bh);
 
@@ -2757,6 +2767,15 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
        journal->j_cnode_used = 0;
        journal->j_must_wait = 0;
 
+       if (journal->j_cnode_free == 0) {
+               reiserfs_warning(p_s_sb, "journal-2004: Journal cnode memory "
+                                "allocation failed (%ld bytes). Journal is "
+                                "too large for available memory. Usually "
+                                "this is due to a journal that is too large.",
+                                sizeof (struct reiserfs_journal_cnode) * num_cnodes);
+               goto free_and_return;
+       }
+
        init_journal_hash(p_s_sb);
        jl = journal->j_current_jl;
        jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
index 72e120798677a0ff20852c4a528bc8c4c5c9aa12..02091eaac0b45557aa2152cdb56533e3e4191c6d 100644 (file)
@@ -115,8 +115,8 @@ static struct dentry *__get_xa_root(struct super_block *s)
 }
 
 /* Returns the dentry (or NULL) referring to the root of the extended
- * attribute directory tree. If it has already been retreived, it is used.
- * Otherwise, we attempt to retreive it from disk. It may also return
+ * attribute directory tree. If it has already been retrieved, it is used.
+ * Otherwise, we attempt to retrieve it from disk. It may also return
  * a pointer-encoded error.
  */
 static inline struct dentry *get_xa_root(struct super_block *s)
index 16446a15c96d956d84d83859a0660f4a8736bc29..2a6f7f12b7f9458a96f19be651f1d05bbef4f601 100644 (file)
@@ -333,8 +333,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
        return length;
 
 toobig:
-       printk(KERN_WARNING "relayfs: event too large (%Zd)\n", length);
-       WARN_ON(1);
+       buf->chan->last_toobig = length;
        return 0;
 }
 
@@ -399,6 +398,11 @@ void relay_close(struct rchan *chan)
                relay_close_buf(chan->buf[i]);
        }
 
+       if (chan->last_toobig)
+               printk(KERN_WARNING "relayfs: one or more items not logged "
+                      "[item size (%Zd) > sub-buffer size (%Zd)]\n",
+                      chan->last_toobig, chan->subbuf_size);
+
        kref_put(&chan->kref, relay_destroy_channel);
 }
 
index b9ded26b10a90b49972e3654d15ad198054c5faf..6598a5037ac80c915bcdbf08269e7a855d051686 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *     Block allocation handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index d95c6e38a45591bd8b3dff70aff4ce993c40e8e0..1b82a4adc2f7594ae11cc9151200be3135449f8d 100644 (file)
  *
  *     AT&T gives permission for the free use of the CRC source code.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 82440b731142f0b1ec8d2e2281ca30d0087b9f3f..f5222527fe39fca5cb0d8997c4140ad9959a253b 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *  Directory handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 9a61ecc5451b07422e6c44563b8c0ac306a1a4d3..fe751a2a0e478d5debb692a7ae23d0c1dc750b6a 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *     Directory related functions
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 01f520c71dc1287102ef44b3fa2884cdeecd1876..8a388289040dbb66de764c8ccc92fdade27253eb 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *  File handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *  E-mail regarding any portion of the Linux UDF file system should be
- *  directed to the development team mailing list (run by majordomo):
- *    linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *  This file is distributed under the terms of the GNU General Public
  *  License (GPL). Copies of the GPL can be obtained from:
index 2dde6b888c2bac2e21d22c590a333ea5648e5b92..5887d78cde431cb05bfb3289b547195ae52421b1 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *  Fsync handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *  E-mail regarding any portion of the Linux UDF file system should be
- *  directed to the development team mailing list (run by majordomo):
- *      linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *  This file is distributed under the terms of the GNU General Public
  *  License (GPL). Copies of the GPL can be obtained from:
index a7e5d40f1ebc002a354abb68c6a0a89e95594656..c9b707b470ca4433fbb08bb7821d7f78d85343ea 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *     Inode allocation handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index b83890beaaacbec45e199c9cf8fc78599423ff07..4014f17d382e70ddc3662521515347748af01910 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *  Inode handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *  E-mail regarding any portion of the Linux UDF file system should be
- *  directed to the development team mailing list (run by majordomo):
- *    linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *  This file is distributed under the terms of the GNU General Public
  *  License (GPL). Copies of the GPL can be obtained from:
index 2da5087dfe05e5eac788a9726e4e09c8b942e27c..08421610766737540d96abd8405fec0b14e28aed 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *  Low Level Device Routines for the UDF filesystem
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index fd321f9ace83a1c7d06ce346f1adf6bded6331d3..cc8ca3254db11f95d669f8b93321f6ee2c61517d 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *     Miscellaneous routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index ac191ed7df0ac74cf57ca06152fd2b5fcd6367f5..ca732e79c48bb60af77c28dfe8f0a4f75b9f64b1 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *      Inode name handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *      E-mail regarding any portion of the Linux UDF file system should be
- *      directed to the development team mailing list (run by majordomo):
- *              linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *      This file is distributed under the terms of the GNU General Public
  *      License (GPL). Copies of the GPL can be obtained from:
index 4d36f264be0d00f05be048a5a4c0d94cd1e35737..dabf2b841db83c1ad00139e7c94054a858caa263 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *      Partition handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *      E-mail regarding any portion of the Linux UDF file system should be
- *      directed to the development team mailing list (run by majordomo):
- *              linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *      This file is distributed under the terms of the GNU General Public
  *      License (GPL). Copies of the GPL can be obtained from:
index 15bd4f24c5b762907d643c231a53e8016d23160b..4a6f49adc609b051b16bea2e5e59d7719b1e5ed7 100644 (file)
  *    http://www.ecma.ch/
  *    http://www.iso.org/
  *
- * CONTACTS
- *  E-mail regarding any portion of the Linux UDF file system should be
- *  directed to the development team mailing list (run by majordomo):
- *       linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *  This file is distributed under the terms of the GNU General Public
  *  License (GPL). Copies of the GPL can be obtained from:
index 43f3051ef756484c58d14b959d42bb26f103b83a..674bb40edc839475cb4bdf5f1fd3b789808ee144 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *     Symlink handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 7dc8a5572ca1900f5ee94db2c9a3695c88a2f909..e1b0e8cfecb4947a120c2c5eeb78848b7604fa32 100644 (file)
@@ -4,11 +4,6 @@
  * PURPOSE
  *     Truncate handling routines for the OSTA-UDF(tm) filesystem.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 5a80efd8debc9b7357668743a45411618c6c4d64..706c92e1dcc937f256c022bc0fcf596b020f21c1 100644 (file)
  *     UTF-8 is explained in the IETF RFC XXXX.
  *             ftp://ftp.internic.net/rfc/rfcxxxx.txt
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team's mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index a9db225579983b4babe40ac4c47a9eef0a3250cb..bcc2156d4d2873d0c3a7b0841a4cdaf1fa456e22 100644 (file)
@@ -245,7 +245,7 @@ listxattr(struct dentry *d, char __user *list, size_t size)
                error = d->d_inode->i_op->listxattr(d, klist, size);
        } else {
                error = security_inode_listsecurity(d->d_inode, klist, size);
-               if (size && error >= size)
+               if (size && error > size)
                        error = -ERANGE;
        }
        if (error > 0) {
index c6108971b4e6a4febd84be420c6da7b832acf768..94d3cdfbf9b8054a502b976fb8c7825837bbf85c 100644 (file)
@@ -941,13 +941,12 @@ __linvfs_get_block(
        int                     retpbbm = 1;
        int                     error;
 
-       if (blocks) {
-               offset = blocks << inode->i_blkbits;    /* 64 bit goodness */
-               size = (ssize_t) min_t(xfs_off_t, offset, LONG_MAX);
-       } else {
-               size = 1 << inode->i_blkbits;
-       }
        offset = (xfs_off_t)iblock << inode->i_blkbits;
+       if (blocks)
+               size = (ssize_t) min_t(xfs_off_t, LONG_MAX,
+                                       (xfs_off_t)blocks << inode->i_blkbits);
+       else
+               size = 1 << inode->i_blkbits;
 
        VOP_BMAP(vp, offset, size,
                create ? flags : BMAPI_READ, &iomap, &retpbbm, error);
@@ -1007,7 +1006,7 @@ __linvfs_get_block(
                ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0);
                offset = min_t(xfs_off_t,
                                iomap.iomap_bsize - iomap.iomap_delta,
-                               blocks << inode->i_blkbits);
+                               (xfs_off_t)blocks << inode->i_blkbits);
                bh_result->b_size = (u32) min_t(xfs_off_t, UINT_MAX, offset);
        }
 
index 1aea42d71a6424ea6091bb4539e947fed9c287b9..5328a2937127dedd66344460025e339839de75de 100644 (file)
@@ -78,7 +78,7 @@ 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);
+STATIC int     xfs_qm_shake(int, gfp_t);
 
 #ifdef DEBUG
 extern mutex_t qcheck_lock;
@@ -2197,7 +2197,7 @@ xfs_qm_shake_freelist(
  */
 /* ARGSUSED */
 STATIC int
-xfs_qm_shake(int nr_to_scan, unsigned int gfp_mask)
+xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask)
 {
        int     ndqused, nfree, n;
 
index 35e557b00db2175cdbda7a48ce4f4a2e93b0b0ad..1c7421840c1802441b5345ec766727a0f874b9eb 100644 (file)
@@ -310,7 +310,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args)
         * Fix up the start offset of the attribute fork
         */
        totsize -= size;
-       if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname) {
+       if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname &&
+           !(mp->m_flags & XFS_MOUNT_COMPAT_ATTR)) {
                /*
                 * Last attribute now removed, revert to original
                 * inode format making all literal area available
@@ -328,7 +329,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args)
                xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
                dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize);
                ASSERT(dp->i_d.di_forkoff);
-               ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || args->addname);
+               ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || args->addname ||
+                       (mp->m_flags & XFS_MOUNT_COMPAT_ATTR));
                dp->i_afp->if_ext_max =
                        XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t);
                dp->i_df.if_ext_max =
@@ -737,7 +739,8 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp)
                                + name_loc->namelen
                                + INT_GET(name_loc->valuelen, ARCH_CONVERT);
        }
-       if (bytes == sizeof(struct xfs_attr_sf_hdr))
+       if (!(dp->i_mount->m_flags & XFS_MOUNT_COMPAT_ATTR) &&
+           (bytes == sizeof(struct xfs_attr_sf_hdr)))
                return(-1);
        return(xfs_attr_shortform_bytesfit(dp, bytes));
 }
@@ -775,6 +778,8 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff)
                goto out;
 
        if (forkoff == -1) {
+               ASSERT(!(dp->i_mount->m_flags & XFS_MOUNT_COMPAT_ATTR));
+
                /*
                 * Last attribute was removed, revert to original
                 * inode format making all literal area available
index 7ceabd0e2d9d93c0abd771855efa245e86454e91..d1236d6f40455c96d188463c188dee42502447db 100644 (file)
@@ -550,7 +550,7 @@ xfs_fs_goingdown(
                struct vfs *vfsp = XFS_MTOVFS(mp);
                struct super_block *sb = freeze_bdev(vfsp->vfs_super->s_bdev);
 
-               if (sb) {
+               if (sb && !IS_ERR(sb)) {
                        xfs_force_shutdown(mp, XFS_FORCE_UMOUNT);
                        thaw_bdev(sb->s_bdev, sb);
                }
index fcd6d63bb68ba4c4db7da17d15d8dfcb0572d8e4..3ce204a524b0665df59272cdc4425d0772f95619 100644 (file)
@@ -69,7 +69,7 @@ typedef struct xfs_iomap {
        xfs_buftarg_t           *iomap_target;
        xfs_off_t               iomap_offset;   /* offset of mapping, bytes */
        xfs_off_t               iomap_bsize;    /* size of mapping, bytes */
-       size_t                  iomap_delta;    /* offset into mapping, bytes */
+       xfs_off_t               iomap_delta;    /* offset into mapping, bytes */
        iomap_flags_t           iomap_flags;
 } xfs_iomap_t;
 
index 8f285149681fcb6c03f05685502c1d036adb24be..4518b188ade69d5e1ff44f850f2a2a5e0e9fd768 100644 (file)
@@ -494,10 +494,8 @@ typedef struct log {
 
 #define XLOG_FORCED_SHUTDOWN(log)      ((log)->l_flags & XLOG_IO_ERROR)
 
-#define XLOG_GRANT_SUB_SPACE(log,bytes,type)   \
-       xlog_grant_sub_space(log,bytes,type)
-static inline void xlog_grant_sub_space(struct log *log, int bytes, int type)
-{
+#define XLOG_GRANT_SUB_SPACE(log,bytes,type)                           \
+    {                                                                  \
        if (type == 'w') {                                              \
                (log)->l_grant_write_bytes -= (bytes);                  \
                if ((log)->l_grant_write_bytes < 0) {                   \
@@ -511,13 +509,9 @@ static inline void xlog_grant_sub_space(struct log *log, int bytes, int type)
                        (log)->l_grant_reserve_cycle--;                 \
                }                                                       \
         }                                                              \
-}
-
-#define XLOG_GRANT_ADD_SPACE(log,bytes,type)   \
-       xlog_grant_add_space(log,bytes,type)
-static inline void
-xlog_grant_add_space(struct log *log, int bytes, int type)
-{
+    }
+#define XLOG_GRANT_ADD_SPACE(log,bytes,type)                           \
+    {                                                                  \
        if (type == 'w') {                                              \
                (log)->l_grant_write_bytes += (bytes);                  \
                if ((log)->l_grant_write_bytes > (log)->l_logsize) {    \
@@ -531,12 +525,9 @@ xlog_grant_add_space(struct log *log, int bytes, int type)
                        (log)->l_grant_reserve_cycle++;                 \
                }                                                       \
         }                                                              \
-}
-
-#define XLOG_INS_TICKETQ(q, tic)       xlog_ins_ticketq(q, tic)
-static inline void
-xlog_ins_ticketq(struct xlog_ticket *q, struct xlog_ticket *tic)
-{                                                      \
+    }
+#define XLOG_INS_TICKETQ(q, tic)                       \
+    {                                                  \
        if (q) {                                        \
                (tic)->t_next       = (q);              \
                (tic)->t_prev       = (q)->t_prev;      \
@@ -547,12 +538,9 @@ xlog_ins_ticketq(struct xlog_ticket *q, struct xlog_ticket *tic)
                (q) = (tic);                            \
        }                                               \
        (tic)->t_flags |= XLOG_TIC_IN_Q;                \
-}
-
-#define XLOG_DEL_TICKETQ(q, tic)       xlog_del_ticketq(q, tic)
-static inline void
-xlog_del_ticketq(struct xlog_ticket *q, struct xlog_ticket *tic)
-{                                                      \
+    }
+#define XLOG_DEL_TICKETQ(q, tic)                       \
+    {                                                  \
        if ((tic) == (tic)->t_next) {                   \
                (q) = NULL;                             \
        } else {                                        \
@@ -562,7 +550,7 @@ xlog_del_ticketq(struct xlog_ticket *q, struct xlog_ticket *tic)
        }                                               \
        (tic)->t_next = (tic)->t_prev = NULL;           \
        (tic)->t_flags &= ~XLOG_TIC_IN_Q;               \
-}
+    }
 
 /* common routines */
 extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);
index 7c1f74531463bb11cac411322a6366420c822921..e03fa2a3d5ed4bb2af022b31c4bf0309c481d702 100644 (file)
@@ -3958,8 +3958,9 @@ xfs_finish_reclaim_all(xfs_mount_t *mp, int noblock)
                                }
                        }
                        XFS_MOUNT_IUNLOCK(mp);
-                       xfs_finish_reclaim(ip, noblock,
-                               XFS_IFLUSH_DELWRI_ELSE_ASYNC);
+                       if (xfs_finish_reclaim(ip, noblock,
+                                       XFS_IFLUSH_DELWRI_ELSE_ASYNC))
+                               delay(1);
                        purged = 1;
                        break;
                }
index e9c2790139ecfa47165f006afd285705618e34d9..4ab2ca18b8df483bb672cc34e6129ad3b516955e 100644 (file)
@@ -211,7 +211,7 @@ ACPI_EXTERN u32 acpi_gbl_original_mode;
 ACPI_EXTERN u32 acpi_gbl_rsdp_original_location;
 ACPI_EXTERN u32 acpi_gbl_ns_lookup_count;
 ACPI_EXTERN u32 acpi_gbl_ps_find_count;
-ACPI_EXTERN u32 acpi_gbl_owner_id_mask;
+ACPI_EXTERN u64 acpi_gbl_owner_id_mask;
 ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save;
 ACPI_EXTERN u16 acpi_gbl_global_lock_handle;
 ACPI_EXTERN u8 acpi_gbl_debugger_configuration;
index 36505bb4e8cbb8790e4be3d44b067f44e3ede462..6183eab006d43a3c30c334a3f2d9ed334c512431 100644 (file)
@@ -118,8 +118,6 @@ static __inline__ long atomic_add_return(int i, atomic_t * v)
        return result;
 }
 
-#define atomic_add_negative(a, v)      (atomic_add_return((a), (v)) < 0)
-
 static __inline__ long atomic64_add_return(long i, atomic64_t * v)
 {
        long temp, result;
@@ -189,6 +187,9 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
 })
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
+#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
+#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
+
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic64_dec_return(v) atomic64_sub_return(1,(v))
 
@@ -199,6 +200,8 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
 #define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
 
 #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
+#define atomic64_inc_and_test(v) (atomic64_add_return(1, (v)) == 0)
+
 #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
 #define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
 
index 578ed3f1a6071d831248a6164694ac4d1492c712..302201f1a0978b0a0c7db477edb498a7fc57fd9e 100644 (file)
@@ -321,6 +321,7 @@ static inline int fls(int word)
 #else
 #define fls    generic_fls
 #endif
+#define fls64   generic_fls64
 
 /* Compute powers of two for the given integer.  */
 static inline long floor_log2(unsigned long word)
index 68e04c0bb3f74db0ff1baf18bcc49ef1044b9b81..ae048441c9edbcf13458ce6c9da6bbce36233157 100644 (file)
@@ -64,7 +64,7 @@ void __writel(u32 val, void __iomem *addr);
 #define writew(v,b)            __writew(v,b)
 #define writel(v,b)            __writel(v,b)
 
-#define __arch_ioremap(cookie,sz,c,a)  ((void __iomem *)(cookie))
+#define __arch_ioremap(cookie,sz,c)    ((void __iomem *)(cookie))
 #define __arch_iounmap(cookie)         do { } while (0)
 
 extern void insb(unsigned int port, void *buf, int sz);
index d4187fe9a85a222dcbbf432df6b705a3e5e1d2db..472badb451c4d6c1652302d9249230666a73f366 100644 (file)
@@ -4,7 +4,7 @@
  * IOP3xx architecture timex specifications
  */
 #include <linux/config.h>
-
+#include <asm/hardware.h>
 
 #if defined(CONFIG_ARCH_IQ80321) || defined(CONFIG_ARCH_IQ31244)
 
index 688f7f90d93e6f323ea6c0ea2a6b46184bb2fcb8..942b622455bc438ad2a164580ce190c03bcdeea4 100644 (file)
@@ -59,11 +59,10 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data);
  * fallback to the default.
  */
 static inline void __iomem *
-__ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags, unsigned long align)
+__ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags)
 {
-       extern void __iomem * __ioremap(unsigned long, size_t, unsigned long, unsigned long);
        if((addr < 0x48000000) || (addr > 0x4fffffff))
-               return __ioremap(addr, size, flags, align);
+               return __ioremap(addr, size, flags);
 
        return (void *)addr;
 }
@@ -71,13 +70,11 @@ __ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags, unsigned
 static inline void
 __ixp4xx_iounmap(void __iomem *addr)
 {
-       extern void __iounmap(void __iomem *addr);
-
        if ((u32)addr >= VMALLOC_START)
                __iounmap(addr);
 }
 
-#define __arch_ioremap(a, s, f, x)     __ixp4xx_ioremap(a, s, f, x)
+#define __arch_ioremap(a, s, f)                __ixp4xx_ioremap(a, s, f)
 #define        __arch_iounmap(a)               __ixp4xx_iounmap(a)
 
 #define        writeb(v, p)                    __ixp4xx_writeb(v, p)
index 2b149ed59149de6eb8c2b71f89a5094d2c6b0bda..9444958bec1e793b57a98160c12a8c7f50bfea0c 100644 (file)
@@ -47,6 +47,7 @@
  * Queue Manager
  */
 #define IXP4XX_QMGR_BASE_PHYS          (0x60000000)
+#define IXP4XX_QMGR_REGION_SIZE                (0x00004000)
 
 /*
  * Expansion BUS Configuration registers
index d770e4b37ae137be669c46b98fc0de51376ee4be..48c60f5eff6aa917f5a0d7ae7817c3f294be618b 100644 (file)
@@ -12,8 +12,3 @@
 
 #define fixup_irq(x)   (x)
 
-/*
- * This prototype is required for cascading of multiplexed interrupts.
- * Since it doesn't exist elsewhere, we'll put it here for now.
- */
-extern void do_IRQ(int irq, struct pt_regs *regs);
diff --git a/include/asm-arm/arch-pxa/ohci.h b/include/asm-arm/arch-pxa/ohci.h
new file mode 100644 (file)
index 0000000..7da8956
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef ASMARM_ARCH_OHCI_H
+#define ASMARM_ARCH_OHCI_H
+
+struct device;
+
+struct pxaohci_platform_data {
+       int (*init)(struct device *);
+       void (*exit)(struct device *);
+
+       int port_mode;
+#define PMM_NPS_MODE           1
+#define PMM_GLOBAL_MODE        2
+#define PMM_PERPORT_MODE       3
+};
+
+extern void pxa_set_ohci_info(struct pxaohci_platform_data *info);
+
+#endif
index cb33d57c146c09fab2268f0daf9aae493098a09a..7f1be48ad67e033d5de562d4ed8670fa0d3cfdf8 100644 (file)
@@ -21,6 +21,7 @@
  *    10-Mar-2005    LCVR    Changed S3C2410_VA to S3C24XX_VA
  *    28-Mar-2005    LCVR    Fixed definition of GPB10
  *    26-Oct-2005    BJD     Added generic configuration types
+ *    27-Nov-2005    LCVR    Added definitions to S3C2400 registers
 */
 
 
 
 #define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)
 
-/* port A - 22bits, zero in bit X makes pin X output
+/* port A - S3C2410: 22bits, zero in bit X makes pin X output
+ *          S3C2400: 18bits, zero in bit X makes pin X output
  * 1 makes port special function, this is default
 */
 #define S3C2410_GPACON    S3C2410_GPIOREG(0x00)
 #define S3C2410_GPADAT    S3C2410_GPIOREG(0x04)
 
+#define S3C2400_GPACON    S3C2410_GPIOREG(0x00)
+#define S3C2400_GPADAT    S3C2410_GPIOREG(0x04)
+
 #define S3C2410_GPA0         S3C2410_GPIONO(S3C2410_GPIO_BANKA, 0)
 #define S3C2410_GPA0_OUT     (0<<0)
 #define S3C2410_GPA0_ADDR0   (1<<0)
 #define S3C2410_GPA10        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 10)
 #define S3C2410_GPA10_OUT    (0<<10)
 #define S3C2410_GPA10_ADDR25 (1<<10)
+#define S3C2400_GPA10_SCKE   (1<<10)
 
 #define S3C2410_GPA11        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 11)
 #define S3C2410_GPA11_OUT    (0<<11)
 #define S3C2410_GPA11_ADDR26 (1<<11)
+#define S3C2400_GPA11_nCAS0  (1<<11)
 
 #define S3C2410_GPA12        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 12)
 #define S3C2410_GPA12_OUT    (0<<12)
 #define S3C2410_GPA12_nGCS1  (1<<12)
+#define S3C2400_GPA12_nCAS1  (1<<12)
 
 #define S3C2410_GPA13        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 13)
 #define S3C2410_GPA13_OUT    (0<<13)
 #define S3C2410_GPA13_nGCS2  (1<<13)
+#define S3C2400_GPA13_nGCS1  (1<<13)
 
 #define S3C2410_GPA14        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 14)
 #define S3C2410_GPA14_OUT    (0<<14)
 #define S3C2410_GPA14_nGCS3  (1<<14)
+#define S3C2400_GPA14_nGCS2  (1<<14)
 
 #define S3C2410_GPA15        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 15)
 #define S3C2410_GPA15_OUT    (0<<15)
 #define S3C2410_GPA15_nGCS4  (1<<15)
+#define S3C2400_GPA15_nGCS3  (1<<15)
 
 #define S3C2410_GPA16        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 16)
 #define S3C2410_GPA16_OUT    (0<<16)
 #define S3C2410_GPA16_nGCS5  (1<<16)
+#define S3C2400_GPA16_nGCS4  (1<<16)
 
 #define S3C2410_GPA17        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 17)
 #define S3C2410_GPA17_OUT    (0<<17)
 #define S3C2410_GPA17_CLE    (1<<17)
+#define S3C2400_GPA17_nGCS5  (1<<17)
 
 #define S3C2410_GPA18        S3C2410_GPIONO(S3C2410_GPIO_BANKA, 18)
 #define S3C2410_GPA18_OUT    (0<<18)
 #define S3C2410_GPA22_OUT    (0<<22)
 #define S3C2410_GPA22_nFCE   (1<<22)
 
-/* 0x08 and 0x0c are reserved */
+/* 0x08 and 0x0c are reserved on S3C2410 */
 
-/* GPB is 10 IO pins, each configured by 2 bits each in GPBCON.
+/* S3C2410:
+ * GPB is 10 IO pins, each configured by 2 bits each in GPBCON.
  *   00 = input, 01 = output, 10=special function, 11=reserved
+
+ * S3C2400:
+ * GPB is 16 IO pins, each configured by 2 bits each in GPBCON.
+ *   00 = input, 01 = output, 10=data, 11=special function
+
  * bit 0,1 = pin 0, 2,3= pin 1...
  *
  * CPBUP = pull up resistor control, 1=disabled, 0=enabled
 #define S3C2410_GPBDAT    S3C2410_GPIOREG(0x14)
 #define S3C2410_GPBUP     S3C2410_GPIOREG(0x18)
 
+#define S3C2400_GPBCON    S3C2410_GPIOREG(0x08)
+#define S3C2400_GPBDAT    S3C2410_GPIOREG(0x0C)
+#define S3C2400_GPBUP     S3C2410_GPIOREG(0x10)
+
 /* no i/o pin in port b can have value 3! */
 
 #define S3C2410_GPB0         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 0)
 #define S3C2410_GPB0_INP     (0x00 << 0)
 #define S3C2410_GPB0_OUTP    (0x01 << 0)
 #define S3C2410_GPB0_TOUT0   (0x02 << 0)
+#define S3C2400_GPB0_DATA16  (0x02 << 0)
 
 #define S3C2410_GPB1         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 1)
 #define S3C2410_GPB1_INP     (0x00 << 2)
 #define S3C2410_GPB1_OUTP    (0x01 << 2)
 #define S3C2410_GPB1_TOUT1   (0x02 << 2)
+#define S3C2400_GPB1_DATA17  (0x02 << 2)
 
 #define S3C2410_GPB2         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 2)
 #define S3C2410_GPB2_INP     (0x00 << 4)
 #define S3C2410_GPB2_OUTP    (0x01 << 4)
 #define S3C2410_GPB2_TOUT2   (0x02 << 4)
+#define S3C2400_GPB2_DATA18  (0x02 << 4)
+#define S3C2400_GPB2_TCLK1   (0x03 << 4)
 
 #define S3C2410_GPB3         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 3)
 #define S3C2410_GPB3_INP     (0x00 << 6)
 #define S3C2410_GPB3_OUTP    (0x01 << 6)
 #define S3C2410_GPB3_TOUT3   (0x02 << 6)
+#define S3C2400_GPB3_DATA19  (0x02 << 6)
+#define S3C2400_GPB3_TXD1    (0x03 << 6)
 
 #define S3C2410_GPB4         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 4)
 #define S3C2410_GPB4_INP     (0x00 << 8)
 #define S3C2410_GPB4_OUTP    (0x01 << 8)
 #define S3C2410_GPB4_TCLK0   (0x02 << 8)
+#define S3C2400_GPB4_DATA20  (0x02 << 8)
 #define S3C2410_GPB4_MASK    (0x03 << 8)
+#define S3C2400_GPB4_RXD1    (0x03 << 8)
+#define S3C2400_GPB4_MASK    (0x03 << 8)
 
 #define S3C2410_GPB5         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 5)
 #define S3C2410_GPB5_INP     (0x00 << 10)
 #define S3C2410_GPB5_OUTP    (0x01 << 10)
 #define S3C2410_GPB5_nXBACK  (0x02 << 10)
+#define S3C2400_GPB5_DATA21  (0x02 << 10)
+#define S3C2400_GPB5_nCTS1   (0x03 << 10)
 
 #define S3C2410_GPB6         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 6)
 #define S3C2410_GPB6_INP     (0x00 << 12)
 #define S3C2410_GPB6_OUTP    (0x01 << 12)
 #define S3C2410_GPB6_nXBREQ  (0x02 << 12)
+#define S3C2400_GPB6_DATA22  (0x02 << 12)
+#define S3C2400_GPB6_nRTS1   (0x03 << 12)
 
 #define S3C2410_GPB7         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 7)
 #define S3C2410_GPB7_INP     (0x00 << 14)
 #define S3C2410_GPB7_OUTP    (0x01 << 14)
 #define S3C2410_GPB7_nXDACK1 (0x02 << 14)
+#define S3C2400_GPB7_DATA23  (0x02 << 14)
 
 #define S3C2410_GPB8         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 8)
 #define S3C2410_GPB8_INP     (0x00 << 16)
 #define S3C2410_GPB8_OUTP    (0x01 << 16)
 #define S3C2410_GPB8_nXDREQ1 (0x02 << 16)
+#define S3C2400_GPB8_DATA24  (0x02 << 16)
 
 #define S3C2410_GPB9         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 9)
 #define S3C2410_GPB9_INP     (0x00 << 18)
 #define S3C2410_GPB9_OUTP    (0x01 << 18)
 #define S3C2410_GPB9_nXDACK0 (0x02 << 18)
+#define S3C2400_GPB9_DATA25  (0x02 << 18)
+#define S3C2400_GPB9_I2SSDI  (0x03 << 18)
 
 #define S3C2410_GPB10        S3C2410_GPIONO(S3C2410_GPIO_BANKB, 10)
 #define S3C2410_GPB10_INP    (0x00 << 20)
 #define S3C2410_GPB10_OUTP   (0x01 << 20)
 #define S3C2410_GPB10_nXDRE0 (0x02 << 20)
+#define S3C2400_GPB10_DATA26 (0x02 << 20)
+#define S3C2400_GPB10_nSS    (0x03 << 20)
+
+#define S3C2400_GPB11        S3C2410_GPIONO(S3C2410_GPIO_BANKB, 11)
+#define S3C2400_GPB11_INP    (0x00 << 22)
+#define S3C2400_GPB11_OUTP   (0x01 << 22)
+#define S3C2400_GPB11_DATA27 (0x02 << 22)
+
+#define S3C2400_GPB12        S3C2410_GPIONO(S3C2410_GPIO_BANKB, 12)
+#define S3C2400_GPB12_INP    (0x00 << 24)
+#define S3C2400_GPB12_OUTP   (0x01 << 24)
+#define S3C2400_GPB12_DATA28 (0x02 << 24)
+
+#define S3C2400_GPB13        S3C2410_GPIONO(S3C2410_GPIO_BANKB, 13)
+#define S3C2400_GPB13_INP    (0x00 << 26)
+#define S3C2400_GPB13_OUTP   (0x01 << 26)
+#define S3C2400_GPB13_DATA29 (0x02 << 26)
+
+#define S3C2400_GPB14        S3C2410_GPIONO(S3C2410_GPIO_BANKB, 14)
+#define S3C2400_GPB14_INP    (0x00 << 28)
+#define S3C2400_GPB14_OUTP   (0x01 << 28)
+#define S3C2400_GPB14_DATA30 (0x02 << 28)
+
+#define S3C2400_GPB15        S3C2410_GPIONO(S3C2410_GPIO_BANKB, 15)
+#define S3C2400_GPB15_INP    (0x00 << 30)
+#define S3C2400_GPB15_OUTP   (0x01 << 30)
+#define S3C2400_GPB15_DATA31 (0x02 << 30)
+
+#define S3C2410_GPB_PUPDIS(x)  (1<<(x))
 
 /* Port C consits of 16 GPIO/Special function
  *
 #define S3C2410_GPCDAT    S3C2410_GPIOREG(0x24)
 #define S3C2410_GPCUP     S3C2410_GPIOREG(0x28)
 
+#define S3C2400_GPCCON    S3C2410_GPIOREG(0x14)
+#define S3C2400_GPCDAT    S3C2410_GPIOREG(0x18)
+#define S3C2400_GPCUP     S3C2410_GPIOREG(0x1C)
+
 #define S3C2410_GPC0            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 0)
 #define S3C2410_GPC0_INP       (0x00 << 0)
 #define S3C2410_GPC0_OUTP      (0x01 << 0)
 #define S3C2410_GPC0_LEND      (0x02 << 0)
+#define S3C2400_GPC0_VD0       (0x02 << 0)
 
 #define S3C2410_GPC1            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 1)
 #define S3C2410_GPC1_INP       (0x00 << 2)
 #define S3C2410_GPC1_OUTP      (0x01 << 2)
 #define S3C2410_GPC1_VCLK      (0x02 << 2)
+#define S3C2400_GPC1_VD1       (0x02 << 2)
 
 #define S3C2410_GPC2            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 2)
 #define S3C2410_GPC2_INP       (0x00 << 4)
 #define S3C2410_GPC2_OUTP      (0x01 << 4)
 #define S3C2410_GPC2_VLINE     (0x02 << 4)
+#define S3C2400_GPC2_VD2       (0x02 << 4)
 
 #define S3C2410_GPC3            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 3)
 #define S3C2410_GPC3_INP       (0x00 << 6)
 #define S3C2410_GPC3_OUTP      (0x01 << 6)
 #define S3C2410_GPC3_VFRAME    (0x02 << 6)
+#define S3C2400_GPC3_VD3       (0x02 << 6)
 
 #define S3C2410_GPC4            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 4)
 #define S3C2410_GPC4_INP       (0x00 << 8)
 #define S3C2410_GPC4_OUTP      (0x01 << 8)
 #define S3C2410_GPC4_VM                (0x02 << 8)
+#define S3C2400_GPC4_VD4       (0x02 << 8)
 
 #define S3C2410_GPC5            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 5)
 #define S3C2410_GPC5_INP       (0x00 << 10)
 #define S3C2410_GPC5_OUTP      (0x01 << 10)
 #define S3C2410_GPC5_LCDVF0    (0x02 << 10)
+#define S3C2400_GPC5_VD5       (0x02 << 10)
 
 #define S3C2410_GPC6            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 6)
 #define S3C2410_GPC6_INP       (0x00 << 12)
 #define S3C2410_GPC6_OUTP      (0x01 << 12)
 #define S3C2410_GPC6_LCDVF1    (0x02 << 12)
+#define S3C2400_GPC6_VD6       (0x02 << 12)
 
 #define S3C2410_GPC7            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 7)
 #define S3C2410_GPC7_INP       (0x00 << 14)
 #define S3C2410_GPC7_OUTP      (0x01 << 14)
 #define S3C2410_GPC7_LCDVF2    (0x02 << 14)
+#define S3C2400_GPC7_VD7       (0x02 << 14)
 
 #define S3C2410_GPC8            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 8)
 #define S3C2410_GPC8_INP       (0x00 << 16)
 #define S3C2410_GPC8_OUTP      (0x01 << 16)
 #define S3C2410_GPC8_VD0       (0x02 << 16)
+#define S3C2400_GPC8_VD8       (0x02 << 16)
 
 #define S3C2410_GPC9            S3C2410_GPIONO(S3C2410_GPIO_BANKC, 9)
 #define S3C2410_GPC9_INP       (0x00 << 18)
 #define S3C2410_GPC9_OUTP      (0x01 << 18)
 #define S3C2410_GPC9_VD1       (0x02 << 18)
+#define S3C2400_GPC9_VD9       (0x02 << 18)
 
 #define S3C2410_GPC10           S3C2410_GPIONO(S3C2410_GPIO_BANKC, 10)
 #define S3C2410_GPC10_INP      (0x00 << 20)
 #define S3C2410_GPC10_OUTP     (0x01 << 20)
 #define S3C2410_GPC10_VD2      (0x02 << 20)
+#define S3C2400_GPC10_VD10     (0x02 << 20)
 
 #define S3C2410_GPC11           S3C2410_GPIONO(S3C2410_GPIO_BANKC, 11)
 #define S3C2410_GPC11_INP      (0x00 << 22)
 #define S3C2410_GPC11_OUTP     (0x01 << 22)
 #define S3C2410_GPC11_VD3      (0x02 << 22)
+#define S3C2400_GPC11_VD11     (0x02 << 22)
 
 #define S3C2410_GPC12           S3C2410_GPIONO(S3C2410_GPIO_BANKC, 12)
 #define S3C2410_GPC12_INP      (0x00 << 24)
 #define S3C2410_GPC12_OUTP     (0x01 << 24)
 #define S3C2410_GPC12_VD4      (0x02 << 24)
+#define S3C2400_GPC12_VD12     (0x02 << 24)
 
 #define S3C2410_GPC13           S3C2410_GPIONO(S3C2410_GPIO_BANKC, 13)
 #define S3C2410_GPC13_INP      (0x00 << 26)
 #define S3C2410_GPC13_OUTP     (0x01 << 26)
 #define S3C2410_GPC13_VD5      (0x02 << 26)
+#define S3C2400_GPC13_VD13     (0x02 << 26)
 
 #define S3C2410_GPC14           S3C2410_GPIONO(S3C2410_GPIO_BANKC, 14)
 #define S3C2410_GPC14_INP      (0x00 << 28)
 #define S3C2410_GPC14_OUTP     (0x01 << 28)
 #define S3C2410_GPC14_VD6      (0x02 << 28)
+#define S3C2400_GPC14_VD14     (0x02 << 28)
 
 #define S3C2410_GPC15           S3C2410_GPIONO(S3C2410_GPIO_BANKC, 15)
 #define S3C2410_GPC15_INP      (0x00 << 30)
 #define S3C2410_GPC15_OUTP     (0x01 << 30)
 #define S3C2410_GPC15_VD7      (0x02 << 30)
+#define S3C2400_GPC15_VD15     (0x02 << 30)
+
+#define S3C2410_GPC_PUPDIS(x)  (1<<(x))
 
-/* Port D consists of 16 GPIO/Special function
+/*
+ * S3C2410: Port D consists of 16 GPIO/Special function
  *
  * almost identical setup to port b, but the special functions are mostly
  * to do with the video system's data.
+ *
+ * S3C2400: Port D consists of 11 GPIO/Special function
+ *
+ * almost identical setup to port c
 */
 
 #define S3C2410_GPDCON    S3C2410_GPIOREG(0x30)
 #define S3C2410_GPDDAT    S3C2410_GPIOREG(0x34)
 #define S3C2410_GPDUP     S3C2410_GPIOREG(0x38)
 
+#define S3C2400_GPDCON    S3C2410_GPIOREG(0x20)
+#define S3C2400_GPDDAT    S3C2410_GPIOREG(0x24)
+#define S3C2400_GPDUP     S3C2410_GPIOREG(0x28)
+
 #define S3C2410_GPD0            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 0)
 #define S3C2410_GPD0_INP       (0x00 << 0)
 #define S3C2410_GPD0_OUTP      (0x01 << 0)
 #define S3C2410_GPD0_VD8       (0x02 << 0)
+#define S3C2400_GPD0_VFRAME    (0x02 << 0)
 
 #define S3C2410_GPD1            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 1)
 #define S3C2410_GPD1_INP       (0x00 << 2)
 #define S3C2410_GPD1_OUTP      (0x01 << 2)
 #define S3C2410_GPD1_VD9       (0x02 << 2)
+#define S3C2400_GPD1_VM                (0x02 << 2)
 
 #define S3C2410_GPD2            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 2)
 #define S3C2410_GPD2_INP       (0x00 << 4)
 #define S3C2410_GPD2_OUTP      (0x01 << 4)
 #define S3C2410_GPD2_VD10      (0x02 << 4)
+#define S3C2400_GPD2_VLINE     (0x02 << 4)
 
 #define S3C2410_GPD3            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 3)
 #define S3C2410_GPD3_INP       (0x00 << 6)
 #define S3C2410_GPD3_OUTP      (0x01 << 6)
 #define S3C2410_GPD3_VD11      (0x02 << 6)
+#define S3C2400_GPD3_VCLK      (0x02 << 6)
 
 #define S3C2410_GPD4            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 4)
 #define S3C2410_GPD4_INP       (0x00 << 8)
 #define S3C2410_GPD4_OUTP      (0x01 << 8)
 #define S3C2410_GPD4_VD12      (0x02 << 8)
+#define S3C2400_GPD4_LEND      (0x02 << 8)
 
 #define S3C2410_GPD5            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 5)
 #define S3C2410_GPD5_INP       (0x00 << 10)
 #define S3C2410_GPD5_OUTP      (0x01 << 10)
 #define S3C2410_GPD5_VD13      (0x02 << 10)
+#define S3C2400_GPD5_TOUT0     (0x02 << 10)
 
 #define S3C2410_GPD6            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 6)
 #define S3C2410_GPD6_INP       (0x00 << 12)
 #define S3C2410_GPD6_OUTP      (0x01 << 12)
 #define S3C2410_GPD6_VD14      (0x02 << 12)
+#define S3C2400_GPD6_TOUT1     (0x02 << 12)
 
 #define S3C2410_GPD7            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 7)
 #define S3C2410_GPD7_INP       (0x00 << 14)
 #define S3C2410_GPD7_OUTP      (0x01 << 14)
 #define S3C2410_GPD7_VD15      (0x02 << 14)
+#define S3C2400_GPD7_TOUT2     (0x02 << 14)
 
 #define S3C2410_GPD8            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 8)
 #define S3C2410_GPD8_INP       (0x00 << 16)
 #define S3C2410_GPD8_OUTP      (0x01 << 16)
 #define S3C2410_GPD8_VD16      (0x02 << 16)
+#define S3C2400_GPD8_TOUT3     (0x02 << 16)
 
 #define S3C2410_GPD9            S3C2410_GPIONO(S3C2410_GPIO_BANKD, 9)
 #define S3C2410_GPD9_INP       (0x00 << 18)
 #define S3C2410_GPD9_OUTP      (0x01 << 18)
 #define S3C2410_GPD9_VD17      (0x02 << 18)
+#define S3C2400_GPD9_TCLK0     (0x02 << 18)
+#define S3C2410_GPD9_MASK       (0x03 << 18)
 
 #define S3C2410_GPD10           S3C2410_GPIONO(S3C2410_GPIO_BANKD, 10)
 #define S3C2410_GPD10_INP      (0x00 << 20)
 #define S3C2410_GPD10_OUTP     (0x01 << 20)
 #define S3C2410_GPD10_VD18     (0x02 << 20)
+#define S3C2400_GPD10_nWAIT    (0x02 << 20)
 
 #define S3C2410_GPD11           S3C2410_GPIONO(S3C2410_GPIO_BANKD, 11)
 #define S3C2410_GPD11_INP      (0x00 << 22)
 #define S3C2410_GPD15_OUTP     (0x01 << 30)
 #define S3C2410_GPD15_VD23     (0x02 << 30)
 
-/* Port E consists of 16 GPIO/Special function
+#define S3C2410_GPD_PUPDIS(x)  (1<<(x))
+
+/* S3C2410:
+ * Port E consists of 16 GPIO/Special function
  *
  * again, the same as port B, but dealing with I2S, SDI, and
  * more miscellaneous functions
+ *
+ * S3C2400:
+ * Port E consists of 12 GPIO/Special function
+ *
+ * GPIO / interrupt inputs
 */
 
 #define S3C2410_GPECON    S3C2410_GPIOREG(0x40)
 #define S3C2410_GPEDAT    S3C2410_GPIOREG(0x44)
 #define S3C2410_GPEUP     S3C2410_GPIOREG(0x48)
 
+#define S3C2400_GPECON    S3C2410_GPIOREG(0x2C)
+#define S3C2400_GPEDAT    S3C2410_GPIOREG(0x30)
+#define S3C2400_GPEUP     S3C2410_GPIOREG(0x34)
+
 #define S3C2410_GPE0           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 0)
 #define S3C2410_GPE0_INP       (0x00 << 0)
 #define S3C2410_GPE0_OUTP      (0x01 << 0)
 #define S3C2410_GPE0_I2SLRCK   (0x02 << 0)
+#define S3C2400_GPE0_EINT0     (0x02 << 0)
 #define S3C2410_GPE0_MASK      (0x03 << 0)
 
 #define S3C2410_GPE1           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 1)
 #define S3C2410_GPE1_INP       (0x00 << 2)
 #define S3C2410_GPE1_OUTP      (0x01 << 2)
 #define S3C2410_GPE1_I2SSCLK   (0x02 << 2)
+#define S3C2400_GPE1_EINT1     (0x02 << 2)
+#define S3C2400_GPE1_nSS       (0x03 << 2)
 #define S3C2410_GPE1_MASK      (0x03 << 2)
 
 #define S3C2410_GPE2           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 2)
 #define S3C2410_GPE2_INP       (0x00 << 4)
 #define S3C2410_GPE2_OUTP      (0x01 << 4)
 #define S3C2410_GPE2_CDCLK     (0x02 << 4)
+#define S3C2400_GPE2_EINT2     (0x02 << 4)
+#define S3C2400_GPE2_I2SSDI    (0x03 << 4)
 
 #define S3C2410_GPE3           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 3)
 #define S3C2410_GPE3_INP       (0x00 << 6)
 #define S3C2410_GPE3_OUTP      (0x01 << 6)
 #define S3C2410_GPE3_I2SSDI    (0x02 << 6)
+#define S3C2400_GPE3_EINT3     (0x02 << 6)
+#define S3C2400_GPE3_nCTS1     (0x03 << 6)
 #define S3C2410_GPE3_nSS0      (0x03 << 6)
 #define S3C2410_GPE3_MASK      (0x03 << 6)
 
 #define S3C2410_GPE4_INP       (0x00 << 8)
 #define S3C2410_GPE4_OUTP      (0x01 << 8)
 #define S3C2410_GPE4_I2SSDO    (0x02 << 8)
+#define S3C2400_GPE4_EINT4     (0x02 << 8)
+#define S3C2400_GPE4_nRTS1     (0x03 << 8)
 #define S3C2410_GPE4_I2SSDI    (0x03 << 8)
 #define S3C2410_GPE4_MASK      (0x03 << 8)
 
 #define S3C2410_GPE5_INP       (0x00 << 10)
 #define S3C2410_GPE5_OUTP      (0x01 << 10)
 #define S3C2410_GPE5_SDCLK     (0x02 << 10)
+#define S3C2400_GPE5_EINT5     (0x02 << 10)
+#define S3C2400_GPE5_TCLK1     (0x03 << 10)
 
 #define S3C2410_GPE6           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 6)
 #define S3C2410_GPE6_INP       (0x00 << 12)
 #define S3C2410_GPE6_OUTP      (0x01 << 12)
 #define S3C2410_GPE6_SDCMD     (0x02 << 12)
+#define S3C2400_GPE6_EINT6     (0x02 << 12)
 
 #define S3C2410_GPE7           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 7)
 #define S3C2410_GPE7_INP       (0x00 << 14)
 #define S3C2410_GPE7_OUTP      (0x01 << 14)
 #define S3C2410_GPE7_SDDAT0    (0x02 << 14)
+#define S3C2400_GPE7_EINT7     (0x02 << 14)
 
 #define S3C2410_GPE8           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 8)
 #define S3C2410_GPE8_INP       (0x00 << 16)
 #define S3C2410_GPE8_OUTP      (0x01 << 16)
 #define S3C2410_GPE8_SDDAT1    (0x02 << 16)
+#define S3C2400_GPE8_nXDACK0   (0x02 << 16)
 
 #define S3C2410_GPE9           S3C2410_GPIONO(S3C2410_GPIO_BANKE, 9)
 #define S3C2410_GPE9_INP       (0x00 << 18)
 #define S3C2410_GPE9_OUTP      (0x01 << 18)
 #define S3C2410_GPE9_SDDAT2    (0x02 << 18)
+#define S3C2400_GPE9_nXDACK1   (0x02 << 18)
+#define S3C2400_GPE9_nXBACK    (0x03 << 18)
 
 #define S3C2410_GPE10          S3C2410_GPIONO(S3C2410_GPIO_BANKE, 10)
 #define S3C2410_GPE10_INP      (0x00 << 20)
 #define S3C2410_GPE10_OUTP     (0x01 << 20)
 #define S3C2410_GPE10_SDDAT3   (0x02 << 20)
+#define S3C2400_GPE10_nXDREQ0  (0x02 << 20)
 
 #define S3C2410_GPE11          S3C2410_GPIONO(S3C2410_GPIO_BANKE, 11)
 #define S3C2410_GPE11_INP      (0x00 << 22)
 #define S3C2410_GPE11_OUTP     (0x01 << 22)
 #define S3C2410_GPE11_SPIMISO0 (0x02 << 22)
+#define S3C2400_GPE11_nXDREQ1  (0x02 << 22)
+#define S3C2400_GPE11_nXBREQ   (0x03 << 22)
 
 #define S3C2410_GPE12          S3C2410_GPIONO(S3C2410_GPIO_BANKE, 12)
 #define S3C2410_GPE12_INP      (0x00 << 24)
 
 #define S3C2410_GPE_PUPDIS(x)  (1<<(x))
 
-/* Port F consists of 8 GPIO/Special function
+/* S3C2410:
+ * Port F consists of 8 GPIO/Special function
  *
  * GPIO / interrupt inputs
  *
  *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 undefined
  *
  * pull up works like all other ports.
+ *
+ * S3C2400:
+ * Port F consists of 7 GPIO/Special function
+ *
+ * GPIO/serial/misc pins
 */
 
 #define S3C2410_GPFCON    S3C2410_GPIOREG(0x50)
 #define S3C2410_GPFDAT    S3C2410_GPIOREG(0x54)
 #define S3C2410_GPFUP     S3C2410_GPIOREG(0x58)
 
+#define S3C2400_GPFCON    S3C2410_GPIOREG(0x38)
+#define S3C2400_GPFDAT    S3C2410_GPIOREG(0x3C)
+#define S3C2400_GPFUP     S3C2410_GPIOREG(0x40)
+
 #define S3C2410_GPF0        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 0)
 #define S3C2410_GPF0_INP    (0x00 << 0)
 #define S3C2410_GPF0_OUTP   (0x01 << 0)
 #define S3C2410_GPF0_EINT0  (0x02 << 0)
+#define S3C2400_GPF0_RXD0   (0x02 << 0)
 
 #define S3C2410_GPF1        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 1)
 #define S3C2410_GPF1_INP    (0x00 << 2)
 #define S3C2410_GPF1_OUTP   (0x01 << 2)
 #define S3C2410_GPF1_EINT1  (0x02 << 2)
+#define S3C2400_GPF1_RXD1   (0x02 << 2)
+#define S3C2400_GPF1_IICSDA (0x03 << 2)
 
 #define S3C2410_GPF2        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 2)
 #define S3C2410_GPF2_INP    (0x00 << 4)
 #define S3C2410_GPF2_OUTP   (0x01 << 4)
 #define S3C2410_GPF2_EINT2  (0x02 << 4)
+#define S3C2400_GPF2_TXD0   (0x02 << 4)
 
 #define S3C2410_GPF3        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 3)
 #define S3C2410_GPF3_INP    (0x00 << 6)
 #define S3C2410_GPF3_OUTP   (0x01 << 6)
 #define S3C2410_GPF3_EINT3  (0x02 << 6)
+#define S3C2400_GPF3_TXD1   (0x02 << 6)
+#define S3C2400_GPF3_IICSCL (0x03 << 6)
 
 #define S3C2410_GPF4        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 4)
 #define S3C2410_GPF4_INP    (0x00 << 8)
 #define S3C2410_GPF4_OUTP   (0x01 << 8)
 #define S3C2410_GPF4_EINT4  (0x02 << 8)
+#define S3C2400_GPF4_nRTS0  (0x02 << 8)
+#define S3C2400_GPF4_nXBACK (0x03 << 8)
 
 #define S3C2410_GPF5        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 5)
 #define S3C2410_GPF5_INP    (0x00 << 10)
 #define S3C2410_GPF5_OUTP   (0x01 << 10)
 #define S3C2410_GPF5_EINT5  (0x02 << 10)
+#define S3C2400_GPF5_nCTS0  (0x02 << 10)
+#define S3C2400_GPF5_nXBREQ (0x03 << 10)
 
 #define S3C2410_GPF6        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 6)
 #define S3C2410_GPF6_INP    (0x00 << 12)
 #define S3C2410_GPF6_OUTP   (0x01 << 12)
 #define S3C2410_GPF6_EINT6  (0x02 << 12)
+#define S3C2400_GPF6_CLKOUT (0x02 << 12)
 
 #define S3C2410_GPF7        S3C2410_GPIONO(S3C2410_GPIO_BANKF, 7)
 #define S3C2410_GPF7_INP    (0x00 << 14)
 #define S3C2410_GPF7_OUTP   (0x01 << 14)
 #define S3C2410_GPF7_EINT7  (0x02 << 14)
 
-/* Port G consists of 8 GPIO/IRQ/Special function
+#define S3C2410_GPF_PUPDIS(x)  (1<<(x))
+
+/* S3C2410:
+ * Port G consists of 8 GPIO/IRQ/Special function
  *
  * GPGCON has 2 bits for each of the input pins on port F
  *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 special func
  *
  * pull up works like all other ports.
+ *
+ * S3C2400:
+ * Port G consists of 10 GPIO/Special function
 */
 
 #define S3C2410_GPGCON    S3C2410_GPIOREG(0x60)
 #define S3C2410_GPGDAT    S3C2410_GPIOREG(0x64)
 #define S3C2410_GPGUP     S3C2410_GPIOREG(0x68)
 
+#define S3C2400_GPGCON    S3C2410_GPIOREG(0x44)
+#define S3C2400_GPGDAT    S3C2410_GPIOREG(0x48)
+#define S3C2400_GPGUP     S3C2410_GPIOREG(0x4C)
+
 #define S3C2410_GPG0          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 0)
 #define S3C2410_GPG0_INP      (0x00 << 0)
 #define S3C2410_GPG0_OUTP     (0x01 << 0)
 #define S3C2410_GPG0_EINT8    (0x02 << 0)
+#define S3C2400_GPG0_I2SLRCK  (0x02 << 0)
 
 #define S3C2410_GPG1          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 1)
 #define S3C2410_GPG1_INP      (0x00 << 2)
 #define S3C2410_GPG1_OUTP     (0x01 << 2)
 #define S3C2410_GPG1_EINT9    (0x02 << 2)
+#define S3C2400_GPG1_I2SSCLK  (0x02 << 2)
 
 #define S3C2410_GPG2          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 2)
 #define S3C2410_GPG2_INP      (0x00 << 4)
 #define S3C2410_GPG2_OUTP     (0x01 << 4)
 #define S3C2410_GPG2_EINT10   (0x02 << 4)
+#define S3C2400_GPG2_CDCLK    (0x02 << 4)
 
 #define S3C2410_GPG3          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 3)
 #define S3C2410_GPG3_INP      (0x00 << 6)
 #define S3C2410_GPG3_OUTP     (0x01 << 6)
 #define S3C2410_GPG3_EINT11   (0x02 << 6)
+#define S3C2400_GPG3_I2SSDO   (0x02 << 6)
+#define S3C2400_GPG3_I2SSDI   (0x03 << 6)
 
 #define S3C2410_GPG4          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 4)
 #define S3C2410_GPG4_INP      (0x00 << 8)
 #define S3C2410_GPG4_OUTP     (0x01 << 8)
 #define S3C2410_GPG4_EINT12   (0x02 << 8)
+#define S3C2400_GPG4_MMCCLK   (0x02 << 8)
+#define S3C2400_GPG4_I2SSDI   (0x03 << 8)
 #define S3C2410_GPG4_LCDPWREN (0x03 << 8)
 
 #define S3C2410_GPG5          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 5)
 #define S3C2410_GPG5_INP      (0x00 << 10)
 #define S3C2410_GPG5_OUTP     (0x01 << 10)
 #define S3C2410_GPG5_EINT13   (0x02 << 10)
+#define S3C2400_GPG5_MMCCMD   (0x02 << 10)
+#define S3C2400_GPG5_IICSDA   (0x03 << 10)
 #define S3C2410_GPG5_SPIMISO1 (0x03 << 10)
 
 #define S3C2410_GPG6          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 6)
 #define S3C2410_GPG6_INP      (0x00 << 12)
 #define S3C2410_GPG6_OUTP     (0x01 << 12)
 #define S3C2410_GPG6_EINT14   (0x02 << 12)
+#define S3C2400_GPG6_MMCDAT   (0x02 << 12)
+#define S3C2400_GPG6_IICSCL   (0x03 << 12)
 #define S3C2410_GPG6_SPIMOSI1 (0x03 << 12)
 
 #define S3C2410_GPG7          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 7)
 #define S3C2410_GPG7_OUTP     (0x01 << 14)
 #define S3C2410_GPG7_EINT15   (0x02 << 14)
 #define S3C2410_GPG7_SPICLK1  (0x03 << 14)
+#define S3C2400_GPG7_SPIMISO  (0x02 << 14)
+#define S3C2400_GPG7_IICSDA   (0x03 << 14)
 
 #define S3C2410_GPG8          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 8)
 #define S3C2410_GPG8_INP      (0x00 << 16)
 #define S3C2410_GPG8_OUTP     (0x01 << 16)
 #define S3C2410_GPG8_EINT16   (0x02 << 16)
+#define S3C2400_GPG8_SPIMOSI  (0x02 << 16)
+#define S3C2400_GPG8_IICSCL   (0x03 << 16)
 
 #define S3C2410_GPG9          S3C2410_GPIONO(S3C2410_GPIO_BANKG, 9)
 #define S3C2410_GPG9_INP      (0x00 << 18)
 #define S3C2410_GPG9_OUTP     (0x01 << 18)
 #define S3C2410_GPG9_EINT17   (0x02 << 18)
+#define S3C2400_GPG9_SPICLK   (0x02 << 18)
+#define S3C2400_GPG9_MMCCLK   (0x03 << 18)
 
 #define S3C2410_GPG10         S3C2410_GPIONO(S3C2410_GPIO_BANKG, 10)
 #define S3C2410_GPG10_INP     (0x00 << 20)
 #define S3C2410_GPH10_CLKOUT1 (0x02 << 20)
 
 /* miscellaneous control */
-
+#define S3C2400_MISCCR    S3C2410_GPIOREG(0x54)
 #define S3C2410_MISCCR    S3C2410_GPIOREG(0x80)
 #define S3C2410_DCLKCON           S3C2410_GPIOREG(0x84)
 
 /* see clock.h for dclk definitions */
 
 /* pullup control on databus */
-#define S3C2410_MISCCR_SPUCR_HEN    (0)
+#define S3C2410_MISCCR_SPUCR_HEN    (0<<0)
 #define S3C2410_MISCCR_SPUCR_HDIS   (1<<0)
-#define S3C2410_MISCCR_SPUCR_LEN    (0)
+#define S3C2410_MISCCR_SPUCR_LEN    (0<<1)
 #define S3C2410_MISCCR_SPUCR_LDIS   (1<<1)
 
-#define S3C2410_MISCCR_USBDEV      (0)
+#define S3C2400_MISCCR_SPUCR_LEN    (0<<0)
+#define S3C2400_MISCCR_SPUCR_LDIS   (1<<0)
+#define S3C2400_MISCCR_SPUCR_HEN    (0<<1)
+#define S3C2400_MISCCR_SPUCR_HDIS   (1<<1)
+
+#define S3C2400_MISCCR_HZ_STOPEN    (0<<2)
+#define S3C2400_MISCCR_HZ_STOPPREV  (1<<2)
+
+#define S3C2410_MISCCR_USBDEV      (0<<3)
 #define S3C2410_MISCCR_USBHOST     (1<<3)
 
 #define S3C2410_MISCCR_CLK0_MPLL    (0<<4)
  *
  * Samsung datasheet p9-25
 */
-
+#define S3C2400_EXTINT0    S3C2410_GPIOREG(0x58)
 #define S3C2410_EXTINT0           S3C2410_GPIOREG(0x88)
 #define S3C2410_EXTINT1           S3C2410_GPIOREG(0x8C)
 #define S3C2410_EXTINT2           S3C2410_GPIOREG(0x90)
 #define S3C2410_GSTATUS2_OFFRESET  (1<<1)
 #define S3C2410_GSTATUS2_PONRESET  (1<<0)
 
+/* open drain control register */
+#define S3C2400_OPENCR     S3C2410_GPIOREG(0x50)
+
+#define S3C2400_OPENCR_OPC_RXD1DIS  (0<<0)
+#define S3C2400_OPENCR_OPC_RXD1EN   (1<<0)
+#define S3C2400_OPENCR_OPC_TXD1DIS  (0<<1)
+#define S3C2400_OPENCR_OPC_TXD1EN   (1<<1)
+#define S3C2400_OPENCR_OPC_CMDDIS   (0<<2)
+#define S3C2400_OPENCR_OPC_CMDEN    (1<<2)
+#define S3C2400_OPENCR_OPC_DATDIS   (0<<3)
+#define S3C2400_OPENCR_OPC_DATEN    (1<<3)
+#define S3C2400_OPENCR_OPC_MISODIS  (0<<4)
+#define S3C2400_OPENCR_OPC_MISOEN   (1<<4)
+#define S3C2400_OPENCR_OPC_MOSIDIS  (0<<5)
+#define S3C2400_OPENCR_OPC_MOSIEN   (1<<5)
+
 #endif /* __ASM_ARCH_REGS_GPIO_H */
 
index 9d4fe6cf205b1fb9e272e19091c8a902b59aa8ec..040ccde7a11ec8f0bafa8a7481944660fd02014c 100644 (file)
@@ -10,8 +10,6 @@
 #ifndef __ASM_ARM_ARCH_IO_H
 #define __ASM_ARM_ARCH_IO_H
 
-#include <asm/hardware.h>
-
 #define IO_SPACE_LIMIT 0xffffffff
 
 /*
index 7399d431edfeeb1a4771833ef3c2e20a85e3a1c0..d02de721ecc185cdcfcbe6f5e707083c477e5413 100644 (file)
@@ -332,6 +332,7 @@ static inline unsigned long __ffs(unsigned long word)
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 /*
  * ffs: find first bit set. This is defined the same way as
@@ -351,6 +352,7 @@ static inline unsigned long __ffs(unsigned long word)
 #define fls(x) \
        ( __builtin_constant_p(x) ? generic_fls(x) : \
          ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
+#define fls64(x)   generic_fls64(x)
 #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
 #define __ffs(x) (ffs(x) - 1)
 #define ffz(x) __ffs( ~(x) )
index 7da97a937548afd05a977ceb0d2148821dc05cfb..2d44b42d1847871a8b6fcc22238eeaa2507ee02a 100644 (file)
@@ -22,6 +22,8 @@ typedef unsigned long elf_freg_t[3];
 #define R_ARM_NONE     0
 #define R_ARM_PC24     1
 #define R_ARM_ABS32    2
+#define R_ARM_CALL     28
+#define R_ARM_JUMP24   29
 
 #define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
index 71770aa6389feb9eedcf0884f421bb0fc9cd8bf9..dc726ffccebd862c84237a6561d869f5db0645de 100644 (file)
 #define UART011_ICR            0x44    /* Interrupt clear register. */
 #define UART011_DMACR          0x48    /* DMA control register. */
 
+#define UART011_DR_OE          (1 << 11)
+#define UART011_DR_BE          (1 << 10)
+#define UART011_DR_PE          (1 << 9)
+#define UART011_DR_FE          (1 << 8)
+
 #define UART01x_RSR_OE                 0x08
 #define UART01x_RSR_BE                 0x04
 #define UART01x_RSR_PE                 0x02
index 2e6799632f124ff6e43d86cddfec5dec1aa7ad89..0cf4d4f99600d6d5c5e9163c69f1100c5d39af76 100644 (file)
@@ -42,9 +42,9 @@ extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen);
 extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
 extern void __raw_writesl(void __iomem *addr, const void *data, int longlen);
 
-extern void __raw_readsb(void __iomem *addr, void *data, int bytelen);
-extern void __raw_readsw(void __iomem *addr, void *data, int wordlen);
-extern void __raw_readsl(void __iomem *addr, void *data, int longlen);
+extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen);
+extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
+extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
 
 #define __raw_writeb(v,a)      (__chk_io_ptr(a), *(volatile unsigned char __force  *)(a) = (v))
 #define __raw_writew(v,a)      (__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v))
@@ -54,6 +54,12 @@ extern void __raw_readsl(void __iomem *addr, void *data, int longlen);
 #define __raw_readw(a)         (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))
 #define __raw_readl(a)         (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))
 
+/*
+ * Architecture ioremap implementation.
+ */
+extern void __iomem * __ioremap(unsigned long, size_t, unsigned long);
+extern void __iounmap(void __iomem *addr);
+
 /*
  * Bad read/write accesses...
  */
@@ -256,18 +262,15 @@ out:
  * ioremap takes a PCI memory address, as specified in
  * Documentation/IO-mapping.txt.
  */
-extern void __iomem * __ioremap(unsigned long, size_t, unsigned long, unsigned long);
-extern void __iounmap(void __iomem *addr);
-
 #ifndef __arch_ioremap
-#define ioremap(cookie,size)           __ioremap(cookie,size,0,1)
-#define ioremap_nocache(cookie,size)   __ioremap(cookie,size,0,1)
-#define ioremap_cached(cookie,size)    __ioremap(cookie,size,L_PTE_CACHEABLE,1)
+#define ioremap(cookie,size)           __ioremap(cookie,size,0)
+#define ioremap_nocache(cookie,size)   __ioremap(cookie,size,0)
+#define ioremap_cached(cookie,size)    __ioremap(cookie,size,L_PTE_CACHEABLE)
 #define iounmap(cookie)                        __iounmap(cookie)
 #else
-#define ioremap(cookie,size)           __arch_ioremap((cookie),(size),0,1)
-#define ioremap_nocache(cookie,size)   __arch_ioremap((cookie),(size),0,1)
-#define ioremap_cached(cookie,size)    __arch_ioremap((cookie),(size),L_PTE_CACHEABLE,1)
+#define ioremap(cookie,size)           __arch_ioremap((cookie),(size),0)
+#define ioremap_nocache(cookie,size)   __arch_ioremap((cookie),(size),0)
+#define ioremap_cached(cookie,size)    __arch_ioremap((cookie),(size),L_PTE_CACHEABLE)
 #define iounmap(cookie)                        __arch_iounmap(cookie)
 #endif
 
index a547ee598c6c9f2e1fa8968fb96be1a9c9ee0712..3e572364ee73c665dbc2fd21a34e33d076e6363b 100644 (file)
@@ -122,6 +122,7 @@ static inline void *phys_to_virt(unsigned long x)
  */
 #define __pa(x)                        __virt_to_phys((unsigned long)(x))
 #define __va(x)                        ((void *)__phys_to_virt((unsigned long)(x)))
+#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
 
 /*
  * Virtual <-> DMA view memory address translations
index 5d2a1034a02ef331089c94f514e21f11296d138c..8df36818ebc9d2897d3bee39bc6751ec5be4eb0e 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef __ASM_ARM_NUMNODES_H
 #define __ASM_ARM_NUMNODES_H
 
+#include <asm/memory.h>
+
 #ifndef NODES_SHIFT
 # define NODES_SHIFT   2       /* Normally, Max 4 Nodes */
 #endif
index 71ca7d412687f9bb0e1a2c2e61a8857e96cec6f5..d5dc624f452a203142908c5cf96adf642dcdbd2b 100644 (file)
@@ -47,11 +47,6 @@ static inline void init_MUTEX_LOCKED(struct semaphore *sem)
        sema_init(sem, 0);
 }
 
-static inline int sema_count(struct semaphore *sem)
-{
-       return atomic_read(&sem->count);
-}
-
 /*
  * special register calling convention
  */
index 6ed4f916b166086a46bc300722e179c6c383349a..43ad4e55878c7961a535e6ce427b842adecb2372 100644 (file)
@@ -30,6 +30,9 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock)
        __asm__ __volatile__(
 "1:    ldrex   %0, [%1]\n"
 "      teq     %0, #0\n"
+#ifdef CONFIG_CPU_32v6K
+"      wfene\n"
+#endif
 "      strexeq %0, %2, [%1]\n"
 "      teqeq   %0, #0\n"
 "      bne     1b"
@@ -65,7 +68,11 @@ static inline void __raw_spin_unlock(raw_spinlock_t *lock)
        smp_mb();
 
        __asm__ __volatile__(
-"      str     %1, [%0]"
+"      str     %1, [%0]\n"
+#ifdef CONFIG_CPU_32v6K
+"      mcr     p15, 0, %1, c7, c10, 4\n" /* DSB */
+"      sev"
+#endif
        :
        : "r" (&lock->lock), "r" (0)
        : "cc");
@@ -87,6 +94,9 @@ static inline void __raw_write_lock(raw_rwlock_t *rw)
        __asm__ __volatile__(
 "1:    ldrex   %0, [%1]\n"
 "      teq     %0, #0\n"
+#ifdef CONFIG_CPU_32v6K
+"      wfene\n"
+#endif
 "      strexeq %0, %2, [%1]\n"
 "      teq     %0, #0\n"
 "      bne     1b"
@@ -122,7 +132,11 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw)
        smp_mb();
 
        __asm__ __volatile__(
-       "str    %1, [%0]"
+       "str    %1, [%0]\n"
+#ifdef CONFIG_CPU_32v6K
+"      mcr     p15, 0, %1, c7, c10, 4\n" /* DSB */
+"      sev\n"
+#endif
        :
        : "r" (&rw->lock), "r" (0)
        : "cc");
@@ -148,6 +162,9 @@ static inline void __raw_read_lock(raw_rwlock_t *rw)
 "1:    ldrex   %0, [%2]\n"
 "      adds    %0, %0, #1\n"
 "      strexpl %1, %0, [%2]\n"
+#ifdef CONFIG_CPU_32v6K
+"      wfemi\n"
+#endif
 "      rsbpls  %0, %1, #0\n"
 "      bmi     1b"
        : "=&r" (tmp), "=&r" (tmp2)
@@ -169,6 +186,11 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw)
 "      strex   %1, %0, [%2]\n"
 "      teq     %1, #0\n"
 "      bne     1b"
+#ifdef CONFIG_CPU_32v6K
+"\n    cmp     %0, #0\n"
+"      mcreq   p15, 0, %0, c7, c10, 4\n"
+"      seveq"
+#endif
        : "=&r" (tmp), "=&r" (tmp2)
        : "r" (&rw->lock)
        : "cc");
index a2fdad0138b3e5bf2e7e2500e97a8821fe7b036e..064f0f5e8e2b9e3361082dbc420b2e6248263c40 100644 (file)
@@ -100,7 +100,6 @@ static inline void set_fs (mm_segment_t fs)
 extern int __get_user_1(void *);
 extern int __get_user_2(void *);
 extern int __get_user_4(void *);
-extern int __get_user_8(void *);
 extern int __get_user_bad(void);
 
 #define __get_user_x(__r2,__p,__e,__s,__i...)                          \
@@ -114,7 +113,7 @@ extern int __get_user_bad(void);
 #define get_user(x,p)                                                  \
        ({                                                              \
                const register typeof(*(p)) __user *__p asm("r0") = (p);\
-               register typeof(*(p)) __r2 asm("r2");                   \
+               register unsigned int __r2 asm("r2");                   \
                register int __e asm("r0");                             \
                switch (sizeof(*(__p))) {                               \
                case 1:                                                 \
@@ -126,12 +125,9 @@ extern int __get_user_bad(void);
                case 4:                                                 \
                        __get_user_x(__r2, __p, __e, 4, "lr");          \
                        break;                                          \
-               case 8:                                                 \
-                       __get_user_x(__r2, __p, __e, 8, "lr");          \
-                       break;                                          \
                default: __e = __get_user_bad(); break;                 \
                }                                                       \
-               x = __r2;                                               \
+               x = (typeof(*(p))) __r2;                                \
                __e;                                                    \
        })
 
index 7d062fb2e34380eabfa60394345e7d27df694a34..15cc6f2da792dc7dec67d6698b863bb47750b667 100644 (file)
@@ -259,6 +259,7 @@ static inline unsigned long __ffs(unsigned long word)
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 /*
  * ffs: find first bit set. This is defined the same way as
index 1bddb3f3a289eddfa320a4519689c3081d9d1c0e..d3eb0f1e42085c7911aaa6f5d4303d38a78cd022 100644 (file)
@@ -240,6 +240,7 @@ static inline int test_bit(int nr, const volatile unsigned long *addr)
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 /*
  * hweightN - returns the hamming weight of a N-bit word
index b664bd5b66635a473abb21691502da08c122e4f6..02be7b3a8a83fd3fcd652472a4b3848c45cbd255 100644 (file)
@@ -228,6 +228,7 @@ found_middle:
                                                        \
        bit ? 33 - bit : bit;                           \
 })
+#define fls64(x)   generic_fls64(x)
 
 /*
  * Every architecture must define this function. It's the fastest
index 5248ca054909e4c8a1314077b6303f0f7f021d48..685123981e8b291d9ab1865220ba221722e14bb0 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <linux/config.h>
 #include <linux/threads.h>
+#include <linux/irq.h>
 
 typedef struct {
        unsigned int __softirq_pending;
index f9caecf7e3c0dd7f5b821336d2101a7647d841ed..ae031eaa3dd2a05705fca170524ec3cedad996c5 100644 (file)
 /*
  * some bits needed for parts of the IDE subsystem to compile
  */
-#define __ide_mm_insw(port, addr, n)   insw(port, addr, n)
-#define __ide_mm_insl(port, addr, n)   insl(port, addr, n)
-#define __ide_mm_outsw(port, addr, n)  outsw(port, addr, n)
-#define __ide_mm_outsl(port, addr, n)  outsl(port, addr, n)
+#define __ide_mm_insw(port, addr, n)   insw((unsigned long) (port), addr, n)
+#define __ide_mm_insl(port, addr, n)   insl((unsigned long) (port), addr, n)
+#define __ide_mm_outsw(port, addr, n)  outsw((unsigned long) (port), addr, n)
+#define __ide_mm_outsl(port, addr, n)  outsl((unsigned long) (port), addr, n)
 
 
 #endif /* __KERNEL__ */
index 4feba567e7fd7bd47601f3199285ba15e7ed9815..b8221b611b5c3cad5c1f54d004d410f1e4dc2e90 100644 (file)
@@ -47,8 +47,8 @@ typedef struct { unsigned long        pgprot; } pgprot_t;
 
 #define devmem_is_allowed(pfn) 1
 
-#define __pa(vaddr)            virt_to_phys((void *) vaddr)
-#define __va(paddr)            phys_to_virt((unsigned long) paddr)
+#define __pa(vaddr)            virt_to_phys((void *) (unsigned long) (vaddr))
+#define __va(paddr)            phys_to_virt((unsigned long) (paddr))
 
 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
 
index b18396288df1a0475fe7d28d09189076e2fcf7e4..907c5c3643cced5eb8e3ecef3b33dd8a6607a213 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/spinlock.h>
 #include <linux/rwsem.h>
 
-#define SEMAPHORE_DEBUG                WAITQUEUE_DEBUG
+#define SEMAPHORE_DEBUG                0
 
 /*
  * the semaphore definition
index c8cba7836f0d2d2b79171235fd522cf7b21ae588..60f6b2aee76d7dc94666b4fc6e5bd24ef6a0e6e7 100644 (file)
@@ -58,7 +58,7 @@ struct thread_info {
 
 #endif
 
-#define PREEMPT_ACTIVE         0x4000000
+#define PREEMPT_ACTIVE         0x10000000
 
 /*
  * macros/functions for gaining access to the thread information structure
index ce31b739fd80ff211e5583cf4b2c6cc762f6a037..0e6d9852008ca36c4826a27f46b9cc26b303ab62 100644 (file)
@@ -56,6 +56,7 @@ extern __inline__ int test_bit(int nr, const unsigned long * addr)
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #ifdef __KERNEL__
 
index 5036f595f8c927d1ebbb167d7e9e8cf93ae84603..c0411ec9d651785200e64d45734983db17d2fcbc 100644 (file)
@@ -406,5 +406,6 @@ found_middle:
 #endif /* __KERNEL__ */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #endif /* _H8300_BITOPS_H */
index ddf1739dc7fd1968954ff0eed7d9053346f1360f..4807aa1d2e3d865fe41c70045da8d4ccd0a4bbfc 100644 (file)
@@ -372,6 +372,7 @@ static inline unsigned long ffz(unsigned long word)
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #ifdef __KERNEL__
 
index fa02e67ea86b7ba58f06e53032ac2aff7279c987..095580f3a45cfb4d556427e84c65a9fad15c690f 100644 (file)
@@ -1,9 +1,8 @@
-#include <linux/config.h>
-
 #ifndef _ASMi386_PARAM_H
 #define _ASMi386_PARAM_H
 
 #ifdef __KERNEL__
+# include <linux/config.h>
 # define HZ            CONFIG_HZ       /* Internal kernel timer frequency */
 # define USER_HZ       100             /* .. some user interfaces are in "ticks" */
 # define CLOCKS_PER_SEC                (USER_HZ)       /* like times() */
index 7232528e2d0c13771f6f62af20de13455aedb30b..36d0fb95ea89dc5113919f03cc0dde9896a6efeb 100644 (file)
@@ -345,6 +345,7 @@ fls (int t)
        x |= x >> 16;
        return ia64_popcnt(x);
 }
+#define fls64(x)   generic_fls64(x)
 
 /*
  * ffs: find first bit set. This is defined the same way as the libc and compiler builtin
index 57182d6f2b9a10c3f3f9f288d1e6f4613a9121bd..bba70207639103caaa05d0a0815b90d6eb4d3fa2 100644 (file)
@@ -84,14 +84,6 @@ __delay (unsigned long loops)
        ia64_delay_loop (loops - 1);
 }
 
-static __inline__ void
-udelay (unsigned long usecs)
-{
-       unsigned long start = ia64_get_itc();
-       unsigned long cycles = usecs*local_cpu_data->cyc_per_usec;
-
-       while (ia64_get_itc() - start < cycles)
-               cpu_relax();
-}
+extern void udelay (unsigned long usecs);
 
 #endif /* _ASM_IA64_DELAY_H */
index 8e746b2413a64fa27a76638180aa6b33cc172263..f8044a1169cd39fdb653f5c86733aba719fd8356 100644 (file)
@@ -13,6 +13,8 @@
 
 # ifdef CONFIG_IA32_SUPPORT
 
+#define IA32_PAGE_OFFSET       0xc0000000
+
 extern void ia32_cpu_init (void);
 extern void ia32_mem_init (void);
 extern void ia32_gdt_init (void);
index 1dbd584ad85178bcbfc95ae03591172ef396a016..dc519092ef4d65099a3c8ad7dec8e7a902cb29a3 100644 (file)
@@ -17,8 +17,8 @@ typedef struct {
 #define local_set(l, i)        atomic64_set(&(l)->val, i)
 #define local_inc(l)   atomic64_inc(&(l)->val)
 #define local_dec(l)   atomic64_dec(&(l)->val)
-#define local_add(l)   atomic64_add(&(l)->val)
-#define local_sub(l)   atomic64_sub(&(l)->val)
+#define local_add(i, l)        atomic64_add((i), &(l)->val)
+#define local_sub(i, l)        atomic64_sub((i), &(l)->val)
 
 /* Non-atomic variants, i.e., preemption disabled and won't be touched in interrupt, etc.  */
 
index 9dd9da10527849add26749970dc31a963237854a..5e6362a786b72b2b5b9ce98a51db94d1b74f27d2 100644 (file)
@@ -110,8 +110,9 @@ extern int ia64_pfn_valid (unsigned long pfn);
 # define pfn_to_page(pfn)      (mem_map + (pfn))
 #elif defined(CONFIG_DISCONTIGMEM)
 extern struct page *vmem_map;
+extern unsigned long min_low_pfn;
 extern unsigned long max_low_pfn;
-# define pfn_valid(pfn)                (((pfn) < max_low_pfn) && ia64_pfn_valid(pfn))
+# define pfn_valid(pfn)                (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn))
 # define page_to_pfn(page)     ((unsigned long) (page - vmem_map))
 # define pfn_to_page(pfn)      (vmem_map + (pfn))
 #endif
index 29df88bdd2bce756443eda94b21f61f621a0dc37..313cad0628d07a5555d430d17ab6236f52fa59cb 100644 (file)
@@ -320,7 +320,8 @@ typedef struct sal_log_timestamp {
 typedef struct sal_log_record_header {
        u64 id;                         /* Unique monotonically increasing ID */
        sal_log_revision_t revision;    /* Major and Minor revision of header */
-       u16 severity;                   /* Error Severity */
+       u8 severity;                    /* Error Severity */
+       u8 validation_bits;             /* 0: platform_guid, 1: !timestamp */
        u32 len;                        /* Length of this error log in bytes */
        sal_log_timestamp_t timestamp;  /* Timestamp */
        efi_guid_t platform_guid;       /* Unique OEM Platform ID */
index 49711d00ad04f77d90467daf33bfd13d549e2109..f65d222ca5e82caec06b9739a0e2e7196b066495 100644 (file)
@@ -3,15 +3,27 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 1992 - 1997, 2000-2004 Silicon Graphics, Inc. All rights reserved.
+ * Copyright (C) 1992 - 1997, 2000-2005 Silicon Graphics, Inc. All rights reserved.
  */
 #ifndef _ASM_IA64_SN_PCI_PCIDEV_H
 #define _ASM_IA64_SN_PCI_PCIDEV_H
 
 #include <linux/pci.h>
 
-#define SN_PCIDEV_INFO(pci_dev) \
-        ((struct pcidev_info *)(pci_dev)->sysdata)
+/*
+ * In ia64, pci_dev->sysdata must be a *pci_controller. To provide access to
+ * the pcidev_info structs for all devices under a controller, we extend the
+ * definition of pci_controller, via sn_pci_controller, to include a list
+ * of pcidev_info.
+ */
+struct sn_pci_controller {
+       struct pci_controller pci_controller;
+       struct list_head pcidev_info;
+};
+
+#define SN_PCI_CONTROLLER(dev) ((struct sn_pci_controller *) dev->sysdata)
+
+#define SN_PCIDEV_INFO(dev)    sn_pcidev_info_get(dev)
 
 #define SN_PCIBUS_BUSSOFT_INFO(pci_bus) \
        (struct pcibus_info *)((struct pcibus_bussoft *)(PCI_CONTROLLER((pci_bus))->platform_data))
@@ -53,11 +65,13 @@ struct pcidev_info {
        struct sn_irq_info      *pdi_sn_irq_info;
        struct sn_pcibus_provider *pdi_provider;        /* sn pci ops */
        struct pci_dev          *host_pci_dev;          /* host bus link */
+       struct list_head        pdi_list;               /* List of pcidev_info */
 };
 
 extern void sn_irq_fixup(struct pci_dev *pci_dev,
                         struct sn_irq_info *sn_irq_info);
 extern void sn_irq_unfixup(struct pci_dev *pci_dev);
+extern struct pcidev_info * sn_pcidev_info_get(struct pci_dev *);
 extern void sn_pci_controller_fixup(int segment, int busnum,
                                    struct pci_bus *bus);
 extern void sn_bus_store_sysdata(struct pci_dev *dev);
index 3f7564dc0aa9bf052b6fee3a20791d4ac7ebb811..2a8b0d92a5d62f139ec98cb0e125883c7e39e122 100644 (file)
@@ -56,6 +56,7 @@
 #define  SN_SAL_BUS_CONFIG                        0x02000037
 #define  SN_SAL_SYS_SERIAL_GET                    0x02000038
 #define  SN_SAL_PARTITION_SERIAL_GET              0x02000039
+#define  SN_SAL_SYSCTL_PARTITION_GET               0x0200003a
 #define  SN_SAL_SYSTEM_POWER_DOWN                 0x0200003b
 #define  SN_SAL_GET_MASTER_BASEIO_NASID                   0x0200003c
 #define  SN_SAL_COHERENCE                          0x0200003d
@@ -580,6 +581,21 @@ sn_partition_serial_number_val(void) {
        return sn_partition_serial_number;
 }
 
+/*
+ * Returns the partition id of the nasid passed in as an argument,
+ * or INVALID_PARTID if the partition id cannot be retrieved.
+ */
+static inline partid_t
+ia64_sn_sysctl_partition_get(nasid_t nasid)
+{
+       struct ia64_sal_retval ret_stuff;
+       SAL_CALL(ret_stuff, SN_SAL_SYSCTL_PARTITION_GET, nasid,
+               0, 0, 0, 0, 0, 0);
+       if (ret_stuff.status != 0)
+           return -1;
+       return ((partid_t)ret_stuff.v0);
+}
+
 /*
  * Returns the physical address of the partition's reserved page through
  * an iterative number of calls.
@@ -1018,6 +1034,24 @@ ia64_sn_get_sn_info(int fc, u8 *shubtype, u16 *nasid_bitmask, u8 *nasid_shift,
        ret_stuff.v2 = 0;
        SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SN_INFO, fc, 0, 0, 0, 0, 0, 0);
 
+/***** BEGIN HACK - temp til old proms no longer supported ********/
+       if (ret_stuff.status == SALRET_NOT_IMPLEMENTED) {
+               int nasid = get_sapicid() & 0xfff;;
+#define SH_SHUB_ID_NODES_PER_BIT_MASK 0x001f000000000000UL
+#define SH_SHUB_ID_NODES_PER_BIT_SHFT 48
+               if (shubtype) *shubtype = 0;
+               if (nasid_bitmask) *nasid_bitmask = 0x7ff;
+               if (nasid_shift) *nasid_shift = 38;
+               if (systemsize) *systemsize = 10;
+               if (sharing_domain_size) *sharing_domain_size = 8;
+               if (partid) *partid = ia64_sn_sysctl_partition_get(nasid);
+               if (coher) *coher = nasid >> 9;
+               if (reg) *reg = (HUB_L((u64 *) LOCAL_MMR_ADDR(SH1_SHUB_ID)) & SH_SHUB_ID_NODES_PER_BIT_MASK) >>
+                       SH_SHUB_ID_NODES_PER_BIT_SHFT;
+               return 0;
+       }
+/***** END HACK *******/
+
        if (ret_stuff.status < 0)
                return ret_stuff.status;
 
index 22879853e46cb47eb4ea02de11d5d9ebc3e97fd9..ecaddf960086faa9efa10673c30ac25e67483fc5 100644 (file)
@@ -1,22 +1,10 @@
-/**************************************************************************
- *                                                                        *
- *  Unpublished copyright (c) 2005, Silicon Graphics, Inc.                *
- *  THIS IS UNPUBLISHED CONFIDENTIAL AND PROPRIETARY SOURCE CODE OF SGI.  *
- *                                                                        *
- *  The copyright notice above does  not evidence any actual or intended  *
- *  publication  or  disclosure  of  this source  code,  which  includes  *
- *  information that is confidential  and/or proprietary, and is a trade  *
- *  secret, of  Silicon Graphics, Inc.   ANY REPRODUCTION, MODIFICATION,  *
- *  DISTRIBUTION, PUBLIC  PERFORMANCE, OR  PUBLIC DISPLAY OF  OR THROUGH  *
- *  USE  OF THIS  SOURCE CODE  WITHOUT  THE EXPRESS  WRITTEN CONSENT  OF  *
- *  SILICON GRAPHICS, INC.  IS  STRICTLY PROHIBITED, AND IN VIOLATION OF  *
- *  APPLICABLE  LAWS   AND  INTERNATIONAL  TREATIES.    THE  RECEIPT  OR  *
- *  POSSESSION OF  THIS SOURCE CODE AND/OR RELATED  INFORMATION DOES NOT  *
- *  CONVEY OR IMPLY ANY RIGHTS  TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS  *
- *  CONTENTS,  OR TO  MANUFACTURE, USE,  OR  SELL ANYTHING  THAT IT  MAY  *
- *  DESCRIBE, IN WHOLE OR IN PART.                                        *
- *                                                                        *
- **************************************************************************/
+/*
+ * 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) 2003-2005 Silicon Graphics, Inc. All rights reserved.
+ */
 
 #ifndef __ASM_IA64_SN_TIOCE_H__
 #define __ASM_IA64_SN_TIOCE_H__
index 7f63dec0a79a968256c272df1caeaf5a951029eb..cb414908671d1d77e0f729a925c94a3ffa86a560 100644 (file)
@@ -1,13 +1,10 @@
-/**************************************************************************
- *             Copyright (C) 2005, Silicon Graphics, Inc.                 *
- *                                                                       *
- *  These coded instructions, statements, and computer programs         contain  *
- *  unpublished         proprietary  information of Silicon Graphics, Inc., and  *
- *  are protected by Federal copyright law.  They  may not be disclosed  *
- *  to third  parties  or copied or duplicated in any form, in whole or  *
- *  in part, without the prior written consent of Silicon Graphics, Inc.  *
- *                                                                       *
- **************************************************************************/
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (c) 2003-2005 Silicon Graphics, Inc. All rights reserved.
+ */
 
 #ifndef _ASM_IA64_SN_CE_PROVIDER_H
 #define _ASM_IA64_SN_CE_PROVIDER_H
index 5b78611411c30e244a650b230aaae7c62ec5a6e9..0c91a76c5ea3cff8decee9debe0cf45d696a83c7 100644 (file)
@@ -201,6 +201,16 @@ static inline void __raw_write_unlock(raw_rwlock_t *x)
 
 #endif /* !ASM_SUPPORTED */
 
-#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
+static inline int __raw_read_trylock(raw_rwlock_t *x)
+{
+       union {
+               raw_rwlock_t lock;
+               __u32 word;
+       } old, new;
+       old.lock = new.lock = *x;
+       old.lock.write_lock = new.lock.write_lock = 0;
+       ++new.lock.read_counter;
+       return (u32)ia64_cmpxchg4_acq((__u32 *)(x), new.word, old.word) == old.word;
+}
 
 #endif /*  _ASM_IA64_SPINLOCK_H */
index a9f738bf18a7e739325a4221269128fa0857ba2b..f7c330467e7e92247993d6b1fe3b1b3c7ed950a6 100644 (file)
@@ -38,7 +38,7 @@
 /*
  * Returns the number of the first CPU on Node 'node'.
  */
-#define node_to_first_cpu(node) (__ffs(node_to_cpumask(node)))
+#define node_to_first_cpu(node) (first_cpu(node_to_cpumask(node)))
 
 /*
  * Determines the node for a given pci bus
index bfff69a49936abdaae3b3d07dea3a8843cf6e39f..ef1fb8ea4726b0c7b3aea02db8d0fc40d4ee6cdf 100644 (file)
@@ -242,6 +242,27 @@ static __inline__ int atomic_dec_return(atomic_t *v)
  */
 #define atomic_add_negative(i,v) (atomic_add_return((i), (v)) < 0)
 
+#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u)                             \
+({                                                             \
+       int c, old;                                             \
+       c = atomic_read(v);                                     \
+       while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+               c = old;                                        \
+       c != (u);                                               \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
 static __inline__ void atomic_clear_mask(unsigned long  mask, atomic_t *addr)
 {
        unsigned long flags;
index e78443981349df080c2812d82927429f10aa2d85..abea2fdd868971bd1ae499a56e2aa4f58441fbed 100644 (file)
@@ -465,6 +465,7 @@ static __inline__ unsigned long __ffs(unsigned long word)
  * fls: find last bit set.
  */
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #ifdef __KERNEL__
 
index 194393bd8beb8f07eee63a375211c34350efc603..f7aa96970d180c7389a272ea0b8b583ca1ca8325 100644 (file)
 # endif
 #endif
 
-#if defined(CONFIG_PLAT_M32700UT)
-#include <asm/irq.h>
-#include <asm/m32700ut/m32700ut_pld.h>
-#endif
+#include <asm/m32r.h>
+
 
 #define IDE_ARCH_OBSOLETE_DEFAULTS
 
 static __inline__ int ide_default_irq(unsigned long base)
 {
        switch (base) {
-#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
+#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2)
+               case 0x1f0: return PLD_IRQ_CFIREQ;
+               default:
+                       return 0;
+#elif defined(CONFIG_PLAT_MAPPI3)
                case 0x1f0: return PLD_IRQ_CFIREQ;
+               case 0x170: return PLD_IRQ_IDEIREQ;
                default:
                        return 0;
 #else
index 3f1551f7f01f16835d82f7cd85dca06dcdb154ac..1d3c25d61bcb2399e6f4def20b7ac16b2a911fd0 100644 (file)
@@ -59,7 +59,7 @@
 #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_IDEIREQ      (8)  /* INT7 IDE Interrupt   */
 #define  PLD_IRQ_MMCCARD      (43)  /* MMC Card Insert */
 #define  PLD_IRQ_MMCIRQ       (44)  /* MMC Transfer Done */
 
index 73348c3f858b673b73513e97d913cb4e265e38c6..5eee832b73a03e56beb8ce574c75f1ca74499eb4 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <linux/config.h>
+#include <asm/assembler.h>
 
 #ifdef __KERNEL__
 
@@ -132,8 +133,6 @@ static inline void local_irq_disable(void)
                !(flags & 0x40);                        \
        })
 
-#endif  /* __KERNEL__ */
-
 #define nop()  __asm__ __volatile__ ("nop" : : )
 
 #define xchg(ptr,x) \
@@ -213,6 +212,67 @@ static __inline__ unsigned long __xchg(unsigned long x, volatile void * ptr,
        return (tmp);
 }
 
+#define __HAVE_ARCH_CMPXCHG    1
+
+static __inline__ unsigned long
+__cmpxchg_u32(volatile unsigned int *p, unsigned int old, unsigned int new)
+{
+       unsigned long flags;
+       unsigned int retval;
+
+       local_irq_save(flags);
+       __asm__ __volatile__ (
+                       DCACHE_CLEAR("%0", "r4", "%1")
+                       M32R_LOCK" %0, @%1;     \n"
+               "       bne     %0, %2, 1f;     \n"
+                       M32R_UNLOCK" %3, @%1;   \n"
+               "       bra     2f;             \n"
+                "       .fillinsn              \n"
+               "1:"
+                       M32R_UNLOCK" %2, @%1;   \n"
+                "       .fillinsn              \n"
+               "2:"
+                       : "=&r" (retval)
+                       : "r" (p), "r" (old), "r" (new)
+                       : "cbit", "memory"
+#ifdef CONFIG_CHIP_M32700_TS1
+                       , "r4"
+#endif  /* CONFIG_CHIP_M32700_TS1 */
+               );
+       local_irq_restore(flags);
+
+       return retval;
+}
+
+/* This function doesn't exist, so you'll get a linker error
+   if something tries to do an invalid cmpxchg().  */
+extern void __cmpxchg_called_with_bad_pointer(void);
+
+static __inline__ unsigned long
+__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
+{
+       switch (size) {
+       case 4:
+               return __cmpxchg_u32(ptr, old, new);
+#if 0  /* we don't have __cmpxchg_u64 */
+       case 8:
+               return __cmpxchg_u64(ptr, old, new);
+#endif /* 0 */
+       }
+       __cmpxchg_called_with_bad_pointer();
+       return old;
+}
+
+#define cmpxchg(ptr,o,n)                                                \
+  ({                                                                    \
+     __typeof__(*(ptr)) _o_ = (o);                                      \
+     __typeof__(*(ptr)) _n_ = (n);                                      \
+     (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,          \
+                                   (unsigned long)_n_, sizeof(*(ptr))); \
+  })
+
+#endif  /* __KERNEL__ */
+
 /*
  * Memory barrier.
  *
index b1bcf7c66516f78bb4bbc553f0244f7b7535bb63..13f4c00484632b0a396c4b3ecf14e5b40251ca84 100644 (file)
@@ -310,6 +310,7 @@ static inline int fls(int x)
 
        return 32 - cnt;
 }
+#define fls64(x)   generic_fls64(x)
 
 /*
  * Every architecture must define this function. It's the fastest
index c42f88a9b9f986d25b3f859d38b9f3794ff17378..4058dd086a029d8a16515f6933fb65eb69ceab90 100644 (file)
@@ -499,5 +499,6 @@ found_middle:
  * fls: find last bit set.
  */
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #endif /* _M68KNOMMU_BITOPS_H */
index 5496f9064a6aa6cab1c4d586606b9b867f3e6326..3b0c8aaf6e8bfaf62ec78fd854fe790a7af3f907 100644 (file)
@@ -695,7 +695,7 @@ static inline unsigned long fls(unsigned long word)
 
        return flz(~word) + 1;
 }
-
+#define fls64(x)   generic_fls64(x)
 
 /*
  * find_next_zero_bit - find the first zero bit in a memory region
index 33d275c3b84caed3d3069c92e0bf2007694e3b46..e867b4ef96d1f09bcaec1fb05dc5d153d1d580bd 100644 (file)
@@ -74,9 +74,6 @@ typedef struct
         u8                      white_list, black_list;
         struct dbdma_cmd        *dma_table_cpu;
         dma_addr_t              dma_table_dma;
-        struct scatterlist      *sg_table;
-        int                     sg_nents;
-        int                     sg_dma_direction;
 #endif
         struct device           *dev;
        int                     irq;
@@ -87,11 +84,6 @@ typedef struct
 } _auide_hwif;
 
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-struct drive_list_entry {
-        const char * id_model;
-        const char * id_firmware;
-};
-
 /* HD white list */
 static const struct drive_list_entry dma_white_list [] = {
 /*
@@ -167,13 +159,9 @@ int __init auide_probe(void);
  * Multi-Word DMA + DbDMA functions
  */
 #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
-
-        static int in_drive_list(struct hd_driveid *id,
-                                 const struct drive_list_entry *drive_table);
         static int auide_build_sglist(ide_drive_t *drive,  struct request *rq);
         static int auide_build_dmatable(ide_drive_t *drive);
         static int auide_dma_end(ide_drive_t *drive);
-        static void auide_dma_start(ide_drive_t *drive );
         ide_startstop_t auide_dma_intr (ide_drive_t *drive);
         static void auide_dma_exec_cmd(ide_drive_t *drive, u8 command);
         static int auide_dma_setup(ide_drive_t *drive);
@@ -188,8 +176,6 @@ int __init auide_probe(void);
         static void auide_ddma_rx_callback(int irq, void *param,
                                            struct pt_regs *regs);
         static int auide_dma_off_quietly(ide_drive_t *drive);
-        static int auide_dma_timeout(ide_drive_t *drive);
-
 #endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
 
 /*******************************************************************************
@@ -299,3 +285,11 @@ int __init auide_probe(void);
 #define SBC_IDE_MDMA2_TPM     (0x00<<6)
 #define SBC_IDE_MDMA2_TA      (0x12<<0)
 
+#define SBC_IDE_TIMING(mode) \
+         SBC_IDE_##mode##_TWCS | \
+         SBC_IDE_##mode##_TCSH | \
+         SBC_IDE_##mode##_TCSOFF | \
+         SBC_IDE_##mode##_TWP | \
+         SBC_IDE_##mode##_TCSW | \
+         SBC_IDE_##mode##_TPM | \
+         SBC_IDE_##mode##_TA
diff --git a/include/asm-mips/mach-qemu/timex.h b/include/asm-mips/mach-qemu/timex.h
new file mode 100644 (file)
index 0000000..cd54369
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * 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 Daniel Jacobowitz
+ */
+#ifndef __ASM_MACH_QEMU_TIMEX_H
+#define __ASM_MACH_QEMU_TIMEX_H
+
+/*
+ * We use a simulated i8254 PIC...
+ */
+#define CLOCK_TICK_RATE                1193182
+
+#endif /* __ASM_MACH_QEMU_TIMEX_H */
index 55b98c67fd82d60ef49fe64e7892f335082fc4c1..15d8c2b5158408b13588229a0581b0577eae4f7a 100644 (file)
@@ -263,6 +263,7 @@ static __inline__ int fls(int x)
 
        return ret;
 }
+#define fls64(x)   generic_fls64(x)
 
 /*
  * hweightN: returns the hamming weight (i.e. the number
index 5727229b0444aee452dd73f79a850d8f18ac89a0..1996eaa8aeae9abe0644277c87e384809d378957 100644 (file)
@@ -310,6 +310,7 @@ static __inline__ int fls(unsigned int x)
        asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
        return 32 - lz;
 }
+#define fls64(x)   generic_fls64(x)
 
 /*
  * hweightN: returns the hamming weight (i.e. the number
diff --git a/include/asm-powerpc/dma-mapping.h b/include/asm-powerpc/dma-mapping.h
new file mode 100644 (file)
index 0000000..59a8016
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2004 IBM
+ *
+ * Implements the generic device dma API for powerpc.
+ * the pci and vio busses
+ */
+#ifndef _ASM_DMA_MAPPING_H
+#define _ASM_DMA_MAPPING_H
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/cache.h>
+/* need struct page definitions */
+#include <linux/mm.h>
+#include <asm/scatterlist.h>
+#include <asm/io.h>
+#include <asm/bug.h>
+
+#define DMA_ERROR_CODE         (~(dma_addr_t)0x0)
+
+#ifdef CONFIG_NOT_COHERENT_CACHE
+/*
+ * DMA-consistent mapping functions for PowerPCs that don't support
+ * cache snooping.  These allocate/free a region of uncached mapped
+ * memory space for use with DMA devices.  Alternatively, you could
+ * allocate the space "normally" and use the cache management functions
+ * to ensure it is consistent.
+ */
+extern void *__dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp);
+extern void __dma_free_coherent(size_t size, void *vaddr);
+extern void __dma_sync(void *vaddr, size_t size, int direction);
+extern void __dma_sync_page(struct page *page, unsigned long offset,
+                                size_t size, int direction);
+
+#else /* ! CONFIG_NOT_COHERENT_CACHE */
+/*
+ * Cache coherent cores.
+ */
+
+#define __dma_alloc_coherent(gfp, size, handle)        NULL
+#define __dma_free_coherent(size, addr)                do { } while (0)
+#define __dma_sync(addr, size, rw)             do { } while (0)
+#define __dma_sync_page(pg, off, sz, rw)       do { } while (0)
+
+#endif /* ! CONFIG_NOT_COHERENT_CACHE */
+
+#ifdef CONFIG_PPC64
+
+extern int dma_supported(struct device *dev, u64 mask);
+extern int dma_set_mask(struct device *dev, u64 dma_mask);
+extern void *dma_alloc_coherent(struct device *dev, size_t size,
+               dma_addr_t *dma_handle, gfp_t flag);
+extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
+               dma_addr_t dma_handle);
+extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
+               size_t size, enum dma_data_direction direction);
+extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
+               size_t size, enum dma_data_direction direction);
+extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
+               unsigned long offset, size_t size,
+               enum dma_data_direction direction);
+extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
+               size_t size, enum dma_data_direction direction);
+extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+               enum dma_data_direction direction);
+extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
+               int nhwentries, enum dma_data_direction direction);
+
+#else /* CONFIG_PPC64 */
+
+#define dma_supported(dev, mask)       (1)
+
+static inline int dma_set_mask(struct device *dev, u64 dma_mask)
+{
+       if (!dev->dma_mask || !dma_supported(dev, mask))
+               return -EIO;
+
+       *dev->dma_mask = dma_mask;
+
+       return 0;
+}
+
+static inline void *dma_alloc_coherent(struct device *dev, size_t size,
+                                      dma_addr_t * dma_handle,
+                                      gfp_t gfp)
+{
+#ifdef CONFIG_NOT_COHERENT_CACHE
+       return __dma_alloc_coherent(size, dma_handle, gfp);
+#else
+       void *ret;
+       /* ignore region specifiers */
+       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
+
+       if (dev == NULL || dev->coherent_dma_mask < 0xffffffff)
+               gfp |= GFP_DMA;
+
+       ret = (void *)__get_free_pages(gfp, get_order(size));
+
+       if (ret != NULL) {
+               memset(ret, 0, size);
+               *dma_handle = virt_to_bus(ret);
+       }
+
+       return ret;
+#endif
+}
+
+static inline void
+dma_free_coherent(struct device *dev, size_t size, void *vaddr,
+                 dma_addr_t dma_handle)
+{
+#ifdef CONFIG_NOT_COHERENT_CACHE
+       __dma_free_coherent(size, vaddr);
+#else
+       free_pages((unsigned long)vaddr, get_order(size));
+#endif
+}
+
+static inline dma_addr_t
+dma_map_single(struct device *dev, void *ptr, size_t size,
+              enum dma_data_direction direction)
+{
+       BUG_ON(direction == DMA_NONE);
+
+       __dma_sync(ptr, size, direction);
+
+       return virt_to_bus(ptr);
+}
+
+/* We do nothing. */
+#define dma_unmap_single(dev, addr, size, dir) do { } while (0)
+
+static inline dma_addr_t
+dma_map_page(struct device *dev, struct page *page,
+            unsigned long offset, size_t size,
+            enum dma_data_direction direction)
+{
+       BUG_ON(direction == DMA_NONE);
+
+       __dma_sync_page(page, offset, size, direction);
+
+       return page_to_bus(page) + offset;
+}
+
+/* We do nothing. */
+#define dma_unmap_page(dev, handle, size, dir) do { } while (0)
+
+static inline int
+dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+          enum dma_data_direction direction)
+{
+       int i;
+
+       BUG_ON(direction == DMA_NONE);
+
+       for (i = 0; i < nents; i++, sg++) {
+               BUG_ON(!sg->page);
+               __dma_sync_page(sg->page, sg->offset, sg->length, direction);
+               sg->dma_address = page_to_bus(sg->page) + sg->offset;
+       }
+
+       return nents;
+}
+
+/* We don't do anything here. */
+#define dma_unmap_sg(dev, sg, nents, dir)      do { } while (0)
+
+#endif /* CONFIG_PPC64 */
+
+static inline void dma_sync_single_for_cpu(struct device *dev,
+               dma_addr_t dma_handle, size_t size,
+               enum dma_data_direction direction)
+{
+       BUG_ON(direction == DMA_NONE);
+       __dma_sync(bus_to_virt(dma_handle), size, direction);
+}
+
+static inline void dma_sync_single_for_device(struct device *dev,
+               dma_addr_t dma_handle, size_t size,
+               enum dma_data_direction direction)
+{
+       BUG_ON(direction == DMA_NONE);
+       __dma_sync(bus_to_virt(dma_handle), size, direction);
+}
+
+static inline void dma_sync_sg_for_cpu(struct device *dev,
+               struct scatterlist *sg, int nents,
+               enum dma_data_direction direction)
+{
+       int i;
+
+       BUG_ON(direction == DMA_NONE);
+
+       for (i = 0; i < nents; i++, sg++)
+               __dma_sync_page(sg->page, sg->offset, sg->length, direction);
+}
+
+static inline void dma_sync_sg_for_device(struct device *dev,
+               struct scatterlist *sg, int nents,
+               enum dma_data_direction direction)
+{
+       int i;
+
+       BUG_ON(direction == DMA_NONE);
+
+       for (i = 0; i < nents; i++, sg++)
+               __dma_sync_page(sg->page, sg->offset, sg->length, direction);
+}
+
+static inline int dma_mapping_error(dma_addr_t dma_addr)
+{
+#ifdef CONFIG_PPC64
+       return (dma_addr == DMA_ERROR_CODE);
+#else
+       return 0;
+#endif
+}
+
+#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
+#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
+#ifdef CONFIG_NOT_COHERENT_CACHE
+#define dma_is_consistent(d)   (0)
+#else
+#define dma_is_consistent(d)   (1)
+#endif
+
+static inline int dma_get_cache_alignment(void)
+{
+#ifdef CONFIG_PPC64
+       /* no easy way to get cache size on all processors, so return
+        * the maximum possible, to be safe */
+       return (1 << L1_CACHE_SHIFT_MAX);
+#else
+       /*
+        * Each processor family will define its own L1_CACHE_SHIFT,
+        * L1_CACHE_BYTES wraps to this, so this is always safe.
+        */
+       return L1_CACHE_BYTES;
+#endif
+}
+
+static inline void dma_sync_single_range_for_cpu(struct device *dev,
+               dma_addr_t dma_handle, unsigned long offset, size_t size,
+               enum dma_data_direction direction)
+{
+       /* just sync everything for now */
+       dma_sync_single_for_cpu(dev, dma_handle, offset + size, direction);
+}
+
+static inline void dma_sync_single_range_for_device(struct device *dev,
+               dma_addr_t dma_handle, unsigned long offset, size_t size,
+               enum dma_data_direction direction)
+{
+       /* just sync everything for now */
+       dma_sync_single_for_device(dev, dma_handle, offset + size, direction);
+}
+
+static inline void dma_cache_sync(void *vaddr, size_t size,
+               enum dma_data_direction direction)
+{
+       BUG_ON(direction == DMA_NONE);
+       __dma_sync(vaddr, size, (int)direction);
+}
+
+/*
+ * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO
+ */
+struct dma_mapping_ops {
+       void *          (*alloc_coherent)(struct device *dev, size_t size,
+                               dma_addr_t *dma_handle, gfp_t flag);
+       void            (*free_coherent)(struct device *dev, size_t size,
+                               void *vaddr, dma_addr_t dma_handle);
+       dma_addr_t      (*map_single)(struct device *dev, void *ptr,
+                               size_t size, enum dma_data_direction direction);
+       void            (*unmap_single)(struct device *dev, dma_addr_t dma_addr,
+                               size_t size, enum dma_data_direction direction);
+       int             (*map_sg)(struct device *dev, struct scatterlist *sg,
+                               int nents, enum dma_data_direction direction);
+       void            (*unmap_sg)(struct device *dev, struct scatterlist *sg,
+                               int nents, enum dma_data_direction direction);
+       int             (*dma_supported)(struct device *dev, u64 mask);
+       int             (*dac_dma_supported)(struct device *dev, u64 mask);
+};
+
+#endif /* _ASM_DMA_MAPPING_H */
diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h
new file mode 100644 (file)
index 0000000..48938d8
--- /dev/null
@@ -0,0 +1,462 @@
+#ifndef _ASM_POWERPC_IO_H
+#define _ASM_POWERPC_IO_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 CONFIG_PPC64
+#include <asm-ppc/io.h>
+#else
+
+#include <linux/compiler.h>
+#include <asm/page.h>
+#include <asm/byteorder.h>
+#ifdef CONFIG_PPC_ISERIES 
+#include <asm/iseries/iseries_io.h>
+#endif  
+#include <asm/synch.h>
+#include <asm/delay.h>
+
+#include <asm-generic/iomap.h>
+
+#define __ide_mm_insw(p, a, c) _insw_ns((volatile u16 __iomem *)(p), (a), (c))
+#define __ide_mm_insl(p, a, c) _insl_ns((volatile u32 __iomem *)(p), (a), (c))
+#define __ide_mm_outsw(p, a, c) _outsw_ns((volatile u16 __iomem *)(p), (a), (c))
+#define __ide_mm_outsl(p, a, c) _outsl_ns((volatile u32 __iomem *)(p), (a), (c))
+
+
+#define SIO_CONFIG_RA  0x398
+#define SIO_CONFIG_RD  0x399
+
+#define SLOW_DOWN_IO
+
+extern unsigned long isa_io_base;
+extern unsigned long pci_io_base;
+extern unsigned long io_page_mask;
+
+#define MAX_ISA_PORT 0x10000
+
+#define _IO_IS_VALID(port) ((port) >= MAX_ISA_PORT || (1 << (port>>PAGE_SHIFT)) \
+                           & io_page_mask)
+
+#ifdef CONFIG_PPC_ISERIES
+/* __raw_* accessors aren't supported on iSeries */
+#define __raw_readb(addr)      { BUG(); 0; }
+#define __raw_readw(addr)       { BUG(); 0; }
+#define __raw_readl(addr)       { BUG(); 0; }
+#define __raw_readq(addr)       { BUG(); 0; }
+#define __raw_writeb(v, addr)   { BUG(); 0; }
+#define __raw_writew(v, addr)   { BUG(); 0; }
+#define __raw_writel(v, addr)   { BUG(); 0; }
+#define __raw_writeq(v, addr)   { BUG(); 0; }
+#define readb(addr)            iSeries_Read_Byte(addr)
+#define readw(addr)            iSeries_Read_Word(addr)
+#define readl(addr)            iSeries_Read_Long(addr)
+#define writeb(data, addr)     iSeries_Write_Byte((data),(addr))
+#define writew(data, addr)     iSeries_Write_Word((data),(addr))
+#define writel(data, addr)     iSeries_Write_Long((data),(addr))
+#define memset_io(a,b,c)       iSeries_memset_io((a),(b),(c))
+#define memcpy_fromio(a,b,c)   iSeries_memcpy_fromio((a), (b), (c))
+#define memcpy_toio(a,b,c)     iSeries_memcpy_toio((a), (b), (c))
+
+#define inb(addr)              readb(((void __iomem *)(long)(addr)))
+#define inw(addr)              readw(((void __iomem *)(long)(addr)))
+#define inl(addr)              readl(((void __iomem *)(long)(addr)))
+#define outb(data,addr)                writeb(data,((void __iomem *)(long)(addr)))
+#define outw(data,addr)                writew(data,((void __iomem *)(long)(addr)))
+#define outl(data,addr)                writel(data,((void __iomem *)(long)(addr)))
+/*
+ * The *_ns versions below don't do byte-swapping.
+ * Neither do the standard versions now, these are just here
+ * for older code.
+ */
+#define insw_ns(port, buf, ns) _insw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
+#define insl_ns(port, buf, nl) _insl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
+#else
+
+static inline unsigned char __raw_readb(const volatile void __iomem *addr)
+{
+       return *(volatile unsigned char __force *)addr;
+}
+static inline unsigned short __raw_readw(const volatile void __iomem *addr)
+{
+       return *(volatile unsigned short __force *)addr;
+}
+static inline unsigned int __raw_readl(const volatile void __iomem *addr)
+{
+       return *(volatile unsigned int __force *)addr;
+}
+static inline unsigned long __raw_readq(const volatile void __iomem *addr)
+{
+       return *(volatile unsigned long __force *)addr;
+}
+static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr)
+{
+       *(volatile unsigned char __force *)addr = v;
+}
+static inline void __raw_writew(unsigned short v, volatile void __iomem *addr)
+{
+       *(volatile unsigned short __force *)addr = v;
+}
+static inline void __raw_writel(unsigned int v, volatile void __iomem *addr)
+{
+       *(volatile unsigned int __force *)addr = v;
+}
+static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
+{
+       *(volatile unsigned long __force *)addr = v;
+}
+#define readb(addr)            eeh_readb(addr)
+#define readw(addr)            eeh_readw(addr)
+#define readl(addr)            eeh_readl(addr)
+#define readq(addr)            eeh_readq(addr)
+#define writeb(data, addr)     eeh_writeb((data), (addr))
+#define writew(data, addr)     eeh_writew((data), (addr))
+#define writel(data, addr)     eeh_writel((data), (addr))
+#define writeq(data, addr)     eeh_writeq((data), (addr))
+#define memset_io(a,b,c)       eeh_memset_io((a),(b),(c))
+#define memcpy_fromio(a,b,c)   eeh_memcpy_fromio((a),(b),(c))
+#define memcpy_toio(a,b,c)     eeh_memcpy_toio((a),(b),(c))
+#define inb(port)              eeh_inb((unsigned long)port)
+#define outb(val, port)                eeh_outb(val, (unsigned long)port)
+#define inw(port)              eeh_inw((unsigned long)port)
+#define outw(val, port)                eeh_outw(val, (unsigned long)port)
+#define inl(port)              eeh_inl((unsigned long)port)
+#define outl(val, port)                eeh_outl(val, (unsigned long)port)
+
+/*
+ * The insw/outsw/insl/outsl macros don't do byte-swapping.
+ * They are only used in practice for transferring buffers which
+ * are arrays of bytes, and byte-swapping is not appropriate in
+ * that case.  - paulus */
+#define insb(port, buf, ns)    eeh_insb((port), (buf), (ns))
+#define insw(port, buf, ns)    eeh_insw_ns((port), (buf), (ns))
+#define insl(port, buf, nl)    eeh_insl_ns((port), (buf), (nl))
+#define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns))
+#define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl))
+
+#define outsb(port, buf, ns)  _outsb((u8 __iomem *)((port)+pci_io_base), (buf), (ns))
+#define outsw(port, buf, ns)  _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
+#define outsl(port, buf, nl)  _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
+
+#endif
+
+#define readb_relaxed(addr) readb(addr)
+#define readw_relaxed(addr) readw(addr)
+#define readl_relaxed(addr) readl(addr)
+#define readq_relaxed(addr) readq(addr)
+
+extern void _insb(volatile u8 __iomem *port, void *buf, int ns);
+extern void _outsb(volatile u8 __iomem *port, const void *buf, int ns);
+extern void _insw(volatile u16 __iomem *port, void *buf, int ns);
+extern void _outsw(volatile u16 __iomem *port, const void *buf, int ns);
+extern void _insl(volatile u32 __iomem *port, void *buf, int nl);
+extern void _outsl(volatile u32 __iomem *port, const void *buf, int nl);
+extern void _insw_ns(volatile u16 __iomem *port, void *buf, int ns);
+extern void _outsw_ns(volatile u16 __iomem *port, const void *buf, int ns);
+extern void _insl_ns(volatile u32 __iomem *port, void *buf, int nl);
+extern void _outsl_ns(volatile u32 __iomem *port, const void *buf, int nl);
+
+#define mmiowb()
+
+/*
+ * output pause versions need a delay at least for the
+ * w83c105 ide controller in a p610.
+ */
+#define inb_p(port)             inb(port)
+#define outb_p(val, port)       (udelay(1), outb((val), (port)))
+#define inw_p(port)             inw(port)
+#define outw_p(val, port)       (udelay(1), outw((val), (port)))
+#define inl_p(port)             inl(port)
+#define outl_p(val, port)       (udelay(1), outl((val), (port)))
+
+/*
+ * The *_ns versions below don't do byte-swapping.
+ * Neither do the standard versions now, these are just here
+ * for older code.
+ */
+#define outsw_ns(port, buf, ns)        _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
+#define outsl_ns(port, buf, nl)        _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
+
+
+#define IO_SPACE_LIMIT ~(0UL)
+
+
+#ifdef __KERNEL__
+extern int __ioremap_explicit(unsigned long p_addr, unsigned long v_addr,
+                             unsigned long size, unsigned long flags);
+extern void __iomem *__ioremap(unsigned long address, unsigned long size,
+                      unsigned long flags);
+
+/**
+ * ioremap     -   map bus memory into CPU space
+ * @address:   bus address of the memory
+ * @size:      size of the resource to map
+ *
+ * ioremap performs a platform specific sequence of operations to
+ * make bus memory CPU accessible via the readb/readw/readl/writeb/
+ * writew/writel functions and the other mmio helpers. The returned
+ * address is not guaranteed to be usable directly as a virtual
+ * address.
+ */
+extern void __iomem *ioremap(unsigned long address, unsigned long size);
+
+#define ioremap_nocache(addr, size)    ioremap((addr), (size))
+extern int iounmap_explicit(volatile void __iomem *addr, unsigned long size);
+extern void iounmap(volatile void __iomem *addr);
+extern void __iomem * reserve_phb_iospace(unsigned long size);
+
+/**
+ *     virt_to_phys    -       map virtual addresses to physical
+ *     @address: address to remap
+ *
+ *     The returned physical address is the physical (CPU) mapping for
+ *     the memory address given. It is only valid to use this function on
+ *     addresses directly mapped or allocated via kmalloc.
+ *
+ *     This function does not give bus mappings for DMA transfers. In
+ *     almost all conceivable cases a device driver should not be using
+ *     this function
+ */
+static inline unsigned long virt_to_phys(volatile void * address)
+{
+       return __pa((unsigned long)address);
+}
+
+/**
+ *     phys_to_virt    -       map physical address to virtual
+ *     @address: address to remap
+ *
+ *     The returned virtual address is a current CPU mapping for
+ *     the memory address given. It is only valid to use this function on
+ *     addresses that have a kernel mapping
+ *
+ *     This function does not handle bus mappings for DMA transfers. In
+ *     almost all conceivable cases a device driver should not be using
+ *     this function
+ */
+static inline void * phys_to_virt(unsigned long address)
+{
+       return (void *)__va(address);
+}
+
+/*
+ * Change "struct page" to physical address.
+ */
+#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
+
+/* We do NOT want virtual merging, it would put too much pressure on
+ * our iommu allocator. Instead, we want drivers to be smart enough
+ * to coalesce sglists that happen to have been mapped in a contiguous
+ * way by the iommu
+ */
+#define BIO_VMERGE_BOUNDARY    0
+
+#endif /* __KERNEL__ */
+
+static inline void iosync(void)
+{
+        __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+/* Enforce in-order execution of data I/O. 
+ * No distinction between read/write on PPC; use eieio for all three.
+ */
+#define iobarrier_rw() eieio()
+#define iobarrier_r()  eieio()
+#define iobarrier_w()  eieio()
+
+/*
+ * 8, 16 and 32 bit, big and little endian I/O operations, with barrier.
+ * These routines do not perform EEH-related I/O address translation,
+ * and should not be used directly by device drivers.  Use inb/readb
+ * instead.
+ */
+static inline int in_8(const volatile unsigned char __iomem *addr)
+{
+       int ret;
+
+       __asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "m" (*addr));
+       return ret;
+}
+
+static inline void out_8(volatile unsigned char __iomem *addr, int val)
+{
+       __asm__ __volatile__("stb%U0%X0 %1,%0; sync"
+                            : "=m" (*addr) : "r" (val));
+}
+
+static inline int in_le16(const volatile unsigned short __iomem *addr)
+{
+       int ret;
+
+       __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "r" (addr), "m" (*addr));
+       return ret;
+}
+
+static inline int in_be16(const volatile unsigned short __iomem *addr)
+{
+       int ret;
+
+       __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "m" (*addr));
+       return ret;
+}
+
+static inline void out_le16(volatile unsigned short __iomem *addr, int val)
+{
+       __asm__ __volatile__("sthbrx %1,0,%2; sync"
+                            : "=m" (*addr) : "r" (val), "r" (addr));
+}
+
+static inline void out_be16(volatile unsigned short __iomem *addr, int val)
+{
+       __asm__ __volatile__("sth%U0%X0 %1,%0; sync"
+                            : "=m" (*addr) : "r" (val));
+}
+
+static inline unsigned in_le32(const volatile unsigned __iomem *addr)
+{
+       unsigned ret;
+
+       __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "r" (addr), "m" (*addr));
+       return ret;
+}
+
+static inline unsigned in_be32(const volatile unsigned __iomem *addr)
+{
+       unsigned ret;
+
+       __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "m" (*addr));
+       return ret;
+}
+
+static inline void out_le32(volatile unsigned __iomem *addr, int val)
+{
+       __asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
+                            : "r" (val), "r" (addr));
+}
+
+static inline void out_be32(volatile unsigned __iomem *addr, int val)
+{
+       __asm__ __volatile__("stw%U0%X0 %1,%0; sync"
+                            : "=m" (*addr) : "r" (val));
+}
+
+static inline unsigned long in_le64(const volatile unsigned long __iomem *addr)
+{
+       unsigned long tmp, ret;
+
+       __asm__ __volatile__(
+                            "ld %1,0(%2)\n"
+                            "twi 0,%1,0\n"
+                            "isync\n"
+                            "rldimi %0,%1,5*8,1*8\n"
+                            "rldimi %0,%1,3*8,2*8\n"
+                            "rldimi %0,%1,1*8,3*8\n"
+                            "rldimi %0,%1,7*8,4*8\n"
+                            "rldicl %1,%1,32,0\n"
+                            "rlwimi %0,%1,8,8,31\n"
+                            "rlwimi %0,%1,24,16,23\n"
+                            : "=r" (ret) , "=r" (tmp) : "b" (addr) , "m" (*addr));
+       return ret;
+}
+
+static inline unsigned long in_be64(const volatile unsigned long __iomem *addr)
+{
+       unsigned long ret;
+
+       __asm__ __volatile__("ld%U1%X1 %0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "m" (*addr));
+       return ret;
+}
+
+static inline void out_le64(volatile unsigned long __iomem *addr, unsigned long val)
+{
+       unsigned long tmp;
+
+       __asm__ __volatile__(
+                            "rldimi %0,%1,5*8,1*8\n"
+                            "rldimi %0,%1,3*8,2*8\n"
+                            "rldimi %0,%1,1*8,3*8\n"
+                            "rldimi %0,%1,7*8,4*8\n"
+                            "rldicl %1,%1,32,0\n"
+                            "rlwimi %0,%1,8,8,31\n"
+                            "rlwimi %0,%1,24,16,23\n"
+                            "std %0,0(%3)\n"
+                            "sync"
+                            : "=&r" (tmp) , "=&r" (val) : "1" (val) , "b" (addr) , "m" (*addr));
+}
+
+static inline void out_be64(volatile unsigned long __iomem *addr, unsigned long val)
+{
+       __asm__ __volatile__("std%U0%X0 %1,%0; sync" : "=m" (*addr) : "r" (val));
+}
+
+#ifndef CONFIG_PPC_ISERIES 
+#include <asm/eeh.h>
+#endif
+
+#ifdef __KERNEL__
+
+/**
+ *     check_signature         -       find BIOS signatures
+ *     @io_addr: mmio address to check
+ *     @signature:  signature block
+ *     @length: length of signature
+ *
+ *     Perform a signature comparison with the mmio address io_addr. This
+ *     address should have been obtained by ioremap.
+ *     Returns 1 on a match.
+ */
+static inline int check_signature(const volatile void __iomem * io_addr,
+       const unsigned char *signature, int length)
+{
+       int retval = 0;
+#ifndef CONFIG_PPC_ISERIES 
+       do {
+               if (readb(io_addr) != *signature)
+                       goto out;
+               io_addr++;
+               signature++;
+               length--;
+       } while (length);
+       retval = 1;
+out:
+#endif
+       return retval;
+}
+
+/* Nothing to do */
+
+#define dma_cache_inv(_start,_size)            do { } while (0)
+#define dma_cache_wback(_start,_size)          do { } while (0)
+#define dma_cache_wback_inv(_start,_size)      do { } while (0)
+
+/* Check of existence of legacy devices */
+extern int check_legacy_ioport(unsigned long base_port);
+
+
+/*
+ * Convert a physical pointer to a virtual kernel pointer for /dev/mem
+ * access
+ */
+#define xlate_dev_mem_ptr(p)   __va(p)
+
+/*
+ * Convert a virtual cached pointer to an uncached pointer
+ */
+#define xlate_dev_kmem_ptr(p)  p
+
+#endif /* __KERNEL__ */
+
+#endif /* CONFIG_PPC64 */
+#endif /* _ASM_POWERPC_IO_H */
index 6a35e6570ccd4ad9dd3691078609a1a1daadc585..f89f0605089378e6579f6b3710044fa70813a017 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
  * Rewrite, cleanup:
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, 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
diff --git a/include/asm-powerpc/mmu.h b/include/asm-powerpc/mmu.h
new file mode 100644 (file)
index 0000000..29b0bb0
--- /dev/null
@@ -0,0 +1,400 @@
+#ifndef _ASM_POWERPC_MMU_H_
+#define _ASM_POWERPC_MMU_H_
+
+#ifndef CONFIG_PPC64
+#include <asm-ppc/mmu.h>
+#else
+
+/*
+ * PowerPC memory management structures
+ *
+ * Dave Engebretsen & Mike Corrigan <{engebret|mikejc}@us.ibm.com>
+ *   PPC64 rework.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <asm/asm-compat.h>
+#include <asm/page.h>
+
+/*
+ * Segment table
+ */
+
+#define STE_ESID_V     0x80
+#define STE_ESID_KS    0x20
+#define STE_ESID_KP    0x10
+#define STE_ESID_N     0x08
+
+#define STE_VSID_SHIFT 12
+
+/* Location of cpu0's segment table */
+#define STAB0_PAGE     0x6
+#define STAB0_PHYS_ADDR        (STAB0_PAGE<<12)
+
+#ifndef __ASSEMBLY__
+extern char initial_stab[];
+#endif /* ! __ASSEMBLY */
+
+/*
+ * SLB
+ */
+
+#define SLB_NUM_BOLTED         3
+#define SLB_CACHE_ENTRIES      8
+
+/* Bits in the SLB ESID word */
+#define SLB_ESID_V             ASM_CONST(0x0000000008000000) /* valid */
+
+/* Bits in the SLB VSID word */
+#define SLB_VSID_SHIFT         12
+#define SLB_VSID_B             ASM_CONST(0xc000000000000000)
+#define SLB_VSID_B_256M                ASM_CONST(0x0000000000000000)
+#define SLB_VSID_B_1T          ASM_CONST(0x4000000000000000)
+#define SLB_VSID_KS            ASM_CONST(0x0000000000000800)
+#define SLB_VSID_KP            ASM_CONST(0x0000000000000400)
+#define SLB_VSID_N             ASM_CONST(0x0000000000000200) /* no-execute */
+#define SLB_VSID_L             ASM_CONST(0x0000000000000100)
+#define SLB_VSID_C             ASM_CONST(0x0000000000000080) /* class */
+#define SLB_VSID_LP            ASM_CONST(0x0000000000000030)
+#define SLB_VSID_LP_00         ASM_CONST(0x0000000000000000)
+#define SLB_VSID_LP_01         ASM_CONST(0x0000000000000010)
+#define SLB_VSID_LP_10         ASM_CONST(0x0000000000000020)
+#define SLB_VSID_LP_11         ASM_CONST(0x0000000000000030)
+#define SLB_VSID_LLP           (SLB_VSID_L|SLB_VSID_LP)
+
+#define SLB_VSID_KERNEL                (SLB_VSID_KP)
+#define SLB_VSID_USER          (SLB_VSID_KP|SLB_VSID_KS|SLB_VSID_C)
+
+#define SLBIE_C                        (0x08000000)
+
+/*
+ * Hash table
+ */
+
+#define HPTES_PER_GROUP 8
+
+#define HPTE_V_AVPN_SHIFT      7
+#define HPTE_V_AVPN            ASM_CONST(0xffffffffffffff80)
+#define HPTE_V_AVPN_VAL(x)     (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
+#define HPTE_V_COMPARE(x,y)    (!(((x) ^ (y)) & HPTE_V_AVPN))
+#define HPTE_V_BOLTED          ASM_CONST(0x0000000000000010)
+#define HPTE_V_LOCK            ASM_CONST(0x0000000000000008)
+#define HPTE_V_LARGE           ASM_CONST(0x0000000000000004)
+#define HPTE_V_SECONDARY       ASM_CONST(0x0000000000000002)
+#define HPTE_V_VALID           ASM_CONST(0x0000000000000001)
+
+#define HPTE_R_PP0             ASM_CONST(0x8000000000000000)
+#define HPTE_R_TS              ASM_CONST(0x4000000000000000)
+#define HPTE_R_RPN_SHIFT       12
+#define HPTE_R_RPN             ASM_CONST(0x3ffffffffffff000)
+#define HPTE_R_FLAGS           ASM_CONST(0x00000000000003ff)
+#define HPTE_R_PP              ASM_CONST(0x0000000000000003)
+#define HPTE_R_N               ASM_CONST(0x0000000000000004)
+
+/* Values for PP (assumes Ks=0, Kp=1) */
+/* pp0 will always be 0 for linux     */
+#define PP_RWXX        0       /* Supervisor read/write, User none */
+#define PP_RWRX 1      /* Supervisor read/write, User read */
+#define PP_RWRW 2      /* Supervisor read/write, User read/write */
+#define PP_RXRX 3      /* Supervisor read,       User read */
+
+#ifndef __ASSEMBLY__
+
+typedef struct {
+       unsigned long v;
+       unsigned long r;
+} hpte_t;
+
+extern hpte_t *htab_address;
+extern unsigned long htab_hash_mask;
+
+/*
+ * Page size definition
+ *
+ *    shift : is the "PAGE_SHIFT" value for that page size
+ *    sllp  : is a bit mask with the value of SLB L || LP to be or'ed
+ *            directly to a slbmte "vsid" value
+ *    penc  : is the HPTE encoding mask for the "LP" field:
+ *
+ */
+struct mmu_psize_def
+{
+       unsigned int    shift;  /* number of bits */
+       unsigned int    penc;   /* HPTE encoding */
+       unsigned int    tlbiel; /* tlbiel supported for that page size */
+       unsigned long   avpnm;  /* bits to mask out in AVPN in the HPTE */
+       unsigned long   sllp;   /* SLB L||LP (exact mask to use in slbmte) */
+};
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * The kernel use the constants below to index in the page sizes array.
+ * The use of fixed constants for this purpose is better for performances
+ * of the low level hash refill handlers.
+ *
+ * A non supported page size has a "shift" field set to 0
+ *
+ * Any new page size being implemented can get a new entry in here. Whether
+ * the kernel will use it or not is a different matter though. The actual page
+ * size used by hugetlbfs is not defined here and may be made variable
+ */
+
+#define MMU_PAGE_4K            0       /* 4K */
+#define MMU_PAGE_64K           1       /* 64K */
+#define MMU_PAGE_64K_AP                2       /* 64K Admixed (in a 4K segment) */
+#define MMU_PAGE_1M            3       /* 1M */
+#define MMU_PAGE_16M           4       /* 16M */
+#define MMU_PAGE_16G           5       /* 16G */
+#define MMU_PAGE_COUNT         6
+
+#ifndef __ASSEMBLY__
+
+/*
+ * The current system page sizes
+ */
+extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
+extern int mmu_linear_psize;
+extern int mmu_virtual_psize;
+
+#ifdef CONFIG_HUGETLB_PAGE
+/*
+ * The page size index of the huge pages for use by hugetlbfs
+ */
+extern int mmu_huge_psize;
+
+#endif /* CONFIG_HUGETLB_PAGE */
+
+/*
+ * This function sets the AVPN and L fields of the HPTE  appropriately
+ * for the page size
+ */
+static inline unsigned long hpte_encode_v(unsigned long va, int psize)
+{
+       unsigned long v =
+       v = (va >> 23) & ~(mmu_psize_defs[psize].avpnm);
+       v <<= HPTE_V_AVPN_SHIFT;
+       if (psize != MMU_PAGE_4K)
+               v |= HPTE_V_LARGE;
+       return v;
+}
+
+/*
+ * This function sets the ARPN, and LP fields of the HPTE appropriately
+ * for the page size. We assume the pa is already "clean" that is properly
+ * aligned for the requested page size
+ */
+static inline unsigned long hpte_encode_r(unsigned long pa, int psize)
+{
+       unsigned long r;
+
+       /* A 4K page needs no special encoding */
+       if (psize == MMU_PAGE_4K)
+               return pa & HPTE_R_RPN;
+       else {
+               unsigned int penc = mmu_psize_defs[psize].penc;
+               unsigned int shift = mmu_psize_defs[psize].shift;
+               return (pa & ~((1ul << shift) - 1)) | (penc << 12);
+       }
+       return r;
+}
+
+/*
+ * This hashes a virtual address for a 256Mb segment only for now
+ */
+
+static inline unsigned long hpt_hash(unsigned long va, unsigned int shift)
+{
+       return ((va >> 28) & 0x7fffffffffUL) ^ ((va & 0x0fffffffUL) >> shift);
+}
+
+extern int __hash_page_4K(unsigned long ea, unsigned long access,
+                         unsigned long vsid, pte_t *ptep, unsigned long trap,
+                         unsigned int local);
+extern int __hash_page_64K(unsigned long ea, unsigned long access,
+                          unsigned long vsid, pte_t *ptep, unsigned long trap,
+                          unsigned int local);
+struct mm_struct;
+extern int hash_huge_page(struct mm_struct *mm, unsigned long access,
+                         unsigned long ea, unsigned long vsid, int local,
+                         unsigned long trap);
+
+extern void htab_finish_init(void);
+extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
+                            unsigned long pstart, unsigned long mode,
+                            int psize);
+
+extern void htab_initialize(void);
+extern void htab_initialize_secondary(void);
+extern void hpte_init_native(void);
+extern void hpte_init_lpar(void);
+extern void hpte_init_iSeries(void);
+extern void mm_init_ppc64(void);
+
+extern long pSeries_lpar_hpte_insert(unsigned long hpte_group,
+                                    unsigned long va, unsigned long prpn,
+                                    unsigned long rflags,
+                                    unsigned long vflags, int psize);
+
+extern long native_hpte_insert(unsigned long hpte_group,
+                              unsigned long va, unsigned long prpn,
+                              unsigned long rflags,
+                              unsigned long vflags, int psize);
+
+extern long iSeries_hpte_insert(unsigned long hpte_group,
+                               unsigned long va, unsigned long prpn,
+                               unsigned long rflags,
+                               unsigned long vflags, int psize);
+
+extern void stabs_alloc(void);
+extern void slb_initialize(void);
+extern void stab_initialize(unsigned long stab);
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * VSID allocation
+ *
+ * We first generate a 36-bit "proto-VSID".  For kernel addresses this
+ * is equal to the ESID, for user addresses it is:
+ *     (context << 15) | (esid & 0x7fff)
+ *
+ * The two forms are distinguishable because the top bit is 0 for user
+ * addresses, whereas the top two bits are 1 for kernel addresses.
+ * Proto-VSIDs with the top two bits equal to 0b10 are reserved for
+ * now.
+ *
+ * The proto-VSIDs are then scrambled into real VSIDs with the
+ * multiplicative hash:
+ *
+ *     VSID = (proto-VSID * VSID_MULTIPLIER) % VSID_MODULUS
+ *     where   VSID_MULTIPLIER = 268435399 = 0xFFFFFC7
+ *             VSID_MODULUS = 2^36-1 = 0xFFFFFFFFF
+ *
+ * This scramble is only well defined for proto-VSIDs below
+ * 0xFFFFFFFFF, so both proto-VSID and actual VSID 0xFFFFFFFFF are
+ * reserved.  VSID_MULTIPLIER is prime, so in particular it is
+ * co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
+ * Because the modulus is 2^n-1 we can compute it efficiently without
+ * a divide or extra multiply (see below).
+ *
+ * This scheme has several advantages over older methods:
+ *
+ *     - We have VSIDs allocated for every kernel address
+ * (i.e. everything above 0xC000000000000000), except the very top
+ * segment, which simplifies several things.
+ *
+ *     - We allow for 15 significant bits of ESID and 20 bits of
+ * context for user addresses.  i.e. 8T (43 bits) of address space for
+ * up to 1M contexts (although the page table structure and context
+ * allocation will need changes to take advantage of this).
+ *
+ *     - The scramble function gives robust scattering in the hash
+ * table (at least based on some initial results).  The previous
+ * method was more susceptible to pathological cases giving excessive
+ * hash collisions.
+ */
+/*
+ * WARNING - If you change these you must make sure the asm
+ * implementations in slb_allocate (slb_low.S), do_stab_bolted
+ * (head.S) and ASM_VSID_SCRAMBLE (below) are changed accordingly.
+ *
+ * You'll also need to change the precomputed VSID values in head.S
+ * which are used by the iSeries firmware.
+ */
+
+#define VSID_MULTIPLIER        ASM_CONST(200730139)    /* 28-bit prime */
+#define VSID_BITS      36
+#define VSID_MODULUS   ((1UL<<VSID_BITS)-1)
+
+#define CONTEXT_BITS   19
+#define USER_ESID_BITS 16
+
+#define USER_VSID_RANGE        (1UL << (USER_ESID_BITS + SID_SHIFT))
+
+/*
+ * This macro generates asm code to compute the VSID scramble
+ * function.  Used in slb_allocate() and do_stab_bolted.  The function
+ * computed is: (protovsid*VSID_MULTIPLIER) % VSID_MODULUS
+ *
+ *     rt = register continaing the proto-VSID and into which the
+ *             VSID will be stored
+ *     rx = scratch register (clobbered)
+ *
+ *     - rt and rx must be different registers
+ *     - The answer will end up in the low 36 bits of rt.  The higher
+ *       bits may contain other garbage, so you may need to mask the
+ *       result.
+ */
+#define ASM_VSID_SCRAMBLE(rt, rx)      \
+       lis     rx,VSID_MULTIPLIER@h;                                   \
+       ori     rx,rx,VSID_MULTIPLIER@l;                                \
+       mulld   rt,rt,rx;               /* rt = rt * MULTIPLIER */      \
+                                                                       \
+       srdi    rx,rt,VSID_BITS;                                        \
+       clrldi  rt,rt,(64-VSID_BITS);                                   \
+       add     rt,rt,rx;               /* add high and low bits */     \
+       /* Now, r3 == VSID (mod 2^36-1), and lies between 0 and         \
+        * 2^36-1+2^28-1.  That in particular means that if r3 >=       \
+        * 2^36-1, then r3+1 has the 2^36 bit set.  So, if r3+1 has     \
+        * the bit clear, r3 already has the answer we want, if it      \
+        * doesn't, the answer is the low 36 bits of r3+1.  So in all   \
+        * cases the answer is the low 36 bits of (r3 + ((r3+1) >> 36))*/\
+       addi    rx,rt,1;                                                \
+       srdi    rx,rx,VSID_BITS;        /* extract 2^36 bit */          \
+       add     rt,rt,rx
+
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned long mm_context_id_t;
+
+typedef struct {
+       mm_context_id_t id;
+#ifdef CONFIG_HUGETLB_PAGE
+       u16 low_htlb_areas, high_htlb_areas;
+#endif
+} mm_context_t;
+
+
+static inline unsigned long vsid_scramble(unsigned long protovsid)
+{
+#if 0
+       /* The code below is equivalent to this function for arguments
+        * < 2^VSID_BITS, which is all this should ever be called
+        * with.  However gcc is not clever enough to compute the
+        * modulus (2^n-1) without a second multiply. */
+       return ((protovsid * VSID_MULTIPLIER) % VSID_MODULUS);
+#else /* 1 */
+       unsigned long x;
+
+       x = protovsid * VSID_MULTIPLIER;
+       x = (x >> VSID_BITS) + (x & VSID_MODULUS);
+       return (x + ((x+1) >> VSID_BITS)) & VSID_MODULUS;
+#endif /* 1 */
+}
+
+/* This is only valid for addresses >= KERNELBASE */
+static inline unsigned long get_kernel_vsid(unsigned long ea)
+{
+       return vsid_scramble(ea >> SID_SHIFT);
+}
+
+/* This is only valid for user addresses (which are below 2^41) */
+static inline unsigned long get_vsid(unsigned long context, unsigned long ea)
+{
+       return vsid_scramble((context << USER_ESID_BITS)
+                            | (ea >> SID_SHIFT));
+}
+
+#define VSID_SCRAMBLE(pvsid)   (((pvsid) * VSID_MULTIPLIER) % VSID_MODULUS)
+#define KERNEL_VSID(ea)                VSID_SCRAMBLE(GET_ESID(ea))
+
+#endif /* __ASSEMBLY */
+
+#endif /* CONFIG_PPC64 */
+#endif /* _ASM_POWERPC_MMU_H_ */
diff --git a/include/asm-powerpc/mmu_context.h b/include/asm-powerpc/mmu_context.h
new file mode 100644 (file)
index 0000000..ea6798c
--- /dev/null
@@ -0,0 +1,89 @@
+#ifndef __ASM_POWERPC_MMU_CONTEXT_H
+#define __ASM_POWERPC_MMU_CONTEXT_H
+
+#ifndef CONFIG_PPC64
+#include <asm-ppc/mmu_context.h>
+#else
+
+#include <linux/kernel.h>      
+#include <linux/mm.h>  
+#include <asm/mmu.h>   
+#include <asm/cputable.h>
+
+/*
+ * Copyright (C) 2001 PPC 64 Team, 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.
+ */
+
+/*
+ * Getting into a kernel thread, there is no valid user segment, mark
+ * paca->pgdir NULL so that SLB miss on user addresses will fault
+ */
+static inline void enter_lazy_tlb(struct mm_struct *mm,
+                                 struct task_struct *tsk)
+{
+#ifdef CONFIG_PPC_64K_PAGES
+       get_paca()->pgdir = NULL;
+#endif /* CONFIG_PPC_64K_PAGES */
+}
+
+#define NO_CONTEXT     0
+#define MAX_CONTEXT    (0x100000-1)
+
+extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
+extern void destroy_context(struct mm_struct *mm);
+
+extern void switch_stab(struct task_struct *tsk, struct mm_struct *mm);
+extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm);
+
+/*
+ * switch_mm is the entry point called from the architecture independent
+ * code in kernel/sched.c
+ */
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
+                            struct task_struct *tsk)
+{
+       if (!cpu_isset(smp_processor_id(), next->cpu_vm_mask))
+               cpu_set(smp_processor_id(), next->cpu_vm_mask);
+
+       /* No need to flush userspace segments if the mm doesnt change */
+#ifdef CONFIG_PPC_64K_PAGES
+       if (prev == next && get_paca()->pgdir == next->pgd)
+               return;
+#else
+       if (prev == next)
+               return;
+#endif /* CONFIG_PPC_64K_PAGES */
+
+#ifdef CONFIG_ALTIVEC
+       if (cpu_has_feature(CPU_FTR_ALTIVEC))
+               asm volatile ("dssall");
+#endif /* CONFIG_ALTIVEC */
+
+       if (cpu_has_feature(CPU_FTR_SLB))
+               switch_slb(tsk, next);
+       else
+               switch_stab(tsk, next);
+}
+
+#define deactivate_mm(tsk,mm)  do { } while (0)
+
+/*
+ * After we have set current->mm to a new value, this activates
+ * the context for the new mm so we see the new mappings.
+ */
+static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       switch_mm(prev, next, current);
+       local_irq_restore(flags);
+}
+
+#endif /* CONFIG_PPC64 */
+#endif /* __ASM_POWERPC_MMU_CONTEXT_H */
diff --git a/include/asm-powerpc/mmzone.h b/include/asm-powerpc/mmzone.h
new file mode 100644 (file)
index 0000000..54958d6
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
+ *
+ * PowerPC64 port:
+ * Copyright (C) 2002 Anton Blanchard, IBM Corp.
+ */
+#ifndef _ASM_MMZONE_H_
+#define _ASM_MMZONE_H_
+
+#include <linux/config.h>
+
+/*
+ * generic non-linear memory support:
+ *
+ * 1) we will not split memory into more chunks than will fit into the
+ *    flags field of the struct page
+ */
+
+#ifdef CONFIG_NEED_MULTIPLE_NODES
+
+extern struct pglist_data *node_data[];
+/*
+ * Return a pointer to the node data for node n.
+ */
+#define NODE_DATA(nid)         (node_data[nid])
+
+/*
+ * Following are specific to this numa platform.
+ */
+
+extern int numa_cpu_lookup_table[];
+extern cpumask_t numa_cpumask_lookup_table[];
+#ifdef CONFIG_MEMORY_HOTPLUG
+extern unsigned long max_pfn;
+#endif
+
+/*
+ * Following are macros that each numa implmentation must define.
+ */
+
+#define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
+#define node_end_pfn(nid)      (NODE_DATA(nid)->node_end_pfn)
+
+#endif /* CONFIG_NEED_MULTIPLE_NODES */
+
+#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
+extern int __init early_pfn_to_nid(unsigned long pfn);
+#endif
+
+#endif /* _ASM_MMZONE_H_ */
index 1e6e7846824fca9f0d23fe7f6384a9072f38faaf..6642c012500177fc5e6f90a6ddf84e0cfa2e5ec5 100644 (file)
@@ -103,8 +103,9 @@ extern unsigned int HPAGE_SHIFT;
 #define HTLB_AREA_SIZE         (1UL << HTLB_AREA_SHIFT)
 #define GET_HTLB_AREA(x)       ((x) >> HTLB_AREA_SHIFT)
 
-#define LOW_ESID_MASK(addr, len)    (((1U << (GET_ESID(addr+len-1)+1)) \
-                                     - (1U << GET_ESID(addr))) & 0xffff)
+#define LOW_ESID_MASK(addr, len)    \
+       (((1U << (GET_ESID(min((addr)+(len)-1, 0x100000000UL))+1)) \
+         - (1U << GET_ESID(min((addr), 0x100000000UL)))) & 0xffff)
 #define HTLB_AREA_MASK(addr, len)   (((1U << (GET_HTLB_AREA(addr+len-1)+1)) \
                                      - (1U << GET_HTLB_AREA(addr))) & 0xffff)
 
@@ -113,17 +114,21 @@ extern unsigned int HPAGE_SHIFT;
 #define ARCH_HAS_SETCLEAR_HUGE_PTE
 
 #define touches_hugepage_low_range(mm, addr, len) \
-       (LOW_ESID_MASK((addr), (len)) & (mm)->context.low_htlb_areas)
+       (((addr) < 0x100000000UL) \
+        && (LOW_ESID_MASK((addr), (len)) & (mm)->context.low_htlb_areas))
 #define touches_hugepage_high_range(mm, addr, len) \
-       (HTLB_AREA_MASK((addr), (len)) & (mm)->context.high_htlb_areas)
+       ((((addr) + (len)) > 0x100000000UL) \
+         && (HTLB_AREA_MASK((addr), (len)) & (mm)->context.high_htlb_areas))
 
 #define __within_hugepage_low_range(addr, len, segmask) \
-       ((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask))
+       ( (((addr)+(len)) <= 0x100000000UL) \
+         && ((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask)))
 #define within_hugepage_low_range(addr, len) \
        __within_hugepage_low_range((addr), (len), \
                                    current->mm->context.low_htlb_areas)
 #define __within_hugepage_high_range(addr, len, zonemask) \
-       ((HTLB_AREA_MASK((addr), (len)) | (zonemask)) == (zonemask))
+       ( ((addr) >= 0x100000000UL) \
+         && ((HTLB_AREA_MASK((addr), (len)) | (zonemask)) == (zonemask)))
 #define within_hugepage_high_range(addr, len) \
        __within_hugepage_high_range((addr), (len), \
                                    current->mm->context.high_htlb_areas)
@@ -135,9 +140,9 @@ extern unsigned int HPAGE_SHIFT;
 
 #define in_hugepage_area(context, addr) \
        (cpu_has_feature(CPU_FTR_16M_PAGE) && \
-        ( ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) || \
-          ( ((addr) < 0x100000000L) && \
-            ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) ) )
+        ( ( (addr) >= 0x100000000UL) \
+          ? ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) \
+          : ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) )
 
 #else /* !CONFIG_HUGETLB_PAGE */
 
diff --git a/include/asm-powerpc/pci-bridge.h b/include/asm-powerpc/pci-bridge.h
new file mode 100644 (file)
index 0000000..223ec7b
--- /dev/null
@@ -0,0 +1,153 @@
+#ifndef _ASM_POWERPC_PCI_BRIDGE_H
+#define _ASM_POWERPC_PCI_BRIDGE_H
+
+#ifndef CONFIG_PPC64
+#include <asm-ppc/pci-bridge.h>
+#else
+
+#include <linux/pci.h>
+#include <linux/list.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.
+ */
+
+/*
+ * Structure of a PCI controller (host bridge)
+ */
+struct pci_controller {
+       struct pci_bus *bus;
+       char is_dynamic;
+       void *arch_data;
+       struct list_head list_node;
+
+       int first_busno;
+       int last_busno;
+
+       void __iomem *io_base_virt;
+       unsigned long io_base_phys;
+
+       /* Some machines have a non 1:1 mapping of
+        * the PCI memory space in the CPU bus space
+        */
+       unsigned long pci_mem_offset;
+       unsigned long pci_io_size;
+
+       struct pci_ops *ops;
+       volatile unsigned int __iomem *cfg_addr;
+       volatile void __iomem *cfg_data;
+
+       /* Currently, we limit ourselves to 1 IO range and 3 mem
+        * ranges since the common pci_bus structure can't handle more
+        */
+       struct resource io_resource;
+       struct resource mem_resources[3];
+       int global_number;              
+       int local_number;               
+       unsigned long buid;
+       unsigned long dma_window_base_cur;
+       unsigned long dma_window_size;
+};
+
+/*
+ * PCI stuff, for nodes representing PCI devices, pointed to
+ * by device_node->data.
+ */
+struct pci_controller;
+struct iommu_table;
+
+struct pci_dn {
+       int     busno;                  /* for pci devices */
+       int     bussubno;               /* for pci devices */
+       int     devfn;                  /* for pci devices */
+
+#ifdef CONFIG_PPC_PSERIES
+       int     eeh_mode;               /* See eeh.h for possible EEH_MODEs */
+       int     eeh_config_addr;
+       int     eeh_check_count;        /* # times driver ignored error */
+       int     eeh_freeze_count;       /* # times this device froze up. */
+       int     eeh_is_bridge;          /* device is pci-to-pci bridge */
+#endif
+       int     pci_ext_config_space;   /* for pci devices */
+       struct  pci_controller *phb;    /* for pci devices */
+       struct  iommu_table *iommu_table;       /* for phb's or bridges */
+       struct  pci_dev *pcidev;        /* back-pointer to the pci device */
+       struct  device_node *node;      /* back-pointer to the device_node */
+#ifdef CONFIG_PPC_ISERIES
+       struct  list_head Device_List;
+       int     Irq;                    /* Assigned IRQ */
+       int     Flags;                  /* Possible flags(disable/bist)*/
+       u8      LogicalSlot;            /* Hv Slot Index for Tces */
+#endif
+       u32     config_space[16];       /* saved PCI config space */
+};
+
+/* Get the pointer to a device_node's pci_dn */
+#define PCI_DN(dn)     ((struct pci_dn *) (dn)->data)
+
+struct device_node *fetch_dev_dn(struct pci_dev *dev);
+
+/* Get a device_node from a pci_dev.  This code must be fast except
+ * in the case where the sysdata is incorrect and needs to be fixed
+ * up (this will only happen once).
+ * In this case the sysdata will have been inherited from a PCI host
+ * bridge or a PCI-PCI bridge further up the tree, so it will point
+ * to a valid struct pci_dn, just not the one we want.
+ */
+static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev)
+{
+       struct device_node *dn = dev->sysdata;
+       struct pci_dn *pdn = dn->data;
+
+       if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number)
+               return dn;      /* fast path.  sysdata is good */
+       return fetch_dev_dn(dev);
+}
+
+static inline int pci_device_from_OF_node(struct device_node *np,
+                                         u8 *bus, u8 *devfn)
+{
+       if (!PCI_DN(np))
+               return -ENODEV;
+       *bus = PCI_DN(np)->busno;
+       *devfn = PCI_DN(np)->devfn;
+       return 0;
+}
+
+static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
+{
+       if (bus->self)
+               return pci_device_to_OF_node(bus->self);
+       else
+               return bus->sysdata; /* Must be root bus (PHB) */
+}
+
+extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
+                                        struct device_node *dev, int primary);
+
+extern int pcibios_remove_root_bus(struct pci_controller *phb);
+
+extern void phbs_remap_io(void);
+
+static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
+{
+       struct device_node *busdn = bus->sysdata;
+
+       BUG_ON(busdn == NULL);
+       return PCI_DN(busdn)->phb;
+}
+
+extern struct pci_controller *
+pcibios_alloc_controller(struct device_node *dev);
+extern void pcibios_free_controller(struct pci_controller *phb);
+
+/* Return values for ppc_md.pci_probe_mode function */
+#define PCI_PROBE_NONE         -1      /* Don't look at this bus at all */
+#define PCI_PROBE_NORMAL       0       /* Do normal PCI probing */
+#define PCI_PROBE_DEVTREE      1       /* Instantiate from device tree */
+
+#endif /* CONFIG_PPC64 */
+#endif
diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h
new file mode 100644 (file)
index 0000000..d5934a0
--- /dev/null
@@ -0,0 +1,247 @@
+#ifndef __ASM_POWERPC_PCI_H
+#define __ASM_POWERPC_PCI_H
+#ifdef __KERNEL__
+
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/dma-mapping.h>
+
+#include <asm/machdep.h>
+#include <asm/scatterlist.h>
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/pci-bridge.h>
+
+#include <asm-generic/pci-dma-compat.h>
+
+#define PCIBIOS_MIN_IO         0x1000
+#define PCIBIOS_MIN_MEM                0x10000000
+
+struct pci_dev;
+
+/* Values for the `which' argument to sys_pciconfig_iobase syscall.  */
+#define IOBASE_BRIDGE_NUMBER   0
+#define IOBASE_MEMORY          1
+#define IOBASE_IO              2
+#define IOBASE_ISA_IO          3
+#define IOBASE_ISA_MEM         4
+
+/*
+ * Set this to 1 if you want the kernel to re-assign all PCI
+ * bus numbers
+ */
+extern int pci_assign_all_buses;
+#define pcibios_assign_all_busses()    (pci_assign_all_buses)
+
+#define pcibios_scan_all_fns(a, b)     0
+
+static inline void pcibios_set_master(struct pci_dev *dev)
+{
+       /* No special bus mastering setup handling */
+}
+
+static inline void pcibios_penalize_isa_irq(int irq, int active)
+{
+       /* We don't do dynamic PCI IRQ allocation */
+}
+
+#define HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ
+static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
+{
+       if (ppc_md.pci_get_legacy_ide_irq)
+               return ppc_md.pci_get_legacy_ide_irq(dev, channel);
+       return channel ? 15 : 14;
+}
+
+#ifdef CONFIG_PPC64
+#define HAVE_ARCH_PCI_MWI 1
+static inline int pcibios_prep_mwi(struct pci_dev *dev)
+{
+       /*
+        * We would like to avoid touching the cacheline size or MWI bit
+        * but we cant do that with the current pcibios_prep_mwi 
+        * interface. pSeries firmware sets the cacheline size (which is not
+        * the cpu cacheline size in all cases) and hardware treats MWI 
+        * the same as memory write. So we dont touch the cacheline size
+        * here and allow the generic code to set the MWI bit.
+        */
+       return 0;
+}
+
+extern struct dma_mapping_ops pci_dma_ops;
+
+/* For DAC DMA, we currently don't support it by default, but
+ * we let 64-bit platforms override this.
+ */
+static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
+{
+       if (pci_dma_ops.dac_dma_supported)
+               return pci_dma_ops.dac_dma_supported(&hwdev->dev, mask);
+       return 0;
+}
+
+#ifdef CONFIG_PCI
+static inline void pci_dma_burst_advice(struct pci_dev *pdev,
+                                       enum pci_dma_burst_strategy *strat,
+                                       unsigned long *strategy_parameter)
+{
+       unsigned long cacheline_size;
+       u8 byte;
+
+       pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &byte);
+       if (byte == 0)
+               cacheline_size = 1024;
+       else
+               cacheline_size = (int) byte * 4;
+
+       *strat = PCI_DMA_BURST_MULTIPLE;
+       *strategy_parameter = cacheline_size;
+}
+#endif
+
+extern int pci_domain_nr(struct pci_bus *bus);
+
+/* Decide whether to display the domain number in /proc */
+extern int pci_proc_domain(struct pci_bus *bus);
+
+#else /* 32-bit */
+
+#ifdef CONFIG_PCI
+static inline void pci_dma_burst_advice(struct pci_dev *pdev,
+                                       enum pci_dma_burst_strategy *strat,
+                                       unsigned long *strategy_parameter)
+{
+       *strat = PCI_DMA_BURST_INFINITY;
+       *strategy_parameter = ~0UL;
+}
+#endif
+
+/*
+ * At present there are very few 32-bit PPC machines that can have
+ * memory above the 4GB point, and we don't support that.
+ */
+#define pci_dac_dma_supported(pci_dev, mask)   (0)
+
+/* Return the index of the PCI controller for device PDEV. */
+#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
+
+/* Set the name of the bus as it appears in /proc/bus/pci */
+static inline int pci_proc_domain(struct pci_bus *bus)
+{
+       return 0;
+}
+
+#endif /* CONFIG_PPC64 */
+
+struct vm_area_struct;
+/* Map a range of PCI memory or I/O space for a device into user space */
+int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
+                       enum pci_mmap_state mmap_state, int write_combine);
+
+/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */
+#define HAVE_PCI_MMAP  1
+
+#ifdef CONFIG_PPC64
+/* pci_unmap_{single,page} is not a nop, thus... */
+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
+       dma_addr_t ADDR_NAME;
+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
+       __u32 LEN_NAME;
+#define pci_unmap_addr(PTR, ADDR_NAME)                 \
+       ((PTR)->ADDR_NAME)
+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
+       (((PTR)->ADDR_NAME) = (VAL))
+#define pci_unmap_len(PTR, LEN_NAME)                   \
+       ((PTR)->LEN_NAME)
+#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
+       (((PTR)->LEN_NAME) = (VAL))
+
+/* The PCI address space does not equal the physical memory address
+ * space (we have an IOMMU).  The IDE and SCSI device layers use
+ * this boolean for bounce buffer decisions.
+ */
+#define PCI_DMA_BUS_IS_PHYS    (0)
+
+#else /* 32-bit */
+
+/* The PCI address space does equal the physical memory
+ * address space (no IOMMU).  The IDE and SCSI device layers use
+ * this boolean for bounce buffer decisions.
+ */
+#define PCI_DMA_BUS_IS_PHYS     (1)
+
+/* pci_unmap_{page,single} is a nop so... */
+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
+#define pci_unmap_addr(PTR, ADDR_NAME)         (0)
+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)        do { } while (0)
+#define pci_unmap_len(PTR, LEN_NAME)           (0)
+#define pci_unmap_len_set(PTR, LEN_NAME, VAL)  do { } while (0)
+
+#endif /* CONFIG_PPC64 */
+       
+extern void pcibios_resource_to_bus(struct pci_dev *dev,
+                       struct pci_bus_region *region,
+                       struct resource *res);
+
+extern void pcibios_bus_to_resource(struct pci_dev *dev,
+                       struct resource *res,
+                       struct pci_bus_region *region);
+
+static inline struct resource *pcibios_select_root(struct pci_dev *pdev,
+                       struct resource *res)
+{
+       struct resource *root = NULL;
+
+       if (res->flags & IORESOURCE_IO)
+               root = &ioport_resource;
+       if (res->flags & IORESOURCE_MEM)
+               root = &iomem_resource;
+
+       return root;
+}
+
+extern int unmap_bus_range(struct pci_bus *bus);
+
+extern int remap_bus_range(struct pci_bus *bus);
+
+extern void pcibios_fixup_device_resources(struct pci_dev *dev,
+                       struct pci_bus *bus);
+
+extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
+
+extern struct pci_dev *of_create_pci_dev(struct device_node *node,
+                                       struct pci_bus *bus, int devfn);
+
+extern void of_scan_pci_bridge(struct device_node *node,
+                               struct pci_dev *dev);
+
+extern void of_scan_bus(struct device_node *node, struct pci_bus *bus);
+
+extern int pci_read_irq_line(struct pci_dev *dev);
+
+extern void pcibios_add_platform_entries(struct pci_dev *dev);
+
+struct file;
+extern pgprot_t        pci_phys_mem_access_prot(struct file *file,
+                                        unsigned long pfn,
+                                        unsigned long size,
+                                        pgprot_t prot);
+
+#if defined(CONFIG_PPC_MULTIPLATFORM) || defined(CONFIG_PPC32)
+#define HAVE_ARCH_PCI_RESOURCE_TO_USER
+extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
+                                const struct resource *rsrc,
+                                u64 *start, u64 *end);
+#endif /* CONFIG_PPC_MULTIPLATFORM || CONFIG_PPC32 */
+
+#endif /* __KERNEL__ */
+#endif /* __ASM_POWERPC_PCI_H */
diff --git a/include/asm-powerpc/pgalloc.h b/include/asm-powerpc/pgalloc.h
new file mode 100644 (file)
index 0000000..bfc2113
--- /dev/null
@@ -0,0 +1,156 @@
+#ifndef _ASM_POWERPC_PGALLOC_H
+#define _ASM_POWERPC_PGALLOC_H
+
+#ifndef CONFIG_PPC64
+#include <asm-ppc/pgalloc.h>
+#else
+
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/cpumask.h>
+#include <linux/percpu.h>
+
+extern kmem_cache_t *pgtable_cache[];
+
+#ifdef CONFIG_PPC_64K_PAGES
+#define PTE_CACHE_NUM  0
+#define PMD_CACHE_NUM  1
+#define PGD_CACHE_NUM  2
+#else
+#define PTE_CACHE_NUM  0
+#define PMD_CACHE_NUM  1
+#define PUD_CACHE_NUM  1
+#define PGD_CACHE_NUM  0
+#endif
+
+/*
+ * 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.
+ */
+
+static inline pgd_t *pgd_alloc(struct mm_struct *mm)
+{
+       return kmem_cache_alloc(pgtable_cache[PGD_CACHE_NUM], GFP_KERNEL);
+}
+
+static inline void pgd_free(pgd_t *pgd)
+{
+       kmem_cache_free(pgtable_cache[PGD_CACHE_NUM], pgd);
+}
+
+#ifndef CONFIG_PPC_64K_PAGES
+
+#define pgd_populate(MM, PGD, PUD)     pgd_set(PGD, PUD)
+
+static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
+{
+       return kmem_cache_alloc(pgtable_cache[PUD_CACHE_NUM],
+                               GFP_KERNEL|__GFP_REPEAT);
+}
+
+static inline void pud_free(pud_t *pud)
+{
+       kmem_cache_free(pgtable_cache[PUD_CACHE_NUM], pud);
+}
+
+static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
+{
+       pud_set(pud, (unsigned long)pmd);
+}
+
+#define pmd_populate(mm, pmd, pte_page) \
+       pmd_populate_kernel(mm, pmd, page_address(pte_page))
+#define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, (unsigned long)(pte))
+
+
+#else /* CONFIG_PPC_64K_PAGES */
+
+#define pud_populate(mm, pud, pmd)     pud_set(pud, (unsigned long)pmd)
+
+static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
+                                      pte_t *pte)
+{
+       pmd_set(pmd, (unsigned long)pte);
+}
+
+#define pmd_populate(mm, pmd, pte_page) \
+       pmd_populate_kernel(mm, pmd, page_address(pte_page))
+
+#endif /* CONFIG_PPC_64K_PAGES */
+
+static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+{
+       return kmem_cache_alloc(pgtable_cache[PMD_CACHE_NUM],
+                               GFP_KERNEL|__GFP_REPEAT);
+}
+
+static inline void pmd_free(pmd_t *pmd)
+{
+       kmem_cache_free(pgtable_cache[PMD_CACHE_NUM], pmd);
+}
+
+static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
+                                         unsigned long address)
+{
+       return kmem_cache_alloc(pgtable_cache[PTE_CACHE_NUM],
+                               GFP_KERNEL|__GFP_REPEAT);
+}
+
+static inline struct page *pte_alloc_one(struct mm_struct *mm,
+                                        unsigned long address)
+{
+       return virt_to_page(pte_alloc_one_kernel(mm, address));
+}
+               
+static inline void pte_free_kernel(pte_t *pte)
+{
+       kmem_cache_free(pgtable_cache[PTE_CACHE_NUM], pte);
+}
+
+static inline void pte_free(struct page *ptepage)
+{
+       pte_free_kernel(page_address(ptepage));
+}
+
+#define PGF_CACHENUM_MASK      0xf
+
+typedef struct pgtable_free {
+       unsigned long val;
+} pgtable_free_t;
+
+static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
+                                               unsigned long mask)
+{
+       BUG_ON(cachenum > PGF_CACHENUM_MASK);
+
+       return (pgtable_free_t){.val = ((unsigned long) p & ~mask) | cachenum};
+}
+
+static inline void pgtable_free(pgtable_free_t pgf)
+{
+       void *p = (void *)(pgf.val & ~PGF_CACHENUM_MASK);
+       int cachenum = pgf.val & PGF_CACHENUM_MASK;
+
+       kmem_cache_free(pgtable_cache[cachenum], p);
+}
+
+extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
+
+#define __pte_free_tlb(tlb, ptepage)   \
+       pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
+               PTE_CACHE_NUM, PTE_TABLE_SIZE-1))
+#define __pmd_free_tlb(tlb, pmd)       \
+       pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
+               PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
+#ifndef CONFIG_PPC_64K_PAGES
+#define __pud_free_tlb(tlb, pmd)       \
+       pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
+               PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
+#endif /* CONFIG_PPC_64K_PAGES */
+
+#define check_pgt_cache()      do { } while (0)
+
+#endif /* CONFIG_PPC64 */
+#endif /* _ASM_POWERPC_PGALLOC_H */
diff --git a/include/asm-powerpc/pgtable-4k.h b/include/asm-powerpc/pgtable-4k.h
new file mode 100644 (file)
index 0000000..e9590c0
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Entries per page directory level.  The PTE level must use a 64b record
+ * for each page table entry.  The PMD and PGD level use a 32b record for
+ * each entry by assuming that each entry is page aligned.
+ */
+#define PTE_INDEX_SIZE  9
+#define PMD_INDEX_SIZE  7
+#define PUD_INDEX_SIZE  7
+#define PGD_INDEX_SIZE  9
+
+#define PTE_TABLE_SIZE (sizeof(pte_t) << PTE_INDEX_SIZE)
+#define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE)
+#define PUD_TABLE_SIZE (sizeof(pud_t) << PUD_INDEX_SIZE)
+#define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
+
+#define PTRS_PER_PTE   (1 << PTE_INDEX_SIZE)
+#define PTRS_PER_PMD   (1 << PMD_INDEX_SIZE)
+#define PTRS_PER_PUD   (1 << PMD_INDEX_SIZE)
+#define PTRS_PER_PGD   (1 << PGD_INDEX_SIZE)
+
+/* PMD_SHIFT determines what a second-level page table entry can map */
+#define PMD_SHIFT      (PAGE_SHIFT + PTE_INDEX_SIZE)
+#define PMD_SIZE       (1UL << PMD_SHIFT)
+#define PMD_MASK       (~(PMD_SIZE-1))
+
+/* With 4k base page size, hugepage PTEs go at the PMD level */
+#define MIN_HUGEPTE_SHIFT      PMD_SHIFT
+
+/* PUD_SHIFT determines what a third-level page table entry can map */
+#define PUD_SHIFT      (PMD_SHIFT + PMD_INDEX_SIZE)
+#define PUD_SIZE       (1UL << PUD_SHIFT)
+#define PUD_MASK       (~(PUD_SIZE-1))
+
+/* PGDIR_SHIFT determines what a fourth-level page table entry can map */
+#define PGDIR_SHIFT    (PUD_SHIFT + PUD_INDEX_SIZE)
+#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
+#define PGDIR_MASK     (~(PGDIR_SIZE-1))
+
+/* PTE bits */
+#define _PAGE_SECONDARY 0x8000 /* software: HPTE is in secondary group */
+#define _PAGE_GROUP_IX  0x7000 /* software: HPTE index within group */
+#define _PAGE_F_SECOND  _PAGE_SECONDARY
+#define _PAGE_F_GIX     _PAGE_GROUP_IX
+
+/* PTE flags to conserve for HPTE identification */
+#define _PAGE_HPTEFLAGS (_PAGE_BUSY | _PAGE_HASHPTE | \
+                        _PAGE_SECONDARY | _PAGE_GROUP_IX)
+
+/* PAGE_MASK gives the right answer below, but only by accident */
+/* It should be preserving the high 48 bits and then specifically */
+/* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
+#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
+                         _PAGE_HPTEFLAGS)
+
+/* Bits to mask out from a PMD to get to the PTE page */
+#define PMD_MASKED_BITS                0
+/* Bits to mask out from a PUD to get to the PMD page */
+#define PUD_MASKED_BITS                0
+/* Bits to mask out from a PGD to get to the PUD page */
+#define PGD_MASKED_BITS                0
+
+/* shift to put page number into pte */
+#define PTE_RPN_SHIFT  (17)
+
+#define __real_pte(e,p)                ((real_pte_t)(e))
+#define __rpte_to_pte(r)       (r)
+#define __rpte_to_hidx(r,index)        (pte_val((r)) >> 12)
+
+#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift)       \
+       do {                                                             \
+               index = 0;                                               \
+               shift = mmu_psize_defs[psize].shift;                     \
+
+#define pte_iterate_hashed_end() } while(0)
+
+/*
+ * 4-level page tables related bits
+ */
+
+#define pgd_none(pgd)          (!pgd_val(pgd))
+#define pgd_bad(pgd)           (pgd_val(pgd) == 0)
+#define pgd_present(pgd)       (pgd_val(pgd) != 0)
+#define pgd_clear(pgdp)                (pgd_val(*(pgdp)) = 0)
+#define pgd_page(pgd)          (pgd_val(pgd) & ~PGD_MASKED_BITS)
+
+#define pud_offset(pgdp, addr) \
+  (((pud_t *) pgd_page(*(pgdp))) + \
+    (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)))
+
+#define pud_ERROR(e) \
+       printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pud_val(e))
diff --git a/include/asm-powerpc/pgtable-64k.h b/include/asm-powerpc/pgtable-64k.h
new file mode 100644 (file)
index 0000000..154f184
--- /dev/null
@@ -0,0 +1,90 @@
+#include <asm-generic/pgtable-nopud.h>
+
+
+#define PTE_INDEX_SIZE  12
+#define PMD_INDEX_SIZE  12
+#define PUD_INDEX_SIZE 0
+#define PGD_INDEX_SIZE  4
+
+#define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE)
+#define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE)
+#define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
+
+#define PTRS_PER_PTE   (1 << PTE_INDEX_SIZE)
+#define PTRS_PER_PMD   (1 << PMD_INDEX_SIZE)
+#define PTRS_PER_PGD   (1 << PGD_INDEX_SIZE)
+
+/* With 4k base page size, hugepage PTEs go at the PMD level */
+#define MIN_HUGEPTE_SHIFT      PAGE_SHIFT
+
+/* PMD_SHIFT determines what a second-level page table entry can map */
+#define PMD_SHIFT      (PAGE_SHIFT + PTE_INDEX_SIZE)
+#define PMD_SIZE       (1UL << PMD_SHIFT)
+#define PMD_MASK       (~(PMD_SIZE-1))
+
+/* PGDIR_SHIFT determines what a third-level page table entry can map */
+#define PGDIR_SHIFT    (PMD_SHIFT + PMD_INDEX_SIZE)
+#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
+#define PGDIR_MASK     (~(PGDIR_SIZE-1))
+
+/* Additional PTE bits (don't change without checking asm in hash_low.S) */
+#define _PAGE_HPTE_SUB 0x0ffff000 /* combo only: sub pages HPTE bits */
+#define _PAGE_HPTE_SUB0        0x08000000 /* combo only: first sub page */
+#define _PAGE_COMBO    0x10000000 /* this is a combo 4k page */
+#define _PAGE_F_SECOND  0x00008000 /* full page: hidx bits */
+#define _PAGE_F_GIX     0x00007000 /* full page: hidx bits */
+
+/* PTE flags to conserve for HPTE identification */
+#define _PAGE_HPTEFLAGS (_PAGE_BUSY | _PAGE_HASHPTE | _PAGE_HPTE_SUB |\
+                         _PAGE_COMBO)
+
+/* Shift to put page number into pte.
+ *
+ * That gives us a max RPN of 32 bits, which means a max of 48 bits
+ * of addressable physical space.
+ * We could get 3 more bits here by setting PTE_RPN_SHIFT to 29 but
+ * 32 makes PTEs more readable for debugging for now :)
+ */
+#define PTE_RPN_SHIFT  (32)
+#define PTE_RPN_MAX    (1UL << (64 - PTE_RPN_SHIFT))
+#define PTE_RPN_MASK   (~((1UL<<PTE_RPN_SHIFT)-1))
+
+/* _PAGE_CHG_MASK masks of bits that are to be preserved accross
+ * pgprot changes
+ */
+#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
+                         _PAGE_ACCESSED)
+
+/* Bits to mask out from a PMD to get to the PTE page */
+#define PMD_MASKED_BITS                0x1ff
+/* Bits to mask out from a PGD/PUD to get to the PMD page */
+#define PUD_MASKED_BITS                0x1ff
+
+#ifndef __ASSEMBLY__
+
+/* Manipulate "rpte" values */
+#define __real_pte(e,p)        ((real_pte_t) { \
+       (e), pte_val(*((p) + PTRS_PER_PTE)) })
+#define __rpte_to_hidx(r,index)        ((pte_val((r).pte) & _PAGE_COMBO) ? \
+        (((r).hidx >> ((index)<<2)) & 0xf) : ((pte_val((r).pte) >> 12) & 0xf))
+#define __rpte_to_pte(r)       ((r).pte)
+#define __rpte_sub_valid(rpte, index) \
+       (pte_val(rpte.pte) & (_PAGE_HPTE_SUB0 >> (index)))
+
+
+/* Trick: we set __end to va + 64k, which happens works for
+ * a 16M page as well as we want only one iteration
+ */
+#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift)         \
+        do {                                                                \
+                unsigned long __end = va + PAGE_SIZE;                       \
+                unsigned __split = (psize == MMU_PAGE_4K ||                 \
+                                   psize == MMU_PAGE_64K_AP);              \
+                shift = mmu_psize_defs[psize].shift;                        \
+               for (index = 0; va < __end; index++, va += (1 << shift)) {  \
+                       if (!__split || __rpte_sub_valid(rpte, index)) do { \
+
+#define pte_iterate_hashed_end() } while(0); } } while(0)
+
+
+#endif /*  __ASSEMBLY__ */
diff --git a/include/asm-powerpc/pgtable.h b/include/asm-powerpc/pgtable.h
new file mode 100644 (file)
index 0000000..0303f57
--- /dev/null
@@ -0,0 +1,524 @@
+#ifndef _ASM_POWERPC_PGTABLE_H
+#define _ASM_POWERPC_PGTABLE_H
+
+#ifndef CONFIG_PPC64
+#include <asm-ppc/pgtable.h>
+#else
+
+/*
+ * This file contains the functions and defines necessary to modify and use
+ * the ppc64 hashed page table.
+ */
+
+#ifndef __ASSEMBLY__
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <asm/processor.h>             /* For TASK_SIZE */
+#include <asm/mmu.h>
+#include <asm/page.h>
+#include <asm/tlbflush.h>
+struct mm_struct;
+#endif /* __ASSEMBLY__ */
+
+#ifdef CONFIG_PPC_64K_PAGES
+#include <asm/pgtable-64k.h>
+#else
+#include <asm/pgtable-4k.h>
+#endif
+
+#define FIRST_USER_ADDRESS     0
+
+/*
+ * Size of EA range mapped by our pagetables.
+ */
+#define PGTABLE_EADDR_SIZE (PTE_INDEX_SIZE + PMD_INDEX_SIZE + \
+                           PUD_INDEX_SIZE + PGD_INDEX_SIZE + PAGE_SHIFT)
+#define PGTABLE_RANGE (1UL << PGTABLE_EADDR_SIZE)
+
+#if TASK_SIZE_USER64 > PGTABLE_RANGE
+#error TASK_SIZE_USER64 exceeds pagetable range
+#endif
+
+#if TASK_SIZE_USER64 > (1UL << (USER_ESID_BITS + SID_SHIFT))
+#error TASK_SIZE_USER64 exceeds user VSID range
+#endif
+
+/*
+ * Define the address range of the vmalloc VM area.
+ */
+#define VMALLOC_START (0xD000000000000000ul)
+#define VMALLOC_SIZE  (0x80000000000UL)
+#define VMALLOC_END   (VMALLOC_START + VMALLOC_SIZE)
+
+/*
+ * Define the address range of the imalloc VM area.
+ */
+#define PHBS_IO_BASE   VMALLOC_END
+#define IMALLOC_BASE   (PHBS_IO_BASE + 0x80000000ul)   /* Reserve 2 gigs for PHBs */
+#define IMALLOC_END    (VMALLOC_START + PGTABLE_RANGE)
+
+/*
+ * Common bits in a linux-style PTE.  These match the bits in the
+ * (hardware-defined) PowerPC PTE as closely as possible. Additional
+ * bits may be defined in pgtable-*.h
+ */
+#define _PAGE_PRESENT  0x0001 /* software: pte contains a translation */
+#define _PAGE_USER     0x0002 /* matches one of the PP bits */
+#define _PAGE_FILE     0x0002 /* (!present only) software: pte holds file offset */
+#define _PAGE_EXEC     0x0004 /* No execute on POWER4 and newer (we invert) */
+#define _PAGE_GUARDED  0x0008
+#define _PAGE_COHERENT 0x0010 /* M: enforce memory coherence (SMP systems) */
+#define _PAGE_NO_CACHE 0x0020 /* I: cache inhibit */
+#define _PAGE_WRITETHRU        0x0040 /* W: cache write-through */
+#define _PAGE_DIRTY    0x0080 /* C: page changed */
+#define _PAGE_ACCESSED 0x0100 /* R: page referenced */
+#define _PAGE_RW       0x0200 /* software: user write access allowed */
+#define _PAGE_HASHPTE  0x0400 /* software: pte has an associated HPTE */
+#define _PAGE_BUSY     0x0800 /* software: PTE & hash are busy */ 
+
+#define _PAGE_BASE     (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT)
+
+#define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY)
+
+/* __pgprot defined in asm-powerpc/page.h */
+#define PAGE_NONE      __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED)
+
+#define PAGE_SHARED    __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER)
+#define PAGE_SHARED_X  __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER | _PAGE_EXEC)
+#define PAGE_COPY      __pgprot(_PAGE_BASE | _PAGE_USER)
+#define PAGE_COPY_X    __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
+#define PAGE_READONLY  __pgprot(_PAGE_BASE | _PAGE_USER)
+#define PAGE_READONLY_X        __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
+#define PAGE_KERNEL    __pgprot(_PAGE_BASE | _PAGE_WRENABLE)
+#define PAGE_KERNEL_CI __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \
+                              _PAGE_WRENABLE | _PAGE_NO_CACHE | _PAGE_GUARDED)
+#define PAGE_KERNEL_EXEC __pgprot(_PAGE_BASE | _PAGE_WRENABLE | _PAGE_EXEC)
+
+#define PAGE_AGP       __pgprot(_PAGE_BASE | _PAGE_WRENABLE | _PAGE_NO_CACHE)
+#define HAVE_PAGE_AGP
+
+/* PTEIDX nibble */
+#define _PTEIDX_SECONDARY      0x8
+#define _PTEIDX_GROUP_IX       0x7
+
+
+/*
+ * POWER4 and newer have per page execute protection, older chips can only
+ * do this on a segment (256MB) basis.
+ *
+ * Also, write permissions imply read permissions.
+ * This is the closest we can get..
+ *
+ * Note due to the way vm flags are laid out, the bits are XWR
+ */
+#define __P000 PAGE_NONE
+#define __P001 PAGE_READONLY
+#define __P010 PAGE_COPY
+#define __P011 PAGE_COPY
+#define __P100 PAGE_READONLY_X
+#define __P101 PAGE_READONLY_X
+#define __P110 PAGE_COPY_X
+#define __P111 PAGE_COPY_X
+
+#define __S000 PAGE_NONE
+#define __S001 PAGE_READONLY
+#define __S010 PAGE_SHARED
+#define __S011 PAGE_SHARED
+#define __S100 PAGE_READONLY_X
+#define __S101 PAGE_READONLY_X
+#define __S110 PAGE_SHARED_X
+#define __S111 PAGE_SHARED_X
+
+#ifndef __ASSEMBLY__
+
+/*
+ * ZERO_PAGE is a global shared page that is always zero: used
+ * for zero-mapped memory areas etc..
+ */
+extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
+#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
+#endif /* __ASSEMBLY__ */
+
+#ifdef CONFIG_HUGETLB_PAGE
+
+#define HAVE_ARCH_UNMAPPED_AREA
+#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
+
+#endif
+
+#ifndef __ASSEMBLY__
+
+/*
+ * Conversion functions: convert a page and protection to a page entry,
+ * and a page entry and page directory to the page they refer to.
+ *
+ * mk_pte takes a (struct page *) as input
+ */
+#define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
+
+static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot)
+{
+       pte_t pte;
+
+
+       pte_val(pte) = (pfn << PTE_RPN_SHIFT) | pgprot_val(pgprot);
+       return pte;
+}
+
+#define pte_modify(_pte, newprot) \
+  (__pte((pte_val(_pte) & _PAGE_CHG_MASK) | pgprot_val(newprot)))
+
+#define pte_none(pte)          ((pte_val(pte) & ~_PAGE_HPTEFLAGS) == 0)
+#define pte_present(pte)       (pte_val(pte) & _PAGE_PRESENT)
+
+/* pte_clear moved to later in this file */
+
+#define pte_pfn(x)             ((unsigned long)((pte_val(x)>>PTE_RPN_SHIFT)))
+#define pte_page(x)            pfn_to_page(pte_pfn(x))
+
+#define pmd_set(pmdp, pmdval)  (pmd_val(*(pmdp)) = (pmdval))
+#define pmd_none(pmd)          (!pmd_val(pmd))
+#define        pmd_bad(pmd)            (pmd_val(pmd) == 0)
+#define        pmd_present(pmd)        (pmd_val(pmd) != 0)
+#define        pmd_clear(pmdp)         (pmd_val(*(pmdp)) = 0)
+#define pmd_page_kernel(pmd)   (pmd_val(pmd) & ~PMD_MASKED_BITS)
+#define pmd_page(pmd)          virt_to_page(pmd_page_kernel(pmd))
+
+#define pud_set(pudp, pudval)  (pud_val(*(pudp)) = (pudval))
+#define pud_none(pud)          (!pud_val(pud))
+#define pud_bad(pud)           ((pud_val(pud)) == 0)
+#define pud_present(pud)       (pud_val(pud) != 0)
+#define pud_clear(pudp)                (pud_val(*(pudp)) = 0)
+#define pud_page(pud)          (pud_val(pud) & ~PUD_MASKED_BITS)
+
+#define pgd_set(pgdp, pudp)    ({pgd_val(*(pgdp)) = (unsigned long)(pudp);})
+
+/* 
+ * Find an entry in a page-table-directory.  We combine the address region 
+ * (the high order N bits) and the pgd portion of the address.
+ */
+/* to avoid overflow in free_pgtables we don't use PTRS_PER_PGD here */
+#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & 0x1ff)
+
+#define pgd_offset(mm, address)         ((mm)->pgd + pgd_index(address))
+
+#define pmd_offset(pudp,addr) \
+  (((pmd_t *) pud_page(*(pudp))) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
+
+#define pte_offset_kernel(dir,addr) \
+  (((pte_t *) pmd_page_kernel(*(dir))) + (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
+
+#define pte_offset_map(dir,addr)       pte_offset_kernel((dir), (addr))
+#define pte_offset_map_nested(dir,addr)        pte_offset_kernel((dir), (addr))
+#define pte_unmap(pte)                 do { } while(0)
+#define pte_unmap_nested(pte)          do { } while(0)
+
+/* to find an entry in a kernel page-table-directory */
+/* This now only contains the vmalloc pages */
+#define pgd_offset_k(address) pgd_offset(&init_mm, address)
+
+/*
+ * The following only work if pte_present() is true.
+ * Undefined behaviour if not..
+ */
+static inline int pte_read(pte_t pte)  { return pte_val(pte) & _PAGE_USER;}
+static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW;}
+static inline int pte_exec(pte_t pte)  { return pte_val(pte) & _PAGE_EXEC;}
+static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY;}
+static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED;}
+static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE;}
+
+static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
+static inline void pte_cache(pte_t pte)   { pte_val(pte) &= ~_PAGE_NO_CACHE; }
+
+static inline pte_t pte_rdprotect(pte_t pte) {
+       pte_val(pte) &= ~_PAGE_USER; return pte; }
+static inline pte_t pte_exprotect(pte_t pte) {
+       pte_val(pte) &= ~_PAGE_EXEC; return pte; }
+static inline pte_t pte_wrprotect(pte_t pte) {
+       pte_val(pte) &= ~(_PAGE_RW); return pte; }
+static inline pte_t pte_mkclean(pte_t pte) {
+       pte_val(pte) &= ~(_PAGE_DIRTY); return pte; }
+static inline pte_t pte_mkold(pte_t pte) {
+       pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
+static inline pte_t pte_mkread(pte_t pte) {
+       pte_val(pte) |= _PAGE_USER; return pte; }
+static inline pte_t pte_mkexec(pte_t pte) {
+       pte_val(pte) |= _PAGE_USER | _PAGE_EXEC; return pte; }
+static inline pte_t pte_mkwrite(pte_t pte) {
+       pte_val(pte) |= _PAGE_RW; return pte; }
+static inline pte_t pte_mkdirty(pte_t pte) {
+       pte_val(pte) |= _PAGE_DIRTY; return pte; }
+static inline pte_t pte_mkyoung(pte_t pte) {
+       pte_val(pte) |= _PAGE_ACCESSED; return pte; }
+static inline pte_t pte_mkhuge(pte_t pte) {
+       return pte; }
+
+/* Atomic PTE updates */
+static inline unsigned long pte_update(pte_t *p, unsigned long clr)
+{
+       unsigned long old, tmp;
+
+       __asm__ __volatile__(
+       "1:     ldarx   %0,0,%3         # pte_update\n\
+       andi.   %1,%0,%6\n\
+       bne-    1b \n\
+       andc    %1,%0,%4 \n\
+       stdcx.  %1,0,%3 \n\
+       bne-    1b"
+       : "=&r" (old), "=&r" (tmp), "=m" (*p)
+       : "r" (p), "r" (clr), "m" (*p), "i" (_PAGE_BUSY)
+       : "cc" );
+       return old;
+}
+
+/* PTE updating functions, this function puts the PTE in the
+ * batch, doesn't actually triggers the hash flush immediately,
+ * you need to call flush_tlb_pending() to do that.
+ * Pass -1 for "normal" size (4K or 64K)
+ */
+extern void hpte_update(struct mm_struct *mm, unsigned long addr,
+                       pte_t *ptep, unsigned long pte, int huge);
+
+static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
+                                             unsigned long addr, pte_t *ptep)
+{
+       unsigned long old;
+
+               if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0)
+               return 0;
+       old = pte_update(ptep, _PAGE_ACCESSED);
+       if (old & _PAGE_HASHPTE) {
+               hpte_update(mm, addr, ptep, old, 0);
+               flush_tlb_pending();
+       }
+       return (old & _PAGE_ACCESSED) != 0;
+}
+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
+#define ptep_test_and_clear_young(__vma, __addr, __ptep)                  \
+({                                                                        \
+       int __r;                                                           \
+       __r = __ptep_test_and_clear_young((__vma)->vm_mm, __addr, __ptep); \
+       __r;                                                               \
+})
+
+/*
+ * On RW/DIRTY bit transitions we can avoid flushing the hpte. For the
+ * moment we always flush but we need to fix hpte_update and test if the
+ * optimisation is worth it.
+ */
+static inline int __ptep_test_and_clear_dirty(struct mm_struct *mm,
+                                             unsigned long addr, pte_t *ptep)
+{
+       unsigned long old;
+
+               if ((pte_val(*ptep) & _PAGE_DIRTY) == 0)
+               return 0;
+       old = pte_update(ptep, _PAGE_DIRTY);
+       if (old & _PAGE_HASHPTE)
+               hpte_update(mm, addr, ptep, old, 0);
+       return (old & _PAGE_DIRTY) != 0;
+}
+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
+#define ptep_test_and_clear_dirty(__vma, __addr, __ptep)                  \
+({                                                                        \
+       int __r;                                                           \
+       __r = __ptep_test_and_clear_dirty((__vma)->vm_mm, __addr, __ptep); \
+       __r;                                                               \
+})
+
+#define __HAVE_ARCH_PTEP_SET_WRPROTECT
+static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
+                                     pte_t *ptep)
+{
+       unsigned long old;
+
+               if ((pte_val(*ptep) & _PAGE_RW) == 0)
+                       return;
+       old = pte_update(ptep, _PAGE_RW);
+       if (old & _PAGE_HASHPTE)
+               hpte_update(mm, addr, ptep, old, 0);
+}
+
+/*
+ * We currently remove entries from the hashtable regardless of whether
+ * the entry was young or dirty. The generic routines only flush if the
+ * entry was young or dirty which is not good enough.
+ *
+ * We should be more intelligent about this but for the moment we override
+ * these functions and force a tlb flush unconditionally
+ */
+#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
+#define ptep_clear_flush_young(__vma, __address, __ptep)               \
+({                                                                     \
+       int __young = __ptep_test_and_clear_young((__vma)->vm_mm, __address, \
+                                                 __ptep);              \
+       __young;                                                        \
+})
+
+#define __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH
+#define ptep_clear_flush_dirty(__vma, __address, __ptep)               \
+({                                                                     \
+       int __dirty = __ptep_test_and_clear_dirty((__vma)->vm_mm, __address, \
+                                                 __ptep);              \
+       flush_tlb_page(__vma, __address);                               \
+       __dirty;                                                        \
+})
+
+#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
+static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
+                                      unsigned long addr, pte_t *ptep)
+{
+       unsigned long old = pte_update(ptep, ~0UL);
+
+       if (old & _PAGE_HASHPTE)
+               hpte_update(mm, addr, ptep, old, 0);
+       return __pte(old);
+}
+
+static inline void pte_clear(struct mm_struct *mm, unsigned long addr,
+                            pte_t * ptep)
+{
+       unsigned long old = pte_update(ptep, ~0UL);
+
+       if (old & _PAGE_HASHPTE)
+               hpte_update(mm, addr, ptep, old, 0);
+}
+
+/*
+ * set_pte stores a linux PTE into the linux page table.
+ */
+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
+                             pte_t *ptep, pte_t pte)
+{
+       if (pte_present(*ptep)) {
+               pte_clear(mm, addr, ptep);
+               flush_tlb_pending();
+       }
+       pte = __pte(pte_val(pte) & ~_PAGE_HPTEFLAGS);
+
+#ifdef CONFIG_PPC_64K_PAGES
+       if (mmu_virtual_psize != MMU_PAGE_64K)
+               pte = __pte(pte_val(pte) | _PAGE_COMBO);
+#endif /* CONFIG_PPC_64K_PAGES */
+
+       *ptep = pte;
+}
+
+/* Set the dirty and/or accessed bits atomically in a linux PTE, this
+ * function doesn't need to flush the hash entry
+ */
+#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
+static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry, int dirty)
+{
+       unsigned long bits = pte_val(entry) &
+               (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
+       unsigned long old, tmp;
+
+       __asm__ __volatile__(
+       "1:     ldarx   %0,0,%4\n\
+               andi.   %1,%0,%6\n\
+               bne-    1b \n\
+               or      %0,%3,%0\n\
+               stdcx.  %0,0,%4\n\
+               bne-    1b"
+       :"=&r" (old), "=&r" (tmp), "=m" (*ptep)
+       :"r" (bits), "r" (ptep), "m" (*ptep), "i" (_PAGE_BUSY)
+       :"cc");
+}
+#define  ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
+       do {                                                               \
+               __ptep_set_access_flags(__ptep, __entry, __dirty);         \
+               flush_tlb_page_nohash(__vma, __address);                   \
+       } while(0)
+
+/*
+ * Macro to mark a page protection value as "uncacheable".
+ */
+#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_NO_CACHE | _PAGE_GUARDED))
+
+struct file;
+extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
+                                    unsigned long size, pgprot_t vma_prot);
+#define __HAVE_PHYS_MEM_ACCESS_PROT
+
+#define __HAVE_ARCH_PTE_SAME
+#define pte_same(A,B)  (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HPTEFLAGS) == 0)
+
+#define pte_ERROR(e) \
+       printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
+#define pmd_ERROR(e) \
+       printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
+#define pgd_ERROR(e) \
+       printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
+
+extern pgd_t swapper_pg_dir[];
+
+extern void paging_init(void);
+
+#ifdef CONFIG_HUGETLB_PAGE
+#define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) \
+       free_pgd_range(tlb, addr, end, floor, ceiling)
+#endif
+
+/*
+ * This gets called at the end of handling a page fault, when
+ * the kernel has put a new PTE into the page table for the process.
+ * We use it to put a corresponding HPTE into the hash table
+ * ahead of time, instead of waiting for the inevitable extra
+ * hash-table miss exception.
+ */
+struct vm_area_struct;
+extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
+
+/* Encode and de-code a swap entry */
+#define __swp_type(entry)      (((entry).val >> 1) & 0x3f)
+#define __swp_offset(entry)    ((entry).val >> 8)
+#define __swp_entry(type, offset) ((swp_entry_t){((type)<< 1)|((offset)<<8)})
+#define __pte_to_swp_entry(pte)        ((swp_entry_t){pte_val(pte) >> PTE_RPN_SHIFT})
+#define __swp_entry_to_pte(x)  ((pte_t) { (x).val << PTE_RPN_SHIFT })
+#define pte_to_pgoff(pte)      (pte_val(pte) >> PTE_RPN_SHIFT)
+#define pgoff_to_pte(off)      ((pte_t) {((off) << PTE_RPN_SHIFT)|_PAGE_FILE})
+#define PTE_FILE_MAX_BITS      (BITS_PER_LONG - PTE_RPN_SHIFT)
+
+/*
+ * kern_addr_valid is intended to indicate whether an address is a valid
+ * kernel address.  Most 32-bit archs define it as always true (like this)
+ * but most 64-bit archs actually perform a test.  What should we do here?
+ * The only use is in fs/ncpfs/dir.c
+ */
+#define kern_addr_valid(addr)  (1)
+
+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)                \
+               remap_pfn_range(vma, vaddr, pfn, size, prot)
+
+void pgtable_cache_init(void);
+
+/*
+ * find_linux_pte returns the address of a linux pte for a given 
+ * effective address and directory.  If not found, it returns zero.
+ */static inline pte_t *find_linux_pte(pgd_t *pgdir, unsigned long ea)
+{
+       pgd_t *pg;
+       pud_t *pu;
+       pmd_t *pm;
+       pte_t *pt = NULL;
+
+       pg = pgdir + pgd_index(ea);
+       if (!pgd_none(*pg)) {
+               pu = pud_offset(pg, ea);
+               if (!pud_none(*pu)) {
+                       pm = pmd_offset(pu, ea);
+                       if (pmd_present(*pm))
+                               pt = pte_offset_kernel(pm, ea);
+               }
+       }
+       return pt;
+}
+
+#include <asm-generic/pgtable.h>
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* CONFIG_PPC64 */
+#endif /* _ASM_POWERPC_PGTABLE_H */
index 2e36e5a7f4f351b1dc8b4de02411ad6445857bb1..36cdc869e580146d573d5daf070f36b63028365b 100644 (file)
@@ -48,8 +48,6 @@ extern void pSeries_final_fixup(void);
 extern void pSeries_irq_bus_setup(struct pci_bus *bus);
 
 extern unsigned long pci_probe_only;
-extern unsigned long pci_assign_all_buses;
-extern int pci_read_irq_line(struct pci_dev *pci_dev);
 
 /* ---- EEH internal-use-only related routines ---- */
 #ifdef CONFIG_EEH
diff --git a/include/asm-powerpc/spinlock.h b/include/asm-powerpc/spinlock.h
new file mode 100644 (file)
index 0000000..caa4b14
--- /dev/null
@@ -0,0 +1,269 @@
+#ifndef __ASM_SPINLOCK_H
+#define __ASM_SPINLOCK_H
+
+/*
+ * Simple spin lock operations.  
+ *
+ * Copyright (C) 2001-2004 Paul Mackerras <paulus@au.ibm.com>, IBM
+ * Copyright (C) 2001 Anton Blanchard <anton@au.ibm.com>, IBM
+ * Copyright (C) 2002 Dave Engebretsen <engebret@us.ibm.com>, IBM
+ *     Rework to support virtual processors
+ *
+ * Type of int is used as a full 64b word is not necessary.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * (the type definitions are in asm/spinlock_types.h)
+ */
+#ifdef CONFIG_PPC64
+#include <asm/paca.h>
+#include <asm/hvcall.h>
+#include <asm/iseries/hv_call.h>
+#endif
+#include <asm/asm-compat.h>
+#include <asm/synch.h>
+
+#define __raw_spin_is_locked(x)                ((x)->slock != 0)
+
+#ifdef CONFIG_PPC64
+/* use 0x800000yy when locked, where yy == CPU number */
+#define LOCK_TOKEN     (*(u32 *)(&get_paca()->lock_token))
+#else
+#define LOCK_TOKEN     1
+#endif
+
+/*
+ * This returns the old value in the lock, so we succeeded
+ * in getting the lock if the return value is 0.
+ */
+static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock)
+{
+       unsigned long tmp, token;
+
+       token = LOCK_TOKEN;
+       __asm__ __volatile__(
+"1:    lwarx           %0,0,%2         # __spin_trylock\n\
+       cmpwi           0,%0,0\n\
+       bne-            2f\n\
+       stwcx.          %1,0,%2\n\
+       bne-            1b\n\
+       isync\n\
+2:"    : "=&r" (tmp)
+       : "r" (token), "r" (&lock->slock)
+       : "cr0", "memory");
+
+       return tmp;
+}
+
+static int __inline__ __raw_spin_trylock(raw_spinlock_t *lock)
+{
+       return __spin_trylock(lock) == 0;
+}
+
+/*
+ * On a system with shared processors (that is, where a physical
+ * processor is multiplexed between several virtual processors),
+ * there is no point spinning on a lock if the holder of the lock
+ * isn't currently scheduled on a physical processor.  Instead
+ * we detect this situation and ask the hypervisor to give the
+ * rest of our timeslice to the lock holder.
+ *
+ * So that we can tell which virtual processor is holding a lock,
+ * we put 0x80000000 | smp_processor_id() in the lock when it is
+ * held.  Conveniently, we have a word in the paca that holds this
+ * value.
+ */
+
+#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
+/* We only yield to the hypervisor if we are in shared processor mode */
+#define SHARED_PROCESSOR (get_paca()->lppaca.shared_proc)
+extern void __spin_yield(raw_spinlock_t *lock);
+extern void __rw_yield(raw_rwlock_t *lock);
+#else /* SPLPAR || ISERIES */
+#define __spin_yield(x)        barrier()
+#define __rw_yield(x)  barrier()
+#define SHARED_PROCESSOR       0
+#endif
+
+static void __inline__ __raw_spin_lock(raw_spinlock_t *lock)
+{
+       while (1) {
+               if (likely(__spin_trylock(lock) == 0))
+                       break;
+               do {
+                       HMT_low();
+                       if (SHARED_PROCESSOR)
+                               __spin_yield(lock);
+               } while (unlikely(lock->slock != 0));
+               HMT_medium();
+       }
+}
+
+static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
+{
+       unsigned long flags_dis;
+
+       while (1) {
+               if (likely(__spin_trylock(lock) == 0))
+                       break;
+               local_save_flags(flags_dis);
+               local_irq_restore(flags);
+               do {
+                       HMT_low();
+                       if (SHARED_PROCESSOR)
+                               __spin_yield(lock);
+               } while (unlikely(lock->slock != 0));
+               HMT_medium();
+               local_irq_restore(flags_dis);
+       }
+}
+
+static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock)
+{
+       __asm__ __volatile__(SYNC_ON_SMP"       # __raw_spin_unlock"
+                            : : :"memory");
+       lock->slock = 0;
+}
+
+#ifdef CONFIG_PPC64
+extern void __raw_spin_unlock_wait(raw_spinlock_t *lock);
+#else
+#define __raw_spin_unlock_wait(lock) \
+       do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
+#endif
+
+/*
+ * Read-write spinlocks, allowing multiple readers
+ * but only one writer.
+ *
+ * NOTE! it is quite common to have readers in interrupts
+ * but no interrupt writers. For those circumstances we
+ * can "mix" irq-safe locks - any writer needs to get a
+ * irq-safe write-lock, but readers can get non-irqsafe
+ * read-locks.
+ */
+
+#define __raw_read_can_lock(rw)                ((rw)->lock >= 0)
+#define __raw_write_can_lock(rw)       (!(rw)->lock)
+
+#ifdef CONFIG_PPC64
+#define __DO_SIGN_EXTEND       "extsw  %0,%0\n"
+#define WRLOCK_TOKEN           LOCK_TOKEN      /* it's negative */
+#else
+#define __DO_SIGN_EXTEND
+#define WRLOCK_TOKEN           (-1)
+#endif
+
+/*
+ * This returns the old value in the lock + 1,
+ * so we got a read lock if the return value is > 0.
+ */
+static long __inline__ __read_trylock(raw_rwlock_t *rw)
+{
+       long tmp;
+
+       __asm__ __volatile__(
+"1:    lwarx           %0,0,%1         # read_trylock\n"
+       __DO_SIGN_EXTEND
+"      addic.          %0,%0,1\n\
+       ble-            2f\n"
+       PPC405_ERR77(0,%1)
+"      stwcx.          %0,0,%1\n\
+       bne-            1b\n\
+       isync\n\
+2:"    : "=&r" (tmp)
+       : "r" (&rw->lock)
+       : "cr0", "xer", "memory");
+
+       return tmp;
+}
+
+/*
+ * This returns the old value in the lock,
+ * so we got the write lock if the return value is 0.
+ */
+static __inline__ long __write_trylock(raw_rwlock_t *rw)
+{
+       long tmp, token;
+
+       token = WRLOCK_TOKEN;
+       __asm__ __volatile__(
+"1:    lwarx           %0,0,%2 # write_trylock\n\
+       cmpwi           0,%0,0\n\
+       bne-            2f\n"
+       PPC405_ERR77(0,%1)
+"      stwcx.          %1,0,%2\n\
+       bne-            1b\n\
+       isync\n\
+2:"    : "=&r" (tmp)
+       : "r" (token), "r" (&rw->lock)
+       : "cr0", "memory");
+
+       return tmp;
+}
+
+static void __inline__ __raw_read_lock(raw_rwlock_t *rw)
+{
+       while (1) {
+               if (likely(__read_trylock(rw) > 0))
+                       break;
+               do {
+                       HMT_low();
+                       if (SHARED_PROCESSOR)
+                               __rw_yield(rw);
+               } while (unlikely(rw->lock < 0));
+               HMT_medium();
+       }
+}
+
+static void __inline__ __raw_write_lock(raw_rwlock_t *rw)
+{
+       while (1) {
+               if (likely(__write_trylock(rw) == 0))
+                       break;
+               do {
+                       HMT_low();
+                       if (SHARED_PROCESSOR)
+                               __rw_yield(rw);
+               } while (unlikely(rw->lock != 0));
+               HMT_medium();
+       }
+}
+
+static int __inline__ __raw_read_trylock(raw_rwlock_t *rw)
+{
+       return __read_trylock(rw) > 0;
+}
+
+static int __inline__ __raw_write_trylock(raw_rwlock_t *rw)
+{
+       return __write_trylock(rw) == 0;
+}
+
+static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
+{
+       long tmp;
+
+       __asm__ __volatile__(
+       "eieio                          # read_unlock\n\
+1:     lwarx           %0,0,%1\n\
+       addic           %0,%0,-1\n"
+       PPC405_ERR77(0,%1)
+"      stwcx.          %0,0,%1\n\
+       bne-            1b"
+       : "=&r"(tmp)
+       : "r"(&rw->lock)
+       : "cr0", "memory");
+}
+
+static __inline__ void __raw_write_unlock(raw_rwlock_t *rw)
+{
+       __asm__ __volatile__(SYNC_ON_SMP"       # write_unlock"
+                            : : :"memory");
+       rw->lock = 0;
+}
+
+#endif /* __ASM_SPINLOCK_H */
index d099d5200f9bbb7ffea65a29535300289c7d84b9..980a094fd5a7201c488b26d577efa49f31e33dac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
  * Rewrite, cleanup:
- * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
+ * Copyright (C) 2004 Olof Johansson <olof@lixom.net>, 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
diff --git a/include/asm-ppc/dma-mapping.h b/include/asm-ppc/dma-mapping.h
deleted file mode 100644 (file)
index 6e96351..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * This is based on both include/asm-sh/dma-mapping.h and
- * include/asm-ppc/pci.h
- */
-#ifndef __ASM_PPC_DMA_MAPPING_H
-#define __ASM_PPC_DMA_MAPPING_H
-
-#include <linux/config.h>
-/* need struct page definitions */
-#include <linux/mm.h>
-#include <asm/scatterlist.h>
-#include <asm/io.h>
-
-#ifdef CONFIG_NOT_COHERENT_CACHE
-/*
- * DMA-consistent mapping functions for PowerPCs that don't support
- * cache snooping.  These allocate/free a region of uncached mapped
- * memory space for use with DMA devices.  Alternatively, you could
- * allocate the space "normally" and use the cache management functions
- * to ensure it is consistent.
- */
-extern void *__dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp);
-extern void __dma_free_coherent(size_t size, void *vaddr);
-extern void __dma_sync(void *vaddr, size_t size, int direction);
-extern void __dma_sync_page(struct page *page, unsigned long offset,
-                                size_t size, int direction);
-#define dma_cache_inv(_start,_size) \
-       invalidate_dcache_range(_start, (_start + _size))
-#define dma_cache_wback(_start,_size) \
-       clean_dcache_range(_start, (_start + _size))
-#define dma_cache_wback_inv(_start,_size) \
-       flush_dcache_range(_start, (_start + _size))
-
-#else /* ! CONFIG_NOT_COHERENT_CACHE */
-/*
- * Cache coherent cores.
- */
-
-#define dma_cache_inv(_start,_size)            do { } while (0)
-#define dma_cache_wback(_start,_size)          do { } while (0)
-#define dma_cache_wback_inv(_start,_size)      do { } while (0)
-
-#define __dma_alloc_coherent(gfp, size, handle)        NULL
-#define __dma_free_coherent(size, addr)                do { } while (0)
-#define __dma_sync(addr, size, rw)             do { } while (0)
-#define __dma_sync_page(pg, off, sz, rw)       do { } while (0)
-
-#endif /* ! CONFIG_NOT_COHERENT_CACHE */
-
-#define dma_supported(dev, mask)       (1)
-
-static inline int dma_set_mask(struct device *dev, u64 dma_mask)
-{
-       if (!dev->dma_mask || !dma_supported(dev, mask))
-               return -EIO;
-
-       *dev->dma_mask = dma_mask;
-
-       return 0;
-}
-
-static inline void *dma_alloc_coherent(struct device *dev, size_t size,
-                                      dma_addr_t * dma_handle,
-                                      gfp_t gfp)
-{
-#ifdef CONFIG_NOT_COHERENT_CACHE
-       return __dma_alloc_coherent(size, dma_handle, gfp);
-#else
-       void *ret;
-       /* ignore region specifiers */
-       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-
-       if (dev == NULL || dev->coherent_dma_mask < 0xffffffff)
-               gfp |= GFP_DMA;
-
-       ret = (void *)__get_free_pages(gfp, get_order(size));
-
-       if (ret != NULL) {
-               memset(ret, 0, size);
-               *dma_handle = virt_to_bus(ret);
-       }
-
-       return ret;
-#endif
-}
-
-static inline void
-dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-                 dma_addr_t dma_handle)
-{
-#ifdef CONFIG_NOT_COHERENT_CACHE
-       __dma_free_coherent(size, vaddr);
-#else
-       free_pages((unsigned long)vaddr, get_order(size));
-#endif
-}
-
-static inline dma_addr_t
-dma_map_single(struct device *dev, void *ptr, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       __dma_sync(ptr, size, direction);
-
-       return virt_to_bus(ptr);
-}
-
-/* We do nothing. */
-#define dma_unmap_single(dev, addr, size, dir) do { } while (0)
-
-static inline dma_addr_t
-dma_map_page(struct device *dev, struct page *page,
-            unsigned long offset, size_t size,
-            enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       __dma_sync_page(page, offset, size, direction);
-
-       return page_to_bus(page) + offset;
-}
-
-/* We do nothing. */
-#define dma_unmap_page(dev, handle, size, dir) do { } while (0)
-
-static inline int
-dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-          enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       for (i = 0; i < nents; i++, sg++) {
-               BUG_ON(!sg->page);
-               __dma_sync_page(sg->page, sg->offset, sg->length, direction);
-               sg->dma_address = page_to_bus(sg->page) + sg->offset;
-       }
-
-       return nents;
-}
-
-/* We don't do anything here. */
-#define dma_unmap_sg(dev, sg, nents, dir)      do { } while (0)
-
-static inline void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                       size_t size,
-                       enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       __dma_sync(bus_to_virt(dma_handle), size, direction);
-}
-
-static inline void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
-                       size_t size,
-                       enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       __dma_sync(bus_to_virt(dma_handle), size, direction);
-}
-
-static inline void
-dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents,
-                   enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       for (i = 0; i < nents; i++, sg++)
-               __dma_sync_page(sg->page, sg->offset, sg->length, direction);
-}
-
-static inline void
-dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
-                   enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       for (i = 0; i < nents; i++, sg++)
-               __dma_sync_page(sg->page, sg->offset, sg->length, direction);
-}
-
-#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
-#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
-#ifdef CONFIG_NOT_COHERENT_CACHE
-#define dma_is_consistent(d)   (0)
-#else
-#define dma_is_consistent(d)   (1)
-#endif
-
-static inline int dma_get_cache_alignment(void)
-{
-       /*
-        * Each processor family will define its own L1_CACHE_SHIFT,
-        * L1_CACHE_BYTES wraps to this, so this is always safe.
-        */
-       return L1_CACHE_BYTES;
-}
-
-static inline void
-dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                             unsigned long offset, size_t size,
-                             enum dma_data_direction direction)
-{
-       /* just sync everything for now */
-       dma_sync_single_for_cpu(dev, dma_handle, offset + size, direction);
-}
-
-static inline void
-dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-                                unsigned long offset, size_t size,
-                                enum dma_data_direction direction)
-{
-       /* just sync everything for now */
-       dma_sync_single_for_device(dev, dma_handle, offset + size, direction);
-}
-
-static inline void dma_cache_sync(void *vaddr, size_t size,
-                                 enum dma_data_direction direction)
-{
-       __dma_sync(vaddr, size, (int)direction);
-}
-
-static inline int dma_mapping_error(dma_addr_t dma_addr)
-{
-       return 0;
-}
-
-#endif                         /* __ASM_PPC_DMA_MAPPING_H */
index 2bfdf9c98459e9ee28d98ccb90c3e638f0bc69be..84ac6e258eef723750fd0b7351ee249f5b3bbbee 100644 (file)
@@ -545,6 +545,23 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
 #include <asm/mpc8260_pci9.h>
 #endif
 
+#ifdef CONFIG_NOT_COHERENT_CACHE
+
+#define dma_cache_inv(_start,_size) \
+       invalidate_dcache_range(_start, (_start + _size))
+#define dma_cache_wback(_start,_size) \
+       clean_dcache_range(_start, (_start + _size))
+#define dma_cache_wback_inv(_start,_size) \
+       flush_dcache_range(_start, (_start + _size))
+
+#else
+
+#define dma_cache_inv(_start,_size)            do { } while (0)
+#define dma_cache_wback(_start,_size)          do { } while (0)
+#define dma_cache_wback_inv(_start,_size)      do { } while (0)
+
+#endif
+
 /*
  * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  * access
index a415001165fabd74f1d53f3c1c5dcbc07674ef7c..46a086fff81629e95d3efad1bc585ed346119702 100644 (file)
@@ -33,9 +33,6 @@
 
 #define MAX_PPC4xx_DMA_CHANNELS                4
 
-/* in arch/ppc/kernel/setup.c -- Cort */
-extern unsigned long DMA_MODE_WRITE, DMA_MODE_READ;
-
 /*
  * Function return status codes
  * These values are used to indicate whether or not the function
diff --git a/include/asm-ppc64/dma-mapping.h b/include/asm-ppc64/dma-mapping.h
deleted file mode 100644 (file)
index fb68fa2..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Copyright (C) 2004 IBM
- *
- * Implements the generic device dma API for ppc64. Handles
- * the pci and vio busses
- */
-
-#ifndef _ASM_DMA_MAPPING_H
-#define _ASM_DMA_MAPPING_H
-
-#include <linux/types.h>
-#include <linux/cache.h>
-/* need struct page definitions */
-#include <linux/mm.h>
-#include <asm/scatterlist.h>
-#include <asm/bug.h>
-
-#define DMA_ERROR_CODE         (~(dma_addr_t)0x0)
-
-extern int dma_supported(struct device *dev, u64 mask);
-extern int dma_set_mask(struct device *dev, u64 dma_mask);
-extern void *dma_alloc_coherent(struct device *dev, size_t size,
-               dma_addr_t *dma_handle, gfp_t flag);
-extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
-               dma_addr_t dma_handle);
-extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
-               size_t size, enum dma_data_direction direction);
-extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
-               size_t size, enum dma_data_direction direction);
-extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
-               unsigned long offset, size_t size,
-               enum dma_data_direction direction);
-extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
-               size_t size, enum dma_data_direction direction);
-extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-               enum dma_data_direction direction);
-extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
-               int nhwentries, enum dma_data_direction direction);
-
-static inline void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-                       enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-static inline void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-                          enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-static inline void
-dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-                   enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-static inline void
-dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-                      enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-static inline int dma_mapping_error(dma_addr_t dma_addr)
-{
-       return (dma_addr == DMA_ERROR_CODE);
-}
-
-/* Now for the API extensions over the pci_ one */
-
-#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
-#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
-#define dma_is_consistent(d)   (1)
-
-static inline int
-dma_get_cache_alignment(void)
-{
-       /* no easy way to get cache size on all processors, so return
-        * the maximum possible, to be safe */
-       return (1 << L1_CACHE_SHIFT_MAX);
-}
-
-static inline void
-dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                             unsigned long offset, size_t size,
-                             enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-static inline void
-dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-                                unsigned long offset, size_t size,
-                                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-static inline void
-dma_cache_sync(void *vaddr, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-       /* nothing to do */
-}
-
-/*
- * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO
- */
-struct dma_mapping_ops {
-       void *          (*alloc_coherent)(struct device *dev, size_t size,
-                               dma_addr_t *dma_handle, gfp_t flag);
-       void            (*free_coherent)(struct device *dev, size_t size,
-                               void *vaddr, dma_addr_t dma_handle);
-       dma_addr_t      (*map_single)(struct device *dev, void *ptr,
-                               size_t size, enum dma_data_direction direction);
-       void            (*unmap_single)(struct device *dev, dma_addr_t dma_addr,
-                               size_t size, enum dma_data_direction direction);
-       int             (*map_sg)(struct device *dev, struct scatterlist *sg,
-                               int nents, enum dma_data_direction direction);
-       void            (*unmap_sg)(struct device *dev, struct scatterlist *sg,
-                               int nents, enum dma_data_direction direction);
-       int             (*dma_supported)(struct device *dev, u64 mask);
-       int             (*dac_dma_supported)(struct device *dev, u64 mask);
-};
-
-#endif /* _ASM_DMA_MAPPING_H */
diff --git a/include/asm-ppc64/imalloc.h b/include/asm-ppc64/imalloc.h
deleted file mode 100644 (file)
index 42adf70..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef _PPC64_IMALLOC_H
-#define _PPC64_IMALLOC_H
-
-/*
- * Define the address range of the imalloc VM area.
- */
-#define PHBS_IO_BASE     VMALLOC_END
-#define IMALLOC_BASE      (PHBS_IO_BASE + 0x80000000ul)        /* Reserve 2 gigs for PHBs */
-#define IMALLOC_END       (VMALLOC_START + PGTABLE_RANGE)
-
-
-/* imalloc region types */
-#define IM_REGION_UNUSED       0x1
-#define IM_REGION_SUBSET       0x2
-#define IM_REGION_EXISTS       0x4
-#define IM_REGION_OVERLAP      0x8
-#define IM_REGION_SUPERSET     0x10
-
-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);
-extern void im_free(void *addr);
-
-extern unsigned long ioremap_bot;
-
-#endif /* _PPC64_IMALLOC_H */
diff --git a/include/asm-ppc64/io.h b/include/asm-ppc64/io.h
deleted file mode 100644 (file)
index 77fc07c..0000000
+++ /dev/null
@@ -1,458 +0,0 @@
-#ifndef _PPC64_IO_H
-#define _PPC64_IO_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/config.h>
-#include <linux/compiler.h>
-#include <asm/page.h>
-#include <asm/byteorder.h>
-#ifdef CONFIG_PPC_ISERIES 
-#include <asm/iseries/iseries_io.h>
-#endif  
-#include <asm/synch.h>
-#include <asm/delay.h>
-
-#include <asm-generic/iomap.h>
-
-#define __ide_mm_insw(p, a, c) _insw_ns((volatile u16 __iomem *)(p), (a), (c))
-#define __ide_mm_insl(p, a, c) _insl_ns((volatile u32 __iomem *)(p), (a), (c))
-#define __ide_mm_outsw(p, a, c) _outsw_ns((volatile u16 __iomem *)(p), (a), (c))
-#define __ide_mm_outsl(p, a, c) _outsl_ns((volatile u32 __iomem *)(p), (a), (c))
-
-
-#define SIO_CONFIG_RA  0x398
-#define SIO_CONFIG_RD  0x399
-
-#define SLOW_DOWN_IO
-
-extern unsigned long isa_io_base;
-extern unsigned long pci_io_base;
-extern unsigned long io_page_mask;
-
-#define MAX_ISA_PORT 0x10000
-
-#define _IO_IS_VALID(port) ((port) >= MAX_ISA_PORT || (1 << (port>>PAGE_SHIFT)) \
-                           & io_page_mask)
-
-#ifdef CONFIG_PPC_ISERIES
-/* __raw_* accessors aren't supported on iSeries */
-#define __raw_readb(addr)      { BUG(); 0; }
-#define __raw_readw(addr)       { BUG(); 0; }
-#define __raw_readl(addr)       { BUG(); 0; }
-#define __raw_readq(addr)       { BUG(); 0; }
-#define __raw_writeb(v, addr)   { BUG(); 0; }
-#define __raw_writew(v, addr)   { BUG(); 0; }
-#define __raw_writel(v, addr)   { BUG(); 0; }
-#define __raw_writeq(v, addr)   { BUG(); 0; }
-#define readb(addr)            iSeries_Read_Byte(addr)
-#define readw(addr)            iSeries_Read_Word(addr)
-#define readl(addr)            iSeries_Read_Long(addr)
-#define writeb(data, addr)     iSeries_Write_Byte((data),(addr))
-#define writew(data, addr)     iSeries_Write_Word((data),(addr))
-#define writel(data, addr)     iSeries_Write_Long((data),(addr))
-#define memset_io(a,b,c)       iSeries_memset_io((a),(b),(c))
-#define memcpy_fromio(a,b,c)   iSeries_memcpy_fromio((a), (b), (c))
-#define memcpy_toio(a,b,c)     iSeries_memcpy_toio((a), (b), (c))
-
-#define inb(addr)              readb(((void __iomem *)(long)(addr)))
-#define inw(addr)              readw(((void __iomem *)(long)(addr)))
-#define inl(addr)              readl(((void __iomem *)(long)(addr)))
-#define outb(data,addr)                writeb(data,((void __iomem *)(long)(addr)))
-#define outw(data,addr)                writew(data,((void __iomem *)(long)(addr)))
-#define outl(data,addr)                writel(data,((void __iomem *)(long)(addr)))
-/*
- * The *_ns versions below don't do byte-swapping.
- * Neither do the standard versions now, these are just here
- * for older code.
- */
-#define insw_ns(port, buf, ns) _insw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
-#define insl_ns(port, buf, nl) _insl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
-#else
-
-static inline unsigned char __raw_readb(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned char __force *)addr;
-}
-static inline unsigned short __raw_readw(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned short __force *)addr;
-}
-static inline unsigned int __raw_readl(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned int __force *)addr;
-}
-static inline unsigned long __raw_readq(const volatile void __iomem *addr)
-{
-       return *(volatile unsigned long __force *)addr;
-}
-static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr)
-{
-       *(volatile unsigned char __force *)addr = v;
-}
-static inline void __raw_writew(unsigned short v, volatile void __iomem *addr)
-{
-       *(volatile unsigned short __force *)addr = v;
-}
-static inline void __raw_writel(unsigned int v, volatile void __iomem *addr)
-{
-       *(volatile unsigned int __force *)addr = v;
-}
-static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
-{
-       *(volatile unsigned long __force *)addr = v;
-}
-#define readb(addr)            eeh_readb(addr)
-#define readw(addr)            eeh_readw(addr)
-#define readl(addr)            eeh_readl(addr)
-#define readq(addr)            eeh_readq(addr)
-#define writeb(data, addr)     eeh_writeb((data), (addr))
-#define writew(data, addr)     eeh_writew((data), (addr))
-#define writel(data, addr)     eeh_writel((data), (addr))
-#define writeq(data, addr)     eeh_writeq((data), (addr))
-#define memset_io(a,b,c)       eeh_memset_io((a),(b),(c))
-#define memcpy_fromio(a,b,c)   eeh_memcpy_fromio((a),(b),(c))
-#define memcpy_toio(a,b,c)     eeh_memcpy_toio((a),(b),(c))
-#define inb(port)              eeh_inb((unsigned long)port)
-#define outb(val, port)                eeh_outb(val, (unsigned long)port)
-#define inw(port)              eeh_inw((unsigned long)port)
-#define outw(val, port)                eeh_outw(val, (unsigned long)port)
-#define inl(port)              eeh_inl((unsigned long)port)
-#define outl(val, port)                eeh_outl(val, (unsigned long)port)
-
-/*
- * The insw/outsw/insl/outsl macros don't do byte-swapping.
- * They are only used in practice for transferring buffers which
- * are arrays of bytes, and byte-swapping is not appropriate in
- * that case.  - paulus */
-#define insb(port, buf, ns)    eeh_insb((port), (buf), (ns))
-#define insw(port, buf, ns)    eeh_insw_ns((port), (buf), (ns))
-#define insl(port, buf, nl)    eeh_insl_ns((port), (buf), (nl))
-#define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns))
-#define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl))
-
-#define outsb(port, buf, ns)  _outsb((u8 __iomem *)((port)+pci_io_base), (buf), (ns))
-#define outsw(port, buf, ns)  _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
-#define outsl(port, buf, nl)  _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
-
-#endif
-
-#define readb_relaxed(addr) readb(addr)
-#define readw_relaxed(addr) readw(addr)
-#define readl_relaxed(addr) readl(addr)
-#define readq_relaxed(addr) readq(addr)
-
-extern void _insb(volatile u8 __iomem *port, void *buf, int ns);
-extern void _outsb(volatile u8 __iomem *port, const void *buf, int ns);
-extern void _insw(volatile u16 __iomem *port, void *buf, int ns);
-extern void _outsw(volatile u16 __iomem *port, const void *buf, int ns);
-extern void _insl(volatile u32 __iomem *port, void *buf, int nl);
-extern void _outsl(volatile u32 __iomem *port, const void *buf, int nl);
-extern void _insw_ns(volatile u16 __iomem *port, void *buf, int ns);
-extern void _outsw_ns(volatile u16 __iomem *port, const void *buf, int ns);
-extern void _insl_ns(volatile u32 __iomem *port, void *buf, int nl);
-extern void _outsl_ns(volatile u32 __iomem *port, const void *buf, int nl);
-
-#define mmiowb()
-
-/*
- * output pause versions need a delay at least for the
- * w83c105 ide controller in a p610.
- */
-#define inb_p(port)             inb(port)
-#define outb_p(val, port)       (udelay(1), outb((val), (port)))
-#define inw_p(port)             inw(port)
-#define outw_p(val, port)       (udelay(1), outw((val), (port)))
-#define inl_p(port)             inl(port)
-#define outl_p(val, port)       (udelay(1), outl((val), (port)))
-
-/*
- * The *_ns versions below don't do byte-swapping.
- * Neither do the standard versions now, these are just here
- * for older code.
- */
-#define outsw_ns(port, buf, ns)        _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
-#define outsl_ns(port, buf, nl)        _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
-
-
-#define IO_SPACE_LIMIT ~(0UL)
-
-
-#ifdef __KERNEL__
-extern int __ioremap_explicit(unsigned long p_addr, unsigned long v_addr,
-                             unsigned long size, unsigned long flags);
-extern void __iomem *__ioremap(unsigned long address, unsigned long size,
-                      unsigned long flags);
-
-/**
- * ioremap     -   map bus memory into CPU space
- * @address:   bus address of the memory
- * @size:      size of the resource to map
- *
- * ioremap performs a platform specific sequence of operations to
- * make bus memory CPU accessible via the readb/readw/readl/writeb/
- * writew/writel functions and the other mmio helpers. The returned
- * address is not guaranteed to be usable directly as a virtual
- * address.
- */
-extern void __iomem *ioremap(unsigned long address, unsigned long size);
-
-#define ioremap_nocache(addr, size)    ioremap((addr), (size))
-extern int iounmap_explicit(volatile void __iomem *addr, unsigned long size);
-extern void iounmap(volatile void __iomem *addr);
-extern void __iomem * reserve_phb_iospace(unsigned long size);
-
-/**
- *     virt_to_phys    -       map virtual addresses to physical
- *     @address: address to remap
- *
- *     The returned physical address is the physical (CPU) mapping for
- *     the memory address given. It is only valid to use this function on
- *     addresses directly mapped or allocated via kmalloc.
- *
- *     This function does not give bus mappings for DMA transfers. In
- *     almost all conceivable cases a device driver should not be using
- *     this function
- */
-static inline unsigned long virt_to_phys(volatile void * address)
-{
-       return __pa((unsigned long)address);
-}
-
-/**
- *     phys_to_virt    -       map physical address to virtual
- *     @address: address to remap
- *
- *     The returned virtual address is a current CPU mapping for
- *     the memory address given. It is only valid to use this function on
- *     addresses that have a kernel mapping
- *
- *     This function does not handle bus mappings for DMA transfers. In
- *     almost all conceivable cases a device driver should not be using
- *     this function
- */
-static inline void * phys_to_virt(unsigned long address)
-{
-       return (void *)__va(address);
-}
-
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
-
-/* We do NOT want virtual merging, it would put too much pressure on
- * our iommu allocator. Instead, we want drivers to be smart enough
- * to coalesce sglists that happen to have been mapped in a contiguous
- * way by the iommu
- */
-#define BIO_VMERGE_BOUNDARY    0
-
-#endif /* __KERNEL__ */
-
-static inline void iosync(void)
-{
-        __asm__ __volatile__ ("sync" : : : "memory");
-}
-
-/* Enforce in-order execution of data I/O. 
- * No distinction between read/write on PPC; use eieio for all three.
- */
-#define iobarrier_rw() eieio()
-#define iobarrier_r()  eieio()
-#define iobarrier_w()  eieio()
-
-/*
- * 8, 16 and 32 bit, big and little endian I/O operations, with barrier.
- * These routines do not perform EEH-related I/O address translation,
- * and should not be used directly by device drivers.  Use inb/readb
- * instead.
- */
-static inline int in_8(const volatile unsigned char __iomem *addr)
-{
-       int ret;
-
-       __asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
-                            : "=r" (ret) : "m" (*addr));
-       return ret;
-}
-
-static inline void out_8(volatile unsigned char __iomem *addr, int val)
-{
-       __asm__ __volatile__("stb%U0%X0 %1,%0; sync"
-                            : "=m" (*addr) : "r" (val));
-}
-
-static inline int in_le16(const volatile unsigned short __iomem *addr)
-{
-       int ret;
-
-       __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
-                            : "=r" (ret) : "r" (addr), "m" (*addr));
-       return ret;
-}
-
-static inline int in_be16(const volatile unsigned short __iomem *addr)
-{
-       int ret;
-
-       __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
-                            : "=r" (ret) : "m" (*addr));
-       return ret;
-}
-
-static inline void out_le16(volatile unsigned short __iomem *addr, int val)
-{
-       __asm__ __volatile__("sthbrx %1,0,%2; sync"
-                            : "=m" (*addr) : "r" (val), "r" (addr));
-}
-
-static inline void out_be16(volatile unsigned short __iomem *addr, int val)
-{
-       __asm__ __volatile__("sth%U0%X0 %1,%0; sync"
-                            : "=m" (*addr) : "r" (val));
-}
-
-static inline unsigned in_le32(const volatile unsigned __iomem *addr)
-{
-       unsigned ret;
-
-       __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
-                            : "=r" (ret) : "r" (addr), "m" (*addr));
-       return ret;
-}
-
-static inline unsigned in_be32(const volatile unsigned __iomem *addr)
-{
-       unsigned ret;
-
-       __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
-                            : "=r" (ret) : "m" (*addr));
-       return ret;
-}
-
-static inline void out_le32(volatile unsigned __iomem *addr, int val)
-{
-       __asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
-                            : "r" (val), "r" (addr));
-}
-
-static inline void out_be32(volatile unsigned __iomem *addr, int val)
-{
-       __asm__ __volatile__("stw%U0%X0 %1,%0; sync"
-                            : "=m" (*addr) : "r" (val));
-}
-
-static inline unsigned long in_le64(const volatile unsigned long __iomem *addr)
-{
-       unsigned long tmp, ret;
-
-       __asm__ __volatile__(
-                            "ld %1,0(%2)\n"
-                            "twi 0,%1,0\n"
-                            "isync\n"
-                            "rldimi %0,%1,5*8,1*8\n"
-                            "rldimi %0,%1,3*8,2*8\n"
-                            "rldimi %0,%1,1*8,3*8\n"
-                            "rldimi %0,%1,7*8,4*8\n"
-                            "rldicl %1,%1,32,0\n"
-                            "rlwimi %0,%1,8,8,31\n"
-                            "rlwimi %0,%1,24,16,23\n"
-                            : "=r" (ret) , "=r" (tmp) : "b" (addr) , "m" (*addr));
-       return ret;
-}
-
-static inline unsigned long in_be64(const volatile unsigned long __iomem *addr)
-{
-       unsigned long ret;
-
-       __asm__ __volatile__("ld%U1%X1 %0,%1; twi 0,%0,0; isync"
-                            : "=r" (ret) : "m" (*addr));
-       return ret;
-}
-
-static inline void out_le64(volatile unsigned long __iomem *addr, unsigned long val)
-{
-       unsigned long tmp;
-
-       __asm__ __volatile__(
-                            "rldimi %0,%1,5*8,1*8\n"
-                            "rldimi %0,%1,3*8,2*8\n"
-                            "rldimi %0,%1,1*8,3*8\n"
-                            "rldimi %0,%1,7*8,4*8\n"
-                            "rldicl %1,%1,32,0\n"
-                            "rlwimi %0,%1,8,8,31\n"
-                            "rlwimi %0,%1,24,16,23\n"
-                            "std %0,0(%3)\n"
-                            "sync"
-                            : "=&r" (tmp) , "=&r" (val) : "1" (val) , "b" (addr) , "m" (*addr));
-}
-
-static inline void out_be64(volatile unsigned long __iomem *addr, unsigned long val)
-{
-       __asm__ __volatile__("std%U0%X0 %1,%0; sync" : "=m" (*addr) : "r" (val));
-}
-
-#ifndef CONFIG_PPC_ISERIES 
-#include <asm/eeh.h>
-#endif
-
-#ifdef __KERNEL__
-
-/**
- *     check_signature         -       find BIOS signatures
- *     @io_addr: mmio address to check
- *     @signature:  signature block
- *     @length: length of signature
- *
- *     Perform a signature comparison with the mmio address io_addr. This
- *     address should have been obtained by ioremap.
- *     Returns 1 on a match.
- */
-static inline int check_signature(const volatile void __iomem * io_addr,
-       const unsigned char *signature, int length)
-{
-       int retval = 0;
-#ifndef CONFIG_PPC_ISERIES 
-       do {
-               if (readb(io_addr) != *signature)
-                       goto out;
-               io_addr++;
-               signature++;
-               length--;
-       } while (length);
-       retval = 1;
-out:
-#endif
-       return retval;
-}
-
-/* Nothing to do */
-
-#define dma_cache_inv(_start,_size)            do { } while (0)
-#define dma_cache_wback(_start,_size)          do { } while (0)
-#define dma_cache_wback_inv(_start,_size)      do { } while (0)
-
-/* Check of existence of legacy devices */
-extern int check_legacy_ioport(unsigned long base_port);
-
-
-/*
- * Convert a physical pointer to a virtual kernel pointer for /dev/mem
- * access
- */
-#define xlate_dev_mem_ptr(p)   __va(p)
-
-/*
- * Convert a virtual cached pointer to an uncached pointer
- */
-#define xlate_dev_kmem_ptr(p)  p
-
-#endif /* __KERNEL__ */
-
-#endif /* _PPC64_IO_H */
diff --git a/include/asm-ppc64/mmu.h b/include/asm-ppc64/mmu.h
deleted file mode 100644 (file)
index 1a7e0af..0000000
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * PowerPC memory management structures
- *
- * Dave Engebretsen & Mike Corrigan <{engebret|mikejc}@us.ibm.com>
- *   PPC64 rework.
- *
- * 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 _PPC64_MMU_H_
-#define _PPC64_MMU_H_
-
-#include <linux/config.h>
-#include <asm/asm-compat.h>
-#include <asm/page.h>
-
-/*
- * Segment table
- */
-
-#define STE_ESID_V     0x80
-#define STE_ESID_KS    0x20
-#define STE_ESID_KP    0x10
-#define STE_ESID_N     0x08
-
-#define STE_VSID_SHIFT 12
-
-/* Location of cpu0's segment table */
-#define STAB0_PAGE     0x6
-#define STAB0_PHYS_ADDR        (STAB0_PAGE<<12)
-
-#ifndef __ASSEMBLY__
-extern char initial_stab[];
-#endif /* ! __ASSEMBLY */
-
-/*
- * SLB
- */
-
-#define SLB_NUM_BOLTED         3
-#define SLB_CACHE_ENTRIES      8
-
-/* Bits in the SLB ESID word */
-#define SLB_ESID_V             ASM_CONST(0x0000000008000000) /* valid */
-
-/* Bits in the SLB VSID word */
-#define SLB_VSID_SHIFT         12
-#define SLB_VSID_B             ASM_CONST(0xc000000000000000)
-#define SLB_VSID_B_256M                ASM_CONST(0x0000000000000000)
-#define SLB_VSID_B_1T          ASM_CONST(0x4000000000000000)
-#define SLB_VSID_KS            ASM_CONST(0x0000000000000800)
-#define SLB_VSID_KP            ASM_CONST(0x0000000000000400)
-#define SLB_VSID_N             ASM_CONST(0x0000000000000200) /* no-execute */
-#define SLB_VSID_L             ASM_CONST(0x0000000000000100)
-#define SLB_VSID_C             ASM_CONST(0x0000000000000080) /* class */
-#define SLB_VSID_LP            ASM_CONST(0x0000000000000030)
-#define SLB_VSID_LP_00         ASM_CONST(0x0000000000000000)
-#define SLB_VSID_LP_01         ASM_CONST(0x0000000000000010)
-#define SLB_VSID_LP_10         ASM_CONST(0x0000000000000020)
-#define SLB_VSID_LP_11         ASM_CONST(0x0000000000000030)
-#define SLB_VSID_LLP           (SLB_VSID_L|SLB_VSID_LP)
-
-#define SLB_VSID_KERNEL                (SLB_VSID_KP)
-#define SLB_VSID_USER          (SLB_VSID_KP|SLB_VSID_KS|SLB_VSID_C)
-
-#define SLBIE_C                        (0x08000000)
-
-/*
- * Hash table
- */
-
-#define HPTES_PER_GROUP 8
-
-#define HPTE_V_AVPN_SHIFT      7
-#define HPTE_V_AVPN            ASM_CONST(0xffffffffffffff80)
-#define HPTE_V_AVPN_VAL(x)     (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
-#define HPTE_V_COMPARE(x,y)    (!(((x) ^ (y)) & HPTE_V_AVPN))
-#define HPTE_V_BOLTED          ASM_CONST(0x0000000000000010)
-#define HPTE_V_LOCK            ASM_CONST(0x0000000000000008)
-#define HPTE_V_LARGE           ASM_CONST(0x0000000000000004)
-#define HPTE_V_SECONDARY       ASM_CONST(0x0000000000000002)
-#define HPTE_V_VALID           ASM_CONST(0x0000000000000001)
-
-#define HPTE_R_PP0             ASM_CONST(0x8000000000000000)
-#define HPTE_R_TS              ASM_CONST(0x4000000000000000)
-#define HPTE_R_RPN_SHIFT       12
-#define HPTE_R_RPN             ASM_CONST(0x3ffffffffffff000)
-#define HPTE_R_FLAGS           ASM_CONST(0x00000000000003ff)
-#define HPTE_R_PP              ASM_CONST(0x0000000000000003)
-#define HPTE_R_N               ASM_CONST(0x0000000000000004)
-
-/* Values for PP (assumes Ks=0, Kp=1) */
-/* pp0 will always be 0 for linux     */
-#define PP_RWXX        0       /* Supervisor read/write, User none */
-#define PP_RWRX 1      /* Supervisor read/write, User read */
-#define PP_RWRW 2      /* Supervisor read/write, User read/write */
-#define PP_RXRX 3      /* Supervisor read,       User read */
-
-#ifndef __ASSEMBLY__
-
-typedef struct {
-       unsigned long v;
-       unsigned long r;
-} hpte_t;
-
-extern hpte_t *htab_address;
-extern unsigned long htab_hash_mask;
-
-/*
- * Page size definition
- *
- *    shift : is the "PAGE_SHIFT" value for that page size
- *    sllp  : is a bit mask with the value of SLB L || LP to be or'ed
- *            directly to a slbmte "vsid" value
- *    penc  : is the HPTE encoding mask for the "LP" field:
- *
- */
-struct mmu_psize_def
-{
-       unsigned int    shift;  /* number of bits */
-       unsigned int    penc;   /* HPTE encoding */
-       unsigned int    tlbiel; /* tlbiel supported for that page size */
-       unsigned long   avpnm;  /* bits to mask out in AVPN in the HPTE */
-       unsigned long   sllp;   /* SLB L||LP (exact mask to use in slbmte) */
-};
-
-#endif /* __ASSEMBLY__ */
-
-/*
- * The kernel use the constants below to index in the page sizes array.
- * The use of fixed constants for this purpose is better for performances
- * of the low level hash refill handlers.
- *
- * A non supported page size has a "shift" field set to 0
- *
- * Any new page size being implemented can get a new entry in here. Whether
- * the kernel will use it or not is a different matter though. The actual page
- * size used by hugetlbfs is not defined here and may be made variable
- */
-
-#define MMU_PAGE_4K            0       /* 4K */
-#define MMU_PAGE_64K           1       /* 64K */
-#define MMU_PAGE_64K_AP                2       /* 64K Admixed (in a 4K segment) */
-#define MMU_PAGE_1M            3       /* 1M */
-#define MMU_PAGE_16M           4       /* 16M */
-#define MMU_PAGE_16G           5       /* 16G */
-#define MMU_PAGE_COUNT         6
-
-#ifndef __ASSEMBLY__
-
-/*
- * The current system page sizes
- */
-extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
-extern int mmu_linear_psize;
-extern int mmu_virtual_psize;
-
-#ifdef CONFIG_HUGETLB_PAGE
-/*
- * The page size index of the huge pages for use by hugetlbfs
- */
-extern int mmu_huge_psize;
-
-#endif /* CONFIG_HUGETLB_PAGE */
-
-/*
- * This function sets the AVPN and L fields of the HPTE  appropriately
- * for the page size
- */
-static inline unsigned long hpte_encode_v(unsigned long va, int psize)
-{
-       unsigned long v =
-       v = (va >> 23) & ~(mmu_psize_defs[psize].avpnm);
-       v <<= HPTE_V_AVPN_SHIFT;
-       if (psize != MMU_PAGE_4K)
-               v |= HPTE_V_LARGE;
-       return v;
-}
-
-/*
- * This function sets the ARPN, and LP fields of the HPTE appropriately
- * for the page size. We assume the pa is already "clean" that is properly
- * aligned for the requested page size
- */
-static inline unsigned long hpte_encode_r(unsigned long pa, int psize)
-{
-       unsigned long r;
-
-       /* A 4K page needs no special encoding */
-       if (psize == MMU_PAGE_4K)
-               return pa & HPTE_R_RPN;
-       else {
-               unsigned int penc = mmu_psize_defs[psize].penc;
-               unsigned int shift = mmu_psize_defs[psize].shift;
-               return (pa & ~((1ul << shift) - 1)) | (penc << 12);
-       }
-       return r;
-}
-
-/*
- * This hashes a virtual address for a 256Mb segment only for now
- */
-
-static inline unsigned long hpt_hash(unsigned long va, unsigned int shift)
-{
-       return ((va >> 28) & 0x7fffffffffUL) ^ ((va & 0x0fffffffUL) >> shift);
-}
-
-extern int __hash_page_4K(unsigned long ea, unsigned long access,
-                         unsigned long vsid, pte_t *ptep, unsigned long trap,
-                         unsigned int local);
-extern int __hash_page_64K(unsigned long ea, unsigned long access,
-                          unsigned long vsid, pte_t *ptep, unsigned long trap,
-                          unsigned int local);
-struct mm_struct;
-extern int hash_huge_page(struct mm_struct *mm, unsigned long access,
-                         unsigned long ea, unsigned long vsid, int local);
-
-extern void htab_finish_init(void);
-extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
-                            unsigned long pstart, unsigned long mode,
-                            int psize);
-
-extern void htab_initialize(void);
-extern void htab_initialize_secondary(void);
-extern void hpte_init_native(void);
-extern void hpte_init_lpar(void);
-extern void hpte_init_iSeries(void);
-extern void mm_init_ppc64(void);
-
-extern long pSeries_lpar_hpte_insert(unsigned long hpte_group,
-                                    unsigned long va, unsigned long prpn,
-                                    unsigned long rflags,
-                                    unsigned long vflags, int psize);
-
-extern long native_hpte_insert(unsigned long hpte_group,
-                              unsigned long va, unsigned long prpn,
-                              unsigned long rflags,
-                              unsigned long vflags, int psize);
-
-extern long iSeries_hpte_insert(unsigned long hpte_group,
-                               unsigned long va, unsigned long prpn,
-                               unsigned long rflags,
-                               unsigned long vflags, int psize);
-
-extern void stabs_alloc(void);
-extern void slb_initialize(void);
-extern void stab_initialize(unsigned long stab);
-
-#endif /* __ASSEMBLY__ */
-
-/*
- * VSID allocation
- *
- * We first generate a 36-bit "proto-VSID".  For kernel addresses this
- * is equal to the ESID, for user addresses it is:
- *     (context << 15) | (esid & 0x7fff)
- *
- * The two forms are distinguishable because the top bit is 0 for user
- * addresses, whereas the top two bits are 1 for kernel addresses.
- * Proto-VSIDs with the top two bits equal to 0b10 are reserved for
- * now.
- *
- * The proto-VSIDs are then scrambled into real VSIDs with the
- * multiplicative hash:
- *
- *     VSID = (proto-VSID * VSID_MULTIPLIER) % VSID_MODULUS
- *     where   VSID_MULTIPLIER = 268435399 = 0xFFFFFC7
- *             VSID_MODULUS = 2^36-1 = 0xFFFFFFFFF
- *
- * This scramble is only well defined for proto-VSIDs below
- * 0xFFFFFFFFF, so both proto-VSID and actual VSID 0xFFFFFFFFF are
- * reserved.  VSID_MULTIPLIER is prime, so in particular it is
- * co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
- * Because the modulus is 2^n-1 we can compute it efficiently without
- * a divide or extra multiply (see below).
- *
- * This scheme has several advantages over older methods:
- *
- *     - We have VSIDs allocated for every kernel address
- * (i.e. everything above 0xC000000000000000), except the very top
- * segment, which simplifies several things.
- *
- *     - We allow for 15 significant bits of ESID and 20 bits of
- * context for user addresses.  i.e. 8T (43 bits) of address space for
- * up to 1M contexts (although the page table structure and context
- * allocation will need changes to take advantage of this).
- *
- *     - The scramble function gives robust scattering in the hash
- * table (at least based on some initial results).  The previous
- * method was more susceptible to pathological cases giving excessive
- * hash collisions.
- */
-/*
- * WARNING - If you change these you must make sure the asm
- * implementations in slb_allocate (slb_low.S), do_stab_bolted
- * (head.S) and ASM_VSID_SCRAMBLE (below) are changed accordingly.
- *
- * You'll also need to change the precomputed VSID values in head.S
- * which are used by the iSeries firmware.
- */
-
-#define VSID_MULTIPLIER        ASM_CONST(200730139)    /* 28-bit prime */
-#define VSID_BITS      36
-#define VSID_MODULUS   ((1UL<<VSID_BITS)-1)
-
-#define CONTEXT_BITS   19
-#define USER_ESID_BITS 16
-
-#define USER_VSID_RANGE        (1UL << (USER_ESID_BITS + SID_SHIFT))
-
-/*
- * This macro generates asm code to compute the VSID scramble
- * function.  Used in slb_allocate() and do_stab_bolted.  The function
- * computed is: (protovsid*VSID_MULTIPLIER) % VSID_MODULUS
- *
- *     rt = register continaing the proto-VSID and into which the
- *             VSID will be stored
- *     rx = scratch register (clobbered)
- *
- *     - rt and rx must be different registers
- *     - The answer will end up in the low 36 bits of rt.  The higher
- *       bits may contain other garbage, so you may need to mask the
- *       result.
- */
-#define ASM_VSID_SCRAMBLE(rt, rx)      \
-       lis     rx,VSID_MULTIPLIER@h;                                   \
-       ori     rx,rx,VSID_MULTIPLIER@l;                                \
-       mulld   rt,rt,rx;               /* rt = rt * MULTIPLIER */      \
-                                                                       \
-       srdi    rx,rt,VSID_BITS;                                        \
-       clrldi  rt,rt,(64-VSID_BITS);                                   \
-       add     rt,rt,rx;               /* add high and low bits */     \
-       /* Now, r3 == VSID (mod 2^36-1), and lies between 0 and         \
-        * 2^36-1+2^28-1.  That in particular means that if r3 >=       \
-        * 2^36-1, then r3+1 has the 2^36 bit set.  So, if r3+1 has     \
-        * the bit clear, r3 already has the answer we want, if it      \
-        * doesn't, the answer is the low 36 bits of r3+1.  So in all   \
-        * cases the answer is the low 36 bits of (r3 + ((r3+1) >> 36))*/\
-       addi    rx,rt,1;                                                \
-       srdi    rx,rx,VSID_BITS;        /* extract 2^36 bit */          \
-       add     rt,rt,rx
-
-
-#ifndef __ASSEMBLY__
-
-typedef unsigned long mm_context_id_t;
-
-typedef struct {
-       mm_context_id_t id;
-#ifdef CONFIG_HUGETLB_PAGE
-       u16 low_htlb_areas, high_htlb_areas;
-#endif
-} mm_context_t;
-
-
-static inline unsigned long vsid_scramble(unsigned long protovsid)
-{
-#if 0
-       /* The code below is equivalent to this function for arguments
-        * < 2^VSID_BITS, which is all this should ever be called
-        * with.  However gcc is not clever enough to compute the
-        * modulus (2^n-1) without a second multiply. */
-       return ((protovsid * VSID_MULTIPLIER) % VSID_MODULUS);
-#else /* 1 */
-       unsigned long x;
-
-       x = protovsid * VSID_MULTIPLIER;
-       x = (x >> VSID_BITS) + (x & VSID_MODULUS);
-       return (x + ((x+1) >> VSID_BITS)) & VSID_MODULUS;
-#endif /* 1 */
-}
-
-/* This is only valid for addresses >= KERNELBASE */
-static inline unsigned long get_kernel_vsid(unsigned long ea)
-{
-       return vsid_scramble(ea >> SID_SHIFT);
-}
-
-/* This is only valid for user addresses (which are below 2^41) */
-static inline unsigned long get_vsid(unsigned long context, unsigned long ea)
-{
-       return vsid_scramble((context << USER_ESID_BITS)
-                            | (ea >> SID_SHIFT));
-}
-
-#define VSID_SCRAMBLE(pvsid)   (((pvsid) * VSID_MULTIPLIER) % VSID_MODULUS)
-#define KERNEL_VSID(ea)                VSID_SCRAMBLE(GET_ESID(ea))
-
-#endif /* __ASSEMBLY */
-
-#endif /* _PPC64_MMU_H_ */
diff --git a/include/asm-ppc64/mmu_context.h b/include/asm-ppc64/mmu_context.h
deleted file mode 100644 (file)
index 4f512e9..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef __PPC64_MMU_CONTEXT_H
-#define __PPC64_MMU_CONTEXT_H
-
-#include <linux/config.h>
-#include <linux/kernel.h>      
-#include <linux/mm.h>  
-#include <asm/mmu.h>   
-#include <asm/cputable.h>
-
-/*
- * Copyright (C) 2001 PPC 64 Team, 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.
- */
-
-/*
- * Getting into a kernel thread, there is no valid user segment, mark
- * paca->pgdir NULL so that SLB miss on user addresses will fault
- */
-static inline void enter_lazy_tlb(struct mm_struct *mm,
-                                 struct task_struct *tsk)
-{
-#ifdef CONFIG_PPC_64K_PAGES
-       get_paca()->pgdir = NULL;
-#endif /* CONFIG_PPC_64K_PAGES */
-}
-
-#define NO_CONTEXT     0
-#define MAX_CONTEXT    (0x100000-1)
-
-extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
-extern void destroy_context(struct mm_struct *mm);
-
-extern void switch_stab(struct task_struct *tsk, struct mm_struct *mm);
-extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm);
-
-/*
- * switch_mm is the entry point called from the architecture independent
- * code in kernel/sched.c
- */
-static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
-                            struct task_struct *tsk)
-{
-       if (!cpu_isset(smp_processor_id(), next->cpu_vm_mask))
-               cpu_set(smp_processor_id(), next->cpu_vm_mask);
-
-       /* No need to flush userspace segments if the mm doesnt change */
-#ifdef CONFIG_PPC_64K_PAGES
-       if (prev == next && get_paca()->pgdir == next->pgd)
-               return;
-#else
-       if (prev == next)
-               return;
-#endif /* CONFIG_PPC_64K_PAGES */
-
-#ifdef CONFIG_ALTIVEC
-       if (cpu_has_feature(CPU_FTR_ALTIVEC))
-               asm volatile ("dssall");
-#endif /* CONFIG_ALTIVEC */
-
-       if (cpu_has_feature(CPU_FTR_SLB))
-               switch_slb(tsk, next);
-       else
-               switch_stab(tsk, next);
-}
-
-#define deactivate_mm(tsk,mm)  do { } while (0)
-
-/*
- * After we have set current->mm to a new value, this activates
- * the context for the new mm so we see the new mappings.
- */
-static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
-{
-       unsigned long flags;
-
-       local_irq_save(flags);
-       switch_mm(prev, next, current);
-       local_irq_restore(flags);
-}
-
-#endif /* __PPC64_MMU_CONTEXT_H */
diff --git a/include/asm-ppc64/mmzone.h b/include/asm-ppc64/mmzone.h
deleted file mode 100644 (file)
index 54958d6..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
- *
- * PowerPC64 port:
- * Copyright (C) 2002 Anton Blanchard, IBM Corp.
- */
-#ifndef _ASM_MMZONE_H_
-#define _ASM_MMZONE_H_
-
-#include <linux/config.h>
-
-/*
- * generic non-linear memory support:
- *
- * 1) we will not split memory into more chunks than will fit into the
- *    flags field of the struct page
- */
-
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-
-extern struct pglist_data *node_data[];
-/*
- * Return a pointer to the node data for node n.
- */
-#define NODE_DATA(nid)         (node_data[nid])
-
-/*
- * Following are specific to this numa platform.
- */
-
-extern int numa_cpu_lookup_table[];
-extern cpumask_t numa_cpumask_lookup_table[];
-#ifdef CONFIG_MEMORY_HOTPLUG
-extern unsigned long max_pfn;
-#endif
-
-/*
- * Following are macros that each numa implmentation must define.
- */
-
-#define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
-#define node_end_pfn(nid)      (NODE_DATA(nid)->node_end_pfn)
-
-#endif /* CONFIG_NEED_MULTIPLE_NODES */
-
-#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
-extern int __init early_pfn_to_nid(unsigned long pfn);
-#endif
-
-#endif /* _ASM_MMZONE_H_ */
diff --git a/include/asm-ppc64/pci-bridge.h b/include/asm-ppc64/pci-bridge.h
deleted file mode 100644 (file)
index cf04327..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-#ifdef __KERNEL__
-#ifndef _ASM_PCI_BRIDGE_H
-#define _ASM_PCI_BRIDGE_H
-
-#include <linux/config.h>
-#include <linux/pci.h>
-#include <linux/list.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.
- */
-
-/*
- * Structure of a PCI controller (host bridge)
- */
-struct pci_controller {
-       struct pci_bus *bus;
-       char is_dynamic;
-       void *arch_data;
-       struct list_head list_node;
-
-       int first_busno;
-       int last_busno;
-
-       void __iomem *io_base_virt;
-       unsigned long io_base_phys;
-
-       /* Some machines have a non 1:1 mapping of
-        * the PCI memory space in the CPU bus space
-        */
-       unsigned long pci_mem_offset;
-       unsigned long pci_io_size;
-
-       struct pci_ops *ops;
-       volatile unsigned int __iomem *cfg_addr;
-       volatile void __iomem *cfg_data;
-
-       /* Currently, we limit ourselves to 1 IO range and 3 mem
-        * ranges since the common pci_bus structure can't handle more
-        */
-       struct resource io_resource;
-       struct resource mem_resources[3];
-       int global_number;              
-       int local_number;               
-       unsigned long buid;
-       unsigned long dma_window_base_cur;
-       unsigned long dma_window_size;
-};
-
-/*
- * PCI stuff, for nodes representing PCI devices, pointed to
- * by device_node->data.
- */
-struct pci_controller;
-struct iommu_table;
-
-struct pci_dn {
-       int     busno;                  /* for pci devices */
-       int     bussubno;               /* for pci devices */
-       int     devfn;                  /* for pci devices */
-
-#ifdef CONFIG_PPC_PSERIES
-       int     eeh_mode;               /* See eeh.h for possible EEH_MODEs */
-       int     eeh_config_addr;
-       int     eeh_check_count;        /* # times driver ignored error */
-       int     eeh_freeze_count;       /* # times this device froze up. */
-       int     eeh_is_bridge;          /* device is pci-to-pci bridge */
-#endif
-       int     pci_ext_config_space;   /* for pci devices */
-       struct  pci_controller *phb;    /* for pci devices */
-       struct  iommu_table *iommu_table;       /* for phb's or bridges */
-       struct  pci_dev *pcidev;        /* back-pointer to the pci device */
-       struct  device_node *node;      /* back-pointer to the device_node */
-#ifdef CONFIG_PPC_ISERIES
-       struct  list_head Device_List;
-       int     Irq;                    /* Assigned IRQ */
-       int     Flags;                  /* Possible flags(disable/bist)*/
-       u8      LogicalSlot;            /* Hv Slot Index for Tces */
-#endif
-       u32     config_space[16];       /* saved PCI config space */
-};
-
-/* Get the pointer to a device_node's pci_dn */
-#define PCI_DN(dn)     ((struct pci_dn *) (dn)->data)
-
-struct device_node *fetch_dev_dn(struct pci_dev *dev);
-
-/* Get a device_node from a pci_dev.  This code must be fast except
- * in the case where the sysdata is incorrect and needs to be fixed
- * up (this will only happen once).
- * In this case the sysdata will have been inherited from a PCI host
- * bridge or a PCI-PCI bridge further up the tree, so it will point
- * to a valid struct pci_dn, just not the one we want.
- */
-static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev)
-{
-       struct device_node *dn = dev->sysdata;
-       struct pci_dn *pdn = dn->data;
-
-       if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number)
-               return dn;      /* fast path.  sysdata is good */
-       return fetch_dev_dn(dev);
-}
-
-static inline int pci_device_from_OF_node(struct device_node *np,
-                                         u8 *bus, u8 *devfn)
-{
-       if (!PCI_DN(np))
-               return -ENODEV;
-       *bus = PCI_DN(np)->busno;
-       *devfn = PCI_DN(np)->devfn;
-       return 0;
-}
-
-static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
-{
-       if (bus->self)
-               return pci_device_to_OF_node(bus->self);
-       else
-               return bus->sysdata; /* Must be root bus (PHB) */
-}
-
-extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
-                                        struct device_node *dev, int primary);
-
-extern int pcibios_remove_root_bus(struct pci_controller *phb);
-
-extern void phbs_remap_io(void);
-
-static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
-{
-       struct device_node *busdn = bus->sysdata;
-
-       BUG_ON(busdn == NULL);
-       return PCI_DN(busdn)->phb;
-}
-
-extern struct pci_controller *
-pcibios_alloc_controller(struct device_node *dev);
-extern void pcibios_free_controller(struct pci_controller *phb);
-
-/* Return values for ppc_md.pci_probe_mode function */
-#define PCI_PROBE_NONE         -1      /* Don't look at this bus at all */
-#define PCI_PROBE_NORMAL       0       /* Do normal PCI probing */
-#define PCI_PROBE_DEVTREE      1       /* Instantiate from device tree */
-
-#endif
-#endif /* __KERNEL__ */
diff --git a/include/asm-ppc64/pci.h b/include/asm-ppc64/pci.h
deleted file mode 100644 (file)
index fafdf88..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef __PPC64_PCI_H
-#define __PPC64_PCI_H
-#ifdef __KERNEL__
-
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/dma-mapping.h>
-
-#include <asm/machdep.h>
-#include <asm/scatterlist.h>
-#include <asm/io.h>
-#include <asm/prom.h>
-
-#include <asm-generic/pci-dma-compat.h>
-
-#define PCIBIOS_MIN_IO         0x1000
-#define PCIBIOS_MIN_MEM                0x10000000
-
-struct pci_dev;
-
-#ifdef CONFIG_PPC_ISERIES
-#define pcibios_scan_all_fns(a, b)     0
-#else
-extern int pcibios_scan_all_fns(struct pci_bus *bus, int devfn);
-#endif
-
-static inline void pcibios_set_master(struct pci_dev *dev)
-{
-       /* No special bus mastering setup handling */
-}
-
-static inline void pcibios_penalize_isa_irq(int irq, int active)
-{
-       /* We don't do dynamic PCI IRQ allocation */
-}
-
-#define HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ
-static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
-{
-       if (ppc_md.pci_get_legacy_ide_irq)
-               return ppc_md.pci_get_legacy_ide_irq(dev, channel);
-       return channel ? 15 : 14;
-}
-
-#define HAVE_ARCH_PCI_MWI 1
-static inline int pcibios_prep_mwi(struct pci_dev *dev)
-{
-       /*
-        * We would like to avoid touching the cacheline size or MWI bit
-        * but we cant do that with the current pcibios_prep_mwi 
-        * interface. pSeries firmware sets the cacheline size (which is not
-        * the cpu cacheline size in all cases) and hardware treats MWI 
-        * the same as memory write. So we dont touch the cacheline size
-        * here and allow the generic code to set the MWI bit.
-        */
-       return 0;
-}
-
-extern unsigned int pcibios_assign_all_busses(void);
-
-extern struct dma_mapping_ops pci_dma_ops;
-
-/* For DAC DMA, we currently don't support it by default, but
- * we let the platform override this
- */
-static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
-{
-       if (pci_dma_ops.dac_dma_supported)
-               return pci_dma_ops.dac_dma_supported(&hwdev->dev, mask);
-       return 0;
-}
-
-#ifdef CONFIG_PCI
-static inline void pci_dma_burst_advice(struct pci_dev *pdev,
-                                       enum pci_dma_burst_strategy *strat,
-                                       unsigned long *strategy_parameter)
-{
-       unsigned long cacheline_size;
-       u8 byte;
-
-       pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &byte);
-       if (byte == 0)
-               cacheline_size = 1024;
-       else
-               cacheline_size = (int) byte * 4;
-
-       *strat = PCI_DMA_BURST_MULTIPLE;
-       *strategy_parameter = cacheline_size;
-}
-#endif
-
-extern int pci_domain_nr(struct pci_bus *bus);
-
-/* Decide whether to display the domain number in /proc */
-extern int pci_proc_domain(struct pci_bus *bus);
-
-struct vm_area_struct;
-/* Map a range of PCI memory or I/O space for a device into user space */
-int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
-                       enum pci_mmap_state mmap_state, int write_combine);
-
-/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */
-#define HAVE_PCI_MMAP  1
-
-/* pci_unmap_{single,page} is not a nop, thus... */
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
-       dma_addr_t ADDR_NAME;
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
-       __u32 LEN_NAME;
-#define pci_unmap_addr(PTR, ADDR_NAME)                 \
-       ((PTR)->ADDR_NAME)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
-       (((PTR)->ADDR_NAME) = (VAL))
-#define pci_unmap_len(PTR, LEN_NAME)                   \
-       ((PTR)->LEN_NAME)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
-       (((PTR)->LEN_NAME) = (VAL))
-
-/* The PCI address space does equal the physical memory
- * address space.  The networking and block device layers use
- * this boolean for bounce buffer decisions.
- */
-#define PCI_DMA_BUS_IS_PHYS    (0)
-       
-extern void
-pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
-                       struct resource *res);
-
-extern void
-pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-                       struct pci_bus_region *region);
-
-static inline struct resource *
-pcibios_select_root(struct pci_dev *pdev, struct resource *res)
-{
-       struct resource *root = NULL;
-
-       if (res->flags & IORESOURCE_IO)
-               root = &ioport_resource;
-       if (res->flags & IORESOURCE_MEM)
-               root = &iomem_resource;
-
-       return root;
-}
-
-extern int
-unmap_bus_range(struct pci_bus *bus);
-
-extern int
-remap_bus_range(struct pci_bus *bus);
-
-extern void
-pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus);
-
-extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
-
-extern struct pci_dev *of_create_pci_dev(struct device_node *node,
-                                       struct pci_bus *bus, int devfn);
-
-extern void of_scan_pci_bridge(struct device_node *node,
-                               struct pci_dev *dev);
-
-extern void of_scan_bus(struct device_node *node, struct pci_bus *bus);
-
-extern int pci_read_irq_line(struct pci_dev *dev);
-
-extern void pcibios_add_platform_entries(struct pci_dev *dev);
-
-struct file;
-extern pgprot_t        pci_phys_mem_access_prot(struct file *file,
-                                        unsigned long pfn,
-                                        unsigned long size,
-                                        pgprot_t prot);
-
-#ifdef CONFIG_PPC_MULTIPLATFORM
-#define HAVE_ARCH_PCI_RESOURCE_TO_USER
-extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
-                                const struct resource *rsrc,
-                                u64 *start, u64 *end);
-#endif /* CONFIG_PPC_MULTIPLATFORM */
-
-
-#endif /* __KERNEL__ */
-
-#endif /* __PPC64_PCI_H */
diff --git a/include/asm-ppc64/pgalloc.h b/include/asm-ppc64/pgalloc.h
deleted file mode 100644 (file)
index dcf3622..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-#ifndef _PPC64_PGALLOC_H
-#define _PPC64_PGALLOC_H
-
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/cpumask.h>
-#include <linux/percpu.h>
-
-extern kmem_cache_t *pgtable_cache[];
-
-#ifdef CONFIG_PPC_64K_PAGES
-#define PTE_CACHE_NUM  0
-#define PMD_CACHE_NUM  1
-#define PGD_CACHE_NUM  2
-#else
-#define PTE_CACHE_NUM  0
-#define PMD_CACHE_NUM  1
-#define PUD_CACHE_NUM  1
-#define PGD_CACHE_NUM  0
-#endif
-
-/*
- * 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.
- */
-
-static inline pgd_t *pgd_alloc(struct mm_struct *mm)
-{
-       return kmem_cache_alloc(pgtable_cache[PGD_CACHE_NUM], GFP_KERNEL);
-}
-
-static inline void pgd_free(pgd_t *pgd)
-{
-       kmem_cache_free(pgtable_cache[PGD_CACHE_NUM], pgd);
-}
-
-#ifndef CONFIG_PPC_64K_PAGES
-
-#define pgd_populate(MM, PGD, PUD)     pgd_set(PGD, PUD)
-
-static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-       return kmem_cache_alloc(pgtable_cache[PUD_CACHE_NUM],
-                               GFP_KERNEL|__GFP_REPEAT);
-}
-
-static inline void pud_free(pud_t *pud)
-{
-       kmem_cache_free(pgtable_cache[PUD_CACHE_NUM], pud);
-}
-
-static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
-{
-       pud_set(pud, (unsigned long)pmd);
-}
-
-#define pmd_populate(mm, pmd, pte_page) \
-       pmd_populate_kernel(mm, pmd, page_address(pte_page))
-#define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, (unsigned long)(pte))
-
-
-#else /* CONFIG_PPC_64K_PAGES */
-
-#define pud_populate(mm, pud, pmd)     pud_set(pud, (unsigned long)pmd)
-
-static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
-                                      pte_t *pte)
-{
-       pmd_set(pmd, (unsigned long)pte);
-}
-
-#define pmd_populate(mm, pmd, pte_page) \
-       pmd_populate_kernel(mm, pmd, page_address(pte_page))
-
-#endif /* CONFIG_PPC_64K_PAGES */
-
-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-       return kmem_cache_alloc(pgtable_cache[PMD_CACHE_NUM],
-                               GFP_KERNEL|__GFP_REPEAT);
-}
-
-static inline void pmd_free(pmd_t *pmd)
-{
-       kmem_cache_free(pgtable_cache[PMD_CACHE_NUM], pmd);
-}
-
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
-                                         unsigned long address)
-{
-       return kmem_cache_alloc(pgtable_cache[PTE_CACHE_NUM],
-                               GFP_KERNEL|__GFP_REPEAT);
-}
-
-static inline struct page *pte_alloc_one(struct mm_struct *mm,
-                                        unsigned long address)
-{
-       return virt_to_page(pte_alloc_one_kernel(mm, address));
-}
-               
-static inline void pte_free_kernel(pte_t *pte)
-{
-       kmem_cache_free(pgtable_cache[PTE_CACHE_NUM], pte);
-}
-
-static inline void pte_free(struct page *ptepage)
-{
-       pte_free_kernel(page_address(ptepage));
-}
-
-#define PGF_CACHENUM_MASK      0xf
-
-typedef struct pgtable_free {
-       unsigned long val;
-} pgtable_free_t;
-
-static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
-                                               unsigned long mask)
-{
-       BUG_ON(cachenum > PGF_CACHENUM_MASK);
-
-       return (pgtable_free_t){.val = ((unsigned long) p & ~mask) | cachenum};
-}
-
-static inline void pgtable_free(pgtable_free_t pgf)
-{
-       void *p = (void *)(pgf.val & ~PGF_CACHENUM_MASK);
-       int cachenum = pgf.val & PGF_CACHENUM_MASK;
-
-       kmem_cache_free(pgtable_cache[cachenum], p);
-}
-
-extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
-
-#define __pte_free_tlb(tlb, ptepage)   \
-       pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
-               PTE_CACHE_NUM, PTE_TABLE_SIZE-1))
-#define __pmd_free_tlb(tlb, pmd)       \
-       pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
-               PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
-#ifndef CONFIG_PPC_64K_PAGES
-#define __pud_free_tlb(tlb, pmd)       \
-       pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
-               PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
-#endif /* CONFIG_PPC_64K_PAGES */
-
-#define check_pgt_cache()      do { } while (0)
-
-#endif /* _PPC64_PGALLOC_H */
diff --git a/include/asm-ppc64/pgtable-4k.h b/include/asm-ppc64/pgtable-4k.h
deleted file mode 100644 (file)
index e9590c0..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Entries per page directory level.  The PTE level must use a 64b record
- * for each page table entry.  The PMD and PGD level use a 32b record for
- * each entry by assuming that each entry is page aligned.
- */
-#define PTE_INDEX_SIZE  9
-#define PMD_INDEX_SIZE  7
-#define PUD_INDEX_SIZE  7
-#define PGD_INDEX_SIZE  9
-
-#define PTE_TABLE_SIZE (sizeof(pte_t) << PTE_INDEX_SIZE)
-#define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE)
-#define PUD_TABLE_SIZE (sizeof(pud_t) << PUD_INDEX_SIZE)
-#define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
-
-#define PTRS_PER_PTE   (1 << PTE_INDEX_SIZE)
-#define PTRS_PER_PMD   (1 << PMD_INDEX_SIZE)
-#define PTRS_PER_PUD   (1 << PMD_INDEX_SIZE)
-#define PTRS_PER_PGD   (1 << PGD_INDEX_SIZE)
-
-/* PMD_SHIFT determines what a second-level page table entry can map */
-#define PMD_SHIFT      (PAGE_SHIFT + PTE_INDEX_SIZE)
-#define PMD_SIZE       (1UL << PMD_SHIFT)
-#define PMD_MASK       (~(PMD_SIZE-1))
-
-/* With 4k base page size, hugepage PTEs go at the PMD level */
-#define MIN_HUGEPTE_SHIFT      PMD_SHIFT
-
-/* PUD_SHIFT determines what a third-level page table entry can map */
-#define PUD_SHIFT      (PMD_SHIFT + PMD_INDEX_SIZE)
-#define PUD_SIZE       (1UL << PUD_SHIFT)
-#define PUD_MASK       (~(PUD_SIZE-1))
-
-/* PGDIR_SHIFT determines what a fourth-level page table entry can map */
-#define PGDIR_SHIFT    (PUD_SHIFT + PUD_INDEX_SIZE)
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-/* PTE bits */
-#define _PAGE_SECONDARY 0x8000 /* software: HPTE is in secondary group */
-#define _PAGE_GROUP_IX  0x7000 /* software: HPTE index within group */
-#define _PAGE_F_SECOND  _PAGE_SECONDARY
-#define _PAGE_F_GIX     _PAGE_GROUP_IX
-
-/* PTE flags to conserve for HPTE identification */
-#define _PAGE_HPTEFLAGS (_PAGE_BUSY | _PAGE_HASHPTE | \
-                        _PAGE_SECONDARY | _PAGE_GROUP_IX)
-
-/* PAGE_MASK gives the right answer below, but only by accident */
-/* It should be preserving the high 48 bits and then specifically */
-/* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
-#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
-                         _PAGE_HPTEFLAGS)
-
-/* Bits to mask out from a PMD to get to the PTE page */
-#define PMD_MASKED_BITS                0
-/* Bits to mask out from a PUD to get to the PMD page */
-#define PUD_MASKED_BITS                0
-/* Bits to mask out from a PGD to get to the PUD page */
-#define PGD_MASKED_BITS                0
-
-/* shift to put page number into pte */
-#define PTE_RPN_SHIFT  (17)
-
-#define __real_pte(e,p)                ((real_pte_t)(e))
-#define __rpte_to_pte(r)       (r)
-#define __rpte_to_hidx(r,index)        (pte_val((r)) >> 12)
-
-#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift)       \
-       do {                                                             \
-               index = 0;                                               \
-               shift = mmu_psize_defs[psize].shift;                     \
-
-#define pte_iterate_hashed_end() } while(0)
-
-/*
- * 4-level page tables related bits
- */
-
-#define pgd_none(pgd)          (!pgd_val(pgd))
-#define pgd_bad(pgd)           (pgd_val(pgd) == 0)
-#define pgd_present(pgd)       (pgd_val(pgd) != 0)
-#define pgd_clear(pgdp)                (pgd_val(*(pgdp)) = 0)
-#define pgd_page(pgd)          (pgd_val(pgd) & ~PGD_MASKED_BITS)
-
-#define pud_offset(pgdp, addr) \
-  (((pud_t *) pgd_page(*(pgdp))) + \
-    (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)))
-
-#define pud_ERROR(e) \
-       printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pud_val(e))
diff --git a/include/asm-ppc64/pgtable-64k.h b/include/asm-ppc64/pgtable-64k.h
deleted file mode 100644 (file)
index 154f184..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-#include <asm-generic/pgtable-nopud.h>
-
-
-#define PTE_INDEX_SIZE  12
-#define PMD_INDEX_SIZE  12
-#define PUD_INDEX_SIZE 0
-#define PGD_INDEX_SIZE  4
-
-#define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE)
-#define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE)
-#define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
-
-#define PTRS_PER_PTE   (1 << PTE_INDEX_SIZE)
-#define PTRS_PER_PMD   (1 << PMD_INDEX_SIZE)
-#define PTRS_PER_PGD   (1 << PGD_INDEX_SIZE)
-
-/* With 4k base page size, hugepage PTEs go at the PMD level */
-#define MIN_HUGEPTE_SHIFT      PAGE_SHIFT
-
-/* PMD_SHIFT determines what a second-level page table entry can map */
-#define PMD_SHIFT      (PAGE_SHIFT + PTE_INDEX_SIZE)
-#define PMD_SIZE       (1UL << PMD_SHIFT)
-#define PMD_MASK       (~(PMD_SIZE-1))
-
-/* PGDIR_SHIFT determines what a third-level page table entry can map */
-#define PGDIR_SHIFT    (PMD_SHIFT + PMD_INDEX_SIZE)
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-/* Additional PTE bits (don't change without checking asm in hash_low.S) */
-#define _PAGE_HPTE_SUB 0x0ffff000 /* combo only: sub pages HPTE bits */
-#define _PAGE_HPTE_SUB0        0x08000000 /* combo only: first sub page */
-#define _PAGE_COMBO    0x10000000 /* this is a combo 4k page */
-#define _PAGE_F_SECOND  0x00008000 /* full page: hidx bits */
-#define _PAGE_F_GIX     0x00007000 /* full page: hidx bits */
-
-/* PTE flags to conserve for HPTE identification */
-#define _PAGE_HPTEFLAGS (_PAGE_BUSY | _PAGE_HASHPTE | _PAGE_HPTE_SUB |\
-                         _PAGE_COMBO)
-
-/* Shift to put page number into pte.
- *
- * That gives us a max RPN of 32 bits, which means a max of 48 bits
- * of addressable physical space.
- * We could get 3 more bits here by setting PTE_RPN_SHIFT to 29 but
- * 32 makes PTEs more readable for debugging for now :)
- */
-#define PTE_RPN_SHIFT  (32)
-#define PTE_RPN_MAX    (1UL << (64 - PTE_RPN_SHIFT))
-#define PTE_RPN_MASK   (~((1UL<<PTE_RPN_SHIFT)-1))
-
-/* _PAGE_CHG_MASK masks of bits that are to be preserved accross
- * pgprot changes
- */
-#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
-                         _PAGE_ACCESSED)
-
-/* Bits to mask out from a PMD to get to the PTE page */
-#define PMD_MASKED_BITS                0x1ff
-/* Bits to mask out from a PGD/PUD to get to the PMD page */
-#define PUD_MASKED_BITS                0x1ff
-
-#ifndef __ASSEMBLY__
-
-/* Manipulate "rpte" values */
-#define __real_pte(e,p)        ((real_pte_t) { \
-       (e), pte_val(*((p) + PTRS_PER_PTE)) })
-#define __rpte_to_hidx(r,index)        ((pte_val((r).pte) & _PAGE_COMBO) ? \
-        (((r).hidx >> ((index)<<2)) & 0xf) : ((pte_val((r).pte) >> 12) & 0xf))
-#define __rpte_to_pte(r)       ((r).pte)
-#define __rpte_sub_valid(rpte, index) \
-       (pte_val(rpte.pte) & (_PAGE_HPTE_SUB0 >> (index)))
-
-
-/* Trick: we set __end to va + 64k, which happens works for
- * a 16M page as well as we want only one iteration
- */
-#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift)         \
-        do {                                                                \
-                unsigned long __end = va + PAGE_SIZE;                       \
-                unsigned __split = (psize == MMU_PAGE_4K ||                 \
-                                   psize == MMU_PAGE_64K_AP);              \
-                shift = mmu_psize_defs[psize].shift;                        \
-               for (index = 0; va < __end; index++, va += (1 << shift)) {  \
-                       if (!__split || __rpte_sub_valid(rpte, index)) do { \
-
-#define pte_iterate_hashed_end() } while(0); } } while(0)
-
-
-#endif /*  __ASSEMBLY__ */
diff --git a/include/asm-ppc64/pgtable.h b/include/asm-ppc64/pgtable.h
deleted file mode 100644 (file)
index a9783ba..0000000
+++ /dev/null
@@ -1,512 +0,0 @@
-#ifndef _PPC64_PGTABLE_H
-#define _PPC64_PGTABLE_H
-
-/*
- * This file contains the functions and defines necessary to modify and use
- * the ppc64 hashed page table.
- */
-
-#ifndef __ASSEMBLY__
-#include <linux/config.h>
-#include <linux/stddef.h>
-#include <asm/processor.h>             /* For TASK_SIZE */
-#include <asm/mmu.h>
-#include <asm/page.h>
-#include <asm/tlbflush.h>
-struct mm_struct;
-#endif /* __ASSEMBLY__ */
-
-#ifdef CONFIG_PPC_64K_PAGES
-#include <asm/pgtable-64k.h>
-#else
-#include <asm/pgtable-4k.h>
-#endif
-
-#define FIRST_USER_ADDRESS     0
-
-/*
- * Size of EA range mapped by our pagetables.
- */
-#define PGTABLE_EADDR_SIZE (PTE_INDEX_SIZE + PMD_INDEX_SIZE + \
-                           PUD_INDEX_SIZE + PGD_INDEX_SIZE + PAGE_SHIFT)
-#define PGTABLE_RANGE (1UL << PGTABLE_EADDR_SIZE)
-
-#if TASK_SIZE_USER64 > PGTABLE_RANGE
-#error TASK_SIZE_USER64 exceeds pagetable range
-#endif
-
-#if TASK_SIZE_USER64 > (1UL << (USER_ESID_BITS + SID_SHIFT))
-#error TASK_SIZE_USER64 exceeds user VSID range
-#endif
-
-/*
- * Define the address range of the vmalloc VM area.
- */
-#define VMALLOC_START (0xD000000000000000ul)
-#define VMALLOC_SIZE  (0x80000000000UL)
-#define VMALLOC_END   (VMALLOC_START + VMALLOC_SIZE)
-
-/*
- * Common bits in a linux-style PTE.  These match the bits in the
- * (hardware-defined) PowerPC PTE as closely as possible. Additional
- * bits may be defined in pgtable-*.h
- */
-#define _PAGE_PRESENT  0x0001 /* software: pte contains a translation */
-#define _PAGE_USER     0x0002 /* matches one of the PP bits */
-#define _PAGE_FILE     0x0002 /* (!present only) software: pte holds file offset */
-#define _PAGE_EXEC     0x0004 /* No execute on POWER4 and newer (we invert) */
-#define _PAGE_GUARDED  0x0008
-#define _PAGE_COHERENT 0x0010 /* M: enforce memory coherence (SMP systems) */
-#define _PAGE_NO_CACHE 0x0020 /* I: cache inhibit */
-#define _PAGE_WRITETHRU        0x0040 /* W: cache write-through */
-#define _PAGE_DIRTY    0x0080 /* C: page changed */
-#define _PAGE_ACCESSED 0x0100 /* R: page referenced */
-#define _PAGE_RW       0x0200 /* software: user write access allowed */
-#define _PAGE_HASHPTE  0x0400 /* software: pte has an associated HPTE */
-#define _PAGE_BUSY     0x0800 /* software: PTE & hash are busy */ 
-
-#define _PAGE_BASE     (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT)
-
-#define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY)
-
-/* __pgprot defined in asm-ppc64/page.h */
-#define PAGE_NONE      __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED)
-
-#define PAGE_SHARED    __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER)
-#define PAGE_SHARED_X  __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER | _PAGE_EXEC)
-#define PAGE_COPY      __pgprot(_PAGE_BASE | _PAGE_USER)
-#define PAGE_COPY_X    __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
-#define PAGE_READONLY  __pgprot(_PAGE_BASE | _PAGE_USER)
-#define PAGE_READONLY_X        __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
-#define PAGE_KERNEL    __pgprot(_PAGE_BASE | _PAGE_WRENABLE)
-#define PAGE_KERNEL_CI __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \
-                              _PAGE_WRENABLE | _PAGE_NO_CACHE | _PAGE_GUARDED)
-#define PAGE_KERNEL_EXEC __pgprot(_PAGE_BASE | _PAGE_WRENABLE | _PAGE_EXEC)
-
-#define PAGE_AGP       __pgprot(_PAGE_BASE | _PAGE_WRENABLE | _PAGE_NO_CACHE)
-#define HAVE_PAGE_AGP
-
-/* PTEIDX nibble */
-#define _PTEIDX_SECONDARY      0x8
-#define _PTEIDX_GROUP_IX       0x7
-
-
-/*
- * POWER4 and newer have per page execute protection, older chips can only
- * do this on a segment (256MB) basis.
- *
- * Also, write permissions imply read permissions.
- * This is the closest we can get..
- *
- * Note due to the way vm flags are laid out, the bits are XWR
- */
-#define __P000 PAGE_NONE
-#define __P001 PAGE_READONLY
-#define __P010 PAGE_COPY
-#define __P011 PAGE_COPY
-#define __P100 PAGE_READONLY_X
-#define __P101 PAGE_READONLY_X
-#define __P110 PAGE_COPY_X
-#define __P111 PAGE_COPY_X
-
-#define __S000 PAGE_NONE
-#define __S001 PAGE_READONLY
-#define __S010 PAGE_SHARED
-#define __S011 PAGE_SHARED
-#define __S100 PAGE_READONLY_X
-#define __S101 PAGE_READONLY_X
-#define __S110 PAGE_SHARED_X
-#define __S111 PAGE_SHARED_X
-
-#ifndef __ASSEMBLY__
-
-/*
- * ZERO_PAGE is a global shared page that is always zero: used
- * for zero-mapped memory areas etc..
- */
-extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-#endif /* __ASSEMBLY__ */
-
-#ifdef CONFIG_HUGETLB_PAGE
-
-#define HAVE_ARCH_UNMAPPED_AREA
-#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
-
-#endif
-
-#ifndef __ASSEMBLY__
-
-/*
- * Conversion functions: convert a page and protection to a page entry,
- * and a page entry and page directory to the page they refer to.
- *
- * mk_pte takes a (struct page *) as input
- */
-#define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
-
-static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot)
-{
-       pte_t pte;
-
-
-       pte_val(pte) = (pfn << PTE_RPN_SHIFT) | pgprot_val(pgprot);
-       return pte;
-}
-
-#define pte_modify(_pte, newprot) \
-  (__pte((pte_val(_pte) & _PAGE_CHG_MASK) | pgprot_val(newprot)))
-
-#define pte_none(pte)          ((pte_val(pte) & ~_PAGE_HPTEFLAGS) == 0)
-#define pte_present(pte)       (pte_val(pte) & _PAGE_PRESENT)
-
-/* pte_clear moved to later in this file */
-
-#define pte_pfn(x)             ((unsigned long)((pte_val(x)>>PTE_RPN_SHIFT)))
-#define pte_page(x)            pfn_to_page(pte_pfn(x))
-
-#define pmd_set(pmdp, pmdval)  (pmd_val(*(pmdp)) = (pmdval))
-#define pmd_none(pmd)          (!pmd_val(pmd))
-#define        pmd_bad(pmd)            (pmd_val(pmd) == 0)
-#define        pmd_present(pmd)        (pmd_val(pmd) != 0)
-#define        pmd_clear(pmdp)         (pmd_val(*(pmdp)) = 0)
-#define pmd_page_kernel(pmd)   (pmd_val(pmd) & ~PMD_MASKED_BITS)
-#define pmd_page(pmd)          virt_to_page(pmd_page_kernel(pmd))
-
-#define pud_set(pudp, pudval)  (pud_val(*(pudp)) = (pudval))
-#define pud_none(pud)          (!pud_val(pud))
-#define pud_bad(pud)           ((pud_val(pud)) == 0)
-#define pud_present(pud)       (pud_val(pud) != 0)
-#define pud_clear(pudp)                (pud_val(*(pudp)) = 0)
-#define pud_page(pud)          (pud_val(pud) & ~PUD_MASKED_BITS)
-
-#define pgd_set(pgdp, pudp)    ({pgd_val(*(pgdp)) = (unsigned long)(pudp);})
-
-/* 
- * Find an entry in a page-table-directory.  We combine the address region 
- * (the high order N bits) and the pgd portion of the address.
- */
-/* to avoid overflow in free_pgtables we don't use PTRS_PER_PGD here */
-#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & 0x1ff)
-
-#define pgd_offset(mm, address)         ((mm)->pgd + pgd_index(address))
-
-#define pmd_offset(pudp,addr) \
-  (((pmd_t *) pud_page(*(pudp))) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
-
-#define pte_offset_kernel(dir,addr) \
-  (((pte_t *) pmd_page_kernel(*(dir))) + (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
-
-#define pte_offset_map(dir,addr)       pte_offset_kernel((dir), (addr))
-#define pte_offset_map_nested(dir,addr)        pte_offset_kernel((dir), (addr))
-#define pte_unmap(pte)                 do { } while(0)
-#define pte_unmap_nested(pte)          do { } while(0)
-
-/* to find an entry in a kernel page-table-directory */
-/* This now only contains the vmalloc pages */
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-
-/*
- * The following only work if pte_present() is true.
- * Undefined behaviour if not..
- */
-static inline int pte_read(pte_t pte)  { return pte_val(pte) & _PAGE_USER;}
-static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW;}
-static inline int pte_exec(pte_t pte)  { return pte_val(pte) & _PAGE_EXEC;}
-static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY;}
-static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED;}
-static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE;}
-
-static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
-static inline void pte_cache(pte_t pte)   { pte_val(pte) &= ~_PAGE_NO_CACHE; }
-
-static inline pte_t pte_rdprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_EXEC; return pte; }
-static inline pte_t pte_wrprotect(pte_t pte) {
-       pte_val(pte) &= ~(_PAGE_RW); return pte; }
-static inline pte_t pte_mkclean(pte_t pte) {
-       pte_val(pte) &= ~(_PAGE_DIRTY); return pte; }
-static inline pte_t pte_mkold(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkread(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER | _PAGE_EXEC; return pte; }
-static inline pte_t pte_mkwrite(pte_t pte) {
-       pte_val(pte) |= _PAGE_RW; return pte; }
-static inline pte_t pte_mkdirty(pte_t pte) {
-       pte_val(pte) |= _PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkyoung(pte_t pte) {
-       pte_val(pte) |= _PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkhuge(pte_t pte) {
-       return pte; }
-
-/* Atomic PTE updates */
-static inline unsigned long pte_update(pte_t *p, unsigned long clr)
-{
-       unsigned long old, tmp;
-
-       __asm__ __volatile__(
-       "1:     ldarx   %0,0,%3         # pte_update\n\
-       andi.   %1,%0,%6\n\
-       bne-    1b \n\
-       andc    %1,%0,%4 \n\
-       stdcx.  %1,0,%3 \n\
-       bne-    1b"
-       : "=&r" (old), "=&r" (tmp), "=m" (*p)
-       : "r" (p), "r" (clr), "m" (*p), "i" (_PAGE_BUSY)
-       : "cc" );
-       return old;
-}
-
-/* PTE updating functions, this function puts the PTE in the
- * batch, doesn't actually triggers the hash flush immediately,
- * you need to call flush_tlb_pending() to do that.
- * Pass -1 for "normal" size (4K or 64K)
- */
-extern void hpte_update(struct mm_struct *mm, unsigned long addr,
-                       pte_t *ptep, unsigned long pte, int huge);
-
-static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
-                                             unsigned long addr, pte_t *ptep)
-{
-       unsigned long old;
-
-               if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0)
-               return 0;
-       old = pte_update(ptep, _PAGE_ACCESSED);
-       if (old & _PAGE_HASHPTE) {
-               hpte_update(mm, addr, ptep, old, 0);
-               flush_tlb_pending();
-       }
-       return (old & _PAGE_ACCESSED) != 0;
-}
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
-#define ptep_test_and_clear_young(__vma, __addr, __ptep)                  \
-({                                                                        \
-       int __r;                                                           \
-       __r = __ptep_test_and_clear_young((__vma)->vm_mm, __addr, __ptep); \
-       __r;                                                               \
-})
-
-/*
- * On RW/DIRTY bit transitions we can avoid flushing the hpte. For the
- * moment we always flush but we need to fix hpte_update and test if the
- * optimisation is worth it.
- */
-static inline int __ptep_test_and_clear_dirty(struct mm_struct *mm,
-                                             unsigned long addr, pte_t *ptep)
-{
-       unsigned long old;
-
-               if ((pte_val(*ptep) & _PAGE_DIRTY) == 0)
-               return 0;
-       old = pte_update(ptep, _PAGE_DIRTY);
-       if (old & _PAGE_HASHPTE)
-               hpte_update(mm, addr, ptep, old, 0);
-       return (old & _PAGE_DIRTY) != 0;
-}
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
-#define ptep_test_and_clear_dirty(__vma, __addr, __ptep)                  \
-({                                                                        \
-       int __r;                                                           \
-       __r = __ptep_test_and_clear_dirty((__vma)->vm_mm, __addr, __ptep); \
-       __r;                                                               \
-})
-
-#define __HAVE_ARCH_PTEP_SET_WRPROTECT
-static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
-                                     pte_t *ptep)
-{
-       unsigned long old;
-
-               if ((pte_val(*ptep) & _PAGE_RW) == 0)
-                       return;
-       old = pte_update(ptep, _PAGE_RW);
-       if (old & _PAGE_HASHPTE)
-               hpte_update(mm, addr, ptep, old, 0);
-}
-
-/*
- * We currently remove entries from the hashtable regardless of whether
- * the entry was young or dirty. The generic routines only flush if the
- * entry was young or dirty which is not good enough.
- *
- * We should be more intelligent about this but for the moment we override
- * these functions and force a tlb flush unconditionally
- */
-#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
-#define ptep_clear_flush_young(__vma, __address, __ptep)               \
-({                                                                     \
-       int __young = __ptep_test_and_clear_young((__vma)->vm_mm, __address, \
-                                                 __ptep);              \
-       __young;                                                        \
-})
-
-#define __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH
-#define ptep_clear_flush_dirty(__vma, __address, __ptep)               \
-({                                                                     \
-       int __dirty = __ptep_test_and_clear_dirty((__vma)->vm_mm, __address, \
-                                                 __ptep);              \
-       flush_tlb_page(__vma, __address);                               \
-       __dirty;                                                        \
-})
-
-#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
-static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
-                                      unsigned long addr, pte_t *ptep)
-{
-       unsigned long old = pte_update(ptep, ~0UL);
-
-       if (old & _PAGE_HASHPTE)
-               hpte_update(mm, addr, ptep, old, 0);
-       return __pte(old);
-}
-
-static inline void pte_clear(struct mm_struct *mm, unsigned long addr,
-                            pte_t * ptep)
-{
-       unsigned long old = pte_update(ptep, ~0UL);
-
-       if (old & _PAGE_HASHPTE)
-               hpte_update(mm, addr, ptep, old, 0);
-}
-
-/*
- * set_pte stores a linux PTE into the linux page table.
- */
-static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
-                             pte_t *ptep, pte_t pte)
-{
-       if (pte_present(*ptep)) {
-               pte_clear(mm, addr, ptep);
-               flush_tlb_pending();
-       }
-       pte = __pte(pte_val(pte) & ~_PAGE_HPTEFLAGS);
-
-#ifdef CONFIG_PPC_64K_PAGES
-       if (mmu_virtual_psize != MMU_PAGE_64K)
-               pte = __pte(pte_val(pte) | _PAGE_COMBO);
-#endif /* CONFIG_PPC_64K_PAGES */
-
-       *ptep = pte;
-}
-
-/* Set the dirty and/or accessed bits atomically in a linux PTE, this
- * function doesn't need to flush the hash entry
- */
-#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
-static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry, int dirty)
-{
-       unsigned long bits = pte_val(entry) &
-               (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
-       unsigned long old, tmp;
-
-       __asm__ __volatile__(
-       "1:     ldarx   %0,0,%4\n\
-               andi.   %1,%0,%6\n\
-               bne-    1b \n\
-               or      %0,%3,%0\n\
-               stdcx.  %0,0,%4\n\
-               bne-    1b"
-       :"=&r" (old), "=&r" (tmp), "=m" (*ptep)
-       :"r" (bits), "r" (ptep), "m" (*ptep), "i" (_PAGE_BUSY)
-       :"cc");
-}
-#define  ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
-       do {                                                               \
-               __ptep_set_access_flags(__ptep, __entry, __dirty);         \
-               flush_tlb_page_nohash(__vma, __address);                   \
-       } while(0)
-
-/*
- * Macro to mark a page protection value as "uncacheable".
- */
-#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_NO_CACHE | _PAGE_GUARDED))
-
-struct file;
-extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
-                                    unsigned long size, pgprot_t vma_prot);
-#define __HAVE_PHYS_MEM_ACCESS_PROT
-
-#define __HAVE_ARCH_PTE_SAME
-#define pte_same(A,B)  (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HPTEFLAGS) == 0)
-
-#define pte_ERROR(e) \
-       printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
-#define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
-#define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
-
-extern pgd_t swapper_pg_dir[];
-
-extern void paging_init(void);
-
-#ifdef CONFIG_HUGETLB_PAGE
-#define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) \
-       free_pgd_range(tlb, addr, end, floor, ceiling)
-#endif
-
-/*
- * This gets called at the end of handling a page fault, when
- * the kernel has put a new PTE into the page table for the process.
- * We use it to put a corresponding HPTE into the hash table
- * ahead of time, instead of waiting for the inevitable extra
- * hash-table miss exception.
- */
-struct vm_area_struct;
-extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
-
-/* Encode and de-code a swap entry */
-#define __swp_type(entry)      (((entry).val >> 1) & 0x3f)
-#define __swp_offset(entry)    ((entry).val >> 8)
-#define __swp_entry(type, offset) ((swp_entry_t){((type)<< 1)|((offset)<<8)})
-#define __pte_to_swp_entry(pte)        ((swp_entry_t){pte_val(pte) >> PTE_RPN_SHIFT})
-#define __swp_entry_to_pte(x)  ((pte_t) { (x).val << PTE_RPN_SHIFT })
-#define pte_to_pgoff(pte)      (pte_val(pte) >> PTE_RPN_SHIFT)
-#define pgoff_to_pte(off)      ((pte_t) {((off) << PTE_RPN_SHIFT)|_PAGE_FILE})
-#define PTE_FILE_MAX_BITS      (BITS_PER_LONG - PTE_RPN_SHIFT)
-
-/*
- * kern_addr_valid is intended to indicate whether an address is a valid
- * kernel address.  Most 32-bit archs define it as always true (like this)
- * but most 64-bit archs actually perform a test.  What should we do here?
- * The only use is in fs/ncpfs/dir.c
- */
-#define kern_addr_valid(addr)  (1)
-
-#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)                \
-               remap_pfn_range(vma, vaddr, pfn, size, prot)
-
-void pgtable_cache_init(void);
-
-/*
- * find_linux_pte returns the address of a linux pte for a given 
- * effective address and directory.  If not found, it returns zero.
- */static inline pte_t *find_linux_pte(pgd_t *pgdir, unsigned long ea)
-{
-       pgd_t *pg;
-       pud_t *pu;
-       pmd_t *pm;
-       pte_t *pt = NULL;
-
-       pg = pgdir + pgd_index(ea);
-       if (!pgd_none(*pg)) {
-               pu = pud_offset(pg, ea);
-               if (!pud_none(*pu)) {
-                       pm = pmd_offset(pu, ea);
-                       if (pmd_present(*pm))
-                               pt = pte_offset_kernel(pm, ea);
-               }
-       }
-       return pt;
-}
-
-#include <asm-generic/pgtable.h>
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _PPC64_PGTABLE_H */
diff --git a/include/asm-ppc64/ptrace-common.h b/include/asm-ppc64/ptrace-common.h
deleted file mode 100644 (file)
index b1babb7..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  linux/arch/ppc64/kernel/ptrace-common.h
- *
- *    Copyright (c) 2002 Stephen Rothwell, IBM Coproration
- *    Extracted from ptrace.c and ptrace32.c
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License.  See the file README.legal in the main directory of
- * this archive for more details.
- */
-
-#ifndef _PPC64_PTRACE_COMMON_H
-#define _PPC64_PTRACE_COMMON_H
-
-#include <linux/config.h>
-#include <asm/system.h>
-
-/*
- * Set of msr bits that gdb can change on behalf of a process.
- */
-#define MSR_DEBUGCHANGE        (MSR_FE0 | MSR_SE | MSR_BE | MSR_FE1)
-
-/*
- * Get contents of register REGNO in task TASK.
- */
-static inline unsigned long get_reg(struct task_struct *task, int regno)
-{
-       unsigned long tmp = 0;
-
-       /*
-        * Put the correct FP bits in, they might be wrong as a result
-        * of our lazy FP restore.
-        */
-       if (regno == PT_MSR) {
-               tmp = ((unsigned long *)task->thread.regs)[PT_MSR];
-               tmp |= task->thread.fpexc_mode;
-       } else if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) {
-               tmp = ((unsigned long *)task->thread.regs)[regno];
-       }
-
-       return tmp;
-}
-
-/*
- * Write contents of register REGNO in task TASK.
- */
-static inline int put_reg(struct task_struct *task, int regno,
-                         unsigned long data)
-{
-       if (regno < PT_SOFTE) {
-               if (regno == PT_MSR)
-                       data = (data & MSR_DEBUGCHANGE)
-                               | (task->thread.regs->msr & ~MSR_DEBUGCHANGE);
-               ((unsigned long *)task->thread.regs)[regno] = data;
-               return 0;
-       }
-       return -EIO;
-}
-
-static inline void set_single_step(struct task_struct *task)
-{
-       struct pt_regs *regs = task->thread.regs;
-       if (regs != NULL)
-               regs->msr |= MSR_SE;
-       set_ti_thread_flag(task->thread_info, TIF_SINGLESTEP);
-}
-
-static inline void clear_single_step(struct task_struct *task)
-{
-       struct pt_regs *regs = task->thread.regs;
-       if (regs != NULL)
-               regs->msr &= ~MSR_SE;
-       clear_ti_thread_flag(task->thread_info, TIF_SINGLESTEP);
-}
-
-#ifdef CONFIG_ALTIVEC
-/*
- * Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go.
- * The transfer totals 34 quadword.  Quadwords 0-31 contain the
- * corresponding vector registers.  Quadword 32 contains the vscr as the
- * last word (offset 12) within that quadword.  Quadword 33 contains the
- * vrsave as the first word (offset 0) within the quadword.
- *
- * This definition of the VMX state is compatible with the current PPC32
- * ptrace interface.  This allows signal handling and ptrace to use the
- * same structures.  This also simplifies the implementation of a bi-arch
- * (combined (32- and 64-bit) gdb.
- */
-
-/*
- * Get contents of AltiVec register state in task TASK
- */
-static inline int get_vrregs(unsigned long __user *data,
-                            struct task_struct *task)
-{
-       unsigned long regsize;
-
-       /* copy AltiVec registers VR[0] .. VR[31] */
-       regsize = 32 * sizeof(vector128);
-       if (copy_to_user(data, task->thread.vr, regsize))
-               return -EFAULT;
-       data += (regsize / sizeof(unsigned long));
-
-       /* copy VSCR */
-       regsize = 1 * sizeof(vector128);
-       if (copy_to_user(data, &task->thread.vscr, regsize))
-               return -EFAULT;
-       data += (regsize / sizeof(unsigned long));
-
-       /* copy VRSAVE */
-       if (put_user(task->thread.vrsave, (u32 __user *)data))
-               return -EFAULT;
-
-       return 0;
-}
-
-/*
- * Write contents of AltiVec register state into task TASK.
- */
-static inline int set_vrregs(struct task_struct *task,
-                            unsigned long __user *data)
-{
-       unsigned long regsize;
-
-       /* copy AltiVec registers VR[0] .. VR[31] */
-       regsize = 32 * sizeof(vector128);
-       if (copy_from_user(task->thread.vr, data, regsize))
-               return -EFAULT;
-       data += (regsize / sizeof(unsigned long));
-
-       /* copy VSCR */
-       regsize = 1 * sizeof(vector128);
-       if (copy_from_user(&task->thread.vscr, data, regsize))
-               return -EFAULT;
-       data += (regsize / sizeof(unsigned long));
-
-       /* copy VRSAVE */
-       if (get_user(task->thread.vrsave, (u32 __user *)data))
-               return -EFAULT;
-
-       return 0;
-}
-#endif
-
-static inline int ptrace_set_debugreg(struct task_struct *task,
-                                     unsigned long addr, unsigned long data)
-{
-       /* We only support one DABR and no IABRS at the moment */
-       if (addr > 0)
-               return -EINVAL;
-
-       /* The bottom 3 bits are flags */
-       if ((data & ~0x7UL) >= TASK_SIZE)
-               return -EIO;
-
-       /* Ensure translation is on */
-       if (data && !(data & DABR_TRANSLATION))
-               return -EIO;
-
-       task->thread.dabr = data;
-       return 0;
-}
-
-#endif /* _PPC64_PTRACE_COMMON_H */
diff --git a/include/asm-ppc64/spinlock.h b/include/asm-ppc64/spinlock.h
deleted file mode 100644 (file)
index 7d84fb5..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-#ifndef __ASM_SPINLOCK_H
-#define __ASM_SPINLOCK_H
-
-/*
- * Simple spin lock operations.  
- *
- * Copyright (C) 2001-2004 Paul Mackerras <paulus@au.ibm.com>, IBM
- * Copyright (C) 2001 Anton Blanchard <anton@au.ibm.com>, IBM
- * Copyright (C) 2002 Dave Engebretsen <engebret@us.ibm.com>, IBM
- *     Rework to support virtual processors
- *
- * Type of int is used as a full 64b word is not necessary.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- * (the type definitions are in asm/spinlock_types.h)
- */
-#include <linux/config.h>
-#include <asm/paca.h>
-#include <asm/hvcall.h>
-#include <asm/iseries/hv_call.h>
-
-#define __raw_spin_is_locked(x)                ((x)->slock != 0)
-
-/*
- * This returns the old value in the lock, so we succeeded
- * in getting the lock if the return value is 0.
- */
-static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock)
-{
-       unsigned long tmp, tmp2;
-
-       __asm__ __volatile__(
-"      lwz             %1,%3(13)               # __spin_trylock\n\
-1:     lwarx           %0,0,%2\n\
-       cmpwi           0,%0,0\n\
-       bne-            2f\n\
-       stwcx.          %1,0,%2\n\
-       bne-            1b\n\
-       isync\n\
-2:"    : "=&r" (tmp), "=&r" (tmp2)
-       : "r" (&lock->slock), "i" (offsetof(struct paca_struct, lock_token))
-       : "cr0", "memory");
-
-       return tmp;
-}
-
-static int __inline__ __raw_spin_trylock(raw_spinlock_t *lock)
-{
-       return __spin_trylock(lock) == 0;
-}
-
-/*
- * On a system with shared processors (that is, where a physical
- * processor is multiplexed between several virtual processors),
- * there is no point spinning on a lock if the holder of the lock
- * isn't currently scheduled on a physical processor.  Instead
- * we detect this situation and ask the hypervisor to give the
- * rest of our timeslice to the lock holder.
- *
- * So that we can tell which virtual processor is holding a lock,
- * we put 0x80000000 | smp_processor_id() in the lock when it is
- * held.  Conveniently, we have a word in the paca that holds this
- * value.
- */
-
-#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
-/* We only yield to the hypervisor if we are in shared processor mode */
-#define SHARED_PROCESSOR (get_paca()->lppaca.shared_proc)
-extern void __spin_yield(raw_spinlock_t *lock);
-extern void __rw_yield(raw_rwlock_t *lock);
-#else /* SPLPAR || ISERIES */
-#define __spin_yield(x)        barrier()
-#define __rw_yield(x)  barrier()
-#define SHARED_PROCESSOR       0
-#endif
-
-static void __inline__ __raw_spin_lock(raw_spinlock_t *lock)
-{
-       while (1) {
-               if (likely(__spin_trylock(lock) == 0))
-                       break;
-               do {
-                       HMT_low();
-                       if (SHARED_PROCESSOR)
-                               __spin_yield(lock);
-               } while (unlikely(lock->slock != 0));
-               HMT_medium();
-       }
-}
-
-static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
-{
-       unsigned long flags_dis;
-
-       while (1) {
-               if (likely(__spin_trylock(lock) == 0))
-                       break;
-               local_save_flags(flags_dis);
-               local_irq_restore(flags);
-               do {
-                       HMT_low();
-                       if (SHARED_PROCESSOR)
-                               __spin_yield(lock);
-               } while (unlikely(lock->slock != 0));
-               HMT_medium();
-               local_irq_restore(flags_dis);
-       }
-}
-
-static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock)
-{
-       __asm__ __volatile__("lwsync    # __raw_spin_unlock": : :"memory");
-       lock->slock = 0;
-}
-
-extern void __raw_spin_unlock_wait(raw_spinlock_t *lock);
-
-/*
- * Read-write spinlocks, allowing multiple readers
- * but only one writer.
- *
- * NOTE! it is quite common to have readers in interrupts
- * but no interrupt writers. For those circumstances we
- * can "mix" irq-safe locks - any writer needs to get a
- * irq-safe write-lock, but readers can get non-irqsafe
- * read-locks.
- */
-
-#define __raw_read_can_lock(rw)                ((rw)->lock >= 0)
-#define __raw_write_can_lock(rw)       (!(rw)->lock)
-
-/*
- * This returns the old value in the lock + 1,
- * so we got a read lock if the return value is > 0.
- */
-static long __inline__ __read_trylock(raw_rwlock_t *rw)
-{
-       long tmp;
-
-       __asm__ __volatile__(
-"1:    lwarx           %0,0,%1         # read_trylock\n\
-       extsw           %0,%0\n\
-       addic.          %0,%0,1\n\
-       ble-            2f\n\
-       stwcx.          %0,0,%1\n\
-       bne-            1b\n\
-       isync\n\
-2:"    : "=&r" (tmp)
-       : "r" (&rw->lock)
-       : "cr0", "xer", "memory");
-
-       return tmp;
-}
-
-/*
- * This returns the old value in the lock,
- * so we got the write lock if the return value is 0.
- */
-static __inline__ long __write_trylock(raw_rwlock_t *rw)
-{
-       long tmp, tmp2;
-
-       __asm__ __volatile__(
-"      lwz             %1,%3(13)       # write_trylock\n\
-1:     lwarx           %0,0,%2\n\
-       cmpwi           0,%0,0\n\
-       bne-            2f\n\
-       stwcx.          %1,0,%2\n\
-       bne-            1b\n\
-       isync\n\
-2:"    : "=&r" (tmp), "=&r" (tmp2)
-       : "r" (&rw->lock), "i" (offsetof(struct paca_struct, lock_token))
-       : "cr0", "memory");
-
-       return tmp;
-}
-
-static void __inline__ __raw_read_lock(raw_rwlock_t *rw)
-{
-       while (1) {
-               if (likely(__read_trylock(rw) > 0))
-                       break;
-               do {
-                       HMT_low();
-                       if (SHARED_PROCESSOR)
-                               __rw_yield(rw);
-               } while (unlikely(rw->lock < 0));
-               HMT_medium();
-       }
-}
-
-static void __inline__ __raw_write_lock(raw_rwlock_t *rw)
-{
-       while (1) {
-               if (likely(__write_trylock(rw) == 0))
-                       break;
-               do {
-                       HMT_low();
-                       if (SHARED_PROCESSOR)
-                               __rw_yield(rw);
-               } while (unlikely(rw->lock != 0));
-               HMT_medium();
-       }
-}
-
-static int __inline__ __raw_read_trylock(raw_rwlock_t *rw)
-{
-       return __read_trylock(rw) > 0;
-}
-
-static int __inline__ __raw_write_trylock(raw_rwlock_t *rw)
-{
-       return __write_trylock(rw) == 0;
-}
-
-static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
-{
-       long tmp;
-
-       __asm__ __volatile__(
-       "eieio                          # read_unlock\n\
-1:     lwarx           %0,0,%1\n\
-       addic           %0,%0,-1\n\
-       stwcx.          %0,0,%1\n\
-       bne-            1b"
-       : "=&r"(tmp)
-       : "r"(&rw->lock)
-       : "cr0", "memory");
-}
-
-static __inline__ void __raw_write_unlock(raw_rwlock_t *rw)
-{
-       __asm__ __volatile__("lwsync    # write_unlock": : :"memory");
-       rw->lock = 0;
-}
-
-#endif /* __ASM_SPINLOCK_H */
index b07c578b22ea677d55f9bf147d8791a18c75a20e..61232760cc3bd50e5d5b72248f23d03dd3fdf87a 100644 (file)
@@ -839,6 +839,7 @@ static inline int sched_find_first_bit(unsigned long *b)
  * fls: find last bit set.
  */
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 /*
  * hweightN: returns the hamming weight (i.e. the number
index 5163d1ff2f1bd365826c4b391859af045dfe96a0..1c526086004543db2afff93f9bed227a1366aecc 100644 (file)
@@ -470,6 +470,7 @@ found_middle:
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #endif /* __KERNEL__ */
 
index e1ff63e092276b1daeef1d5e9062a47dd4e96dc9..ce9c3ad45fe027ba8756ba6ab037981313ed347c 100644 (file)
@@ -510,6 +510,7 @@ found_middle:
 
 #define ffs(x) generic_ffs(x)
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #endif /* __KERNEL__ */
 
index bfbd795a0a80579e1168dff755de89f837c4a687..41722b5e45ef02da75ec02d35eed5c90ac7f8a91 100644 (file)
@@ -298,6 +298,7 @@ static inline int ffs(int x)
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 /*
  * hweightN: returns the hamming weight (i.e. the number
index c0498d3baf931fe71c8d656b4146844a471d67dc..5fb95c828da6760582fe95f93ff5ddf683fc73c7 100644 (file)
@@ -36,7 +36,7 @@
 
 /* Memory parity error register with associated bit constants. */
 #ifndef __ASSEMBLY__
-extern __volatile__ unsigned long *sun4c_memerr_reg;
+extern __volatile__ unsigned long __iomem *sun4c_memerr_reg;
 #endif
 
 #define        SUN4C_MPE_ERROR 0x80    /* Parity error detected. (ro) */
index 301ae8022dddc6effb83eee457ec2a5b217fe385..dedea14d87c8b090425089512ecad3bce37abcf2 100644 (file)
 #include <asm/pbm.h>
 
 struct linux_pcic {
-        void * __iomem          pcic_regs;
+        void __iomem            *pcic_regs;
         unsigned long           pcic_io;
-        void * __iomem          pcic_config_space_addr;
-        void * __iomem          pcic_config_space_data;
+        void __iomem            *pcic_config_space_addr;
+        void __iomem            *pcic_config_space_data;
        struct resource         pcic_res_regs;
        struct resource         pcic_res_io;
        struct resource         pcic_res_cfg_addr;
index 8198c3d0d0074368b0d9fbba5d72969b403c4884..3789fe3159923ef5bbe8bc6bad873b5b851bf78d 100644 (file)
@@ -54,6 +54,7 @@ extern int atomic64_sub_ret(int, atomic64_t *);
  * other cases.
  */
 #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
+#define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
 
 #define atomic_sub_and_test(i, v) (atomic_sub_ret(i, v) == 0)
 #define atomic64_sub_and_test(i, v) (atomic64_sub_ret(i, v) == 0)
index 6388b8376c50227bc8609d87a40e52451f74a435..6efc0162fb09b8e2fa6beb9de1eb5ebfc4ffdf15 100644 (file)
@@ -119,6 +119,7 @@ static inline unsigned long __ffs(unsigned long word)
  */
 
 #define fls(x) generic_fls(x)
+#define fls64(x)   generic_fls64(x)
 
 #ifdef __KERNEL__
 
index 9a02879b235db410cb6d3e465b080eee1daaba5d..f0a9b44d3eb5068c1c70b14520d25c4f5226974b 100644 (file)
@@ -348,16 +348,6 @@ extern unsigned long find_ecache_flush_span(unsigned long size);
 struct vm_area_struct;
 extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
 
-/* Make a non-present pseudo-TTE. */
-static inline pte_t mk_pte_io(unsigned long page, pgprot_t prot, int space)
-{
-       pte_t pte;
-       pte_val(pte) = (((page) | pgprot_val(prot) | _PAGE_E) &
-                       ~(unsigned long)_PAGE_CACHE);
-       pte_val(pte) |= (((unsigned long)space) << 32);
-       return pte;
-}
-
 /* Encode and de-code a swap entry */
 #define __swp_type(entry)      (((entry).val >> PAGE_SHIFT) & 0xffUL)
 #define __swp_offset(entry)    ((entry).val >> (PAGE_SHIFT + 8UL))
index b42662929b6c04b9980d1607b5856d609976ca7b..175722a9116478545c8d8c90da1b8f92fe0fe9f5 100644 (file)
@@ -35,7 +35,7 @@ typedef struct uml_ldt {
        union {
                struct ldt_entry * pages[LDT_PAGES_MAX];
                struct ldt_entry entries[LDT_DIRECT_ENTRIES];
-       };
+       } u;
 } uml_ldt_t;
 
 /*
diff --git a/include/asm-um/ldt-x86_64.h b/include/asm-um/ldt-x86_64.h
new file mode 100644 (file)
index 0000000..175722a
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2004 Fujitsu Siemens Computers GmbH
+ * Licensed under the GPL
+ *
+ * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
+ */
+
+#ifndef __ASM_LDT_I386_H
+#define __ASM_LDT_I386_H
+
+#include "asm/semaphore.h"
+#include "asm/arch/ldt.h"
+
+struct mmu_context_skas;
+extern void ldt_host_info(void);
+extern long init_new_ldt(struct mmu_context_skas * to_mm,
+                        struct mmu_context_skas * from_mm);
+extern void free_ldt(struct mmu_context_skas * mm);
+
+#define LDT_PAGES_MAX \
+       ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE)
+#define LDT_ENTRIES_PER_PAGE \
+       (PAGE_SIZE/LDT_ENTRY_SIZE)
+#define LDT_DIRECT_ENTRIES \
+       ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE)
+
+struct ldt_entry {
+       __u32 a;
+       __u32 b;
+};
+
+typedef struct uml_ldt {
+       int entry_count;
+       struct semaphore semaphore;
+       union {
+               struct ldt_entry * pages[LDT_PAGES_MAX];
+               struct ldt_entry entries[LDT_DIRECT_ENTRIES];
+       } u;
+} uml_ldt_t;
+
+/*
+ * macros stolen from include/asm-i386/desc.h
+ */
+#define LDT_entry_a(info) \
+       ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
+
+#define LDT_entry_b(info) \
+       (((info)->base_addr & 0xff000000) | \
+       (((info)->base_addr & 0x00ff0000) >> 16) | \
+       ((info)->limit & 0xf0000) | \
+       (((info)->read_exec_only ^ 1) << 9) | \
+       ((info)->contents << 10) | \
+       (((info)->seg_not_present ^ 1) << 15) | \
+       ((info)->seg_32bit << 22) | \
+       ((info)->limit_in_pages << 23) | \
+       ((info)->useable << 20) | \
+       0x7000)
+
+#define LDT_empty(info) (\
+       (info)->base_addr       == 0    && \
+       (info)->limit           == 0    && \
+       (info)->contents        == 0    && \
+       (info)->read_exec_only  == 1    && \
+       (info)->seg_32bit       == 0    && \
+       (info)->limit_in_pages  == 0    && \
+       (info)->seg_not_present == 1    && \
+       (info)->useable         == 0    )
+
+#endif
diff --git a/include/asm-um/ldt.h b/include/asm-um/ldt.h
deleted file mode 100644 (file)
index 4466ff6..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2004 Fujitsu Siemens Computers GmbH
- * Licensed under the GPL
- *
- * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
- */
-
-#ifndef __ASM_LDT_I386_H
-#define __ASM_LDT_I386_H
-
-#include "asm/semaphore.h"
-#include "asm/arch/ldt.h"
-
-struct mmu_context_skas;
-extern void ldt_host_info(void);
-extern long init_new_ldt(struct mmu_context_skas * to_mm,
-                        struct mmu_context_skas * from_mm);
-extern void free_ldt(struct mmu_context_skas * mm);
-
-#define LDT_PAGES_MAX \
-       ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE)
-#define LDT_ENTRIES_PER_PAGE \
-       (PAGE_SIZE/LDT_ENTRY_SIZE)
-#define LDT_DIRECT_ENTRIES \
-       ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE)
-
-struct ldt_entry {
-       __u32 a;
-       __u32 b;
-};
-
-typedef struct uml_ldt {
-       int entry_count;
-       struct semaphore semaphore;
-       union {
-               struct ldt_entry * pages[LDT_PAGES_MAX];
-               struct ldt_entry entries[LDT_DIRECT_ENTRIES];
-       };
-} uml_ldt_t;
-
-/*
- * macros stolen from include/asm-i386/desc.h
- */
-#define LDT_entry_a(info) \
-       ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
-
-#define LDT_entry_b(info) \
-       (((info)->base_addr & 0xff000000) | \
-       (((info)->base_addr & 0x00ff0000) >> 16) | \
-       ((info)->limit & 0xf0000) | \
-       (((info)->read_exec_only ^ 1) << 9) | \
-       ((info)->contents << 10) | \
-       (((info)->seg_not_present ^ 1) << 15) | \
-       ((info)->seg_32bit << 22) | \
-       ((info)->limit_in_pages << 23) | \
-       ((info)->useable << 20) | \
-       0x7000)
-
-#define LDT_empty(info) (\
-       (info)->base_addr       == 0    && \
-       (info)->limit           == 0    && \
-       (info)->contents        == 0    && \
-       (info)->read_exec_only  == 1    && \
-       (info)->seg_32bit       == 0    && \
-       (info)->limit_in_pages  == 0    && \
-       (info)->seg_not_present == 1    && \
-       (info)->useable         == 0    )
-
-#endif
-#ifndef __UM_LDT_H
-#define __UM_LDT_H
-
-#include "asm/arch/ldt.h"
-#endif
index b91e799763fdf4f3896b20abb17563323f717b76..8955d2376ac824e5e3a7bd3e97459b442f206cf7 100644 (file)
@@ -276,6 +276,7 @@ found_middle:
 
 #define ffs(x) generic_ffs (x)
 #define fls(x) generic_fls (x)
+#define fls64(x) generic_fls64(x)
 #define __ffs(x) ffs(x)
 
 
index 0866ef67f198d8380a8241727ea21f0a16a19ec1..50db9f39274f8d1994844b58094ebdf1e16da570 100644 (file)
@@ -160,8 +160,8 @@ static __inline__ int atomic_inc_and_test(atomic_t *v)
 
 /**
  * atomic_add_negative - add and test if negative
- * @v: pointer of type atomic_t
  * @i: integer value to add
+ * @v: pointer of type atomic_t
  * 
  * Atomically adds @i to @v and returns true
  * if the result is negative, or false when
@@ -178,6 +178,31 @@ static __inline__ int atomic_add_negative(int i, atomic_t *v)
        return c;
 }
 
+/**
+ * atomic_add_return - add and return
+ * @i: integer value to add
+ * @v: pointer of type atomic_t
+ *
+ * Atomically adds @i to @v and returns @i + @v
+ */
+static __inline__ int atomic_add_return(int i, atomic_t *v)
+{
+       int __i = i;
+       __asm__ __volatile__(
+               LOCK "xaddl %0, %1;"
+               :"=r"(i)
+               :"m"(v->counter), "0"(i));
+       return i + __i;
+}
+
+static __inline__ int atomic_sub_return(int i, atomic_t *v)
+{
+       return atomic_add_return(-i,v);
+}
+
+#define atomic_inc_return(v)  (atomic_add_return(1,v))
+#define atomic_dec_return(v)  (atomic_sub_return(1,v))
+
 /* An 64bit atomic type */
 
 typedef struct { volatile long counter; } atomic64_t;
@@ -320,14 +345,14 @@ static __inline__ int atomic64_inc_and_test(atomic64_t *v)
 
 /**
  * atomic64_add_negative - add and test if negative
- * @v: pointer to atomic64_t
  * @i: integer value to add
+ * @v: pointer to type atomic64_t
  *
  * Atomically adds @i to @v and returns true
  * if the result is negative, or false when
  * result is greater than or equal to zero.
  */
-static __inline__ long atomic64_add_negative(long i, atomic64_t *v)
+static __inline__ int atomic64_add_negative(long i, atomic64_t *v)
 {
        unsigned char c;
 
@@ -339,27 +364,30 @@ static __inline__ long atomic64_add_negative(long i, atomic64_t *v)
 }
 
 /**
- * atomic_add_return - add and return
- * @v: pointer of type atomic_t
+ * atomic64_add_return - add and return
  * @i: integer value to add
+ * @v: pointer to type atomic64_t
  *
  * Atomically adds @i to @v and returns @i + @v
  */
-static __inline__ int atomic_add_return(int i, atomic_t *v)
+static __inline__ long atomic64_add_return(long i, atomic64_t *v)
 {
-       int __i = i;
+       long __i = i;
        __asm__ __volatile__(
-               LOCK "xaddl %0, %1;"
+               LOCK "xaddq %0, %1;"
                :"=r"(i)
                :"m"(v->counter), "0"(i));
        return i + __i;
 }
 
-static __inline__ int atomic_sub_return(int i, atomic_t *v)
+static __inline__ long atomic64_sub_return(long i, atomic64_t *v)
 {
-       return atomic_add_return(-i,v);
+       return atomic64_add_return(-i,v);
 }
 
+#define atomic64_inc_return(v)  (atomic64_add_return(1,v))
+#define atomic64_dec_return(v)  (atomic64_sub_return(1,v))
+
 #define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
 
 /**
@@ -381,9 +409,6 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
 })
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
-#define atomic_inc_return(v)  (atomic_add_return(1,v))
-#define atomic_dec_return(v)  (atomic_sub_return(1,v))
-
 /* These are x86-specific, used by some header files */
 #define atomic_clear_mask(mask, addr) \
 __asm__ __volatile__(LOCK "andl %0,%1" \
index 05a0d374404b0fb5ae24cfff181f6cf77aec6a75..a4d5d090945347fd89d70a2c2555bdb7112c7e06 100644 (file)
@@ -340,6 +340,20 @@ static __inline__ unsigned long __ffs(unsigned long word)
        return word;
 }
 
+/*
+ * __fls: find last bit set.
+ * @word: The word to search
+ *
+ * Undefined if no zero exists, so code should check against ~0UL first.
+ */
+static __inline__ unsigned long __fls(unsigned long word)
+{
+       __asm__("bsrq %1,%0"
+               :"=r" (word)
+               :"rm" (word));
+       return word;
+}
+
 #ifdef __KERNEL__
 
 static inline int sched_find_first_bit(const unsigned long *b)
@@ -369,6 +383,19 @@ static __inline__ int ffs(int x)
        return r+1;
 }
 
+/**
+ * fls64 - find last bit set in 64 bit word
+ * @x: the word to search
+ *
+ * This is defined the same way as fls.
+ */
+static __inline__ int fls64(__u64 x)
+{
+       if (x == 0)
+               return 0;
+       return __fls(x) + 1;
+}
+
 /**
  * hweightN - returns the hamming weight of a N-bit word
  * @x: the word to weigh
index 24dc39651bc4780d5f1166e49d31c7bbfa328503..10f8b51cec8ba3e76dadcfd74a3955d7c7e350ba 100644 (file)
@@ -56,7 +56,7 @@
                       ".section __ex_table,\"a\"\n"            \
                       " .align 8\n"                            \
                       " .quad 1b,3b\n"                         \
-                      ".previous":"=&bDS" (ret__), "=a"(a), "=d"(b)\
+                      ".previous":"=&bDS" (ret__), "=a"(*(a)), "=d"(*(b))\
                       :"c"(msr), "i"(-EIO), "0"(0));           \
          ret__; })             
 
index 40b11937180d37afc8bd32034bba45dafd6891ec..5956b23b57c247d6a18a911469a54e312007429b 100644 (file)
@@ -1,9 +1,8 @@
-#include <linux/config.h>
-
 #ifndef _ASMx86_64_PARAM_H
 #define _ASMx86_64_PARAM_H
 
 #ifdef __KERNEL__
+# include <linux/config.h>
 # define HZ            CONFIG_HZ       /* Internal kernel timer frequency */
 # define USER_HZ       100             /* .. some user interfaces are in "ticks */
 #define CLOCKS_PER_SEC        (USER_HZ)       /* like times() */
index 8a78a4ace53c5e6294b3de06d8a0b96e4851fccd..9942cc393064a825d6f64159b9135b599f592b44 100644 (file)
@@ -64,7 +64,7 @@
                     ::"a" (rw) : "memory")
 
 #define __build_write_lock_const(rw, helper) \
-       asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
+       asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
                     "jnz 2f\n" \
                     "1:\n" \
                    LOCK_SECTION_START("") \
index d39ebd5263ed4ff1fdf98739c93fe1a51750d903..7d82bc56b9fae2f123326a936699819b4a5effa3 100644 (file)
@@ -23,7 +23,7 @@ extern int __node_distance(int, int);
 
 #define cpu_to_node(cpu)               (cpu_to_node[cpu])
 #define parent_node(node)              (node)
-#define node_to_first_cpu(node)        (__ffs(node_to_cpumask[node]))
+#define node_to_first_cpu(node)        (first_cpu(node_to_cpumask[node]))
 #define node_to_cpumask(node)          (node_to_cpumask[node])
 #define pcibus_to_node(bus)            ((long)(bus->sysdata))  
 #define pcibus_to_cpumask(bus)         node_to_cpumask(pcibus_to_node(bus));
index e76ee889e21dadf98702fdc1756b540752b1b355..0a2065f1a372dc8619bfa3cbc6924b7b0c8fb2b2 100644 (file)
@@ -245,6 +245,7 @@ static __inline__ int fls (unsigned int x)
 {
        return __cntlz(x);
 }
+#define fls64(x)   generic_fls64(x)
 
 static __inline__ int
 find_next_bit(const unsigned long *addr, int size, int offset)
index e7d0593bb5766c908c906aa9528541512187b266..b203ea82a0a8b8db8e13613d15eca2d764b900bf 100644 (file)
@@ -7,7 +7,6 @@
 #define LINUX_ATMDEV_H
 
 
-#include <linux/config.h>
 #include <linux/atmapi.h>
 #include <linux/atm.h>
 #include <linux/atmioc.h>
@@ -210,6 +209,7 @@ struct atm_cirange {
 
 #ifdef __KERNEL__
 
+#include <linux/config.h>
 #include <linux/wait.h> /* wait_queue_head_t */
 #include <linux/time.h> /* struct timeval */
 #include <linux/net.h>
@@ -274,7 +274,7 @@ enum {
 
 
 enum {
-       ATM_DF_CLOSE,           /* close device when last VCC is closed */
+       ATM_DF_REMOVED,         /* device was removed from atm_devs list */
 };
 
 
@@ -415,7 +415,6 @@ struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops,
     int number,unsigned long *flags); /* number == -1: pick first available */
 struct atm_dev *atm_dev_lookup(int number);
 void atm_dev_deregister(struct atm_dev *dev);
-void shutdown_atm_dev(struct atm_dev *dev);
 void vcc_insert_socket(struct sock *sk);
 
 
@@ -457,18 +456,19 @@ static inline void atm_dev_hold(struct atm_dev *dev)
 
 static inline void atm_dev_put(struct atm_dev *dev)
 {
-       atomic_dec(&dev->refcnt);
-
-       if ((atomic_read(&dev->refcnt) == 1) &&
-           test_bit(ATM_DF_CLOSE,&dev->flags))
-               shutdown_atm_dev(dev);
+       if (atomic_dec_and_test(&dev->refcnt)) {
+               BUG_ON(!test_bit(ATM_DF_REMOVED, &dev->flags));
+               if (dev->ops->dev_close)
+                       dev->ops->dev_close(dev);
+               kfree(dev);
+       }
 }
 
 
 int atm_charge(struct atm_vcc *vcc,int truesize);
 struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
     gfp_t gfp_flags);
-int atm_pcr_goal(struct atm_trafprm *tp);
+int atm_pcr_goal(const struct atm_trafprm *tp);
 
 void vcc_release_async(struct atm_vcc *vcc, int reply);
 
index 685fd3720df5b2105c86d3be588eb9cf0061b360..b60ffe32cd21b34acfeee792d8d5ff3f66f94bd7 100644 (file)
@@ -292,6 +292,8 @@ extern struct bio *bio_clone(struct bio *, gfp_t);
 extern void bio_init(struct bio *);
 
 extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int);
+extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *,
+                          unsigned int, unsigned int);
 extern int bio_get_nr_vecs(struct block_device *);
 extern struct bio *bio_map_user(struct request_queue *, struct block_device *,
                                unsigned long, unsigned int, int);
index 38c2fb7ebe091bc7c252193a614abca2c5c244bb..6a2a19f14bb26bb3f4f49815b566c2a4e8353cab 100644 (file)
@@ -76,6 +76,15 @@ static __inline__ int generic_fls(int x)
  */
 #include <asm/bitops.h>
 
+
+static inline int generic_fls64(__u64 x)
+{
+       __u32 h = x >> 32;
+       if (h)
+               return fls(x) + 32;
+       return fls(x);
+}
+
 static __inline__ int get_bitmask_order(unsigned int count)
 {
        int order;
index a33a31e71bbc6cb02acf3409c926137c8664b882..a18500d196e12aa1c0c0c3ba8bdd8d4df6ca2036 100644 (file)
@@ -184,6 +184,7 @@ struct request {
        void *sense;
 
        unsigned int timeout;
+       int retries;
 
        /*
         * For Power Management requests
@@ -558,6 +559,7 @@ extern void blk_unregister_queue(struct gendisk *disk);
 extern void register_disk(struct gendisk *dev);
 extern void generic_make_request(struct bio *bio);
 extern void blk_put_request(struct request *);
+extern void __blk_put_request(request_queue_t *, struct request *);
 extern void blk_end_sync_rq(struct request *rq);
 extern void blk_attempt_remerge(request_queue_t *, struct request *);
 extern struct request *blk_get_request(request_queue_t *, int, gfp_t);
@@ -579,6 +581,10 @@ extern int blk_rq_map_kern(request_queue_t *, struct request *, void *, unsigned
 extern int blk_rq_map_user_iov(request_queue_t *, struct request *, struct sg_iovec *, int);
 extern int blk_execute_rq(request_queue_t *, struct gendisk *,
                          struct request *, int);
+extern void blk_execute_rq_nowait(request_queue_t *, struct gendisk *,
+                                 struct request *, int,
+                                 void (*done)(struct request *));
+
 static inline request_queue_t *bdev_get_queue(struct block_device *bdev)
 {
        return bdev->bd_disk->queue;
@@ -696,7 +702,8 @@ extern int blkdev_issue_flush(struct block_device *, sector_t *);
 
 #define MAX_PHYS_SEGMENTS 128
 #define MAX_HW_SEGMENTS 128
-#define MAX_SECTORS 255
+#define SAFE_MAX_SECTORS 255
+#define BLK_DEF_MAX_SECTORS 1024
 
 #define MAX_SEGMENT_SIZE       65536
 
index f6b5a46c5f827dbfa02f20252f4fcbf9d72100f9..0b7ecf3af78a70a854cefbac1d7e814a5000baf5 100644 (file)
@@ -13,7 +13,7 @@
 #define SMP_CACHE_BYTES L1_CACHE_BYTES
 #endif
 
-#if defined(CONFIG_X86) || defined(CONFIG_SPARC64)
+#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64)
 #define __read_mostly __attribute__((__section__(".data.read_mostly")))
 #else
 #define __read_mostly
index 70ab5631738084935a1ef5cad40a2131f4d776c0..1417de93505788152005b978c85fce08b22f5c21 100644 (file)
@@ -26,6 +26,7 @@
 #define CN_PROC_H
 
 #include <linux/types.h>
+#include <linux/time.h>
 #include <linux/connector.h>
 
 /*
@@ -65,6 +66,7 @@ struct proc_event {
                PROC_EVENT_EXIT = 0x80000000
        } what;
        __u32 cpu;
+       struct timespec timestamp;
        union { /* must be last field of proc_event struct */
                struct {
                        __u32 err;
@@ -86,12 +88,12 @@ struct proc_event {
                        pid_t process_pid;
                        pid_t process_tgid;
                        union {
-                               uid_t ruid; /* current->uid */
-                               gid_t rgid; /* current->gid */
+                               __u32 ruid; /* task uid */
+                               __u32 rgid; /* task gid */
                        } r;
                        union {
-                               uid_t euid;
-                               gid_t egid;
+                               __u32 euid;
+                               __u32 egid;
                        } e;
                } id;
 
index 43c44530ef9dc02297c6a27e8478c80e7cbf5c79..0ed1d4853c69814530920c14b9c2bb6cee445b92 100644 (file)
@@ -65,10 +65,9 @@ extern struct sysdev_class cpu_sysdev_class;
 
 #ifdef CONFIG_HOTPLUG_CPU
 /* Stop CPUs going up and down. */
-extern struct semaphore cpucontrol;
-#define lock_cpu_hotplug()     down(&cpucontrol)
-#define unlock_cpu_hotplug()   up(&cpucontrol)
-#define lock_cpu_hotplug_interruptible() down_interruptible(&cpucontrol)
+extern void lock_cpu_hotplug(void);
+extern void unlock_cpu_hotplug(void);
+extern int lock_cpu_hotplug_interruptible(void);
 #define hotcpu_notifier(fn, pri) {                             \
        static struct notifier_block fn##_nb =                  \
                { .notifier_call = fn, .priority = pri };       \
index d068176b7ad7f4d7242e2417f87e3f67043b1d23..c31650df92412de9c6514e81bc5955e8f8a02dcb 100644 (file)
@@ -256,6 +256,16 @@ int cpufreq_update_policy(unsigned int cpu);
 /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
 unsigned int cpufreq_get(unsigned int cpu);
 
+/* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
+#ifdef CONFIG_CPU_FREQ
+unsigned int cpufreq_quick_get(unsigned int cpu);
+#else
+static inline unsigned int cpufreq_quick_get(unsigned int cpu)
+{
+       return 0;
+}
+#endif
+
 
 /*********************************************************************
  *                       CPUFREQ DEFAULT GOVERNOR                    *
index 71fab4311e92624ff985793df2d9c14777b7e46c..088529f549657214b9ce1352b7d2210a2caadaec 100644 (file)
@@ -192,10 +192,9 @@ enum {
 #include <linux/workqueue.h>
 
 #include <net/inet_connection_sock.h>
+#include <net/inet_sock.h>
 #include <net/inet_timewait_sock.h>
-#include <net/sock.h>
 #include <net/tcp_states.h>
-#include <net/tcp.h>
 
 enum dccp_state {
        DCCP_OPEN       = TCP_ESTABLISHED,
@@ -408,8 +407,6 @@ struct dccp_ackvec;
  * @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss
  * @dccps_timestamp_time - time of latest TIMESTAMP option
  * @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option
- * @dccps_ext_header_len - network protocol overhead (IP/IPv6 options)
- * @dccps_pmtu_cookie - Last pmtu seen by socket
  * @dccps_packet_size - Set thru setsockopt
  * @dccps_role - Role of this sock, one of %dccp_role
  * @dccps_ndp_count - number of Non Data Packets since last data packet
@@ -434,8 +431,6 @@ struct dccp_sock {
        __u32                           dccps_timestamp_echo;
        __u32                           dccps_packet_size;
        unsigned long                   dccps_ndp_count;
-       __u16                           dccps_ext_header_len;
-       __u32                           dccps_pmtu_cookie;
        __u32                           dccps_mss_cache;
        struct dccp_options             dccps_options;
        struct dccp_ackvec              *dccps_hc_rx_ackvec;
index cc314443f1c4e37d086ccbc66854274bbdfafa4f..2b8797084685fcaacbb219036e2a29dfcea2c85c 100644 (file)
 
 
 typedef enum {
-        AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */
+       AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */
        AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */
 } audio_stream_source_t;
 
 
 typedef enum {
        AUDIO_STOPPED,      /* Device is stopped */
-        AUDIO_PLAYING,      /* Device is currently playing */
+       AUDIO_PLAYING,      /* Device is currently playing */
        AUDIO_PAUSED        /* Device is paused */
 } audio_play_state_t;
 
 
 typedef enum {
-        AUDIO_STEREO,
-        AUDIO_MONO_LEFT,
+       AUDIO_STEREO,
+       AUDIO_MONO_LEFT,
        AUDIO_MONO_RIGHT
 } audio_channel_select_t;
 
 
 typedef struct audio_mixer {
-        unsigned int volume_left;
-        unsigned int volume_right;
+       unsigned int volume_left;
+       unsigned int volume_right;
   // what else do we need? bass, pass-through, ...
 } audio_mixer_t;
 
 
 typedef struct audio_status {
-        int                    AV_sync_state;  /* sync audio and video? */
-        int                    mute_state;     /* audio is muted */
-        audio_play_state_t     play_state;     /* current playback state */
-        audio_stream_source_t  stream_source;  /* current stream source */
-        audio_channel_select_t channel_select; /* currently selected channel */
-        int                    bypass_mode;    /* pass on audio data to */
+       int                    AV_sync_state;  /* sync audio and video? */
+       int                    mute_state;     /* audio is muted */
+       audio_play_state_t     play_state;     /* current playback state */
+       audio_stream_source_t  stream_source;  /* current stream source */
+       audio_channel_select_t channel_select; /* currently selected channel */
+       int                    bypass_mode;    /* pass on audio data to */
        audio_mixer_t          mixer_state;    /* current mixer state */
 } audio_status_t;                              /* separate decoder hardware */
 
@@ -74,8 +74,8 @@ struct audio_karaoke{  /* if Vocal1 or Vocal2 are non-zero, they get mixed  */
        int vocal1;    /* into left and right t at 70% each */
        int vocal2;    /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/
        int melody;    /* mixed into the left channel and */
-                       /* Vocal2 into the right channel at 100% each. */
-                       /* if Melody is non-zero, the melody channel gets mixed*/
+                      /* Vocal2 into the right channel at 100% each. */
+                      /* if Melody is non-zero, the melody channel gets mixed*/
 } audio_karaoke_t;     /* into left and right  */
 
 
index 558af0cc76927d7d764b7f4b43beaf373607e8ba..c18537f3e449bb219a1b48f1b9e46c1c3aa00820 100644 (file)
 /* slot interface types and info */
 
 typedef struct ca_slot_info {
-        int num;               /* slot number */
+       int num;               /* slot number */
 
-        int type;              /* CA interface this slot supports */
+       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;
+       unsigned int flags;
 #define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */
 #define CA_CI_MODULE_READY   2
 } ca_slot_info_t;
@@ -45,37 +45,37 @@ typedef struct ca_slot_info {
 /* descrambler types and info */
 
 typedef struct ca_descr_info {
-        unsigned int num;          /* number of available descramblers (keys) */
-        unsigned int type;         /* type of supported scrambling system */
+       unsigned int num;          /* number of available descramblers (keys) */
+       unsigned int type;         /* type of supported scrambling system */
 #define CA_ECD           1
 #define CA_NDS           2
 #define CA_DSS           4
 } ca_descr_info_t;
 
 typedef struct ca_caps {
-        unsigned int slot_num;     /* total number of CA card and module slots */
-        unsigned int slot_type;    /* OR of all supported types */
-        unsigned int descr_num;    /* total number of descrambler slots (keys) */
-        unsigned int descr_type;   /* OR of all supported types */
+       unsigned int slot_num;     /* total number of CA card and module slots */
+       unsigned int slot_type;    /* OR of all supported types */
+       unsigned int descr_num;    /* total number of descrambler slots (keys) */
+       unsigned int descr_type;   /* OR of all supported types */
 } ca_caps_t;
 
 /* a message to/from a CI-CAM */
 typedef struct ca_msg {
-        unsigned int index;
-        unsigned int type;
-        unsigned int length;
-        unsigned char msg[256];
+       unsigned int index;
+       unsigned int type;
+       unsigned int length;
+       unsigned char msg[256];
 } ca_msg_t;
 
 typedef struct ca_descr {
-        unsigned int index;
-        unsigned int parity;   /* 0 == even, 1 == odd */
-        unsigned char cw[8];
+       unsigned int index;
+       unsigned int parity;    /* 0 == even, 1 == odd */
+       unsigned char cw[8];
 } ca_descr_t;
 
 typedef struct ca_pid {
-        unsigned int pid;
-        int index;             /* -1 == disable*/
+       unsigned int pid;
+       int index;              /* -1 == disable*/
 } ca_pid_t;
 
 #define CA_RESET          _IO('o', 128)
index ce3f829da82cf5a7943fe7c218465cf10f3cdc01..2787b8a22ff1b772e2bc42cddeff33f6512de2fa 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * dmx.h
  *
  * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
@@ -38,10 +38,10 @@ typedef enum
 {
        DMX_OUT_DECODER, /* Streaming directly to decoder. */
        DMX_OUT_TAP,     /* Output going to a memory buffer */
-                        /* (to be retrieved via the read command).*/
+                        /* (to be retrieved via the read command).*/
        DMX_OUT_TS_TAP   /* Output multiplexed into a new TS  */
-                        /* (to be retrieved by reading from the */
-                        /* logical DVR device).                 */
+                        /* (to be retrieved by reading from the */
+                        /* logical DVR device).                 */
 } dmx_output_t;
 
 
@@ -54,25 +54,25 @@ typedef enum
 
 typedef enum
 {
-        DMX_PES_AUDIO0,
+       DMX_PES_AUDIO0,
        DMX_PES_VIDEO0,
        DMX_PES_TELETEXT0,
        DMX_PES_SUBTITLE0,
        DMX_PES_PCR0,
 
-        DMX_PES_AUDIO1,
+       DMX_PES_AUDIO1,
        DMX_PES_VIDEO1,
        DMX_PES_TELETEXT1,
        DMX_PES_SUBTITLE1,
        DMX_PES_PCR1,
 
-        DMX_PES_AUDIO2,
+       DMX_PES_AUDIO2,
        DMX_PES_VIDEO2,
        DMX_PES_TELETEXT2,
        DMX_PES_SUBTITLE2,
        DMX_PES_PCR2,
 
-        DMX_PES_AUDIO3,
+       DMX_PES_AUDIO3,
        DMX_PES_VIDEO3,
        DMX_PES_TELETEXT3,
        DMX_PES_SUBTITLE3,
@@ -90,8 +90,8 @@ typedef enum
 
 typedef enum
 {
-        DMX_SCRAMBLING_EV,
-        DMX_FRONTEND_EV
+       DMX_SCRAMBLING_EV,
+       DMX_FRONTEND_EV
 } dmx_event_t;
 
 
index 0e1973d54a6b1e5e729b511fb3beca13d1b3dcf4..880e68435832b9040de2ba943c68a1f1af3cf837 100644 (file)
@@ -98,43 +98,43 @@ typedef enum {
 } OSD_Command;
 
 typedef struct osd_cmd_s {
-        OSD_Command cmd;
-        int x0;
-        int y0;
-        int x1;
-        int y1;
-        int color;
-        void __user *data;
+       OSD_Command cmd;
+       int x0;
+       int y0;
+       int x1;
+       int y1;
+       int color;
+       void __user *data;
 } osd_cmd_t;
 
 /* OSD_OpenRaw: set 'color' to desired window type */
 typedef enum {
-        OSD_BITMAP1,           /* 1 bit bitmap */
-        OSD_BITMAP2,           /* 2 bit bitmap */
-        OSD_BITMAP4,           /* 4 bit bitmap */
-        OSD_BITMAP8,           /* 8 bit bitmap */
-        OSD_BITMAP1HR,         /* 1 Bit bitmap half resolution */
-        OSD_BITMAP2HR,         /* 2 bit bitmap half resolution */
-        OSD_BITMAP4HR,         /* 4 bit bitmap half resolution */
-        OSD_BITMAP8HR,         /* 8 bit bitmap half resolution */
-        OSD_YCRCB422,          /* 4:2:2 YCRCB Graphic Display */
-        OSD_YCRCB444,          /* 4:4:4 YCRCB Graphic Display */
-        OSD_YCRCB444HR,        /* 4:4:4 YCRCB graphic half resolution */
-        OSD_VIDEOTSIZE,        /* True Size Normal MPEG Video Display */
-        OSD_VIDEOHSIZE,        /* MPEG Video Display Half Resolution */
-        OSD_VIDEOQSIZE,        /* MPEG Video Display Quarter Resolution */
-        OSD_VIDEODSIZE,        /* MPEG Video Display Double Resolution */
-        OSD_VIDEOTHSIZE,       /* True Size MPEG Video Display Half Resolution */
-        OSD_VIDEOTQSIZE,       /* True Size MPEG Video Display Quarter Resolution*/
-        OSD_VIDEOTDSIZE,       /* True Size MPEG Video Display Double Resolution */
-        OSD_VIDEONSIZE,        /* Full Size MPEG Video Display */
-        OSD_CURSOR             /* Cursor */
+       OSD_BITMAP1,           /* 1 bit bitmap */
+       OSD_BITMAP2,           /* 2 bit bitmap */
+       OSD_BITMAP4,           /* 4 bit bitmap */
+       OSD_BITMAP8,           /* 8 bit bitmap */
+       OSD_BITMAP1HR,         /* 1 Bit bitmap half resolution */
+       OSD_BITMAP2HR,         /* 2 bit bitmap half resolution */
+       OSD_BITMAP4HR,         /* 4 bit bitmap half resolution */
+       OSD_BITMAP8HR,         /* 8 bit bitmap half resolution */
+       OSD_YCRCB422,          /* 4:2:2 YCRCB Graphic Display */
+       OSD_YCRCB444,          /* 4:4:4 YCRCB Graphic Display */
+       OSD_YCRCB444HR,        /* 4:4:4 YCRCB graphic half resolution */
+       OSD_VIDEOTSIZE,        /* True Size Normal MPEG Video Display */
+       OSD_VIDEOHSIZE,        /* MPEG Video Display Half Resolution */
+       OSD_VIDEOQSIZE,        /* MPEG Video Display Quarter Resolution */
+       OSD_VIDEODSIZE,        /* MPEG Video Display Double Resolution */
+       OSD_VIDEOTHSIZE,       /* True Size MPEG Video Display Half Resolution */
+       OSD_VIDEOTQSIZE,       /* True Size MPEG Video Display Quarter Resolution*/
+       OSD_VIDEOTDSIZE,       /* True Size MPEG Video Display Double Resolution */
+       OSD_VIDEONSIZE,        /* Full Size MPEG Video Display */
+       OSD_CURSOR             /* Cursor */
 } osd_raw_window_t;
 
 typedef struct osd_cap_s {
-        int  cmd;
+       int  cmd;
 #define OSD_CAP_MEMSIZE         1  /* memory size */
-        long val;
+       long val;
 } osd_cap_t;
 
 
index 941045e9ab891fed47c1088d97f6cb64b30bb479..b1999bfeaa5621556e0f98cd86e1a4fa9b59d745 100644 (file)
@@ -36,7 +36,7 @@
 
 typedef enum {
        VIDEO_FORMAT_4_3,     /* Select 4:3 format */
-        VIDEO_FORMAT_16_9,    /* Select 16:9 format. */
+       VIDEO_FORMAT_16_9,    /* Select 16:9 format. */
        VIDEO_FORMAT_221_1    /* 2.21:1 */
 } video_format_t;
 
@@ -54,7 +54,7 @@ typedef enum {
 
 
 typedef enum {
-        VIDEO_PAN_SCAN,       /* use pan and scan format */
+       VIDEO_PAN_SCAN,       /* use pan and scan format */
        VIDEO_LETTER_BOX,     /* use letterbox format */
        VIDEO_CENTER_CUT_OUT  /* use center cut out format */
 } video_displayformat_t;
@@ -66,7 +66,7 @@ typedef struct {
 } video_size_t;
 
 typedef enum {
-        VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */
+       VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */
        VIDEO_SOURCE_MEMORY /* If this source is selected, the stream
                               comes from the user through the write
                               system call */
@@ -75,35 +75,35 @@ typedef enum {
 
 typedef enum {
        VIDEO_STOPPED, /* Video is stopped */
-        VIDEO_PLAYING, /* Video is currently playing */
+       VIDEO_PLAYING, /* Video is currently playing */
        VIDEO_FREEZED  /* Video is freezed */
 } video_play_state_t;
 
 
 struct video_event {
-        int32_t type;
+       int32_t type;
 #define VIDEO_EVENT_SIZE_CHANGED       1
 #define VIDEO_EVENT_FRAME_RATE_CHANGED 2
-        time_t timestamp;
+       time_t timestamp;
        union {
-               video_size_t size;
+               video_size_t size;
                unsigned int frame_rate;        /* in frames per 1000sec */
        } u;
 };
 
 
 struct video_status {
-        int                   video_blank;   /* blank video on freeze? */
-        video_play_state_t    play_state;    /* current state of playback */
-        video_stream_source_t stream_source; /* current source (demux/memory) */
-        video_format_t        video_format;  /* current aspect ratio of stream*/
-        video_displayformat_t display_format;/* selected cropping mode */
+       int                   video_blank;   /* blank video on freeze? */
+       video_play_state_t    play_state;    /* current state of playback */
+       video_stream_source_t stream_source; /* current source (demux/memory) */
+       video_format_t        video_format;  /* current aspect ratio of stream*/
+       video_displayformat_t display_format;/* selected cropping mode */
 };
 
 
 struct video_still_picture {
-        char __user *iFrame;        /* pointer to a single iframe in memory */
-        int32_t size;
+       char __user *iFrame;        /* pointer to a single iframe in memory */
+       int32_t size;
 };
 
 
@@ -111,19 +111,19 @@ typedef
 struct video_highlight {
        int     active;      /*    1=show highlight, 0=hide highlight */
        uint8_t contrast1;   /*    7- 4  Pattern pixel contrast */
-                             /*    3- 0  Background pixel contrast */
+                            /*    3- 0  Background pixel contrast */
        uint8_t contrast2;   /*    7- 4  Emphasis pixel-2 contrast */
-                             /*    3- 0  Emphasis pixel-1 contrast */
+                            /*    3- 0  Emphasis pixel-1 contrast */
        uint8_t color1;      /*    7- 4  Pattern pixel color */
-                             /*    3- 0  Background pixel color */
+                            /*    3- 0  Background pixel color */
        uint8_t color2;      /*    7- 4  Emphasis pixel-2 color */
-                             /*    3- 0  Emphasis pixel-1 color */
+                            /*    3- 0  Emphasis pixel-1 color */
        uint32_t ypos;       /*   23-22  auto action mode */
-                             /*   21-12  start y */
-                             /*    9- 0  end y */
+                            /*   21-12  start y */
+                            /*    9- 0  end y */
        uint32_t xpos;       /*   23-22  button color number */
-                             /*   21-12  start x */
-                             /*    9- 0  end x */
+                            /*   21-12  start x */
+                            /*    9- 0  end x */
 } video_highlight_t;
 
 
index 5f49a30eb6f25d92a5d616e6c0889df7787b0d01..745c988359c0bb29628609062c7d7a59c424ba45 100644 (file)
@@ -63,10 +63,11 @@ static inline int is_zero_ether_addr(const u8 *addr)
  * @addr: Pointer to a six-byte array containing the Ethernet address
  *
  * Return true if the address is a multicast address.
+ * By definition the broadcast address is also a multicast address.
  */
 static inline int is_multicast_ether_addr(const u8 *addr)
 {
-       return ((addr[0] != 0xff) && (0x01 & addr[0]));
+       return (0x01 & addr[0]);
 }
 
 /**
index 04a58f33ec53b5e33d98d046049b3b7d4fe512b3..a973be2cfe61abb2fb774bc5409225556649c2d1 100644 (file)
@@ -617,6 +617,12 @@ struct fb_ops {
 
        /* perform fb specific mmap */
        int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma);
+
+       /* save current hardware state */
+       void (*fb_save_state)(struct fb_info *info);
+
+       /* restore saved state */
+       void (*fb_restore_state)(struct fb_info *info);
 };
 
 #ifdef CONFIG_FB_TILEBLITTING
@@ -726,6 +732,18 @@ struct fb_tile_ops {
                                                  from userspace */
 #define FBINFO_MISC_TILEBLITTING       0x20000 /* use tile blitting */
 
+/* A driver may set this flag to indicate that it does want a set_par to be
+ * called every time when fbcon_switch is executed. The advantage is that with
+ * this flag set you can really be shure that set_par is always called before
+ * any of the functions dependant on the correct hardware state or altering
+ * that state, even if you are using some broken X releases. The disadvantage
+ * is that it introduces unwanted delays to every console switch if set_par
+ * is slow. It is a good idea to try this flag in the drivers initialization
+ * code whenever there is a bug report related to switching between X and the
+ * framebuffer console.
+ */
+#define FBINFO_MISC_ALWAYS_SETPAR   0x40000
+
 struct fb_info {
        int node;
        int flags;
@@ -815,6 +833,18 @@ struct fb_info {
 #define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b))
 #define fb_memset memset
 
+#endif
+
+#if defined (__BIG_ENDIAN)
+#define FB_LEFT_POS(bpp)          (32 - bpp)
+#define FB_SHIFT_HIGH(val, bits)  ((val) >> (bits))
+#define FB_SHIFT_LOW(val, bits)   ((val) << (bits))
+#define FB_BIT_NR(b)              (7 - (b))
+#else
+#define FB_LEFT_POS(bpp)          (0)
+#define FB_SHIFT_HIGH(val, bits)  ((val) << (bits))
+#define FB_SHIFT_LOW(val, bits)   ((val) >> (bits))
+#define FB_BIT_NR(b)              (b)
 #endif
 
     /*
index 313dfe9b443abb0d98b890aae74158e580db3ba8..8b2eab90abb6ef690fb4ba12db6e9c287d6c2865 100644 (file)
@@ -11,7 +11,7 @@ struct vm_area_struct;
 /*
  * GFP bitmasks..
  */
-/* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low two bits) */
+/* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low three bits) */
 #define __GFP_DMA      ((__force gfp_t)0x01u)
 #define __GFP_HIGHMEM  ((__force gfp_t)0x02u)
 #ifdef CONFIG_DMA_IS_DMA32
@@ -74,7 +74,12 @@ struct vm_area_struct;
 #define GFP_DMA32      __GFP_DMA32
 
 
-#define gfp_zone(mask) ((__force int)((mask) & (__force gfp_t)GFP_ZONEMASK))
+static inline int gfp_zone(gfp_t gfp)
+{
+       int zone = GFP_ZONEMASK & (__force int) gfp;
+       BUG_ON(zone >= GFP_ZONETYPES);
+       return zone;
+}
 
 /*
  * There is only one page-allocator function, and two main namespaces to
index b5d660089de42f8b91b420dd2cf15e1ba9d5f97d..2b54eac738ea236f3babec4fbb7b4053d2cba82a 100644 (file)
 /*
  * Define standard taskfile in/out register
  */
-#define IDE_TASKFILE_STD_OUT_FLAGS     0xFE
 #define IDE_TASKFILE_STD_IN_FLAGS      0xFE
-#define IDE_HOB_STD_OUT_FLAGS          0x3C
 #define IDE_HOB_STD_IN_FLAGS           0x3C
+#ifndef __KERNEL__
+#define IDE_TASKFILE_STD_OUT_FLAGS     0xFE
+#define IDE_HOB_STD_OUT_FLAGS          0x3C
+#endif
 
 typedef unsigned char task_ioreg_t;
 typedef unsigned long sata_ioreg_t;
index 1543daaa9c5ed962ca5e43b3df6add58cacd38d9..006c81ef4d506013c5272e5544abf99fc3df5cc2 100644 (file)
 #define I2C_DRIVERID_SAA7127   72      /* saa7124 video encoder        */
 #define I2C_DRIVERID_SAA711X   73      /* saa711x video encoders       */
 #define I2C_DRIVERID_AKITAIOEXP        74      /* IO Expander on Sharp SL-C1000 */
+#define I2C_DRIVERID_INFRARED  75      /* I2C InfraRed on Video boards */
 
 #define I2C_DRIVERID_EXP0      0xF0    /* experimental use id's        */
 #define I2C_DRIVERID_EXP1      0xF1
index e99019057ba6166f7b2140cd67528c8c92064ad5..7b6a6a58e465e950f6d53ab6422851d6a6c6f70f 100644 (file)
 #include <asm/io.h>
 #include <asm/semaphore.h>
 
-/*
- * This is the multiple IDE interface driver, as evolved from hd.c.
- * It supports up to four IDE interfaces, on one or more IRQs (usually 14 & 15).
- * There can be up to two drives per interface, as per the ATA-2 spec.
- *
- * Primary i/f:    ide0: major=3;  (hda)         minor=0; (hdb)         minor=64
- * Secondary i/f:  ide1: major=22; (hdc or hd1a) minor=0; (hdd or hd1b) minor=64
- * Tertiary i/f:   ide2: major=33; (hde)         minor=0; (hdf)         minor=64
- * Quaternary i/f: ide3: major=34; (hdg)         minor=0; (hdh)         minor=64
- */
-
 /******************************************************************************
  * IDE driver configuration options (play with these as desired):
  *
@@ -193,11 +182,6 @@ typedef unsigned char      byte;   /* used everywhere */
 #define WAIT_CMD       (10*HZ) /* 10sec  - maximum wait for an IRQ to happen */
 #define WAIT_MIN_SLEEP (2*HZ/100)      /* 20msec - minimum sleep time */
 
-#define HOST(hwif,chipset)                                     \
-{                                                              \
-       return ((hwif)->chipset == chipset) ? 1 : 0;            \
-}
-
 /*
  * Check for an interrupt and acknowledge the interrupt status
  */
@@ -390,45 +374,6 @@ typedef union {
        } b;
 } ata_nsector_t, ata_data_t, atapi_bcount_t, ata_index_t;
 
-/*
- * ATA-IDE Error Register
- *
- * mark                : Bad address mark
- * tzero       : Couldn't find track 0
- * abrt                : Aborted Command
- * mcr         : Media Change Request
- * id          : ID field not found
- * mce         : Media Change Event
- * ecc         : Uncorrectable ECC error
- * bdd         : dual meaing
- */
-typedef union {
-       unsigned all                    :8;
-       struct {
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-               unsigned mark           :1;
-               unsigned tzero          :1;
-               unsigned abrt           :1;
-               unsigned mcr            :1;
-               unsigned id             :1;
-               unsigned mce            :1;
-               unsigned ecc            :1;
-               unsigned bdd            :1;
-#elif defined(__BIG_ENDIAN_BITFIELD)
-               unsigned bdd            :1;
-               unsigned ecc            :1;
-               unsigned mce            :1;
-               unsigned id             :1;
-               unsigned mcr            :1;
-               unsigned abrt           :1;
-               unsigned tzero          :1;
-               unsigned mark           :1;
-#else
-#error "Please fix <asm/byteorder.h>"
-#endif
-       } b;
-} ata_error_t;
-
 /*
  * ATA-IDE Select Register, aka Device-Head
  *
@@ -503,39 +448,6 @@ typedef union {
        } b;
 } ata_status_t, atapi_status_t;
 
-/*
- * ATA-IDE Control Register
- *
- * bit0                : Should be set to zero
- * nIEN                : device INTRQ to host
- * SRST                : host soft reset bit
- * bit3                : ATA-2 thingy, Should be set to 1
- * reserved456 : Reserved
- * HOB         : 48-bit address ordering, High Ordered Bit
- */
-typedef union {
-       unsigned all                    : 8;
-       struct {
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-               unsigned bit0           : 1;
-               unsigned nIEN           : 1;
-               unsigned SRST           : 1;
-               unsigned bit3           : 1;
-               unsigned reserved456    : 3;
-               unsigned HOB            : 1;
-#elif defined(__BIG_ENDIAN_BITFIELD)
-               unsigned HOB            : 1;
-               unsigned reserved456    : 3;
-               unsigned bit3           : 1;
-               unsigned SRST           : 1;
-               unsigned nIEN           : 1;
-               unsigned bit0           : 1;
-#else
-#error "Please fix <asm/byteorder.h>"
-#endif
-       } b;
-} ata_control_t;
-
 /*
  * ATAPI Feature Register
  *
@@ -617,39 +529,6 @@ typedef union {
        } b;
 } atapi_error_t;
 
-/*
- * ATAPI floppy Drive Select Register
- *
- * sam_lun     : Logical unit number
- * reserved3   : Reserved
- * drv         : The responding drive will be drive 0 (0) or drive 1 (1)
- * one5                : Should be set to 1
- * reserved6   : Reserved
- * one7                : Should be set to 1
- */
-typedef union {
-       unsigned all                    :8;
-       struct {
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-               unsigned sam_lun        :3;
-               unsigned reserved3      :1;
-               unsigned drv            :1;
-               unsigned one5           :1;
-               unsigned reserved6      :1;
-               unsigned one7           :1;
-#elif defined(__BIG_ENDIAN_BITFIELD)
-               unsigned one7           :1;
-               unsigned reserved6      :1;
-               unsigned one5           :1;
-               unsigned drv            :1;
-               unsigned reserved3      :1;
-               unsigned sam_lun        :3;
-#else
-#error "Please fix <asm/byteorder.h>"
-#endif
-       } b;
-} atapi_select_t;
-
 /*
  * Status returned from various ide_ functions
  */
@@ -1101,10 +980,7 @@ typedef struct ide_driver_s {
        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;
-       void            (*ata_prebuilder)(ide_drive_t *);
-       void            (*atapi_prebuilder)(ide_drive_t *);
        struct device_driver    gen_driver;
 } ide_driver_t;
 
@@ -1201,37 +1077,11 @@ extern u64 ide_get_error_location(ide_drive_t *, char *);
  */
 typedef enum {
        ide_wait,       /* insert rq at end of list, and wait for it */
-       ide_next,       /* insert rq immediately after current request */
        ide_preempt,    /* insert rq in front of current request */
        ide_head_wait,  /* insert rq in front of current request and wait for it */
        ide_end         /* insert rq at end of list, but don't wait for it */
 } ide_action_t;
 
-/*
- * This function issues a special IDE device request
- * onto the request queue.
- *
- * If action is ide_wait, then the rq is queued at the end of the
- * request queue, and the function sleeps until it has been processed.
- * This is for use when invoked from an ioctl handler.
- *
- * If action is ide_preempt, then the rq is queued at the head of
- * the request queue, displacing the currently-being-processed
- * request and this function returns immediately without waiting
- * for the new rq to be completed.  This is VERY DANGEROUS, and is
- * intended for careful use by the ATAPI tape/cdrom driver code.
- *
- * If action is ide_next, then the rq is queued immediately after
- * the currently-being-processed-request (if any), and the function
- * returns without waiting for the new rq to be completed.  As above,
- * This is VERY DANGEROUS, and is intended for careful use by the
- * ATAPI tape/cdrom driver code.
- *
- * If action is ide_end, then the rq is queued at the end of the
- * request queue, and the function returns immediately without waiting
- * for the new rq to be completed. This is again intended for careful
- * use by the ATAPI tape/cdrom driver code.
- */
 extern int ide_do_drive_cmd(ide_drive_t *, struct request *, ide_action_t);
 
 /*
@@ -1324,7 +1174,6 @@ extern int ide_spin_wait_hwgroup(ide_drive_t *);
 extern void ide_timer_expiry(unsigned long);
 extern irqreturn_t ide_intr(int irq, void *dev_id, struct pt_regs *regs);
 extern void do_ide_request(request_queue_t *);
-extern void ide_init_subdrivers(void);
 
 void ide_init_disk(struct gendisk *, ide_drive_t *);
 
@@ -1397,6 +1246,12 @@ void ide_init_sg_cmd(ide_drive_t *, struct request *);
 #define GOOD_DMA_DRIVE         1
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
+struct drive_list_entry {
+       const char *id_model;
+       const char *id_firmware;
+};
+
+int ide_in_drive_list(struct hd_driveid *, const struct drive_list_entry *);
 int __ide_dma_bad_drive(ide_drive_t *);
 int __ide_dma_good_drive(ide_drive_t *);
 int ide_use_dma(ide_drive_t *);
index e677f73f13dd7f5a6db8455152c7f90faabf8f50..4fab3d0a4bcef5e7d6e0c9047b30b09afdead916 100644 (file)
@@ -157,8 +157,7 @@ struct pppox_proto {
 extern int register_pppox_proto(int proto_num, struct pppox_proto *pp);
 extern void unregister_pppox_proto(int proto_num);
 extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */
-extern int pppox_channel_ioctl(struct ppp_channel *pc, unsigned int cmd,
-                              unsigned long arg);
+extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
 
 /* PPPoX socket states */
 enum {
index ee5b239092edbb03dee1765dd7919246bf4a2400..267c88b5f742592b69dabf70bfcdfb2c471ec706 100644 (file)
@@ -47,6 +47,8 @@ struct inotify_event {
 #define IN_MOVE                        (IN_MOVED_FROM | IN_MOVED_TO) /* moves */
 
 /* special flags */
+#define IN_ONLYDIR             0x01000000      /* only watch the path if it is a directory */
+#define IN_DONT_FOLLOW         0x02000000      /* don't follow a sym link */
 #define IN_MASK_ADD            0x20000000      /* add to the mask of an already existing watch */
 #define IN_ISDIR               0x40000000      /* event occurred against dir */
 #define IN_ONESHOT             0x80000000      /* only send event once */
index 33e8a19a1a0fbaec33122f4f931c3d577fc975c9..9e2eb9a602ebdc7154e0ef3a629a9868e219e8c4 100644 (file)
@@ -16,6 +16,7 @@
  */
 #ifndef _LINUX_IP_H
 #define _LINUX_IP_H
+#include <linux/types.h>
 #include <asm/byteorder.h>
 
 #define IPTOS_TOS_MASK         0x1E
 #define        IPOPT_TS_TSANDADDR      1               /* timestamps and addresses */
 #define        IPOPT_TS_PRESPEC        3               /* specified modules only */
 
-#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>
-
-struct ip_options {
-  __u32                faddr;                          /* Saved first hop address */
-  unsigned char        optlen;
-  unsigned char srr;
-  unsigned char rr;
-  unsigned char ts;
-  unsigned char is_setbyuser:1,                        /* Set by setsockopt?                   */
-                is_data:1,                     /* Options in __data, rather than skb   */
-                is_strictroute:1,              /* Strict source route                  */
-                srr_is_hit:1,                  /* Packet destination addr was our one  */
-                is_changed:1,                  /* IP checksum more not valid           */      
-                rr_needaddr:1,                 /* Need to record addr of outgoing dev  */
-                ts_needtime:1,                 /* Need to record timestamp             */
-                ts_needaddr:1;                 /* Need to record addr of outgoing dev  */
-  unsigned char router_alert;
-  unsigned char __pad1;
-  unsigned char __pad2;
-  unsigned char __data[0];
-};
-
-#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 {
-       /* sk and pinet6 has to be the first two members of inet_sock */
-       struct sock             sk;
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-       struct ipv6_pinfo       *pinet6;
-#endif
-       /* Socket demultiplex comparisons on incoming packets. */
-       __u32                   daddr;          /* Foreign IPv4 addr */
-       __u32                   rcv_saddr;      /* Bound local IPv4 addr */
-       __u16                   dport;          /* Destination port */
-       __u16                   num;            /* Local port */
-       __u32                   saddr;          /* Sending source */
-       __s16                   uc_ttl;         /* Unicast TTL */
-       __u16                   cmsg_flags;
-       struct ip_options       *opt;
-       __u16                   sport;          /* Source port */
-       __u16                   id;             /* ID counter for DF pkts */
-       __u8                    tos;            /* TOS */
-       __u8                    mc_ttl;         /* Multicasting TTL */
-       __u8                    pmtudisc;
-       unsigned                recverr : 1,
-                               freebind : 1,
-                               hdrincl : 1,
-                               mc_loop : 1;
-       int                     mc_index;       /* Multicast device index */
-       __u32                   mc_addr;
-       struct ip_mc_socklist   *mc_list;       /* Group array */
-       /*
-        * Following members are used to retain the infomation to build
-        * an ip header on each ip fragmentation while the socket is corked.
-        */
-       struct {
-               unsigned int            flags;
-               unsigned int            fragsize;
-               struct ip_options       *opt;
-               struct rtable           *rt;
-               int                     length; /* Total length of all frames */
-               u32                     addr;
-               struct flowi            fl;
-       } cork;
-};
-
-#define IPCORK_OPT     1       /* ip-options has been held in ipcork.opt */
-#define IPCORK_ALLFRAG 2       /* always fragment (for ipv6 for now) */
-
-static inline struct inet_sock *inet_sk(const struct sock *sk)
-{
-       return (struct inet_sock *)sk;
-}
-
-static inline void __inet_sk_copy_descendant(struct sock *sk_to,
-                                            const struct sock *sk_from,
-                                            const int ancestor_size)
-{
-       memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,
-              sk_from->sk_prot->obj_size - ancestor_size);
-}
-#if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
-static inline void inet_sk_copy_descendant(struct sock *sk_to,
-                                          const struct sock *sk_from)
-{
-       __inet_sk_copy_descendant(sk_to, sk_from, sizeof(struct inet_sock));
-}
-#endif
-#endif
-
-extern int inet_sk_rebuild_header(struct sock *sk);
-
 struct iphdr {
 #if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8    ihl:4,
index e0b922785d985e5c2a03598303ad011cb0dbc9d4..93bbed5c6cf426a61683ec8204363f75f67fc08b 100644 (file)
@@ -171,12 +171,13 @@ enum {
 };
 
 #ifdef __KERNEL__
-#include <linux/in6.h>          /* struct sockaddr_in6 */
 #include <linux/icmpv6.h>
-#include <net/if_inet6.h>       /* struct ipv6_mc_socklist */
 #include <linux/tcp.h>
 #include <linux/udp.h>
 
+#include <net/if_inet6.h>       /* struct ipv6_mc_socklist */
+#include <net/inet_sock.h>
+
 /* 
    This structure contains results of exthdrs parsing
    as offsets from skb->nh.
@@ -199,18 +200,17 @@ static inline int inet6_iif(const struct sk_buff *skb)
        return IP6CB(skb)->iif;
 }
 
-struct tcp6_request_sock {
-       struct tcp_request_sock req;
+struct inet6_request_sock {
        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 tcp6_request_sock {
+       struct tcp_request_sock   tcp6rsk_tcp;
+       struct inet6_request_sock tcp6rsk_inet6;
+};
 
 /**
  * struct ipv6_pinfo - ipv6 private area
@@ -298,12 +298,36 @@ struct tcp6_sock {
        struct ipv6_pinfo inet6;
 };
 
+extern int inet6_sk_rebuild_header(struct sock *sk);
+
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
 {
        return inet_sk(__sk)->pinet6;
 }
 
+static inline struct inet6_request_sock *
+                       inet6_rsk(const struct request_sock *rsk)
+{
+       return (struct inet6_request_sock *)(((u8 *)rsk) +
+                                            inet_rsk(rsk)->inet6_rsk_offset);
+}
+
+static inline u32 inet6_rsk_offset(struct request_sock *rsk)
+{
+       return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock);
+}
+
+static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops)
+{
+       struct request_sock *req = reqsk_alloc(ops);
+
+       if (req != NULL)
+               inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req);
+
+       return req;
+}
+
 static inline struct raw6_sock *raw6_sk(const struct sock *sk)
 {
        return (struct raw6_sock *)sk;
@@ -323,28 +347,37 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to,
 #define __ipv6_only_sock(sk)   (inet6_sk(sk)->ipv6only)
 #define ipv6_only_sock(sk)     ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
 
-#include <linux/tcp.h>
+struct inet6_timewait_sock {
+       struct in6_addr tw_v6_daddr;
+       struct in6_addr tw_v6_rcv_saddr;
+};
 
 struct tcp6_timewait_sock {
-       struct tcp_timewait_sock tw_v6_sk;
-       struct in6_addr          tw_v6_daddr;
-       struct in6_addr          tw_v6_rcv_saddr;
+       struct tcp_timewait_sock   tcp6tw_tcp;
+       struct inet6_timewait_sock tcp6tw_inet6;
 };
 
-static inline struct tcp6_timewait_sock *tcp6_twsk(const struct sock *sk)
+static inline u16 inet6_tw_offset(const struct proto *prot)
 {
-       return (struct tcp6_timewait_sock *)sk;
+       return prot->twsk_prot->twsk_obj_size -
+                       sizeof(struct inet6_timewait_sock);
 }
 
-static inline struct in6_addr *__tcp_v6_rcv_saddr(const struct sock *sk)
+static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk)
+{
+       return (struct inet6_timewait_sock *)(((u8 *)sk) +
+                                             inet_twsk(sk)->tw_ipv6_offset);
+}
+
+static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk)
 {
        return likely(sk->sk_state != TCP_TIME_WAIT) ?
-               &inet6_sk(sk)->rcv_saddr : &tcp6_twsk(sk)->tw_v6_rcv_saddr;
+               &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr;
 }
 
-static inline struct in6_addr *tcp_v6_rcv_saddr(const struct sock *sk)
+static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
 {
-       return sk->sk_family == AF_INET6 ? __tcp_v6_rcv_saddr(sk) : NULL;
+       return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL;
 }
 
 static inline int inet_v6_ipv6only(const struct sock *sk)
@@ -361,13 +394,19 @@ static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
        return NULL;
 }
 
+static inline struct inet6_request_sock *
+                       inet6_rsk(const struct request_sock *rsk)
+{
+       return NULL;
+}
+
 static inline struct raw6_sock *raw6_sk(const struct sock *sk)
 {
        return NULL;
 }
 
-#define __tcp_v6_rcv_saddr(__sk)       NULL
-#define tcp_v6_rcv_saddr(__sk)         NULL
+#define __inet6_rcv_saddr(__sk)        NULL
+#define inet6_rcv_saddr(__sk)  NULL
 #define tcp_twsk_ipv6only(__sk)                0
 #define inet_v6_ipv6only(__sk)         0
 #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
index e2f935038013b745252dd4ac6670c18474ec1e99..d7c41d1d706a30d592d6183079627afb101d42f8 100644 (file)
@@ -18,6 +18,7 @@
                                           fallback, no routers on link */
 #define RTF_ADDRCONF   0x00040000      /* addrconf route - RA          */
 #define RTF_PREFIX_RT  0x00080000      /* A prefix only route - RA     */
+#define RTF_ANYCAST    0x00100000      /* Anycast                      */
 
 #define RTF_NONEXTHOP  0x00200000      /* route with no nexthop        */
 #define RTF_EXPIRES    0x00400000
index c516382fbec2fa5fb5871937ba0bab6de48d4dfd..f04ba20712a2968cba8d9e77e31c2d716f157830 100644 (file)
@@ -10,7 +10,7 @@
  */
 
 #include <linux/config.h>
-#include <asm/smp.h>           /* cpu_online_map */
+#include <linux/smp.h>
 
 #if !defined(CONFIG_ARCH_S390)
 
index aa56172c6fed9533136aab5f98a43a2912bf19eb..dcde7adfdce51ac2104299dac232defc62267346 100644 (file)
@@ -16,8 +16,6 @@
 #ifndef _LINUX_JBD_H
 #define _LINUX_JBD_H
 
-#if defined(CONFIG_JBD) || defined(CONFIG_JBD_MODULE) || !defined(__KERNEL__)
-
 /* Allow this file to be included directly into e2fsprogs */
 #ifndef __KERNEL__
 #include "jfs_compat.h"
@@ -1083,19 +1081,4 @@ extern int jbd_blocks_per_page(struct inode *inode);
 
 #endif /* __KERNEL__ */
 
-#endif /* CONFIG_JBD || CONFIG_JBD_MODULE || !__KERNEL__ */
-
-/*
- * Compatibility no-ops which allow the kernel to compile without CONFIG_JBD
- * go here.
- */
-
-#if defined(__KERNEL__) && !(defined(CONFIG_JBD) || defined(CONFIG_JBD_MODULE))
-
-#define J_ASSERT(expr)                 do {} while (0)
-#define J_ASSERT_BH(bh, expr)          do {} while (0)
-#define buffer_jbd(bh)                 0
-#define journal_buffer_journal_lru(bh) 0
-
-#endif /* defined(__KERNEL__) && !defined(CONFIG_JBD) */
 #endif /* _LINUX_JBD_H */
index e373c4a9de53601a3f6e85bf1623a2b1d896f36c..c03f2dc933de04a7503d75f2cacb9fa68963ca13 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/spinlock.h>
 #include <linux/rcupdate.h>
 
+#ifdef CONFIG_KPROBES
 #include <asm/kprobes.h>
 
 /* kprobe_status settings */
@@ -147,7 +148,6 @@ struct kretprobe_instance {
        struct task_struct *task;
 };
 
-#ifdef CONFIG_KPROBES
 extern spinlock_t kretprobe_lock;
 extern int arch_prepare_kprobe(struct kprobe *p);
 extern void arch_copy_kprobe(struct kprobe *p);
@@ -158,6 +158,7 @@ extern int arch_init_kprobes(void);
 extern void show_registers(struct pt_regs *regs);
 extern kprobe_opcode_t *get_insn_slot(void);
 extern void free_insn_slot(kprobe_opcode_t *slot);
+extern void kprobes_inc_nmissed_count(struct kprobe *p);
 
 /* Get the kprobe at this addr (if any) - called with preemption disabled */
 struct kprobe *get_kprobe(void *addr);
@@ -195,6 +196,11 @@ void add_rp_inst(struct kretprobe_instance *ri);
 void kprobe_flush_task(struct task_struct *tk);
 void recycle_rp_inst(struct kretprobe_instance *ri);
 #else /* CONFIG_KPROBES */
+
+#define __kprobes      /**/
+struct jprobe;
+struct kretprobe;
+
 static inline struct kprobe *kprobe_running(void)
 {
        return NULL;
index f2dbb684ce9e4fce7e76ed09399ebf68cbe2c068..e828e172ccbf1f2d80b6838c43000d0379117abb 100644 (file)
@@ -122,6 +122,7 @@ enum {
        ATA_FLAG_NOINTR         = (1 << 9), /* FIXME: Remove this once
                                             * proper HSM is in place. */
        ATA_FLAG_DEBUGMSG       = (1 << 10),
+       ATA_FLAG_NO_ATAPI       = (1 << 11), /* No ATAPI support */
 
        ATA_QCFLAG_ACTIVE       = (1 << 1), /* cmd not yet ack'd to scsi lyer */
        ATA_QCFLAG_SG           = (1 << 3), /* have s/g table? */
@@ -135,6 +136,8 @@ enum {
        ATA_TMOUT_BOOT_QUICK    = 7 * HZ,       /* hueristic */
        ATA_TMOUT_CDB           = 30 * HZ,
        ATA_TMOUT_CDB_QUICK     = 5 * HZ,
+       ATA_TMOUT_INTERNAL      = 30 * HZ,
+       ATA_TMOUT_INTERNAL_QUICK = 5 * HZ,
 
        /* ATA bus states */
        BUS_UNKNOWN             = 0,
@@ -194,7 +197,7 @@ struct ata_port;
 struct ata_queued_cmd;
 
 /* typedefs */
-typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc, unsigned int err_mask);
+typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
 
 struct ata_ioports {
        unsigned long           cmd_addr;
@@ -279,9 +282,9 @@ struct ata_queued_cmd {
        /* DO NOT iterate over __sg manually, use ata_for_each_sg() */
        struct scatterlist      *__sg;
 
-       ata_qc_cb_t             complete_fn;
+       unsigned int            err_mask;
 
-       struct completion       *waiting;
+       ata_qc_cb_t             complete_fn;
 
        void                    *private_data;
 };
@@ -330,8 +333,6 @@ struct ata_port {
 
        u8                      ctl;    /* cache of ATA control register */
        u8                      last_ctl;       /* Cache last written value */
-       unsigned int            bus_state;
-       unsigned int            port_state;
        unsigned int            pio_mask;
        unsigned int            mwdma_mask;
        unsigned int            udma_mask;
@@ -477,7 +478,7 @@ extern void ata_bmdma_start (struct ata_queued_cmd *qc);
 extern void ata_bmdma_stop(struct ata_queued_cmd *qc);
 extern u8   ata_bmdma_status(struct ata_port *ap);
 extern void ata_bmdma_irq_clear(struct ata_port *ap);
-extern void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask);
+extern void ata_qc_complete(struct ata_queued_cmd *qc);
 extern void ata_eng_timeout(struct ata_port *ap);
 extern void ata_scsi_simulate(u16 *id, struct scsi_cmnd *cmd,
                              void (*done)(struct scsi_cmnd *));
@@ -669,6 +670,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
        qc->cursect = qc->cursg = qc->cursg_ofs = 0;
        qc->nsect = 0;
        qc->nbytes = qc->curbytes = 0;
+       qc->err_mask = 0;
 
        ata_tf_init(qc->ap, &qc->tf, qc->dev->devno);
 }
index fbfca73355a3a6791a3f2afb20fa41823c5f6fc6..8e3388284530093dc71a1231c263d4436cf8a88d 100644 (file)
@@ -202,12 +202,15 @@ static inline void list_del_rcu(struct list_head *entry)
  *
  * The old entry will be replaced with the new entry atomically.
  */
-static inline void list_replace_rcu(struct list_head *old, struct list_head *new){
+static inline void list_replace_rcu(struct list_head *old,
+                               struct list_head *new)
+{
        new->next = old->next;
        new->prev = old->prev;
        smp_wmb();
        new->next->prev = new;
        new->prev->next = new;
+       old->prev = LIST_POISON2;
 }
 
 /**
@@ -578,6 +581,27 @@ static inline void hlist_del_init(struct hlist_node *n)
        }
 }
 
+/*
+ * hlist_replace_rcu - replace old entry by new one
+ * @old : the element to be replaced
+ * @new : the new element to insert
+ *
+ * The old entry will be replaced with the new entry atomically.
+ */
+static inline void hlist_replace_rcu(struct hlist_node *old,
+                                       struct hlist_node *new)
+{
+       struct hlist_node *next = old->next;
+
+       new->next = next;
+       new->pprev = old->pprev;
+       smp_wmb();
+       if (next)
+               new->next->pprev = &new->next;
+       *new->pprev = new;
+       old->pprev = LIST_POISON2;
+}
+
 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
 {
        struct hlist_node *first = h->first;
index 9a424383e6c60064fdb76ae8b0c7895351da69a0..dc4081b6f161e3f697c3280bbf9547aed9bfbea1 100644 (file)
@@ -85,7 +85,6 @@ struct notifier_block;
 extern int register_memory_notifier(struct notifier_block *nb);
 extern void unregister_memory_notifier(struct notifier_block *nb);
 
-extern struct sysdev_class memory_sysdev_class;
 #endif /* CONFIG_MEMORY_HOTPLUG */
 
 #define hotplug_memory_notifier(fn, pri) {                     \
index 0986d19be0b7c810c122b7decbcd24dcd7a8827b..a06a84d347fb5cbbc3b29ff3dfa727f429cc0f7b 100644 (file)
@@ -144,7 +144,8 @@ extern unsigned int kobjsize(const void *objp);
 
 #define VM_GROWSDOWN   0x00000100      /* general info on the segment */
 #define VM_GROWSUP     0x00000200
-#define VM_SHM         0x00000400      /* shared memory area, don't swap out */
+#define VM_SHM         0x00000000      /* Means nothing: delete it later */
+#define VM_PFNMAP      0x00000400      /* Page-ranges managed without "struct page", just pure PFN */
 #define VM_DENYWRITE   0x00000800      /* ETXTBSY on write attempts.. */
 
 #define VM_EXECUTABLE  0x00001000
@@ -157,11 +158,12 @@ extern unsigned int kobjsize(const void *objp);
 
 #define VM_DONTCOPY    0x00020000      /* Do not copy this vma on fork */
 #define VM_DONTEXPAND  0x00040000      /* Cannot expand with mremap() */
-#define VM_RESERVED    0x00080000      /* Pages managed in a special way */
+#define VM_RESERVED    0x00080000      /* Count as reserved_vm like IO */
 #define VM_ACCOUNT     0x00100000      /* Is a VM accounted object */
 #define VM_HUGETLB     0x00400000      /* Huge TLB Page VM */
 #define VM_NONLINEAR   0x00800000      /* Is non-linear (remap_file_pages) */
 #define VM_MAPPED_COPY 0x01000000      /* T if mapped copy of data (nommu mmap) */
+#define VM_INSERTPAGE  0x02000000      /* The vma has had "vm_insert_page()" done on it */
 
 #ifndef VM_STACK_DEFAULT_FLAGS         /* arch can override this */
 #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
@@ -311,8 +313,6 @@ struct page {
 
 extern void FASTCALL(__page_cache_release(struct page *));
 
-#ifdef CONFIG_HUGETLB_PAGE
-
 static inline int page_count(struct page *page)
 {
        if (PageCompound(page))
@@ -329,23 +329,6 @@ static inline void get_page(struct page *page)
 
 void put_page(struct page *page);
 
-#else          /* CONFIG_HUGETLB_PAGE */
-
-#define page_count(p)          (atomic_read(&(p)->_count) + 1)
-
-static inline void get_page(struct page *page)
-{
-       atomic_inc(&page->_count);
-}
-
-static inline void put_page(struct page *page)
-{
-       if (put_page_testzero(page))
-               __page_cache_release(page);
-}
-
-#endif         /* CONFIG_HUGETLB_PAGE */
-
 /*
  * Multiple processes may "see" the same page. E.g. for untouched
  * mappings of /dev/null, all processes see the same page full of
@@ -682,6 +665,7 @@ struct zap_details {
        unsigned long truncate_count;           /* Compare vm_truncate_count */
 };
 
+struct page *vm_normal_page(struct vm_area_struct *, unsigned long, pte_t);
 unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
                unsigned long size, struct zap_details *);
 unsigned long unmap_vmas(struct mmu_gather **tlb,
@@ -758,6 +742,8 @@ struct shrinker;
 extern struct shrinker *set_shrinker(int, shrinker_t);
 extern void remove_shrinker(struct shrinker *shrinker);
 
+extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl));
+
 int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
 int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
 int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
@@ -970,8 +956,9 @@ struct page *vmalloc_to_page(void *addr);
 unsigned long vmalloc_to_pfn(void *addr);
 int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
                        unsigned long pfn, unsigned long size, pgprot_t);
+int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
 
-struct page *follow_page(struct mm_struct *, unsigned long address,
+struct page *follow_page(struct vm_area_struct *, unsigned long address,
                        unsigned int foll_flags);
 #define FOLL_WRITE     0x01    /* check pte is writable */
 #define FOLL_TOUCH     0x02    /* mark page accessed */
index f819cae92266aa2fdd889d7bbe9b6480828d9680..a14dc306545b86f2f353d4ab2022523264109a51 100644 (file)
@@ -63,7 +63,7 @@
   /* class 5 */
 #define MMC_ERASE_GROUP_START    35   /* ac   [31:0] data addr   R1  */
 #define MMC_ERASE_GROUP_END      36   /* ac   [31:0] data addr   R1  */
-#define MMC_ERASE                37   /* ac                      R1b */
+#define MMC_ERASE                38   /* ac                      R1b */
 
   /* class 9 */
 #define MMC_FAST_IO              39   /* ac   <Complex>          R4  */
@@ -74,7 +74,7 @@
 
   /* class 8 */
 #define MMC_APP_CMD              55   /* ac   [31:16] RCA        R1  */
-#define MMC_GEN_CMD              56   /* adtc [0] RD/WR          R1b */
+#define MMC_GEN_CMD              56   /* adtc [0] RD/WR          R1  */
 
 /* SD commands                           type  argument     response */
   /* class 8 */
index 2c8edad5dccf3796337dcb989f55815cd53faf51..9f22090df7dde381a177707cf745733ececbd320 100644 (file)
@@ -91,21 +91,11 @@ struct per_cpu_pageset {
  * will be a maximum of 4 (2 ** 2) zonelists, for 3 modifiers there will
  * be 8 (2 ** 3) zonelists.  GFP_ZONETYPES defines the number of possible
  * combinations of zone modifiers in "zone modifier space".
+ *
+ * NOTE! Make sure this matches the zones in <linux/gfp.h>
  */
-#define GFP_ZONEMASK   0x03
-/*
- * As an optimisation any zone modifier bits which are only valid when
- * no other zone modifier bits are set (loners) should be placed in
- * the highest order bits of this field.  This allows us to reduce the
- * extent of the zonelists thus saving space.  For example in the case
- * of three zone modifier bits, we could require up to eight zonelists.
- * If the left most zone modifier is a "loner" then the highest valid
- * zonelist would be four allowing us to allocate only five zonelists.
- * Use the first form when the left most bit is not a "loner", otherwise
- * use the second.
- */
-/* #define GFP_ZONETYPES       (GFP_ZONEMASK + 1) */           /* Non-loner */
-#define GFP_ZONETYPES  ((GFP_ZONEMASK + 1) / 2 + 1)            /* Loner */
+#define GFP_ZONEMASK   0x07
+#define GFP_ZONETYPES  5
 
 /*
  * On machines where it is needed (eg PCs) we divide physical memory
index 3c9ea4b7adda50b85c52dd335cd56191ac5b541c..23a5689103417141c34d505d2f40b4083b6bbf5a 100644 (file)
@@ -1,7 +1,7 @@
 
 /* Common Flash Interface structures
  * See http://support.intel.com/design/flash/technote/index.htm
- * $Id: cfi.h,v 1.56 2005/11/07 11:14:54 gleixner Exp $
+ * $Id: cfi.h,v 1.57 2005/11/15 23:28:17 tpoynor Exp $
  */
 
 #ifndef __MTD_CFI_H__
@@ -426,6 +426,22 @@ static inline uint8_t cfi_read_query(struct map_info *map, uint32_t addr)
        }
 }
 
+static inline uint16_t cfi_read_query16(struct map_info *map, uint32_t addr)
+{
+       map_word val = map_read(map, addr);
+
+       if (map_bankwidth_is_1(map)) {
+               return val.x[0] & 0xff;
+       } else if (map_bankwidth_is_2(map)) {
+               return cfi16_to_cpu(val.x[0]);
+       } else {
+               /* No point in a 64-bit byteswap since that would just be
+                  swapping the responses from different chips, and we are
+                  only interested in one chip (a representative sample) */
+               return cfi32_to_cpu(val.x[0]);
+       }
+}
+
 static inline void cfi_udelay(int us)
 {
        if (us >= 1000) {
index f1fd4215686acc2b7655c6a5e63f974115c3ff78..7419b5fab1337a8f55899f219e2d297faef5a064 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/mtd/bbm.h>
 
 #define MAX_BUFFERRAM          2
-#define MAX_ONENAND_PAGESIZE   (2048 + 64)
 
 /* Scan and identify a OneNAND device */
 extern int onenand_scan(struct mtd_info *mtd, int max_chips);
@@ -110,6 +109,7 @@ struct onenand_chip {
        spinlock_t              chip_lock;
        wait_queue_head_t       wq;
        onenand_state_t         state;
+       unsigned char           *page_buf;
 
        struct nand_oobinfo     *autooob;
 
@@ -134,13 +134,12 @@ struct onenand_chip {
  * Options bits
  */
 #define ONENAND_CONT_LOCK              (0x0001)
-
+#define ONENAND_PAGEBUF_ALLOC          (0x1000)
 
 /*
  * OneNAND Flash Manufacturer ID Codes
  */
 #define ONENAND_MFR_SAMSUNG    0xec
-#define ONENAND_MFR_UNKNOWN    0x00
 
 /**
  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
index 2352bcd31a06f15874e3d2f735178f1af05a2827..db4f3776978aafe81c36caf263f001d195e28311 100644 (file)
  * L. Haag
  *
  * $Log: r3964.h,v $
+ * Revision 1.4  2005/12/21 19:54:24  Kurt Huwig <kurt huwig de>
+ * Fixed HZ usage on 2.6 kernels
+ * Removed unnecessary include
+ *
  * Revision 1.3  2001/03/18 13:02:24  dwmw2
  * Fix timer usage, use spinlocks properly.
  *
 #define __LINUX_N_R3964_H__
 
 /* line disciplines for r3964 protocol */
-#include <asm/termios.h>
 
 #ifdef __KERNEL__
+
+#include <linux/param.h>
+
 /*
  * Common ascii handshake characters:
  */
 #define NAK 0x15
 
 /*
- * Timeouts (msecs/10 msecs per timer interrupt):
+ * Timeouts (from milliseconds to jiffies)
  */
 
-#define R3964_TO_QVZ 550/10
-#define R3964_TO_ZVZ 220/10
-#define R3964_TO_NO_BUF 400/10
-#define R3964_NO_TX_ROOM 100/10
-#define R3964_TO_RX_PANIC 4000/10
+#define R3964_TO_QVZ ((550)*HZ/1000)
+#define R3964_TO_ZVZ ((220)*HZ/1000)
+#define R3964_TO_NO_BUF ((400)*HZ/1000)
+#define R3964_NO_TX_ROOM ((100)*HZ/1000)
+#define R3964_TO_RX_PANIC ((4000)*HZ/1000)
 #define R3964_MAX_RETRIES 5
 
 #endif
index d6a41e6577f61a3b2729247af897532ab3b44ea3..28195a2d8ff0a50501a5ab180ef6bf3b252cbb28 100644 (file)
@@ -107,7 +107,7 @@ enum sock_type {
 struct socket {
        socket_state            state;
        unsigned long           flags;
-       struct proto_ops        *ops;
+       const struct proto_ops  *ops;
        struct fasync_struct    *fasync_list;
        struct file             *file;
        struct sock             *sk;
@@ -260,7 +260,7 @@ SOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct ms
 SOCKCALL_WRAP(name, mmap, (struct file *file, struct socket *sock, struct vm_area_struct *vma), \
              (file, sock, vma)) \
              \
-static struct proto_ops name##_ops = {                 \
+static const struct proto_ops name##_ops = {                   \
        .family         = fam,                          \
        .owner          = THIS_MODULE,                  \
        .release        = __lock_##name##_release,      \
index 936f8b76114ea95901ccb74190f2ebc96fc2a3a7..7fda03d338d1c40a76e2acd6d7a4c80d4910b198 100644 (file)
@@ -684,6 +684,7 @@ extern int          netif_rx(struct sk_buff *skb);
 extern int             netif_rx_ni(struct sk_buff *skb);
 #define HAVE_NETIF_RECEIVE_SKB 1
 extern int             netif_receive_skb(struct sk_buff *skb);
+extern int             dev_valid_name(const char *name);
 extern int             dev_ioctl(unsigned int cmd, void __user *);
 extern int             dev_ethtool(struct ifreq *);
 extern unsigned                dev_get_flags(const struct net_device *);
@@ -801,12 +802,16 @@ static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits)
        return (1 << debug_value) - 1;
 }
 
-/* Schedule rx intr now? */
+/* Test if receive needs to be scheduled */
+static inline int __netif_rx_schedule_prep(struct net_device *dev)
+{
+       return !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
+}
 
+/* Test if receive needs to be scheduled but only if up */
 static inline int netif_rx_schedule_prep(struct net_device *dev)
 {
-       return netif_running(dev) &&
-               !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
+       return netif_running(dev) && __netif_rx_schedule_prep(dev);
 }
 
 /* Add interface to tail of rx poll list. This assumes that _prep has
index e93a9ec99fc288cd919b32684aff054f2aceeb37..80b3dbacd193ea6ad6c6ce82a94b68d36a1aed78 100644 (file)
@@ -7,8 +7,6 @@
 
 #define IPT_SCTP_VALID_FLAGS           0x07
 
-#define ELEMCOUNT(x) (sizeof(x)/sizeof(x[0]))
-
 
 struct ipt_sctp_flag_info {
        u_int8_t chunktype;
@@ -59,21 +57,21 @@ struct ipt_sctp_info {
 #define SCTP_CHUNKMAP_RESET(chunkmap)                          \
        do {                                                    \
                int i;                                          \
-               for (i = 0; i < ELEMCOUNT(chunkmap); i++)       \
+               for (i = 0; i < ARRAY_SIZE(chunkmap); i++)      \
                        chunkmap[i] = 0;                        \
        } while (0)
 
 #define SCTP_CHUNKMAP_SET_ALL(chunkmap)                        \
        do {                                                    \
                int i;                                          \
-               for (i = 0; i < ELEMCOUNT(chunkmap); i++)       \
+               for (i = 0; i < ARRAY_SIZE(chunkmap); i++)      \
                        chunkmap[i] = ~0;                       \
        } while (0)
 
 #define SCTP_CHUNKMAP_COPY(destmap, srcmap)                    \
        do {                                                    \
                int i;                                          \
-               for (i = 0; i < ELEMCOUNT(chunkmap); i++)       \
+               for (i = 0; i < ARRAY_SIZE(chunkmap); i++)      \
                        destmap[i] = srcmap[i];                 \
        } while (0)
 
@@ -81,7 +79,7 @@ struct ipt_sctp_info {
 ({                                                     \
        int i;                                          \
        int flag = 1;                                   \
-       for (i = 0; i < ELEMCOUNT(chunkmap); i++) {     \
+       for (i = 0; i < ARRAY_SIZE(chunkmap); i++) {    \
                if (chunkmap[i]) {                      \
                        flag = 0;                       \
                        break;                          \
@@ -94,7 +92,7 @@ struct ipt_sctp_info {
 ({                                                     \
        int i;                                          \
        int flag = 1;                                   \
-       for (i = 0; i < ELEMCOUNT(chunkmap); i++) {     \
+       for (i = 0; i < ARRAY_SIZE(chunkmap); i++) {    \
                if (chunkmap[i] != ~0) {                \
                        flag = 0;                       \
                                break;                  \
index 12787a9b02596d14a412eeeacb21d3bb39f29e43..2516adeccecfd1a7d2cd17bc9fe7f1e9c5ce9034 100644 (file)
@@ -291,6 +291,7 @@ static inline int nfs_verify_change_attribute(struct inode *inode, unsigned long
 /*
  * linux/fs/nfs/inode.c
  */
+extern int nfs_sync_mapping(struct address_space *mapping);
 extern void nfs_zap_caches(struct inode *);
 extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *,
                                struct nfs_fattr *);
index f34767c5fc79e7a5ecee1676e72b4ebf84296aa2..343083fec25834b0d950ee0e496766b1629a277e 100644 (file)
@@ -287,11 +287,7 @@ extern void __mod_page_state(unsigned long offset, unsigned long delta);
 #define ClearPageReclaim(page) clear_bit(PG_reclaim, &(page)->flags)
 #define TestClearPageReclaim(page) test_and_clear_bit(PG_reclaim, &(page)->flags)
 
-#ifdef CONFIG_HUGETLB_PAGE
 #define PageCompound(page)     test_bit(PG_compound, &(page)->flags)
-#else
-#define PageCompound(page)     0
-#endif
 #define SetPageCompound(page)  set_bit(PG_compound, &(page)->flags)
 #define ClearPageCompound(page)        clear_bit(PG_compound, &(page)->flags)
 
index 7825c76cbd00df635afb5bcef50775651b07e0cf..c6f7624708796434d74b0480cdb0c67646a86418 100644 (file)
@@ -86,7 +86,7 @@ extern __inline__ void dump_parport_state (char *str, struct parport *p)
        unsigned char dcr = inb (CONTROL (p));
        unsigned char dsr = inb (STATUS (p));
        static char *ecr_modes[] = {"SPP", "PS2", "PPFIFO", "ECP", "xXx", "yYy", "TST", "CFG"};
-       const struct parport_pc_private *priv = (parport_pc_private *)p->physport->private_data;
+       const struct parport_pc_private *priv = p->physport->private_data;
        int i;
 
        printk (KERN_DEBUG "*** parport state (%s): ecr=[%s", str, ecr_modes[(ecr & 0xe0) >> 5]);
index 7b387faedb4d68e94a12c1c4ef5080e90fb3f790..a17e171384ef77828a38a20ca3cc0ef451e0fb26 100644 (file)
@@ -15,6 +15,7 @@
 #define PCI_CLASS_STORAGE_FLOPPY       0x0102
 #define PCI_CLASS_STORAGE_IPI          0x0103
 #define PCI_CLASS_STORAGE_RAID         0x0104
+#define PCI_CLASS_STORAGE_SAS          0x0107
 #define PCI_CLASS_STORAGE_OTHER                0x0180
 
 #define PCI_BASE_CLASS_NETWORK         0x02
 #define PCI_DEVICE_ID_SI_961           0x0961
 #define PCI_DEVICE_ID_SI_962           0x0962
 #define PCI_DEVICE_ID_SI_963           0x0963
+#define PCI_DEVICE_ID_SI_965           0x0965
 #define PCI_DEVICE_ID_SI_5511          0x5511
 #define PCI_DEVICE_ID_SI_5513          0x5513
 #define PCI_DEVICE_ID_SI_5518          0x5518
 #define PCI_DEVICE_ID_VIA_3269_0       0x0269
 #define PCI_DEVICE_ID_VIA_K8T800PRO_0  0x0282
 #define PCI_DEVICE_ID_VIA_8363_0       0x0305
+#define PCI_DEVICE_ID_VIA_P4M800CE     0x0314
 #define PCI_DEVICE_ID_VIA_8371_0       0x0391
 #define PCI_DEVICE_ID_VIA_8501_0       0x0501
 #define PCI_DEVICE_ID_VIA_82C561       0x0561
 #define PCI_DEVICE_ID_VIA_8703_51_0    0x3148
 #define PCI_DEVICE_ID_VIA_8237_SATA    0x3149
 #define PCI_DEVICE_ID_VIA_XN266                0x3156
+#define PCI_DEVICE_ID_VIA_6410         0x3164
 #define PCI_DEVICE_ID_VIA_8754C_0      0x3168
 #define PCI_DEVICE_ID_VIA_8235         0x3177
 #define PCI_DEVICE_ID_VIA_8385_0       0x3188
 #define PCI_DEVICE_ID_VIA_8378_0       0x3205
 #define PCI_DEVICE_ID_VIA_8783_0       0x3208
 #define PCI_DEVICE_ID_VIA_8237         0x3227
+#define PCI_DEVICE_ID_VIA_8251         0x3287
 #define PCI_DEVICE_ID_VIA_3296_0       0x0296
 #define PCI_DEVICE_ID_VIA_8231         0x8231
 #define PCI_DEVICE_ID_VIA_8231_4       0x8235
index 724066778affe84f50bbdf8d6a08a245e26132f4..6351c4055acea365d682d33c89f42b5b8a16b035 100644 (file)
@@ -216,6 +216,16 @@ struct sadb_x_nat_t_port {
 } __attribute__((packed));
 /* sizeof(struct sadb_x_nat_t_port) == 8 */
 
+/* Generic LSM security context */
+struct sadb_x_sec_ctx {
+       uint16_t        sadb_x_sec_len;
+       uint16_t        sadb_x_sec_exttype;
+       uint8_t         sadb_x_ctx_alg;  /* LSMs: e.g., selinux == 1 */
+       uint8_t         sadb_x_ctx_doi;
+       uint16_t        sadb_x_ctx_len;
+} __attribute__((packed));
+/* sizeof(struct sadb_sec_ctx) = 8 */
+
 /* Message types */
 #define SADB_RESERVED          0
 #define SADB_GETSPI            1
@@ -325,7 +335,8 @@ struct sadb_x_nat_t_port {
 #define SADB_X_EXT_NAT_T_SPORT         21
 #define SADB_X_EXT_NAT_T_DPORT         22
 #define SADB_X_EXT_NAT_T_OA            23
-#define SADB_EXT_MAX                   23
+#define SADB_X_EXT_SEC_CTX             24
+#define SADB_EXT_MAX                   24
 
 /* Identity Extension values */
 #define SADB_IDENTTYPE_RESERVED        0
index e87b233615b349a4d982174779eaceaa7c1f127f..d10f35338507021c219bac8ce1d235b8a0c05b30 100644 (file)
@@ -429,6 +429,7 @@ enum
        TCA_NETEM_CORR,
        TCA_NETEM_DELAY_DIST,
        TCA_NETEM_REORDER,
+       TCA_NETEM_CORRUPT,
        __TCA_NETEM_MAX,
 };
 
@@ -457,6 +458,12 @@ struct tc_netem_reorder
        __u32   correlation;
 };
 
+struct tc_netem_corrupt
+{
+       __u32   probability;
+       __u32   correlation;
+};
+
 #define NETEM_DIST_SCALE       8192
 
 #endif
index d9a2f5254a51194858091bec44bf6bfb43cb9168..5769d14d1e6ab658b7ab8b2a2c9de117ec2b4838 100644 (file)
@@ -48,6 +48,7 @@ do { \
 #define preempt_enable() \
 do { \
        preempt_enable_no_resched(); \
+       barrier(); \
        preempt_check_resched(); \
 } while (0)
 
index 7b2adb3322d5a6052504058e152cc0f94828c06e..5d6456bcdebac8e4099809369407583bf04b8d69 100644 (file)
@@ -52,9 +52,9 @@ extern void get_random_bytes(void *buf, int nbytes);
 void generate_random_uuid(unsigned char uuid_out[16]);
 
 extern __u32 secure_ip_id(__u32 daddr);
-extern u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport);
-extern u32 secure_tcpv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, 
-                                      __u16 dport);
+extern u32 secure_ipv4_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport);
+extern u32 secure_ipv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, 
+                                     __u16 dport);
 extern __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr,
                                        __u16 sport, __u16 dport);
 extern __u32 secure_tcpv6_sequence_number(__u32 *saddr, __u32 *daddr,
index cce25591eec2076dae54c0d803e18298935d638a..a471f3bb713ee1045fb0cddb71d2dc9fcacb54ab 100644 (file)
@@ -100,6 +100,7 @@ struct rcu_data {
        struct rcu_head *donelist;
        struct rcu_head **donetail;
        int cpu;
+       struct rcu_head barrier;
 };
 
 DECLARE_PER_CPU(struct rcu_data, rcu_data);
@@ -285,6 +286,7 @@ extern void FASTCALL(call_rcu_bh(struct rcu_head *head,
 extern __deprecated_for_modules void synchronize_kernel(void);
 extern void synchronize_rcu(void);
 void synchronize_idle(void);
+extern void rcu_barrier(void);
 
 #endif /* __KERNEL__ */
 #endif /* __LINUX_RCUPDATE_H */
index cfafc3e76bc2bb2faaaa012fd0d27b17d90e10a5..fb7e8073732583515c2b41843e1c691848cbd98e 100644 (file)
@@ -20,9 +20,9 @@
 #include <linux/kref.h>
 
 /*
- * Tracks changes to rchan_buf struct
+ * Tracks changes to rchan/rchan_buf structs
  */
-#define RELAYFS_CHANNEL_VERSION                5
+#define RELAYFS_CHANNEL_VERSION                6
 
 /*
  * Per-cpu relay channel buffer
@@ -60,6 +60,7 @@ struct rchan
        struct rchan_callbacks *cb;     /* client callbacks */
        struct kref kref;               /* channel refcount */
        void *private_data;             /* for user-defined data */
+       size_t last_toobig;             /* tried to log event > subbuf size */
        struct rchan_buf *buf[NR_CPUS]; /* per-cpu channel buffers */
 };
 
index 35b30e6c8cf8c7b0b4fb4bd09c11b154a45c6ba6..33261f1d22395fba7d9a54a45efcaff12493336d 100644 (file)
@@ -89,7 +89,7 @@ static inline void page_dup_rmap(struct page *page)
 /*
  * Called from mm/vmscan.c to handle paging out
  */
-int page_referenced(struct page *, int is_locked, int ignore_token);
+int page_referenced(struct page *, int is_locked);
 int try_to_unmap(struct page *);
 
 /*
@@ -109,7 +109,7 @@ unsigned long page_address_in_vma(struct page *, struct vm_area_struct *);
 #define anon_vma_prepare(vma)  (0)
 #define anon_vma_link(vma)     do {} while (0)
 
-#define page_referenced(page,l,i) TestClearPageReferenced(page)
+#define page_referenced(page,l) TestClearPageReferenced(page)
 #define try_to_unmap(page)     SWAP_FAIL
 
 #endif /* CONFIG_MMU */
index c231e9a08f0bb2b2365b7f5f568de8c459385a59..d50482ba27fe17dab4678df7c3e8aa586130955c 100644 (file)
@@ -866,6 +866,7 @@ enum rtnetlink_groups {
 #define        RTNLGRP_IPV4_MROUTE     RTNLGRP_IPV4_MROUTE
        RTNLGRP_IPV4_ROUTE,
 #define RTNLGRP_IPV4_ROUTE     RTNLGRP_IPV4_ROUTE
+       RTNLGRP_NOP1,
        RTNLGRP_IPV6_IFADDR,
 #define RTNLGRP_IPV6_IFADDR    RTNLGRP_IPV6_IFADDR
        RTNLGRP_IPV6_MROUTE,
@@ -876,8 +877,11 @@ enum rtnetlink_groups {
 #define RTNLGRP_IPV6_IFINFO    RTNLGRP_IPV6_IFINFO
        RTNLGRP_DECnet_IFADDR,
 #define RTNLGRP_DECnet_IFADDR  RTNLGRP_DECnet_IFADDR
+       RTNLGRP_NOP2,
        RTNLGRP_DECnet_ROUTE,
 #define RTNLGRP_DECnet_ROUTE   RTNLGRP_DECnet_ROUTE
+       RTNLGRP_NOP3,
+       RTNLGRP_NOP4,
        RTNLGRP_IPV6_PREFIX,
 #define RTNLGRP_IPV6_PREFIX    RTNLGRP_IPV6_PREFIX
        __RTNLGRP_MAX
index 2038bd27b0413c74bcb66290adc3cfe33b5c0fd3..b0ad6f30679eac4cd128f924bd8b1010b4c75be1 100644 (file)
@@ -908,7 +908,6 @@ do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } while(0)
 #define PF_SYNCWRITE   0x00200000      /* I am doing a sync write */
 #define PF_BORROWED_MM 0x00400000      /* I am a kthread doing use_mm */
 #define PF_RANDOMIZE   0x00800000      /* randomize virtual address space */
-#define PF_HOTPLUG_CPU 0x01000000      /* Currently performing CPU hotplug */
 
 /*
  * Only the _current_ task can read/write to tsk->flags, but other
index f7e0ae018712257a11b67ffa6cd12eafb988c34b..ef753654daa56810568aa73bca8b952c533fd588 100644 (file)
@@ -59,6 +59,12 @@ struct sk_buff;
 struct sock;
 struct sockaddr;
 struct socket;
+struct flowi;
+struct dst_entry;
+struct xfrm_selector;
+struct xfrm_policy;
+struct xfrm_state;
+struct xfrm_user_sec_ctx;
 
 extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb);
 extern int cap_netlink_recv(struct sk_buff *skb);
@@ -788,6 +794,52 @@ struct swap_info_struct;
  *      which is used to copy security attributes between local stream sockets.
  * @sk_free_security:
  *     Deallocate security structure.
+ * @sk_getsid:
+ *     Retrieve the LSM-specific sid for the sock to enable caching of network
+ *     authorizations.
+ *
+ * Security hooks for XFRM operations.
+ *
+ * @xfrm_policy_alloc_security:
+ *     @xp contains the xfrm_policy being added to Security Policy Database
+ *     used by the XFRM system.
+ *     @sec_ctx contains the security context information being provided by
+ *     the user-level policy update program (e.g., setkey).
+ *     Allocate a security structure to the xp->selector.security field.
+ *     The security field is initialized to NULL when the xfrm_policy is
+ *     allocated.
+ *     Return 0 if operation was successful (memory to allocate, legal context)
+ * @xfrm_policy_clone_security:
+ *     @old contains an existing xfrm_policy in the SPD.
+ *     @new contains a new xfrm_policy being cloned from old.
+ *     Allocate a security structure to the new->selector.security field
+ *     that contains the information from the old->selector.security field.
+ *     Return 0 if operation was successful (memory to allocate).
+ * @xfrm_policy_free_security:
+ *     @xp contains the xfrm_policy
+ *     Deallocate xp->selector.security.
+ * @xfrm_state_alloc_security:
+ *     @x contains the xfrm_state being added to the Security Association
+ *     Database by the XFRM system.
+ *     @sec_ctx contains the security context information being provided by
+ *     the user-level SA generation program (e.g., setkey or racoon).
+ *     Allocate a security structure to the x->sel.security field.  The
+ *     security field is initialized to NULL when the xfrm_state is
+ *     allocated.
+ *     Return 0 if operation was successful (memory to allocate, legal context).
+ * @xfrm_state_free_security:
+ *     @x contains the xfrm_state.
+ *     Deallocate x>sel.security.
+ * @xfrm_policy_lookup:
+ *     @xp contains the xfrm_policy for which the access control is being
+ *     checked.
+ *     @sk_sid contains the sock security label that is used to authorize
+ *     access to the policy xp.
+ *     @dir contains the direction of the flow (input or output).
+ *     Check permission when a sock selects a xfrm_policy for processing
+ *     XFRMs on a packet.  The hook is called when selecting either a
+ *     per-socket policy or a generic xfrm policy.
+ *     Return 0 if permission is granted.
  *
  * Security hooks affecting all Key Management operations
  *
@@ -1237,8 +1289,18 @@ struct security_operations {
        int (*socket_getpeersec) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len);
        int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority);
        void (*sk_free_security) (struct sock *sk);
+       unsigned int (*sk_getsid) (struct sock *sk, struct flowi *fl, u8 dir);
 #endif /* CONFIG_SECURITY_NETWORK */
 
+#ifdef CONFIG_SECURITY_NETWORK_XFRM
+       int (*xfrm_policy_alloc_security) (struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx);
+       int (*xfrm_policy_clone_security) (struct xfrm_policy *old, struct xfrm_policy *new);
+       void (*xfrm_policy_free_security) (struct xfrm_policy *xp);
+       int (*xfrm_state_alloc_security) (struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx);
+       void (*xfrm_state_free_security) (struct xfrm_state *x);
+       int (*xfrm_policy_lookup)(struct xfrm_policy *xp, u32 sk_sid, u8 dir);
+#endif /* CONFIG_SECURITY_NETWORK_XFRM */
+
        /* key management security hooks */
 #ifdef CONFIG_KEYS
        int (*key_alloc)(struct key *key);
@@ -2679,6 +2741,11 @@ static inline void security_sk_free(struct sock *sk)
 {
        return security_ops->sk_free_security(sk);
 }
+
+static inline unsigned int security_sk_sid(struct sock *sk, struct flowi *fl, u8 dir)
+{
+       return security_ops->sk_getsid(sk, fl, dir);
+}
 #else  /* CONFIG_SECURITY_NETWORK */
 static inline int security_unix_stream_connect(struct socket * sock,
                                               struct socket * other, 
@@ -2795,8 +2862,73 @@ static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
 static inline void security_sk_free(struct sock *sk)
 {
 }
+
+static inline unsigned int security_sk_sid(struct sock *sk, struct flowi *fl, u8 dir)
+{
+       return 0;
+}
 #endif /* CONFIG_SECURITY_NETWORK */
 
+#ifdef CONFIG_SECURITY_NETWORK_XFRM
+static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx)
+{
+       return security_ops->xfrm_policy_alloc_security(xp, sec_ctx);
+}
+
+static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new)
+{
+       return security_ops->xfrm_policy_clone_security(old, new);
+}
+
+static inline void security_xfrm_policy_free(struct xfrm_policy *xp)
+{
+       security_ops->xfrm_policy_free_security(xp);
+}
+
+static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx)
+{
+       return security_ops->xfrm_state_alloc_security(x, sec_ctx);
+}
+
+static inline void security_xfrm_state_free(struct xfrm_state *x)
+{
+       security_ops->xfrm_state_free_security(x);
+}
+
+static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir)
+{
+       return security_ops->xfrm_policy_lookup(xp, sk_sid, dir);
+}
+#else  /* CONFIG_SECURITY_NETWORK_XFRM */
+static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx)
+{
+       return 0;
+}
+
+static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new)
+{
+       return 0;
+}
+
+static inline void security_xfrm_policy_free(struct xfrm_policy *xp)
+{
+}
+
+static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx)
+{
+       return 0;
+}
+
+static inline void security_xfrm_state_free(struct xfrm_state *x)
+{
+}
+
+static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir)
+{
+       return 0;
+}
+#endif /* CONFIG_SECURITY_NETWORK_XFRM */
+
 #ifdef CONFIG_KEYS
 #ifdef CONFIG_SECURITY
 static inline int security_key_alloc(struct key *key)
index a3ac92b19acac8267ff5ec922e1bdfccd2b9ca06..e3710d7e260aa6d31b6d5f46f811ca49f3c65b86 100644 (file)
 
 #define PORT_IP3106    70
 
+/* Hilscher netx */
+#define PORT_NETX      71
+
 #ifdef __KERNEL__
 
 #include <linux/config.h>
index 0a8ea8b358162b00fcd4036f5a3b23ad6f668a7d..483cfc47ec34203535f2fe0f0ed776c95da7c077 100644 (file)
@@ -32,7 +32,6 @@
 
 #define HAVE_ALLOC_SKB         /* For the drivers to know */
 #define HAVE_ALIGNABLE_SKB     /* Ditto 8)                */
-#define SLAB_SKB               /* Slabified skbuffs       */
 
 #define CHECKSUM_NONE 0
 #define CHECKSUM_HW 1
@@ -134,7 +133,7 @@ struct skb_frag_struct {
  */
 struct skb_shared_info {
        atomic_t        dataref;
-       unsigned int    nr_frags;
+       unsigned short  nr_frags;
        unsigned short  tso_size;
        unsigned short  tso_segs;
        unsigned short  ufo_size;
@@ -206,6 +205,7 @@ enum {
  *     @nfct: Associated connection, if any
  *     @ipvs_property: skbuff is owned by ipvs
  *     @nfctinfo: Relationship of this skb to the connection
+ *     @nfct_reasm: netfilter conntrack re-assembly pointer
  *     @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
  *     @tc_index: Traffic control index
  *     @tc_verd: traffic control verdict
@@ -264,16 +264,14 @@ struct sk_buff {
                                nohdr:1,
                                nfctinfo:3;
        __u8                    pkt_type:3,
-                               fclone:2;
+                               fclone:2,
+                               ipvs_property:1;
        __be16                  protocol;
 
        void                    (*destructor)(struct sk_buff *skb);
 #ifdef CONFIG_NETFILTER
        __u32                   nfmark;
        struct nf_conntrack     *nfct;
-#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
-       __u8                    ipvs_property:1;
-#endif
 #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
        struct sk_buff          *nfct_reasm;
 #endif
@@ -1240,6 +1238,8 @@ extern int               skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
                                                        int hlen,
                                                        struct iovec *iov);
 extern void           skb_free_datagram(struct sock *sk, struct sk_buff *skb);
+extern void           skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
+                                        unsigned int flags);
 extern unsigned int    skb_checksum(const struct sk_buff *skb, int offset,
                                    int len, unsigned int csum);
 extern int            skb_copy_bits(const struct sk_buff *skb, int offset,
index 1739c2d5b95b449669b887aa86aeb324d836c1f2..9f4019156fd8e7045e442df7f7661d7032b0642e 100644 (file)
@@ -27,7 +27,6 @@ struct __kernel_sockaddr_storage {
 #include <linux/compiler.h>            /* __user                       */
 
 extern int sysctl_somaxconn;
-extern void sock_init(void);
 #ifdef CONFIG_PROC_FS
 struct seq_file;
 extern void socket_seq_show(struct seq_file *seq);
index 20c975642cab4c7f17e1cd9c8b2a6b9a2938aa03..508668f840b6a072998ce931bfc492a68c83f473 100644 (file)
@@ -239,6 +239,11 @@ static inline void put_swap_token(struct mm_struct *mm)
                __put_swap_token(mm);
 }
 
+static inline void disable_swap_token(void)
+{
+       put_swap_token(swap_token_mm);
+}
+
 #else /* CONFIG_SWAP */
 
 #define total_swap_pages                       0
@@ -283,6 +288,7 @@ static inline swp_entry_t get_swap_page(void)
 #define put_swap_token(x) do { } while(0)
 #define grab_swap_token()  do { } while(0)
 #define has_swap_token(x) 0
+#define disable_swap_token() do { } while(0)
 
 #endif /* CONFIG_SWAP */
 #endif /* __KERNEL__*/
index 6bc03c911a83269d83c2692adff04a66c444fbe6..93fa765e47d30e9f10c7ab05f0954822bac21d49 100644 (file)
@@ -390,6 +390,7 @@ enum
        NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
        NET_TCP_CONG_CONTROL=110,
        NET_TCP_ABC=111,
+       NET_IPV4_IPFRAG_MAX_DIST=112,
 };
 
 enum {
@@ -670,6 +671,9 @@ enum {
        NET_DECNET_DST_GC_INTERVAL = 9,
        NET_DECNET_CONF = 10,
        NET_DECNET_NO_FC_MAX_CWND = 11,
+       NET_DECNET_MEM = 12,
+       NET_DECNET_RMEM = 13,
+       NET_DECNET_WMEM = 14,
        NET_DECNET_DEBUG_LEVEL = 255
 };
 
index 0e1da6602e054c24ee3f27f8dfe8b5d288e00c69..f2bb2396853f5319000e70bcb9bf71784e933c18 100644 (file)
@@ -55,22 +55,6 @@ struct tcphdr {
        __u16   urg_ptr;
 };
 
-#define TCP_ACTION_FIN (1 << 7)
-
-enum {
-  TCPF_ESTABLISHED = (1 << 1),
-  TCPF_SYN_SENT  = (1 << 2),
-  TCPF_SYN_RECV  = (1 << 3),
-  TCPF_FIN_WAIT1 = (1 << 4),
-  TCPF_FIN_WAIT2 = (1 << 5),
-  TCPF_TIME_WAIT = (1 << 6),
-  TCPF_CLOSE     = (1 << 7),
-  TCPF_CLOSE_WAIT = (1 << 8),
-  TCPF_LAST_ACK  = (1 << 9),
-  TCPF_LISTEN    = (1 << 10),
-  TCPF_CLOSING   = (1 << 11) 
-};
-
 /*
  *     The union cast uses a gcc extension to avoid aliasing problems
  *  (union is compatible to any of its members)
@@ -254,10 +238,9 @@ struct tcp_sock {
        __u32   snd_wl1;        /* Sequence for window update           */
        __u32   snd_wnd;        /* The window we expect to receive      */
        __u32   max_window;     /* Maximal window ever seen from peer   */
-       __u32   pmtu_cookie;    /* Last pmtu seen by socket             */
        __u32   mss_cache;      /* Cached effective mss, not including SACKS */
        __u16   xmit_size_goal; /* Goal for segmenting output packets   */
-       __u16   ext_header_len; /* Network protocol overhead (IP/IPv6 options) */
+       /* XXX Two bytes hole, try to pack */
 
        __u32   window_clamp;   /* Maximal window to advertise          */
        __u32   rcv_ssthresh;   /* Current window clamp                 */
@@ -295,8 +278,6 @@ struct tcp_sock {
 
        struct sk_buff_head     out_of_order_queue; /* Out of order segments go here */
 
-       struct tcp_func         *af_specific;   /* Operations which are AF_INET{4,6} specific   */
-
        __u32   rcv_wnd;        /* Current receiver window              */
        __u32   rcv_wup;        /* rcv_nxt on last window update sent   */
        __u32   write_seq;      /* Tail(+1) of data held in tcp send buffer */
index bfbe92d0767c62a61f09db17b5b59cb8e4a080a6..797ccd813bb004a1f02e52651f0c49260617254d 100644 (file)
@@ -95,6 +95,7 @@ struct itimerval;
 extern int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue);
 extern int do_getitimer(int which, struct itimerval *value);
 extern void getnstimeofday (struct timespec *tv);
+extern void getnstimestamp(struct timespec *ts);
 
 extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
 
index 46e2bb9453539e11ec583fc4a68a1c52bfc1dd5c..36c684e1b11040476fb685d8067a3831a00b4e2d 100644 (file)
  *    http://www.osta.org/ *    http://www.ecma.ch/
  *    http://www.iso.org/
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 62b15a4214e6608b8b5554ae07de8e3677dd3c0b..1e7508420fcfb6fab284ab15203d1cb1670f4ac2 100644 (file)
@@ -3,11 +3,6 @@
  *
  * This file is intended for the Linux kernel/module. 
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index 1966a6dbb4b6f70301470e381d845d7efe4b824e..b15ff2e99c91ff36a9c4a20fc719766914002f77 100644 (file)
@@ -3,11 +3,6 @@
  * 
  * This include file is for the Linux kernel/module.
  *
- * CONTACTS
- *     E-mail regarding any portion of the Linux UDF file system should be
- *     directed to the development team mailing list (run by majordomo):
- *             linux_udf@hpesjro.fc.hp.com
- *
  * COPYRIGHT
  *     This file is distributed under the terms of the GNU General Public
  *     License (GPL). Copies of the GPL can be obtained from:
index b60e0b4a25c41fd4cb91d333f0d001643c9cc424..85a55658831c5f0acdf8edda61921f7df7e14e77 100644 (file)
@@ -35,10 +35,10 @@ struct udphdr {
 #define UDP_ENCAP_ESPINUDP     2 /* draft-ietf-ipsec-udp-encaps-06 */
 
 #ifdef __KERNEL__
-
 #include <linux/config.h>
-#include <net/sock.h>
-#include <linux/ip.h>
+#include <linux/types.h>
+
+#include <net/inet_sock.h>
 
 struct udp_sock {
        /* inet_sock has to be the first member */
index 84876077027fb6c89643b76f9938085efdcfab86..0ff7ca68e5c53412e22c063eda26edc84381718b 100644 (file)
@@ -34,8 +34,7 @@
 #define UINPUT_BUFFER_SIZE     16
 #define UINPUT_NUM_REQUESTS    16
 
-/* state flags => bit index for {set|clear|test}_bit ops */
-#define UIST_CREATED           0
+enum uinput_state { UIST_NEW_DEVICE, UIST_SETUP_COMPLETE, UIST_CREATED };
 
 struct uinput_request {
        int                     id;
@@ -52,11 +51,12 @@ struct uinput_request {
 
 struct uinput_device {
        struct input_dev        *dev;
-       unsigned long           state;
+       struct semaphore        sem;
+       enum uinput_state       state;
        wait_queue_head_t       waitq;
-       unsigned char           ready,
-                               head,
-                               tail;
+       unsigned char           ready;
+       unsigned char           head;
+       unsigned char           tail;
        struct input_event      buff[UINPUT_BUFFER_SIZE];
 
        struct uinput_request   *requests[UINPUT_NUM_REQUESTS];
@@ -91,6 +91,7 @@ struct uinput_ff_erase {
 #define UI_SET_SNDBIT          _IOW(UINPUT_IOCTL_BASE, 106, int)
 #define UI_SET_FFBIT           _IOW(UINPUT_IOCTL_BASE, 107, int)
 #define UI_SET_PHYS            _IOW(UINPUT_IOCTL_BASE, 108, char*)
+#define UI_SET_SWBIT           _IOW(UINPUT_IOCTL_BASE, 109, int)
 
 #define UI_BEGIN_FF_UPLOAD     _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload)
 #define UI_END_FF_UPLOAD       _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload)
index 856d232c756235bcf66ce5d20d0609914d5d5cfd..e59d1bd52d4ff3ff651a62adc0787db7037fd0b3 100644 (file)
@@ -47,6 +47,7 @@ struct usb_driver;
  * @urb_list: urbs queued to this endpoint; maintained by usbcore
  * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH)
  *     with one or more transfer descriptors (TDs) per urb
+ * @kobj: kobject for sysfs info
  * @extra: descriptors following this endpoint in the configuration
  * @extralen: how many bytes of "extra" are valid
  *
@@ -328,8 +329,6 @@ struct usb_device {
        struct usb_tt   *tt;            /* low/full speed dev, highspeed hub */
        int             ttport;         /* device port on that tt hub */
 
-       struct semaphore serialize;
-
        unsigned int toggle[2];         /* one bit for each endpoint
                                         * ([0] = IN, [1] = OUT) */
 
@@ -348,6 +347,9 @@ struct usb_device {
 
        char **rawdescriptors;          /* Raw descriptors for each config */
 
+       unsigned short bus_mA;          /* Current available from the bus */
+       u8 portnum;                     /* Parent port number (origin 1) */
+
        int have_langid;                /* whether string_langid is valid */
        int string_langid;              /* language ID for strings */
 
@@ -376,11 +378,12 @@ struct usb_device {
 extern struct usb_device *usb_get_dev(struct usb_device *dev);
 extern void usb_put_dev(struct usb_device *dev);
 
-extern void usb_lock_device(struct usb_device *udev);
-extern int usb_trylock_device(struct usb_device *udev);
+/* USB device locking */
+#define usb_lock_device(udev)          down(&(udev)->dev.sem)
+#define usb_unlock_device(udev)                up(&(udev)->dev.sem)
+#define usb_trylock_device(udev)       down_trylock(&(udev)->dev.sem)
 extern int usb_lock_device_for_reset(struct usb_device *udev,
                struct usb_interface *iface);
-extern void usb_unlock_device(struct usb_device *udev);
 
 /* USB port reset for device reinitialization */
 extern int usb_reset_device(struct usb_device *dev);
@@ -528,10 +531,13 @@ static inline int usb_make_path (struct usb_device *dev, char *buf,
 
 /* ----------------------------------------------------------------------- */
 
+struct usb_dynids {
+       spinlock_t lock;
+       struct list_head list;
+};
+
 /**
  * struct usb_driver - identifies USB driver to usbcore
- * @owner: Pointer to the module owner of this driver; initialize
- *     it using THIS_MODULE.
  * @name: The driver name should be unique among USB drivers,
  *     and should normally be the same as the module name.
  * @probe: Called to see if the driver is willing to manage a particular
@@ -552,7 +558,11 @@ static inline int usb_make_path (struct usb_device *dev, char *buf,
  * @id_table: USB drivers use ID table to support hotplugging.
  *     Export this with MODULE_DEVICE_TABLE(usb,...).  This must be set
  *     or your driver's probe function will never get called.
+ * @dynids: used internally to hold the list of dynamically added device
+ *     ids for this driver.
  * @driver: the driver model core driver structure.
+ * @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be
+ *     added to this driver by preventing the sysfs file from being created.
  *
  * USB drivers must provide a name, probe() and disconnect() methods,
  * and an id_table.  Other driver fields are optional.
@@ -570,8 +580,6 @@ static inline int usb_make_path (struct usb_device *dev, char *buf,
  * them as necessary, and blocking until the unlinks complete).
  */
 struct usb_driver {
-       struct module *owner;
-
        const char *name;
 
        int (*probe) (struct usb_interface *intf,
@@ -587,7 +595,9 @@ struct usb_driver {
 
        const struct usb_device_id *id_table;
 
+       struct usb_dynids dynids;
        struct device_driver driver;
+       unsigned int no_dynamic_id:1;
 };
 #define        to_usb_driver(d) container_of(d, struct usb_driver, driver)
 
@@ -613,7 +623,11 @@ struct usb_class_driver {
  * use these in module_init()/module_exit()
  * and don't forget MODULE_DEVICE_TABLE(usb, ...)
  */
-extern int usb_register(struct usb_driver *);
+int usb_register_driver(struct usb_driver *, struct module *);
+static inline int usb_register(struct usb_driver *driver)
+{
+       return usb_register_driver(driver, THIS_MODULE);
+}
 extern void usb_deregister(struct usb_driver *);
 
 extern int usb_register_dev(struct usb_interface *intf,
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
new file mode 100644 (file)
index 0000000..b2d0898
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Interface to the libusual.
+ *
+ * Copyright (c) 2005 Pete Zaitcev <zaitcev@redhat.com>
+ * Copyright (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
+ * Copyright (c) 1999 Michael Gee (michael@linuxspecific.com)
+ */
+
+#ifndef __LINUX_USB_USUAL_H
+#define __LINUX_USB_USUAL_H
+
+#include <linux/config.h>
+
+/* We should do this for cleanliness... But other usb_foo.h do not do this. */
+/* #include <linux/usb.h> */
+
+/*
+ * The flags field, which we store in usb_device_id.driver_info.
+ * It is compatible with the old usb-storage flags in lower 24 bits.
+ */
+
+/*
+ * Static flag definitions.  We use this roundabout technique so that the
+ * proc_info() routine can automatically display a message for each flag.
+ */
+#define US_DO_ALL_FLAGS                                                \
+       US_FLAG(SINGLE_LUN,     0x00000001)                     \
+               /* allow access to only LUN 0 */                \
+       US_FLAG(NEED_OVERRIDE,  0x00000002)                     \
+               /* unusual_devs entry is necessary */           \
+       US_FLAG(SCM_MULT_TARG,  0x00000004)                     \
+               /* supports multiple targets */                 \
+       US_FLAG(FIX_INQUIRY,    0x00000008)                     \
+               /* INQUIRY response needs faking */             \
+       US_FLAG(FIX_CAPACITY,   0x00000010)                     \
+               /* READ CAPACITY response too big */            \
+       US_FLAG(IGNORE_RESIDUE, 0x00000020)                     \
+               /* reported residue is wrong */                 \
+       US_FLAG(BULK32,         0x00000040)                     \
+               /* Uses 32-byte CBW length */                   \
+       US_FLAG(NOT_LOCKABLE,   0x00000080)                     \
+               /* PREVENT/ALLOW not supported */               \
+       US_FLAG(GO_SLOW,        0x00000100)                     \
+               /* Need delay after Command phase */            \
+       US_FLAG(NO_WP_DETECT,   0x00000200)                     \
+               /* Don't check for write-protect */             \
+
+#define US_FLAG(name, value)   US_FL_##name = value ,
+enum { US_DO_ALL_FLAGS };
+#undef US_FLAG
+
+/*
+ * The bias field for libusual and friends.
+ */
+#define USB_US_TYPE_NONE   0
+#define USB_US_TYPE_STOR   1           /* usb-storage */
+#define USB_US_TYPE_UB     2           /* ub */
+
+#define USB_US_TYPE(flags)             (((flags) >> 24) & 0xFF)
+#define USB_US_ORIG_FLAGS(flags)       ((flags) & 0x00FFFFFF)
+
+/*
+ * This is probably not the best place to keep these constants, conceptually.
+ * But it's the only header included into all places which need them.
+ */
+
+/* Sub Classes */
+
+#define US_SC_RBC      0x01            /* Typically, flash devices */
+#define US_SC_8020     0x02            /* CD-ROM */
+#define US_SC_QIC      0x03            /* QIC-157 Tapes */
+#define US_SC_UFI      0x04            /* Floppy */
+#define US_SC_8070     0x05            /* Removable media */
+#define US_SC_SCSI     0x06            /* Transparent */
+#define US_SC_ISD200    0x07           /* ISD200 ATA */
+#define US_SC_MIN      US_SC_RBC
+#define US_SC_MAX      US_SC_ISD200
+
+#define US_SC_DEVICE   0xff            /* Use device's value */
+
+/* Protocols */
+
+#define US_PR_CBI      0x00            /* Control/Bulk/Interrupt */
+#define US_PR_CB       0x01            /* Control/Bulk w/o interrupt */
+#define US_PR_BULK     0x50            /* bulk only */
+#ifdef CONFIG_USB_STORAGE_USBAT
+#define US_PR_USBAT    0x80            /* SCM-ATAPI bridge */
+#endif
+#ifdef CONFIG_USB_STORAGE_SDDR09
+#define US_PR_EUSB_SDDR09      0x81    /* SCM-SCSI bridge for SDDR-09 */
+#endif
+#ifdef CONFIG_USB_STORAGE_SDDR55
+#define US_PR_SDDR55   0x82            /* SDDR-55 (made up) */
+#endif
+#define US_PR_DPCM_USB  0xf0           /* Combination CB/SDDR09 */
+#ifdef CONFIG_USB_STORAGE_FREECOM
+#define US_PR_FREECOM   0xf1           /* Freecom */
+#endif
+#ifdef CONFIG_USB_STORAGE_DATAFAB
+#define US_PR_DATAFAB   0xf2           /* Datafab chipsets */
+#endif
+#ifdef CONFIG_USB_STORAGE_JUMPSHOT
+#define US_PR_JUMPSHOT  0xf3           /* Lexar Jumpshot */
+#endif
+#ifdef CONFIG_USB_STORAGE_ALAUDA
+#define US_PR_ALAUDA    0xf4           /* Alauda chipsets */
+#endif
+
+#define US_PR_DEVICE   0xff            /* Use device's value */
+
+/*
+ */
+#ifdef CONFIG_USB_LIBUSUAL
+
+extern struct usb_device_id storage_usb_ids[];
+extern void usb_usual_set_present(int type);
+extern void usb_usual_clear_present(int type);
+extern int usb_usual_check_type(const struct usb_device_id *, int type);
+#else
+
+#define usb_usual_set_present(t)       do { } while(0)
+#define usb_usual_clear_present(t)     do { } while(0)
+#define usb_usual_check_type(id, t)    (0)
+#endif /* CONFIG_USB_LIBUSUAL */
+
+#endif /* __LINUX_USB_USUAL_H */
index 0fb077d68441f864281d8473dd9744c37d9d80df..82fbb758e28f398bbcc0e2a3728a433d81ea6f82 100644 (file)
@@ -27,6 +27,22 @@ struct xfrm_id
        __u8            proto;
 };
 
+struct xfrm_sec_ctx {
+       __u8    ctx_doi;
+       __u8    ctx_alg;
+       __u16   ctx_len;
+       __u32   ctx_sid;
+       char    ctx_str[0];
+};
+
+/* Security Context Domains of Interpretation */
+#define XFRM_SC_DOI_RESERVED 0
+#define XFRM_SC_DOI_LSM 1
+
+/* Security Context Algorithms */
+#define XFRM_SC_ALG_RESERVED 0
+#define XFRM_SC_ALG_SELINUX 1
+
 /* Selector, used as selector both on policy rules (SPD) and SAs. */
 
 struct xfrm_selector
@@ -146,6 +162,18 @@ enum {
 
 #define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)
 
+/*
+ * Generic LSM security context for comunicating to user space
+ * NOTE: Same format as sadb_x_sec_ctx
+ */
+struct xfrm_user_sec_ctx {
+       __u16                   len;
+       __u16                   exttype;
+       __u8                    ctx_alg;  /* LSMs: e.g., selinux == 1 */
+       __u8                    ctx_doi;
+       __u16                   ctx_len;
+};
+
 struct xfrm_user_tmpl {
        struct xfrm_id          id;
        __u16                   family;
@@ -176,6 +204,7 @@ enum xfrm_attr_type_t {
        XFRMA_TMPL,             /* 1 or more struct xfrm_user_tmpl */
        XFRMA_SA,
        XFRMA_POLICY,
+       XFRMA_SEC_CTX,          /* struct xfrm_sec_ctx */
        __XFRMA_MAX
 
 #define XFRMA_MAX (__XFRMA_MAX - 1)
index 2a897c3a6a9af9fd2a483843f452ddb01ac91cdd..e5be2b9b846b9321bd5e3e316061ae57e29d9dd4 100644 (file)
@@ -14,7 +14,7 @@
 #include <linux/vmalloc.h>     /* for vmalloc() */
 #include <linux/mm.h>          /* for vmalloc_to_page() */
 
-#define SAA7146_VERSION_CODE 0x000500   /* 0.5.0 */
+#define SAA7146_VERSION_CODE 0x000500  /* 0.5.0 */
 
 #define saa7146_write(sxy,adr,dat)    writel((dat),(sxy->mem+(adr)))
 #define saa7146_read(sxy,adr)         readl(sxy->mem+(adr))
@@ -112,7 +112,7 @@ struct saa7146_dev
 
        /* different device locks */
        spinlock_t                      slock;
-        struct semaphore               lock;
+       struct semaphore                lock;
 
        unsigned char                   __iomem *mem;           /* pointer to mapped IO memory */
        int                             revision;       /* chip revision; needed for bug-workarounds*/
@@ -133,7 +133,7 @@ struct saa7146_dev
        void (*vv_callback)(struct saa7146_dev *dev, unsigned long status);
 
        /* i2c-stuff */
-        struct semaphore       i2c_lock;
+       struct semaphore        i2c_lock;
        u32                     i2c_bitrate;
        struct saa7146_dma      d_i2c;  /* pointer to i2c memory */
        wait_queue_head_t       i2c_wq;
index 64691753721edc1e82d38ff0cc9473273ddedede..16af9299315f3da06ba07a722fb9bdaa7627e520 100644 (file)
@@ -113,7 +113,7 @@ struct saa7146_vv
        /* vbi capture */
        struct saa7146_dmaqueue         vbi_q;
        /* vbi workaround interrupt queue */
-        wait_queue_head_t              vbi_wq;
+       wait_queue_head_t               vbi_wq;
        int                             vbi_fieldcount;
        struct saa7146_fh               *vbi_streaming;
 
@@ -181,10 +181,10 @@ struct saa7146_ext_vv
 };
 
 struct saa7146_use_ops  {
-        void (*init)(struct saa7146_dev *, struct saa7146_vv *);
-        int(*open)(struct saa7146_dev *, struct file *);
-        void (*release)(struct saa7146_dev *, struct file *);
-        void (*irq_done)(struct saa7146_dev *, unsigned long status);
+       void (*init)(struct saa7146_dev *, struct saa7146_vv *);
+       int(*open)(struct saa7146_dev *, struct file *);
+       void (*release)(struct saa7146_dev *, struct file *);
+       void (*irq_done)(struct saa7146_dev *, unsigned long status);
        ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
 };
 
index e2035c7da09480551a93555ab8cd36524a8982d7..e9fc1a7854970aaccf6eb8252cbd3914c41bdfd9 100644 (file)
@@ -4,12 +4,15 @@
 struct tveeprom {
        u32 has_radio;
        u32 has_ir;     /* 0: no IR, 1: IR present, 2: unknown */
+       u32 has_MAC_address; /* 0: no MAC, 1: MAC present, 2: unknown */
 
        u32 tuner_type;
        u32 tuner_formats;
+       u32 tuner_hauppauge_model;
 
        u32 tuner2_type;
        u32 tuner2_formats;
+       u32 tuner2_hauppauge_model;
 
        u32 digitizer;
        u32 digitizer_formats;
@@ -21,6 +24,7 @@ struct tveeprom {
        u32 revision;
        u32 serial_number;
        char rev_str[5];
+       u8 MAC_address[6];
 };
 
 void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
index b5d785ab4a0ea3cd41fe6ac2c82edcaf68274c0a..bfc1779fc753fcf0c1a13a086bf5fc2b7c999b65 100644 (file)
@@ -13,7 +13,7 @@ extern void unix_gc(void);
 #define UNIX_HASH_SIZE 256
 
 extern struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1];
-extern rwlock_t unix_table_lock;
+extern spinlock_t unix_table_lock;
 
 extern atomic_t unix_tot_inflight;
 
@@ -58,10 +58,10 @@ struct unix_skb_parms {
 #define UNIXCB(skb)    (*(struct unix_skb_parms*)&((skb)->cb))
 #define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
 
-#define unix_state_rlock(s)    read_lock(&unix_sk(s)->lock)
-#define unix_state_runlock(s)  read_unlock(&unix_sk(s)->lock)
-#define unix_state_wlock(s)    write_lock(&unix_sk(s)->lock)
-#define unix_state_wunlock(s)  write_unlock(&unix_sk(s)->lock)
+#define unix_state_rlock(s)    spin_lock(&unix_sk(s)->lock)
+#define unix_state_runlock(s)  spin_unlock(&unix_sk(s)->lock)
+#define unix_state_wlock(s)    spin_lock(&unix_sk(s)->lock)
+#define unix_state_wunlock(s)  spin_unlock(&unix_sk(s)->lock)
 
 #ifdef __KERNEL__
 /* The AF_UNIX socket */
@@ -76,7 +76,7 @@ struct unix_sock {
         struct sock            *other;
         struct sock            *gc_tree;
         atomic_t                inflight;
-        rwlock_t                lock;
+        spinlock_t             lock;
         wait_queue_head_t       peer_wait;
 };
 #define unix_sk(__sk) ((struct unix_sock *)__sk)
index 47048b1d179a61c6d5c1c53775d6d83ec92ae9c1..90fcc98e676f349239b66d9a6840502fcb0e33f0 100644 (file)
@@ -7,7 +7,6 @@
 #define _ATMCLIP_H
 
 #include <linux/netdevice.h>
-#include <linux/skbuff.h>
 #include <linux/atm.h>
 #include <linux/atmdev.h>
 #include <linux/atmarp.h>
@@ -18,6 +17,7 @@
 #define CLIP_VCC(vcc) ((struct clip_vcc *) ((vcc)->user_back))
 #define NEIGH2ENTRY(neigh) ((struct atmarp_entry *) (neigh)->primary_key)
 
+struct sk_buff;
 
 struct clip_vcc {
        struct atm_vcc  *vcc;           /* VCC descriptor */
index c1dbbd22279394863d3d7cb7d8b7ed948e8bcfa7..a4b6168e1e2571ac34f01aab561167275323ea4d 100644 (file)
@@ -234,4 +234,8 @@ extern int decnet_di_count;
 extern int decnet_dr_count;
 extern int decnet_no_fc_max_cwnd;
 
+extern int sysctl_decnet_mem[3];
+extern int sysctl_decnet_wmem[3];
+extern int sysctl_decnet_rmem[3];
+
 #endif /* _NET_DN_H */
index 6c196a5baf24bda85e3789163ebe4a6cdf74eb31..bee8b84d329db3522f0e9fc7f3991e4579f7963c 100644 (file)
@@ -9,6 +9,7 @@
 #define _NET_DST_H
 
 #include <linux/config.h>
+#include <linux/netdevice.h>
 #include <linux/rtnetlink.h>
 #include <linux/rcupdate.h>
 #include <linux/jiffies.h>
index 9a5c94b1a0eca9d703ed72d8c8474b274db94a80..ec7eb86eb2035fa7ed44dce421b7a0579d617329 100644 (file)
@@ -84,11 +84,12 @@ struct flowi {
 #define FLOW_DIR_OUT   1
 #define FLOW_DIR_FWD   2
 
-typedef void (*flow_resolve_t)(struct flowi *key, u16 family, u8 dir,
+struct sock;
+typedef void (*flow_resolve_t)(struct flowi *key, u32 sk_sid, u16 family, u8 dir,
                               void **objp, atomic_t **obj_refp);
 
-extern void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
-                              flow_resolve_t resolver);
+extern void *flow_cache_lookup(struct flowi *key, u32 sk_sid, u16 family, u8 dir,
+                              flow_resolve_t resolver);
 extern void flow_cache_flush(void);
 extern atomic_t flow_cache_genid;
 
index 52d8b1a73d521b5bb792148a2f17fff854aec9d6..c5b96b2b81554e452630774254c1a2ae4e9a9f34 100644 (file)
@@ -60,7 +60,7 @@ struct genl_info
  */
 struct genl_ops
 {
-       unsigned int            cmd;
+       u8                      cmd;
        unsigned int            flags;
        struct nla_policy       *policy;
        int                    (*doit)(struct sk_buff *skb,
index 6cdebeee5f961318bc5c8e942b1a2f92e4b276ce..e7c3f20fbafc6de85b683d41588f2d1646ca4989 100644 (file)
 
 #include <linux/config.h>
 #include <linux/icmp.h>
-#include <linux/skbuff.h>
 
-#include <net/sock.h>
-#include <net/protocol.h>
+#include <net/inet_sock.h>
 #include <net/snmp.h>
-#include <linux/ip.h>
 
 struct icmp_err {
   int          errno;
@@ -38,6 +35,10 @@ DECLARE_SNMP_STAT(struct icmp_mib, icmp_statistics);
 #define ICMP_INC_STATS_BH(field)       SNMP_INC_STATS_BH(icmp_statistics, field)
 #define ICMP_INC_STATS_USER(field)     SNMP_INC_STATS_USER(icmp_statistics, field)
 
+struct dst_entry;
+struct net_proto_family;
+struct sk_buff;
+
 extern void    icmp_send(struct sk_buff *skb_in,  int type, int code, u32 info);
 extern int     icmp_rcv(struct sk_buff *skb);
 extern int     icmp_ioctl(struct sock *sk, int cmd, unsigned long arg);
index 225fc751d46485101468be810298d020bb68e5fb..03b766afdc395cab12fe65f083714667627b4b78 100644 (file)
 #ifndef IEEE80211_CRYPT_H
 #define IEEE80211_CRYPT_H
 
-#include <linux/skbuff.h>
+#include <linux/types.h>
+#include <linux/list.h>
+#include <asm/atomic.h>
 
 enum {
        IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = (1 << 0),
 };
 
+struct sk_buff;
+struct module;
+
 struct ieee80211_crypto_ops {
        const char *name;
        struct list_head list;
@@ -87,6 +92,8 @@ struct ieee80211_crypt_data {
        atomic_t refcnt;
 };
 
+struct ieee80211_device;
+
 int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops);
 int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops);
 struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name);
index e97a9accb71df31630d5c4d4455ef52bec535991..eb8afe3499a92766245e59c17ab70bfd84da3ffb 100644 (file)
@@ -24,6 +24,7 @@
 #define IF_RA_MANAGED  0x40
 #define IF_RA_RCVD     0x20
 #define IF_RS_SENT     0x10
+#define IF_READY       0x80000000
 
 /* prefix flags */
 #define IF_PREFIX_ONLINK       0x01
@@ -82,6 +83,7 @@ struct ipv6_mc_socklist
        struct in6_addr         addr;
        int                     ifindex;
        struct ipv6_mc_socklist *next;
+       rwlock_t                sflock;
        unsigned int            sfmode;         /* MCAST_{INCLUDE,EXCLUDE} */
        struct ip6_sf_socklist  *sflist;
 };
diff --git a/include/net/inet6_connection_sock.h b/include/net/inet6_connection_sock.h
new file mode 100644 (file)
index 0000000..b33b438
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * NET         Generic infrastructure for INET6 connection oriented protocols.
+ *
+ * Authors:    Many people, see the TCPv6 sources
+ *
+ *             From code originally in TCPv6
+ *
+ *             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 _INET6_CONNECTION_SOCK_H
+#define _INET6_CONNECTION_SOCK_H
+
+#include <linux/types.h>
+
+struct in6_addr;
+struct inet_bind_bucket;
+struct request_sock;
+struct sk_buff;
+struct sock;
+struct sockaddr;
+
+extern int inet6_csk_bind_conflict(const struct sock *sk,
+                                  const struct inet_bind_bucket *tb);
+
+extern struct request_sock *inet6_csk_search_req(const struct sock *sk,
+                                                struct request_sock ***prevp,
+                                                const __u16 rport,
+                                                const struct in6_addr *raddr,
+                                                const struct in6_addr *laddr,
+                                                const int iif);
+
+extern void inet6_csk_reqsk_queue_hash_add(struct sock *sk,
+                                          struct request_sock *req,
+                                          const unsigned long timeout);
+
+extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
+
+extern int inet6_csk_xmit(struct sk_buff *skb, int ipfragok);
+#endif /* _INET6_CONNECTION_SOCK_H */
index 5a2beed5a7701e0c69d7793a6eb3b60667abd84e..25f708ff020e9b158e26fe95c56b2706774c8bdf 100644 (file)
@@ -48,6 +48,32 @@ static inline int inet6_sk_ehashfn(const struct sock *sk)
        return inet6_ehashfn(laddr, lport, faddr, fport);
 }
 
+static inline void __inet6_hash(struct inet_hashinfo *hashinfo,
+                               struct sock *sk)
+{
+       struct hlist_head *list;
+       rwlock_t *lock;
+
+       BUG_TRAP(sk_unhashed(sk));
+
+       if (sk->sk_state == TCP_LISTEN) {
+               list = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)];
+               lock = &hashinfo->lhash_lock;
+               inet_listen_wlock(hashinfo);
+       } else {
+               unsigned int hash;
+               sk->sk_hash = hash = inet6_sk_ehashfn(sk);
+               hash &= (hashinfo->ehash_size - 1);
+               list = &hashinfo->ehash[hash].chain;
+               lock = &hashinfo->ehash[hash].lock;
+               write_lock(lock);
+       }
+
+       __sk_add_node(sk, list);
+       sock_prot_inc_use(sk->sk_prot);
+       write_unlock(lock);
+}
+
 /*
  * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so
  * we need not check it for TCP lookups anymore, thanks Alexey. -DaveM
@@ -84,10 +110,10 @@ static inline struct sock *
 
                if(*((__u32 *)&(tw->tw_dport))  == ports        &&
                   sk->sk_family                == PF_INET6) {
-                       const struct tcp6_timewait_sock *tcp6tw = tcp6_twsk(sk);
+                       const struct inet6_timewait_sock *tw6 = inet6_twsk(sk);
 
-                       if (ipv6_addr_equal(&tcp6tw->tw_v6_daddr, saddr)        &&
-                           ipv6_addr_equal(&tcp6tw->tw_v6_rcv_saddr, daddr)    &&
+                       if (ipv6_addr_equal(&tw6->tw_v6_daddr, saddr)   &&
+                           ipv6_addr_equal(&tw6->tw_v6_rcv_saddr, daddr)       &&
                            (!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dif))
                                goto hit;
                }
index f943306ce5ff3104092f604ed4d23c5c93de9855..227adcbdfec801e313f9e4c49a029a8f4347be90 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef _INET_COMMON_H
 #define _INET_COMMON_H
 
-extern struct proto_ops                inet_stream_ops;
-extern struct proto_ops                inet_dgram_ops;
+extern const struct proto_ops          inet_stream_ops;
+extern const struct proto_ops          inet_dgram_ops;
 
 /*
  *     INET4 prototypes used by INET6
index b0c99060b78d721f285c7b23a34525dd1d592e62..50234fa56a6843a16f803e2d22616e4489d8e7b6 100644 (file)
 #ifndef _INET_CONNECTION_SOCK_H
 #define _INET_CONNECTION_SOCK_H
 
-#include <linux/ip.h>
+#include <linux/compiler.h>
 #include <linux/string.h>
 #include <linux/timer.h>
+
+#include <net/inet_sock.h>
 #include <net/request_sock.h>
 
 #define INET_CSK_DEBUG 1
@@ -29,6 +31,29 @@ struct inet_bind_bucket;
 struct inet_hashinfo;
 struct tcp_congestion_ops;
 
+/*
+ * Pointers to address related TCP functions
+ * (i.e. things that depend on the address family)
+ */
+struct inet_connection_sock_af_ops {
+       int         (*queue_xmit)(struct sk_buff *skb, int ipfragok);
+       void        (*send_check)(struct sock *sk, int len,
+                                 struct sk_buff *skb);
+       int         (*rebuild_header)(struct sock *sk);
+       int         (*conn_request)(struct sock *sk, struct sk_buff *skb);
+       struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb,
+                                     struct request_sock *req,
+                                     struct dst_entry *dst);
+       int         (*remember_stamp)(struct sock *sk);
+       __u16       net_header_len;
+       int         (*setsockopt)(struct sock *sk, int level, int optname, 
+                                 char __user *optval, int optlen);
+       int         (*getsockopt)(struct sock *sk, int level, int optname, 
+                                 char __user *optval, int __user *optlen);
+       void        (*addr2sockaddr)(struct sock *sk, struct sockaddr *);
+       int sockaddr_len;
+};
+
 /** inet_connection_sock - INET connection oriented sock
  *
  * @icsk_accept_queue:    FIFO of established children 
@@ -36,13 +61,16 @@ struct tcp_congestion_ops;
  * @icsk_timeout:         Timeout
  * @icsk_retransmit_timer: Resend (no ack)
  * @icsk_rto:             Retransmit timeout
+ * @icsk_pmtu_cookie      Last pmtu seen by socket
  * @icsk_ca_ops                   Pluggable congestion control hook
+ * @icsk_af_ops                   Operations which are AF_INET{4,6} specific
  * @icsk_ca_state:        Congestion control state
  * @icsk_retransmits:     Number of unrecovered [RTO] timeouts
  * @icsk_pending:         Scheduled timer event
  * @icsk_backoff:         Backoff
  * @icsk_syn_retries:      Number of allowed SYN (or equivalent) retries
  * @icsk_probes_out:      unanswered 0 window probes
+ * @icsk_ext_hdr_len:     Network protocol overhead (IP/IPv6 options)
  * @icsk_ack:             Delayed ACK control data
  */
 struct inet_connection_sock {
@@ -54,14 +82,17 @@ struct inet_connection_sock {
        struct timer_list         icsk_retransmit_timer;
        struct timer_list         icsk_delack_timer;
        __u32                     icsk_rto;
+       __u32                     icsk_pmtu_cookie;
        struct tcp_congestion_ops *icsk_ca_ops;
+       struct inet_connection_sock_af_ops *icsk_af_ops;
+       unsigned int              (*icsk_sync_mss)(struct sock *sk, u32 pmtu);
        __u8                      icsk_ca_state;
        __u8                      icsk_retransmits;
        __u8                      icsk_pending;
        __u8                      icsk_backoff;
        __u8                      icsk_syn_retries;
        __u8                      icsk_probes_out;
-       /* 2 BYTES HOLE, TRY TO PACK! */
+       __u16                     icsk_ext_hdr_len;
        struct {
                __u8              pending;       /* ACK is pending                         */
                __u8              quick;         /* Scheduled number of quick acks         */
@@ -192,8 +223,12 @@ extern struct request_sock *inet_csk_search_req(const struct sock *sk,
                                                const __u16 rport,
                                                const __u32 raddr,
                                                const __u32 laddr);
+extern int inet_csk_bind_conflict(const struct sock *sk,
+                                 const struct inet_bind_bucket *tb);
 extern int inet_csk_get_port(struct inet_hashinfo *hashinfo,
-                            struct sock *sk, unsigned short snum);
+                            struct sock *sk, unsigned short snum,
+                            int (*bind_conflict)(const struct sock *sk,
+                                                 const struct inet_bind_bucket *tb));
 
 extern struct dst_entry* inet_csk_route_req(struct sock *sk,
                                            const struct request_sock *req);
@@ -207,7 +242,7 @@ static inline void inet_csk_reqsk_queue_add(struct sock *sk,
 
 extern void inet_csk_reqsk_queue_hash_add(struct sock *sk,
                                          struct request_sock *req,
-                                         const unsigned timeout);
+                                         unsigned long timeout);
 
 static inline void inet_csk_reqsk_queue_removed(struct sock *sk,
                                                struct request_sock *req)
@@ -273,4 +308,6 @@ static inline unsigned int inet_csk_listen_poll(const struct sock *sk)
 extern int  inet_csk_listen_start(struct sock *sk, const int nr_table_entries);
 extern void inet_csk_listen_stop(struct sock *sk);
 
+extern void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
+
 #endif /* _INET_CONNECTION_SOCK_H */
index b0c47e2eccf10849d7ca097eeeaf3b08c307837e..d599c6bfbb86bc5eb0e83f91f9f7fb417d4631f2 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <linux/ip.h>
 #include <linux/skbuff.h>
+
+#include <net/inet_sock.h>
 #include <net/dsfield.h>
 
 enum {
index 07840baa934125280a97a3261fcb25da1840588e..135d80fd658ebf2c8d027440a1e9580f1c2b1ba3 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/wait.h>
 
 #include <net/inet_connection_sock.h>
+#include <net/inet_sock.h>
 #include <net/route.h>
 #include <net/sock.h>
 #include <net/tcp_states.h>
@@ -128,26 +129,6 @@ struct inet_hashinfo {
        kmem_cache_t                    *bind_bucket_cachep;
 };
 
-static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
-                              const __u32 faddr, const __u16 fport)
-{
-       unsigned int h = (laddr ^ lport) ^ (faddr ^ fport);
-       h ^= h >> 16;
-       h ^= h >> 8;
-       return h;
-}
-
-static inline int inet_sk_ehashfn(const struct sock *sk)
-{
-       const struct inet_sock *inet = inet_sk(sk);
-       const __u32 laddr = inet->rcv_saddr;
-       const __u16 lport = inet->num;
-       const __u32 faddr = inet->daddr;
-       const __u16 fport = inet->dport;
-
-       return inet_ehashfn(laddr, lport, faddr, fport);
-}
-
 static inline struct inet_ehash_bucket *inet_ehash_bucket(
        struct inet_hashinfo *hashinfo,
        unsigned int hash)
@@ -434,4 +415,7 @@ static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo,
 
        return sk;
 }
+
+extern int inet_hash_connect(struct inet_timewait_death_row *death_row,
+                            struct sock *sk);
 #endif /* _INET_HASHTABLES_H */
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
new file mode 100644 (file)
index 0000000..883eb52
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * 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.
+ *
+ *             Definitions for inet_sock
+ *
+ * Authors:    Many, reorganised here by
+ *             Arnaldo Carvalho de Melo <acme@mandriva.com>
+ *
+ *             This program is free software; you can redistribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ */
+#ifndef _INET_SOCK_H
+#define _INET_SOCK_H
+
+#include <linux/config.h>
+
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include <net/flow.h>
+#include <net/sock.h>
+#include <net/request_sock.h>
+
+/** struct ip_options - IP Options
+ *
+ * @faddr - Saved first hop address
+ * @is_setbyuser - Set by setsockopt?
+ * @is_data - Options in __data, rather than skb
+ * @is_strictroute - Strict source route
+ * @srr_is_hit - Packet destination addr was our one
+ * @is_changed - IP checksum more not valid
+ * @rr_needaddr - Need to record addr of outgoing dev
+ * @ts_needtime - Need to record timestamp
+ * @ts_needaddr - Need to record addr of outgoing dev
+ */
+struct ip_options {
+       __u32           faddr;
+       unsigned char   optlen;
+       unsigned char   srr;
+       unsigned char   rr;
+       unsigned char   ts;
+       unsigned char   is_setbyuser:1,
+                       is_data:1,
+                       is_strictroute:1,
+                       srr_is_hit:1,
+                       is_changed:1,
+                       rr_needaddr:1,
+                       ts_needtime:1,
+                       ts_needaddr:1;
+       unsigned char   router_alert;
+       unsigned char   __pad1;
+       unsigned char   __pad2;
+       unsigned char   __data[0];
+};
+
+#define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
+
+struct inet_request_sock {
+       struct request_sock     req;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       u16                     inet6_rsk_offset;
+       /* 2 bytes hole, try to pack */
+#endif
+       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 ip_mc_socklist;
+struct ipv6_pinfo;
+struct rtable;
+
+/** struct inet_sock - representation of INET sockets
+ *
+ * @sk - ancestor class
+ * @pinet6 - pointer to IPv6 control block
+ * @daddr - Foreign IPv4 addr
+ * @rcv_saddr - Bound local IPv4 addr
+ * @dport - Destination port
+ * @num - Local port
+ * @saddr - Sending source
+ * @uc_ttl - Unicast TTL
+ * @sport - Source port
+ * @id - ID counter for DF pkts
+ * @tos - TOS
+ * @mc_ttl - Multicasting TTL
+ * @is_icsk - is this an inet_connection_sock?
+ * @mc_index - Multicast device index
+ * @mc_list - Group array
+ * @cork - info to build ip hdr on each ip frag while socket is corked
+ */
+struct inet_sock {
+       /* sk and pinet6 has to be the first two members of inet_sock */
+       struct sock             sk;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       struct ipv6_pinfo       *pinet6;
+#endif
+       /* Socket demultiplex comparisons on incoming packets. */
+       __u32                   daddr;
+       __u32                   rcv_saddr;
+       __u16                   dport;
+       __u16                   num;
+       __u32                   saddr;
+       __s16                   uc_ttl;
+       __u16                   cmsg_flags;
+       struct ip_options       *opt;
+       __u16                   sport;
+       __u16                   id;
+       __u8                    tos;
+       __u8                    mc_ttl;
+       __u8                    pmtudisc;
+       __u8                    recverr:1,
+                               is_icsk:1,
+                               freebind:1,
+                               hdrincl:1,
+                               mc_loop:1;
+       int                     mc_index;
+       __u32                   mc_addr;
+       struct ip_mc_socklist   *mc_list;
+       struct {
+               unsigned int            flags;
+               unsigned int            fragsize;
+               struct ip_options       *opt;
+               struct rtable           *rt;
+               int                     length; /* Total length of all frames */
+               u32                     addr;
+               struct flowi            fl;
+       } cork;
+};
+
+#define IPCORK_OPT     1       /* ip-options has been held in ipcork.opt */
+#define IPCORK_ALLFRAG 2       /* always fragment (for ipv6 for now) */
+
+static inline struct inet_sock *inet_sk(const struct sock *sk)
+{
+       return (struct inet_sock *)sk;
+}
+
+static inline void __inet_sk_copy_descendant(struct sock *sk_to,
+                                            const struct sock *sk_from,
+                                            const int ancestor_size)
+{
+       memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,
+              sk_from->sk_prot->obj_size - ancestor_size);
+}
+#if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
+static inline void inet_sk_copy_descendant(struct sock *sk_to,
+                                          const struct sock *sk_from)
+{
+       __inet_sk_copy_descendant(sk_to, sk_from, sizeof(struct inet_sock));
+}
+#endif
+
+extern int inet_sk_rebuild_header(struct sock *sk);
+
+static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
+                                       const __u32 faddr, const __u16 fport)
+{
+       unsigned int h = (laddr ^ lport) ^ (faddr ^ fport);
+       h ^= h >> 16;
+       h ^= h >> 8;
+       return h;
+}
+
+static inline int inet_sk_ehashfn(const struct sock *sk)
+{
+       const struct inet_sock *inet = inet_sk(sk);
+       const __u32 laddr = inet->rcv_saddr;
+       const __u16 lport = inet->num;
+       const __u32 faddr = inet->daddr;
+       const __u16 fport = inet->dport;
+
+       return inet_ehashfn(laddr, lport, faddr, fport);
+}
+
+#endif /* _INET_SOCK_H */
index 28f7b2103505edc6cd4389e96aeca02845b1192d..1da294c47522a31dce68280c2dd9b677c7c38bac 100644 (file)
 
 #include <linux/config.h>
 
-#include <linux/ip.h>
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/timer.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
 
+#include <net/inet_sock.h>
 #include <net/sock.h>
 #include <net/tcp_states.h>
+#include <net/timewait_sock.h>
 
 #include <asm/atomic.h>
 
@@ -127,7 +128,8 @@ struct inet_timewait_sock {
        __u16                   tw_num;
        /* And these are ours. */
        __u8                    tw_ipv6only:1;
-       /* 31 bits hole, try to pack */
+       /* 15 bits hole, try to pack */
+       __u16                   tw_ipv6_offset;
        int                     tw_timeout;
        unsigned long           tw_ttd;
        struct inet_bind_bucket *tw_tb;
@@ -199,7 +201,7 @@ static inline void inet_twsk_put(struct inet_timewait_sock *tw)
                printk(KERN_DEBUG "%s timewait_sock %p released\n",
                       tw->tw_prot->name, tw);
 #endif
-               kmem_cache_free(tw->tw_prot->twsk_slab, tw);
+               kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw);
                module_put(owner);
        }
 }
index 7fda471002b6b3b19b9bfda4cbca64ad4e75c497..0965515f40cfabba4e3839007ca51ebac6d22113 100644 (file)
@@ -25,6 +25,7 @@ struct inet_peer
        __u32                   v4daddr;        /* peer's address */
        __u16                   avl_height;
        __u16                   ip_id_count;    /* IP ID for the next packet */
+       atomic_t                rid;            /* Frag reception counter */
        __u32                   tcp_ts;
        unsigned long           tcp_ts_stamp;
 };
index e4563bbee6ea2baab2d6e61571dc2bd78cc1502e..f7e7fd728b67049a42f6e6f8a2b82bd4dd7b7c2e 100644 (file)
 
 #include <linux/config.h>
 #include <linux/types.h>
-#include <linux/socket.h>
 #include <linux/ip.h>
 #include <linux/in.h>
-#include <linux/netdevice.h>
-#include <linux/inetdevice.h>
-#include <linux/in_route.h>
-#include <net/route.h>
-#include <net/arp.h>
+
+#include <net/inet_sock.h>
 #include <net/snmp.h>
 
 struct sock;
@@ -45,6 +41,7 @@ struct inet_skb_parm
 #define IPSKB_TRANSLATED       2
 #define IPSKB_FORWARDED                4
 #define IPSKB_XFRM_TUNNEL_SIZE 8
+#define IPSKB_FRAG_COMPLETE    16
 };
 
 struct ipcm_cookie
@@ -74,6 +71,13 @@ extern rwlock_t ip_ra_lock;
 
 #define IP_FRAG_TIME   (30 * HZ)               /* fragment lifetime    */
 
+struct msghdr;
+struct net_device;
+struct packet_type;
+struct rtable;
+struct sk_buff;
+struct sockaddr;
+
 extern void            ip_mc_dropsocket(struct sock *);
 extern void            ip_mc_dropdevice(struct net_device *dev);
 extern int             igmp_mc_proc_init(void);
@@ -168,6 +172,7 @@ extern int sysctl_ipfrag_high_thresh;
 extern int sysctl_ipfrag_low_thresh;
 extern int sysctl_ipfrag_time;
 extern int sysctl_ipfrag_secret_interval;
+extern int sysctl_ipfrag_max_dist;
 
 /* From inetpeer.c */
 extern int inet_peer_threshold;
@@ -182,6 +187,8 @@ extern int sysctl_ip_dynaddr;
 extern void ipfrag_init(void);
 
 #ifdef CONFIG_INET
+#include <net/dst.h>
+
 /* The function in 2.2 was invalid, producing wrong result for
  * check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */
 static inline
index 14de4ebd12113f4b31b05991159428d842cd78cf..e000fa2cd5f62824059afb171439120e573bab74 100644 (file)
@@ -238,6 +238,8 @@ extern int fib_validate_source(u32 src, u32 dst, u8 tos, int oif,
                               struct net_device *dev, u32 *spec_dst, u32 *itag);
 extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
 
+struct rtentry;
+
 /* Exported by fib_semantics.c */
 extern int ip_fib_check_default(u32 gw, struct net_device *dev);
 extern int fib_sync_down(u32 local, struct net_device *dev, int force);
index 3b5559a023a4603eff8723ca92eda35c9016eba9..7d2674fde19a87020a225ada56b64a97c118ff44 100644 (file)
@@ -251,16 +251,15 @@ struct ip_vs_daemon_user {
 #include <linux/config.h>
 #include <linux/list.h>                 /* for struct list_head */
 #include <linux/spinlock.h>             /* for struct rwlock_t */
-#include <linux/skbuff.h>               /* for struct sk_buff */
-#include <linux/ip.h>                   /* for struct iphdr */
 #include <asm/atomic.h>                 /* for struct atomic_t */
-#include <linux/netdevice.h>           /* for struct neighbour */
-#include <net/dst.h>                   /* for struct dst_entry */
-#include <net/udp.h>
 #include <linux/compiler.h>
+#include <linux/timer.h>
 
+#include <net/checksum.h>
 
 #ifdef CONFIG_IP_VS_DEBUG
+#include <linux/net.h>
+
 extern int ip_vs_get_debug_level(void);
 #define IP_VS_DBG(level, msg...)                       \
     do {                                               \
@@ -429,8 +428,11 @@ struct ip_vs_stats
        spinlock_t              lock;           /* spin lock */
 };
 
+struct dst_entry;
+struct iphdr;
 struct ip_vs_conn;
 struct ip_vs_app;
+struct sk_buff;
 
 struct ip_vs_protocol {
        struct ip_vs_protocol   *next;
index 6addb4d464d6c87b0b7d9ae2884c46e57c2e8737..860bbac4c4ee37dd0d3431c120f9ddf5a8fd3746 100644 (file)
@@ -237,6 +237,10 @@ extern struct ipv6_txoptions *     ipv6_renew_options(struct sock *sk, struct ipv6_t
                                                   int newtype,
                                                   struct ipv6_opt_hdr __user *newopt,
                                                   int newoptlen);
+struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
+                                         struct ipv6_txoptions *opt);
+
+extern int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb);
 
 extern int ip6_frag_nqueues;
 extern atomic_t ip6_frag_mem;
@@ -523,6 +527,9 @@ extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
 extern int inet6_ioctl(struct socket *sock, unsigned int cmd, 
                       unsigned long arg);
 
+extern int inet6_hash_connect(struct inet_timewait_death_row *death_row,
+                             struct sock *sk);
+
 /*
  * reassembly.c
  */
@@ -531,8 +538,11 @@ extern int sysctl_ip6frag_low_thresh;
 extern int sysctl_ip6frag_time;
 extern int sysctl_ip6frag_secret_interval;
 
-extern struct proto_ops inet6_stream_ops;
-extern struct proto_ops inet6_dgram_ops;
+extern const struct proto_ops inet6_stream_ops;
+extern const struct proto_ops inet6_dgram_ops;
+
+struct group_source_req;
+struct group_filter;
 
 extern int ip6_mc_source(int add, int omode, struct sock *sk,
                         struct group_source_req *pgsr);
index f85d6e4b74426b97f75b472403c6e5c82ca9cdb2..bbac87eeb422603a91377918f0e4b3bd9acc4689 100644 (file)
@@ -35,11 +35,20 @@ enum {
 
 #ifdef __KERNEL__
 
-#include <linux/skbuff.h>
-#include <linux/netdevice.h>
+#include <linux/config.h>
+#include <linux/compiler.h>
 #include <linux/icmpv6.h>
+#include <linux/in6.h>
+#include <linux/types.h>
+
 #include <net/neighbour.h>
-#include <asm/atomic.h>
+
+struct ctl_table;
+struct file;
+struct inet6_dev;
+struct net_device;
+struct net_proto_family;
+struct sk_buff;
 
 extern struct neigh_table nd_tbl;
 
@@ -108,7 +117,7 @@ extern int                  igmp6_event_report(struct sk_buff *skb);
 extern void                    igmp6_cleanup(void);
 
 #ifdef CONFIG_SYSCTL
-extern int                     ndisc_ifinfo_sysctl_change(ctl_table *ctl,
+extern int                     ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
                                                           int write,
                                                           struct file * filp,
                                                           void __user *buffer,
index 34c07731933db95b38cbb05a4db4ccefde2d6d7e..6fa9ae1907417f2a113c6509ee4031ce169c43e3 100644 (file)
@@ -49,8 +49,8 @@
 #ifdef __KERNEL__
 
 #include <asm/atomic.h>
-#include <linux/skbuff.h>
 #include <linux/netdevice.h>
+#include <linux/skbuff.h>
 #include <linux/rcupdate.h>
 #include <linux/seq_file.h>
 
index bd08964b72c085b76b88d578af328f4efeab9435..b225d8472b7e7536fbf4baa610eeec139ee59a4e 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/in.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
-#include <linux/netdevice.h>
 #include <linux/skbuff.h>
 #include <linux/rtnetlink.h>
 #include <linux/module.h>
index 357691f6a45f1d19f6e2709fd604c59eee74fa25..63f7db99c2a67c526dffd96a090621f5542e6765 100644 (file)
@@ -65,7 +65,7 @@ struct inet_protosw {
        int              protocol; /* This is the L4 protocol number.  */
 
        struct proto     *prot;
-       struct proto_ops *ops;
+       const struct proto_ops *ops;
   
        int              capability; /* Which (if any) capability do
                                      * we need to use this socket
@@ -76,6 +76,7 @@ struct inet_protosw {
 };
 #define INET_PROTOSW_REUSE 0x01             /* Are ports automatically reusable? */
 #define INET_PROTOSW_PERMANENT 0x02  /* Permanent protocols are unremovable. */
+#define INET_PROTOSW_ICSK      0x04  /* Is this an inet_connection_sock? */
 
 extern struct net_protocol *inet_protocol_base;
 extern struct net_protocol *inet_protos[MAX_INET_PROTOS];
index f47917469b12121c9b3d770514f474ae5bf7a9d7..e67b28a0248c3ce5c8c831634a475ae9017eeafc 100644 (file)
@@ -19,6 +19,8 @@
 
 #include <linux/config.h>
 
+#include <net/protocol.h>
+
 extern struct proto raw_prot;
 
 extern void    raw_err(struct sock *, struct sk_buff *, u32 info);
index b52cc52ffe39f1475488c0d904753519a6df531f..11641c9384f78ae48f5a41272f223066102cc96c 100644 (file)
@@ -244,7 +244,7 @@ static inline int reqsk_queue_is_full(const struct request_sock_queue *queue)
 
 static inline void reqsk_queue_hash_req(struct request_sock_queue *queue,
                                        u32 hash, struct request_sock *req,
-                                       unsigned timeout)
+                                       unsigned long timeout)
 {
        struct listen_sock *lopt = queue->listen_opt;
 
index dbe79ca67d317cc1410b879e0898ae6ac52a3b03..e3e5436f8017929aeba0d271b7748d13c8a365b6 100644 (file)
@@ -126,6 +126,9 @@ extern int          ip_rt_ioctl(unsigned int cmd, void __user *arg);
 extern void            ip_rt_get_source(u8 *src, struct rtable *rt);
 extern int             ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb);
 
+struct in_ifaddr;
+extern void fib_add_ifaddr(struct in_ifaddr *);
+
 static inline void ip_rt_put(struct rtable * rt)
 {
        if (rt)
index 8e7794ee27ffb8d05f1a0ed0560825ed6f8a975a..f5c22d77feab60e030c826bcc6abe92eee1d2d26 100644 (file)
@@ -277,6 +277,24 @@ struct sctp_sock {
        __u32 default_context;
        __u32 default_timetolive;
 
+       /* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
+        * the destination address every heartbeat interval. This value
+        * will be inherited by all new associations.
+        */
+       __u32 hbinterval;
+
+       /* This is the max_retrans value for new associations. */
+       __u16 pathmaxrxt;
+
+       /* The initial Path MTU to use for new associations. */
+       __u32 pathmtu;
+
+       /* The default SACK delay timeout for new associations. */
+       __u32 sackdelay;
+
+       /* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
+       __u32 param_flags;
+
        struct sctp_initmsg initmsg;
        struct sctp_rtoinfo rtoinfo;
        struct sctp_paddrparams paddrparam;
@@ -845,9 +863,6 @@ struct sctp_transport {
        /* Data that has been sent, but not acknowledged. */
        __u32 flight_size;
 
-       /* PMTU       : The current known path MTU.  */
-       __u32 pmtu;
-
        /* Destination */
        struct dst_entry *dst;
        /* Source address. */
@@ -862,7 +877,22 @@ struct sctp_transport {
        /* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
         * the destination address every heartbeat interval.
         */
-       int hb_interval;
+       __u32 hbinterval;
+
+       /* This is the max_retrans value for the transport and will
+        * be initialized from the assocs value.  This can be changed
+        * using SCTP_SET_PEER_ADDR_PARAMS socket option.
+        */
+       __u16 pathmaxrxt;
+
+       /* PMTU       : The current known path MTU.  */
+       __u32 pathmtu;
+
+       /* SACK delay timeout */
+       __u32 sackdelay;
+
+       /* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
+       __u32 param_flags;
 
        /* When was the last time (in jiffies) that we heard from this
         * transport?  We use this to pick new active and retran paths.
@@ -882,22 +912,11 @@ struct sctp_transport {
         */
        int state;
 
-       /* hb_allowed  : The current heartbeat state of this destination,
-        *             :  i.e. ALLOW-HB, NO-HEARTBEAT, etc.
-        */
-       int hb_allowed;
-
        /* These are the error stats for this destination.  */
 
        /* Error count : The current error count for this destination.  */
        unsigned short error_count;
 
-       /* This is the max_retrans value for the transport and will
-        * be initialized to proto.max_retrans.path.  This can be changed
-        * using SCTP_SET_PEER_ADDR_PARAMS socket option.
-        */
-       int max_retrans;
-
        /* Per         : A timer used by each destination.
         * Destination :
         * Timer       :
@@ -1502,6 +1521,28 @@ struct sctp_association {
        /* The largest timeout or RTO value to use in attempting an INIT */
        __u16 max_init_timeo;
 
+       /* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
+        * the destination address every heartbeat interval. This value
+        * will be inherited by all new transports.
+        */
+       __u32 hbinterval;
+
+       /* This is the max_retrans value for new transports in the
+        * association.
+        */
+       __u16 pathmaxrxt;
+
+       /* Association : The smallest PMTU discovered for all of the
+        * PMTU        : peer's transport addresses.
+        */
+       __u32 pathmtu;
+
+       /* SACK delay timeout */
+       __u32 sackdelay;
+
+       /* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
+       __u32 param_flags;
+
        int timeouts[SCTP_NUM_TIMEOUT_TYPES];
        struct timer_list timers[SCTP_NUM_TIMEOUT_TYPES];
 
@@ -1571,11 +1612,6 @@ struct sctp_association {
         */
        wait_queue_head_t       wait;
 
-       /* Association : The smallest PMTU discovered for all of the
-        * PMTU        : peer's transport addresses.
-        */
-       __u32 pmtu;
-
        /* The message size at which SCTP fragmentation will occur. */
        __u32 frag_point;
 
index f1c3bc54526a18efcfaeff470017bbd4d59ba2e8..8a6bef6f91ebc39192805530255c6a6f94a63bc1 100644 (file)
@@ -93,6 +93,8 @@ enum sctp_optname {
 #define SCTP_STATUS SCTP_STATUS
        SCTP_GET_PEER_ADDR_INFO,
 #define SCTP_GET_PEER_ADDR_INFO SCTP_GET_PEER_ADDR_INFO
+       SCTP_DELAYED_ACK_TIME,
+#define SCTP_DELAYED_ACK_TIME SCTP_DELAYED_ACK_TIME
 
        /* Internal Socket Options. Some of the sctp library functions are 
         * implemented using these socket options.
@@ -503,13 +505,41 @@ struct sctp_setadaption {
  *   unreachable. The following structure is used to access and modify an
  *   address's parameters:
  */
+enum  sctp_spp_flags {
+       SPP_HB_ENABLE = 1,              /*Enable heartbeats*/
+       SPP_HB_DISABLE = 2,             /*Disable heartbeats*/
+       SPP_HB = SPP_HB_ENABLE | SPP_HB_DISABLE,
+       SPP_HB_DEMAND = 4,              /*Send heartbeat immediately*/
+       SPP_PMTUD_ENABLE = 8,           /*Enable PMTU discovery*/
+       SPP_PMTUD_DISABLE = 16,         /*Disable PMTU discovery*/
+       SPP_PMTUD = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE,
+       SPP_SACKDELAY_ENABLE = 32,      /*Enable SACK*/
+       SPP_SACKDELAY_DISABLE = 64,     /*Disable SACK*/
+       SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE,
+};
+
 struct sctp_paddrparams {
        sctp_assoc_t            spp_assoc_id;
        struct sockaddr_storage spp_address;
        __u32                   spp_hbinterval;
        __u16                   spp_pathmaxrxt;
+       __u32                   spp_pathmtu;
+       __u32                   spp_sackdelay;
+       __u32                   spp_flags;
 } __attribute__((packed, aligned(4)));
 
+/* 7.1.24. Delayed Ack Timer (SCTP_DELAYED_ACK_TIME)
+ *
+ *   This options will get or set the delayed ack timer.  The time is set
+ *   in milliseconds.  If the assoc_id is 0, then this sets or gets the
+ *   endpoints default delayed ack timer value.  If the assoc_id field is
+ *   non-zero, then the set or get effects the specified association.
+ */
+struct sctp_assoc_value {
+    sctp_assoc_t            assoc_id;
+    uint32_t                assoc_value;
+};
+
 /*
  * 7.2.2 Peer Address Information
  *
index 982b4ecd187b9393b9470a3da7462bdd878a0e52..6961700ff3a03584309a7c40b4fccd6f83bd8220 100644 (file)
@@ -493,6 +493,7 @@ extern void sk_stream_kill_queues(struct sock *sk);
 extern int sk_wait_data(struct sock *sk, long *timeo);
 
 struct request_sock_ops;
+struct timewait_sock_ops;
 
 /* Networking protocol blocks we attach to sockets.
  * socket layer -> transport layer interface
@@ -557,11 +558,10 @@ struct proto {
        kmem_cache_t            *slab;
        unsigned int            obj_size;
 
-       kmem_cache_t            *twsk_slab;
-       unsigned int            twsk_obj_size;
        atomic_t                *orphan_count;
 
        struct request_sock_ops *rsk_prot;
+       struct timewait_sock_ops *twsk_prot;
 
        struct module           *owner;
 
@@ -926,6 +926,29 @@ static inline void sock_put(struct sock *sk)
                sk_free(sk);
 }
 
+static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
+{
+       int rc = NET_RX_SUCCESS;
+
+       if (sk_filter(sk, skb, 0))
+               goto discard_and_relse;
+
+       skb->dev = NULL;
+
+       bh_lock_sock(sk);
+       if (!sock_owned_by_user(sk))
+               rc = sk->sk_backlog_rcv(sk, skb);
+       else
+               sk_add_backlog(sk, skb);
+       bh_unlock_sock(sk);
+out:
+       sock_put(sk);
+       return rc;
+discard_and_relse:
+       kfree_skb(skb);
+       goto out;
+}
+
 /* Detach socket from process context.
  * Announce socket dead, detach it from wait queue and inode.
  * Note that parent inode held reference count on this struct sock,
@@ -1166,7 +1189,10 @@ static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb)
  
 static inline int sock_error(struct sock *sk)
 {
-       int err = xchg(&sk->sk_err, 0);
+       int err;
+       if (likely(!sk->sk_err))
+               return 0;
+       err = xchg(&sk->sk_err, 0);
        return -err;
 }
 
index d78025f9fbea218bc6a09201534d619ca8893bae..77f21c65bbca2e1f2a460d167bc390d76eb6eb50 100644 (file)
@@ -224,53 +224,6 @@ extern atomic_t tcp_memory_allocated;
 extern atomic_t tcp_sockets_allocated;
 extern int tcp_memory_pressure;
 
-/*
- *     Pointers to address related TCP functions
- *     (i.e. things that depend on the address family)
- */
-
-struct tcp_func {
-       int                     (*queue_xmit)           (struct sk_buff *skb,
-                                                        int ipfragok);
-
-       void                    (*send_check)           (struct sock *sk,
-                                                        struct tcphdr *th,
-                                                        int len,
-                                                        struct sk_buff *skb);
-
-       int                     (*rebuild_header)       (struct sock *sk);
-
-       int                     (*conn_request)         (struct sock *sk,
-                                                        struct sk_buff *skb);
-
-       struct sock *           (*syn_recv_sock)        (struct sock *sk,
-                                                        struct sk_buff *skb,
-                                                        struct request_sock *req,
-                                                        struct dst_entry *dst);
-    
-       int                     (*remember_stamp)       (struct sock *sk);
-
-       __u16                   net_header_len;
-
-       int                     (*setsockopt)           (struct sock *sk, 
-                                                        int level, 
-                                                        int optname, 
-                                                        char __user *optval, 
-                                                        int optlen);
-
-       int                     (*getsockopt)           (struct sock *sk, 
-                                                        int level, 
-                                                        int optname, 
-                                                        char __user *optval, 
-                                                        int __user *optlen);
-
-
-       void                    (*addr2sockaddr)        (struct sock *sk,
-                                                        struct sockaddr *);
-
-       int sockaddr_len;
-};
-
 /*
  * The next routines deal with comparing 32 bit unsigned ints
  * and worry about wraparound (automatic with unsigned arithmetic).
@@ -334,6 +287,9 @@ extern int                  tcp_rcv_established(struct sock *sk,
 
 extern void                    tcp_rcv_space_adjust(struct sock *sk);
 
+extern int                     tcp_twsk_unique(struct sock *sk,
+                                               struct sock *sktw, void *twp);
+
 static inline void tcp_dec_quickack_mode(struct sock *sk,
                                         const unsigned int pkts)
 {
@@ -405,8 +361,7 @@ extern void                 tcp_parse_options(struct sk_buff *skb,
  *     TCP v4 functions exported for the inet6 API
  */
 
-extern void                    tcp_v4_send_check(struct sock *sk, 
-                                                 struct tcphdr *th, int len, 
+extern void                    tcp_v4_send_check(struct sock *sk, int len,
                                                  struct sk_buff *skb);
 
 extern int                     tcp_v4_conn_request(struct sock *sk,
@@ -490,34 +445,16 @@ typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
 extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
                         sk_read_actor_t recv_actor);
 
-/* Initialize RCV_MSS value.
- * RCV_MSS is an our guess about MSS used by the peer.
- * We haven't any direct information about the MSS.
- * It's better to underestimate the RCV_MSS rather than overestimate.
- * Overestimations make us ACKing less frequently than needed.
- * Underestimations are more easy to detect and fix by tcp_measure_rcv_mss().
- */
+extern void tcp_initialize_rcv_mss(struct sock *sk);
 
-static inline void tcp_initialize_rcv_mss(struct sock *sk)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-       unsigned int hint = min_t(unsigned int, tp->advmss, tp->mss_cache);
-
-       hint = min(hint, tp->rcv_wnd/2);
-       hint = min(hint, TCP_MIN_RCVMSS);
-       hint = max(hint, TCP_MIN_MSS);
-
-       inet_csk(sk)->icsk_ack.rcv_mss = hint;
-}
-
-static __inline__ void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd)
+static inline void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd)
 {
        tp->pred_flags = htonl((tp->tcp_header_len << 26) |
                               ntohl(TCP_FLAG_ACK) |
                               snd_wnd);
 }
 
-static __inline__ void tcp_fast_path_on(struct tcp_sock *tp)
+static inline void tcp_fast_path_on(struct tcp_sock *tp)
 {
        __tcp_fast_path_on(tp, tp->snd_wnd >> tp->rx_opt.snd_wscale);
 }
@@ -535,7 +472,7 @@ static inline void tcp_fast_path_check(struct sock *sk, struct tcp_sock *tp)
  * Rcv_nxt can be after the window if our peer push more data
  * than the offered window.
  */
-static __inline__ u32 tcp_receive_window(const struct tcp_sock *tp)
+static inline u32 tcp_receive_window(const struct tcp_sock *tp)
 {
        s32 win = tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt;
 
@@ -707,6 +644,7 @@ extern void tcp_cleanup_congestion_control(struct sock *sk);
 extern int tcp_set_default_congestion_control(const char *name);
 extern void tcp_get_default_congestion_control(char *name);
 extern int tcp_set_congestion_control(struct sock *sk, const char *name);
+extern void tcp_slow_start(struct tcp_sock *tp);
 
 extern struct tcp_congestion_ops tcp_init_congestion_ops;
 extern u32 tcp_reno_ssthresh(struct sock *sk);
@@ -746,7 +684,7 @@ static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
  *     "Packets left network, but not honestly ACKed yet" PLUS
  *     "Packets fast retransmitted"
  */
-static __inline__ unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
+static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
 {
        return (tp->packets_out - tp->left_out + tp->retrans_out);
 }
@@ -766,33 +704,6 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk)
                            (tp->snd_cwnd >> 2)));
 }
 
-/*
- * Linear increase during slow start
- */
-static inline void tcp_slow_start(struct tcp_sock *tp)
-{
-       if (sysctl_tcp_abc) {
-               /* RFC3465: Slow Start
-                * TCP sender SHOULD increase cwnd by the number of
-                * previously unacknowledged bytes ACKed by each incoming
-                * acknowledgment, provided the increase is not more than L
-                */
-               if (tp->bytes_acked < tp->mss_cache)
-                       return;
-
-               /* We MAY increase by 2 if discovered delayed ack */
-               if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) {
-                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                               tp->snd_cwnd++;
-               }
-       }
-       tp->bytes_acked = 0;
-
-       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-               tp->snd_cwnd++;
-}
-
-
 static inline void tcp_sync_left_out(struct tcp_sock *tp)
 {
        if (tp->rx_opt.sack_ok &&
@@ -801,34 +712,7 @@ static inline void tcp_sync_left_out(struct tcp_sock *tp)
        tp->left_out = tp->sacked_out + tp->lost_out;
 }
 
-/* Set slow start threshold and cwnd not falling to slow start */
-static inline void __tcp_enter_cwr(struct sock *sk)
-{
-       const struct inet_connection_sock *icsk = inet_csk(sk);
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       tp->undo_marker = 0;
-       tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk);
-       tp->snd_cwnd = min(tp->snd_cwnd,
-                          tcp_packets_in_flight(tp) + 1U);
-       tp->snd_cwnd_cnt = 0;
-       tp->high_seq = tp->snd_nxt;
-       tp->snd_cwnd_stamp = tcp_time_stamp;
-       TCP_ECN_queue_cwr(tp);
-}
-
-static inline void tcp_enter_cwr(struct sock *sk)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       tp->prior_ssthresh = 0;
-       tp->bytes_acked = 0;
-       if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) {
-               __tcp_enter_cwr(sk);
-               tcp_set_ca_state(sk, TCP_CA_CWR);
-       }
-}
-
+extern void tcp_enter_cwr(struct sock *sk);
 extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst);
 
 /* Slow start with delack produces 3 packets of burst, so that
@@ -860,14 +744,14 @@ static inline int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight)
                return left <= tcp_max_burst(tp);
 }
 
-static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss, 
-                                          const struct sk_buff *skb)
+static inline void tcp_minshall_update(struct tcp_sock *tp, int mss,
+                                      const struct sk_buff *skb)
 {
        if (skb->len < mss)
                tp->snd_sml = TCP_SKB_CB(skb)->end_seq;
 }
 
-static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *tp)
+static inline void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *tp)
 {
        const struct inet_connection_sock *icsk = inet_csk(sk);
        if (!tp->packets_out && !icsk->icsk_pending)
@@ -875,18 +759,18 @@ static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *t
                                          icsk->icsk_rto, TCP_RTO_MAX);
 }
 
-static __inline__ void tcp_push_pending_frames(struct sock *sk,
-                                              struct tcp_sock *tp)
+static inline void tcp_push_pending_frames(struct sock *sk,
+                                          struct tcp_sock *tp)
 {
        __tcp_push_pending_frames(sk, tp, tcp_current_mss(sk, 1), tp->nonagle);
 }
 
-static __inline__ void tcp_init_wl(struct tcp_sock *tp, u32 ack, u32 seq)
+static inline void tcp_init_wl(struct tcp_sock *tp, u32 ack, u32 seq)
 {
        tp->snd_wl1 = seq;
 }
 
-static __inline__ void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq)
+static inline void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq)
 {
        tp->snd_wl1 = seq;
 }
@@ -894,19 +778,19 @@ static __inline__ void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq)
 /*
  * Calculate(/check) TCP checksum
  */
-static __inline__ u16 tcp_v4_check(struct tcphdr *th, int len,
-                                  unsigned long saddr, unsigned long daddr, 
-                                  unsigned long base)
+static inline u16 tcp_v4_check(struct tcphdr *th, int len,
+                              unsigned long saddr, unsigned long daddr, 
+                              unsigned long base)
 {
        return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
 }
 
-static __inline__ int __tcp_checksum_complete(struct sk_buff *skb)
+static inline int __tcp_checksum_complete(struct sk_buff *skb)
 {
        return __skb_checksum_complete(skb);
 }
 
-static __inline__ int tcp_checksum_complete(struct sk_buff *skb)
+static inline int tcp_checksum_complete(struct sk_buff *skb)
 {
        return skb->ip_summed != CHECKSUM_UNNECESSARY &&
                __tcp_checksum_complete(skb);
@@ -914,7 +798,7 @@ static __inline__ int tcp_checksum_complete(struct sk_buff *skb)
 
 /* Prequeue for VJ style copy to user, combined with checksumming. */
 
-static __inline__ void tcp_prequeue_init(struct tcp_sock *tp)
+static inline void tcp_prequeue_init(struct tcp_sock *tp)
 {
        tp->ucopy.task = NULL;
        tp->ucopy.len = 0;
@@ -930,7 +814,7 @@ static __inline__ void tcp_prequeue_init(struct tcp_sock *tp)
  *
  * NOTE: is this not too big to inline?
  */
-static __inline__ int tcp_prequeue(struct sock *sk, struct sk_buff *skb)
+static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb)
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
@@ -971,7 +855,7 @@ static const char *statename[]={
 };
 #endif
 
-static __inline__ void tcp_set_state(struct sock *sk, int state)
+static inline void tcp_set_state(struct sock *sk, int state)
 {
        int oldstate = sk->sk_state;
 
@@ -1005,7 +889,7 @@ static __inline__ void tcp_set_state(struct sock *sk, int state)
 #endif 
 }
 
-static __inline__ void tcp_done(struct sock *sk)
+static inline void tcp_done(struct sock *sk)
 {
        tcp_set_state(sk, TCP_CLOSE);
        tcp_clear_xmit_timers(sk);
@@ -1018,81 +902,13 @@ static __inline__ void tcp_done(struct sock *sk)
                inet_csk_destroy_sock(sk);
 }
 
-static __inline__ void tcp_sack_reset(struct tcp_options_received *rx_opt)
+static inline void tcp_sack_reset(struct tcp_options_received *rx_opt)
 {
        rx_opt->dsack = 0;
        rx_opt->eff_sacks = 0;
        rx_opt->num_sacks = 0;
 }
 
-static __inline__ void tcp_build_and_update_options(__u32 *ptr, struct tcp_sock *tp, __u32 tstamp)
-{
-       if (tp->rx_opt.tstamp_ok) {
-               *ptr++ = __constant_htonl((TCPOPT_NOP << 24) |
-                                         (TCPOPT_NOP << 16) |
-                                         (TCPOPT_TIMESTAMP << 8) |
-                                         TCPOLEN_TIMESTAMP);
-               *ptr++ = htonl(tstamp);
-               *ptr++ = htonl(tp->rx_opt.ts_recent);
-       }
-       if (tp->rx_opt.eff_sacks) {
-               struct tcp_sack_block *sp = tp->rx_opt.dsack ? tp->duplicate_sack : tp->selective_acks;
-               int this_sack;
-
-               *ptr++ = __constant_htonl((TCPOPT_NOP << 24) |
-                                         (TCPOPT_NOP << 16) |
-                                         (TCPOPT_SACK << 8) |
-                                         (TCPOLEN_SACK_BASE +
-                                          (tp->rx_opt.eff_sacks * TCPOLEN_SACK_PERBLOCK)));
-               for(this_sack = 0; this_sack < tp->rx_opt.eff_sacks; this_sack++) {
-                       *ptr++ = htonl(sp[this_sack].start_seq);
-                       *ptr++ = htonl(sp[this_sack].end_seq);
-               }
-               if (tp->rx_opt.dsack) {
-                       tp->rx_opt.dsack = 0;
-                       tp->rx_opt.eff_sacks--;
-               }
-       }
-}
-
-/* Construct a tcp options header for a SYN or SYN_ACK packet.
- * If this is every changed make sure to change the definition of
- * MAX_SYN_SIZE to match the new maximum number of options that you
- * can generate.
- */
-static inline void tcp_syn_build_options(__u32 *ptr, int mss, int ts, int sack,
-                                            int offer_wscale, int wscale, __u32 tstamp, __u32 ts_recent)
-{
-       /* We always get an MSS option.
-        * The option bytes which will be seen in normal data
-        * packets should timestamps be used, must be in the MSS
-        * advertised.  But we subtract them from tp->mss_cache so
-        * that calculations in tcp_sendmsg are simpler etc.
-        * So account for this fact here if necessary.  If we
-        * don't do this correctly, as a receiver we won't
-        * recognize data packets as being full sized when we
-        * should, and thus we won't abide by the delayed ACK
-        * rules correctly.
-        * SACKs don't matter, we never delay an ACK when we
-        * have any of those going out.
-        */
-       *ptr++ = htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) | mss);
-       if (ts) {
-               if(sack)
-                       *ptr++ = __constant_htonl((TCPOPT_SACK_PERM << 24) | (TCPOLEN_SACK_PERM << 16) |
-                                                 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
-               else
-                       *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
-                                                 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
-               *ptr++ = htonl(tstamp);         /* TSVAL */
-               *ptr++ = htonl(ts_recent);      /* TSECR */
-       } else if(sack)
-               *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
-                                         (TCPOPT_SACK_PERM << 8) | TCPOLEN_SACK_PERM);
-       if (offer_wscale)
-               *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_WINDOW << 16) | (TCPOLEN_WINDOW << 8) | (wscale));
-}
-
 /* Determine a window scaling and initial window to offer. */
 extern void tcp_select_initial_window(int __space, __u32 mss,
                                      __u32 *rcv_wnd, __u32 *window_clamp,
@@ -1117,9 +933,9 @@ static inline int tcp_full_space(const struct sock *sk)
        return tcp_win_from_space(sk->sk_rcvbuf); 
 }
 
-static __inline__ void tcp_openreq_init(struct request_sock *req,
-                                       struct tcp_options_received *rx_opt,
-                                       struct sk_buff *skb)
+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);
 
index b9d4176b2d156004ff4c007362e266f47a7d892c..b0b645988bd86687ac06b170f468e1239f4576f0 100644 (file)
@@ -31,4 +31,20 @@ enum {
 
 #define TCP_STATE_MASK 0xF
 
+#define TCP_ACTION_FIN (1 << 7)
+
+enum {
+       TCPF_ESTABLISHED = (1 << 1),
+       TCPF_SYN_SENT    = (1 << 2),
+       TCPF_SYN_RECV    = (1 << 3),
+       TCPF_FIN_WAIT1   = (1 << 4),
+       TCPF_FIN_WAIT2   = (1 << 5),
+       TCPF_TIME_WAIT   = (1 << 6),
+       TCPF_CLOSE       = (1 << 7),
+       TCPF_CLOSE_WAIT  = (1 << 8),
+       TCPF_LAST_ACK    = (1 << 9),
+       TCPF_LISTEN      = (1 << 10),
+       TCPF_CLOSING     = (1 << 11) 
+};
+
 #endif /* _LINUX_TCP_STATES_H */
diff --git a/include/net/timewait_sock.h b/include/net/timewait_sock.h
new file mode 100644 (file)
index 0000000..2544281
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * NET         Generic infrastructure for Network protocols.
+ *
+ * Authors:    Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ *
+ *             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 _TIMEWAIT_SOCK_H
+#define _TIMEWAIT_SOCK_H
+
+#include <linux/slab.h>
+#include <net/sock.h>
+
+struct timewait_sock_ops {
+       kmem_cache_t    *twsk_slab;
+       unsigned int    twsk_obj_size;
+       int             (*twsk_unique)(struct sock *sk,
+                                      struct sock *sktw, void *twp);
+};
+
+static inline int twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
+{
+       if (sk->sk_prot->twsk_prot->twsk_unique != NULL)
+               return sk->sk_prot->twsk_prot->twsk_unique(sk, sktw, twp);
+       return 0;
+}
+
+#endif /* _TIMEWAIT_SOCK_H */
index 4e86f2de6638cc5445baa85ba4b9f56a6e78f000..61f724c1036faa2df0225e42385f0adde88995ab 100644 (file)
@@ -44,7 +44,7 @@ extern int                    datagram_send_ctl(struct msghdr *msg,
 /*
  *     address family specific functions
  */
-extern struct tcp_func ipv4_specific;
+extern struct inet_connection_sock_af_ops ipv4_specific;
 
 extern int inet6_destroy_sock(struct sock *sk);
 
index 107b9d791a1f1d31fc478bc31b7fedbe25c2ba22..766fba1369ce5a45262d78521a63e59980c1f832 100644 (file)
@@ -22,9 +22,8 @@
 #ifndef _UDP_H
 #define _UDP_H
 
-#include <linux/udp.h>
-#include <linux/ip.h>
 #include <linux/list.h>
+#include <net/inet_sock.h>
 #include <net/sock.h>
 #include <net/snmp.h>
 #include <linux/seq_file.h>
@@ -62,6 +61,7 @@ static inline int udp_lport_inuse(u16 num)
 
 extern struct proto udp_prot;
 
+struct sk_buff;
 
 extern void    udp_err(struct sk_buff *, u32);
 
index 5beae1ccd57405e5a86ab7a6250799fd0909dc84..07d7b50cdd76fc9ed52d1f98609898703e807161 100644 (file)
@@ -2,11 +2,12 @@
 #define _NET_XFRM_H
 
 #include <linux/compiler.h>
+#include <linux/in.h>
 #include <linux/xfrm.h>
 #include <linux/spinlock.h>
 #include <linux/list.h>
 #include <linux/skbuff.h>
-#include <linux/netdevice.h>
+#include <linux/socket.h>
 #include <linux/crypto.h>
 #include <linux/pfkeyv2.h>
 #include <linux/in6.h>
@@ -144,6 +145,9 @@ struct xfrm_state
         * transformer. */
        struct xfrm_type        *type;
 
+       /* Security context */
+       struct xfrm_sec_ctx     *security;
+
        /* Private data of this transformer, format is opaque,
         * interpreted by xfrm_type methods. */
        void                    *data;
@@ -298,6 +302,7 @@ struct xfrm_policy
        __u8                    flags;
        __u8                    dead;
        __u8                    xfrm_nr;
+       struct xfrm_sec_ctx     *security;
        struct xfrm_tmpl        xfrm_vec[XFRM_MAX_DEPTH];
 };
 
@@ -510,6 +515,25 @@ xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,
        return 0;
 }
 
+#ifdef CONFIG_SECURITY_NETWORK_XFRM
+/*     If neither has a context --> match
+ *     Otherwise, both must have a context and the sids, doi, alg must match
+ */
+static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
+{
+       return ((!s1 && !s2) ||
+               (s1 && s2 &&
+                (s1->ctx_sid == s2->ctx_sid) &&
+                (s1->ctx_doi == s2->ctx_doi) &&
+                (s1->ctx_alg == s2->ctx_alg)));
+}
+#else
+static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
+{
+       return 1;
+}
+#endif
+
 /* A struct encoding bundle of transformations to apply to some set of flow.
  *
  * dst->child points to the next element of bundle.
@@ -878,8 +902,8 @@ static inline int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsig
 struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp);
 extern int xfrm_policy_walk(int (*func)(struct xfrm_policy *, int, int, void*), void *);
 int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
-struct xfrm_policy *xfrm_policy_bysel(int dir, struct xfrm_selector *sel,
-                                     int delete);
+struct xfrm_policy *xfrm_policy_bysel_ctx(int dir, struct xfrm_selector *sel,
+                                         struct xfrm_sec_ctx *ctx, int delete);
 struct xfrm_policy *xfrm_policy_byid(int dir, u32 id, int delete);
 void xfrm_policy_flush(void);
 u32 xfrm_get_acqseq(void);
@@ -890,6 +914,7 @@ struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
 extern void xfrm_policy_flush(void);
 extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
 extern int xfrm_flush_bundles(void);
+extern void xfrm_flush_all_bundles(void);
 extern int xfrm_bundle_ok(struct xfrm_dst *xdst, struct flowi *fl, int family);
 extern void xfrm_init_pmtu(struct dst_entry *dst);
 
index 7529f4388bb46df6655e61364217c78e2199ea18..41cfc29be8993562e3d265d5a38d02e3d9b576f1 100644 (file)
@@ -151,5 +151,6 @@ extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
 extern void scsi_put_command(struct scsi_cmnd *);
 extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int);
 extern void scsi_finish_command(struct scsi_cmnd *cmd);
+extern void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd);
 
 #endif /* _SCSI_SCSI_CMND_H */
index b090a11d7e1c87ee20eb7458f3e0bb3ed3651cce..4d69dee66d4d0327ce174e49000fe983abdbbb0d 100644 (file)
@@ -16,7 +16,6 @@ extern void __scsi_print_sense(const char *name,
 extern void scsi_print_driverbyte(int);
 extern void scsi_print_hostbyte(int);
 extern void scsi_print_status(unsigned char);
-extern int scsi_print_msg(const unsigned char *);
 extern const char *scsi_sense_key_string(unsigned char);
 extern const char *scsi_extd_sense_format(unsigned char, unsigned char);
 
index 85cfd88461c8d79337400f5a28ecd0aec63014da..e94ca4d360358bb535224bca0766af0f706cef61 100644 (file)
@@ -79,9 +79,9 @@ struct scsi_device {
        char inq_periph_qual;   /* PQ from INQUIRY data */      
        unsigned char inquiry_len;      /* valid bytes in 'inquiry' */
        unsigned char * inquiry;        /* INQUIRY response data */
-       char * vendor;          /* [back_compat] point into 'inquiry' ... */
-       char * model;           /* ... after scan; point to static string */
-       char * rev;             /* ... "nullnullnullnull" before scan */
+       const char * vendor;            /* [back_compat] point into 'inquiry' ... */
+       const char * model;             /* ... after scan; point to static string */
+       const char * rev;               /* ... "nullnullnullnull" before scan */
        unsigned char current_tag;      /* current tag */
        struct scsi_target      *sdev_target;   /* used only for single_lun */
 
@@ -274,6 +274,12 @@ extern int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
 extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd,
                            int data_direction, void *buffer, unsigned bufflen,
                            struct scsi_sense_hdr *, int timeout, int retries);
+extern int scsi_execute_async(struct scsi_device *sdev,
+                             const unsigned char *cmd, int data_direction,
+                             void *buffer, unsigned bufflen, int use_sg,
+                             int timeout, int retries, void *privdata,
+                             void (*done)(void *, char *, int, int),
+                             gfp_t gfp);
 
 static inline unsigned int sdev_channel(struct scsi_device *sdev)
 {
index fac547d32a98f112123ec4c2e35c59e2e1a586c4..394f14a5b7cb44cc17ed888f865b358200eddaac 100644 (file)
@@ -79,6 +79,7 @@ enum fc_port_state {
        FC_PORTSTATE_LINKDOWN,
        FC_PORTSTATE_ERROR,
        FC_PORTSTATE_LOOPBACK,
+       FC_PORTSTATE_DELETED,
 };
 
 
@@ -325,8 +326,14 @@ struct fc_host_attrs {
        struct list_head rport_bindings;
        u32 next_rport_number;
        u32 next_target_id;
+       u8 flags;
+       struct work_struct rport_del_work;
 };
 
+/* values for struct fc_host_attrs "flags" field: */
+#define FC_SHOST_RPORT_DEL_SCHEDULED   0x01
+
+
 #define fc_host_node_name(x) \
        (((struct fc_host_attrs *)(x)->shost_data)->node_name)
 #define fc_host_port_name(x)   \
@@ -365,6 +372,10 @@ struct fc_host_attrs {
        (((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
 #define fc_host_next_target_id(x) \
        (((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
+#define fc_host_flags(x) \
+       (((struct fc_host_attrs *)(x)->shost_data)->flags)
+#define fc_host_rport_del_work(x) \
+       (((struct fc_host_attrs *)(x)->shost_data)->rport_del_work)
 
 
 /* The functions by which the transport class and the driver communicate */
index 6bdc4afb248380d7180f7d9a68bf869cd09fd4c1..54a89611e9c5abc04f89013112c9ff9202dece6f 100644 (file)
@@ -24,6 +24,9 @@
 #include <linux/transport_class.h>
 
 struct scsi_transport_template;
+struct scsi_target;
+struct scsi_device;
+struct Scsi_Host;
 
 struct spi_transport_attrs {
        int period;             /* value in the PPR/SDTR command */
@@ -143,5 +146,6 @@ void spi_release_transport(struct scsi_transport_template *);
 void spi_schedule_dv_device(struct scsi_device *);
 void spi_dv_device(struct scsi_device *);
 void spi_display_xfer_agreement(struct scsi_target *);
+int spi_print_msg(const unsigned char *);
 
 #endif /* SCSI_TRANSPORT_SPI_H */
index 11930fbb1e02613143f547f8a51bd82b6555d61a..aa29b797ca2b353537665d010afb81b08cc33238 100644 (file)
@@ -206,7 +206,7 @@ config HOTPLUG
          outside the kernel tree does. Such modules require Y here.
 
 config KOBJECT_UEVENT
-       bool "Kernel Userspace Events"
+       bool "Kernel Userspace Events" if EMBEDDED
        depends on NET
        default y
        help
@@ -256,6 +256,19 @@ config CPUSETS
 
 source "usr/Kconfig"
 
+config CC_OPTIMIZE_FOR_SIZE
+       bool "Optimize for size (Look out for broken compilers!)"
+       default y
+       depends on ARM || H8300 || EXPERIMENTAL
+       help
+         Enabling this option will pass "-Os" instead of "-O2" to gcc
+         resulting in a smaller kernel.
+
+         WARNING: some versions of gcc may generate incorrect code with this
+         option.  If problems are observed, a gcc upgrade may be needed.
+
+         If unsure, say N.
+
 menuconfig EMBEDDED
        bool "Configure standard kernel features (for small systems)"
        help
@@ -338,18 +351,6 @@ config EPOLL
          Disabling this option will cause the kernel to be built without
          support for epoll family of system calls.
 
-config CC_OPTIMIZE_FOR_SIZE
-       bool "Optimize for size" if EMBEDDED
-       default y if ARM || H8300
-       help
-         Enabling this option will pass "-Os" instead of "-O2" to gcc
-         resulting in a smaller kernel.
-
-         WARNING: some versions of gcc may generate incorrect code with this
-         option.  If problems are observed, a gcc upgrade may be needed.
-
-         If unsure, say N.
-
 config SHMEM
        bool "Use full shmem filesystem" if EMBEDDED
        default y
index 27f97f9b46362c4fa316619fdcc8e0d29751bbd3..54aaf561cf6626fc09acadf4b1ece9a12bb217cb 100644 (file)
@@ -47,7 +47,6 @@
 #include <linux/rmap.h>
 #include <linux/mempolicy.h>
 #include <linux/key.h>
-#include <net/sock.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -614,9 +613,6 @@ static void __init do_basic_setup(void)
        sysctl_init();
 #endif
 
-       /* Networking initialization needs a process context */ 
-       sock_init();
-
        do_initcalls();
 }
 
index 19af028a3e380d251d31e4b8ec4cd96ee679a1cb..cb5bb2a5df96f417f5c44b1108e8483ee3a10585 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -381,6 +381,7 @@ static void update_queue (struct sem_array * sma)
                        /* hands-off: q will disappear immediately after
                         * writing q->status.
                         */
+                       smp_wmb();
                        q->status = error;
                        q = n;
                } else {
@@ -461,6 +462,7 @@ static void freeary (struct sem_array *sma, int id)
                n = q->next;
                q->status = IN_WAKEUP;
                wake_up_process(q->sleeper); /* doesn't sleep */
+               smp_wmb();
                q->status = -EIDRM;     /* hands-off q */
                q = n;
        }
index 0c56320d38dc38eac05fb4eb04b5d0e626352019..32fa03ad1984da1395386d99deee3b98e073648d 100644 (file)
@@ -291,8 +291,10 @@ int kauditd_thread(void *dummy)
                        set_current_state(TASK_INTERRUPTIBLE);
                        add_wait_queue(&kauditd_wait, &wait);
 
-                       if (!skb_queue_len(&audit_skb_queue))
+                       if (!skb_queue_len(&audit_skb_queue)) {
+                               try_to_freeze();
                                schedule();
+                       }
 
                        __set_current_state(TASK_RUNNING);
                        remove_wait_queue(&kauditd_wait, &wait);
index 986f7af31e0a5773ab82c1957912c3735f57931e..009e1ebdcb88e57b62d64daafb4be1be9468a514 100644 (file)
@@ -3,7 +3,7 @@
  * Echo the kernel .config file used to build the kernel
  *
  * Copyright (C) 2002 Khalid Aziz <khalid_aziz@hp.com>
- * Copyright (C) 2002 Randy Dunlap <rddunlap@osdl.org>
+ * Copyright (C) 2002 Randy Dunlap <rdunlap@xenotime.net>
  * Copyright (C) 2002 Al Stone <ahs3@fc.hp.com>
  * Copyright (C) 2002 Hewlett-Packard Company
  *
index d61ba88f34e57b90edae90342ed1db59ebfbb59c..e882c6babf414854a53b615229e49005d3cc4d75 100644 (file)
 #include <asm/semaphore.h>
 
 /* This protects CPUs going up and down... */
-DECLARE_MUTEX(cpucontrol);
-EXPORT_SYMBOL_GPL(cpucontrol);
+static DECLARE_MUTEX(cpucontrol);
 
 static struct notifier_block *cpu_chain;
 
-/*
- * Used to check by callers if they need to acquire the cpucontrol
- * or not to protect a cpu from being removed. Its sometimes required to
- * call these functions both for normal operations, and in response to
- * a cpu being added/removed. If the context of the call is in the same
- * thread context as a CPU hotplug thread, we dont need to take the lock
- * since its already protected
- * check drivers/cpufreq/cpufreq.c for its usage - Ashok Raj
- */
+#ifdef CONFIG_HOTPLUG_CPU
+static struct task_struct *lock_cpu_hotplug_owner;
+static int lock_cpu_hotplug_depth;
 
-int current_in_cpu_hotplug(void)
+static int __lock_cpu_hotplug(int interruptible)
 {
-       return (current->flags & PF_HOTPLUG_CPU);
+       int ret = 0;
+
+       if (lock_cpu_hotplug_owner != current) {
+               if (interruptible)
+                       ret = down_interruptible(&cpucontrol);
+               else
+                       down(&cpucontrol);
+       }
+
+       /*
+        * Set only if we succeed in locking
+        */
+       if (!ret) {
+               lock_cpu_hotplug_depth++;
+               lock_cpu_hotplug_owner = current;
+       }
+
+       return ret;
 }
 
-EXPORT_SYMBOL_GPL(current_in_cpu_hotplug);
+void lock_cpu_hotplug(void)
+{
+       __lock_cpu_hotplug(0);
+}
+EXPORT_SYMBOL_GPL(lock_cpu_hotplug);
 
+void unlock_cpu_hotplug(void)
+{
+       if (--lock_cpu_hotplug_depth == 0) {
+               lock_cpu_hotplug_owner = NULL;
+               up(&cpucontrol);
+       }
+}
+EXPORT_SYMBOL_GPL(unlock_cpu_hotplug);
+
+int lock_cpu_hotplug_interruptible(void)
+{
+       return __lock_cpu_hotplug(1);
+}
+EXPORT_SYMBOL_GPL(lock_cpu_hotplug_interruptible);
+#endif /* CONFIG_HOTPLUG_CPU */
 
 /* Need to know about CPUs going up/down? */
 int register_cpu_notifier(struct notifier_block *nb)
 {
        int ret;
 
-       if ((ret = down_interruptible(&cpucontrol)) != 0)
+       if ((ret = lock_cpu_hotplug_interruptible()) != 0)
                return ret;
        ret = notifier_chain_register(&cpu_chain, nb);
-       up(&cpucontrol);
+       unlock_cpu_hotplug();
        return ret;
 }
 EXPORT_SYMBOL(register_cpu_notifier);
 
 void unregister_cpu_notifier(struct notifier_block *nb)
 {
-       down(&cpucontrol);
+       lock_cpu_hotplug();
        notifier_chain_unregister(&cpu_chain, nb);
-       up(&cpucontrol);
+       unlock_cpu_hotplug();
 }
 EXPORT_SYMBOL(unregister_cpu_notifier);
 
@@ -112,13 +141,6 @@ int cpu_down(unsigned int cpu)
                goto out;
        }
 
-       /*
-        * Leave a trace in current->flags indicating we are already in
-        * process of performing CPU hotplug. Callers can check if cpucontrol
-        * is already acquired by current thread, and if so not cause
-        * a dead lock by not acquiring the lock
-        */
-       current->flags |= PF_HOTPLUG_CPU;
        err = notifier_call_chain(&cpu_chain, CPU_DOWN_PREPARE,
                                                (void *)(long)cpu);
        if (err == NOTIFY_BAD) {
@@ -171,7 +193,6 @@ out_thread:
 out_allowed:
        set_cpus_allowed(current, old_allowed);
 out:
-       current->flags &= ~PF_HOTPLUG_CPU;
        unlock_cpu_hotplug();
        return err;
 }
@@ -182,7 +203,7 @@ int __devinit cpu_up(unsigned int cpu)
        int ret;
        void *hcpu = (void *)(long)cpu;
 
-       if ((ret = down_interruptible(&cpucontrol)) != 0)
+       if ((ret = lock_cpu_hotplug_interruptible()) != 0)
                return ret;
 
        if (cpu_online(cpu) || !cpu_present(cpu)) {
@@ -190,11 +211,6 @@ int __devinit cpu_up(unsigned int cpu)
                goto out;
        }
 
-       /*
-        * Leave a trace in current->flags indicating we are already in
-        * process of performing CPU hotplug.
-        */
-       current->flags |= PF_HOTPLUG_CPU;
        ret = notifier_call_chain(&cpu_chain, CPU_UP_PREPARE, hcpu);
        if (ret == NOTIFY_BAD) {
                printk("%s: attempt to bring up CPU %u failed\n",
@@ -217,7 +233,6 @@ out_notify:
        if (ret != 0)
                notifier_call_chain(&cpu_chain, CPU_UP_CANCELED, hcpu);
 out:
-       current->flags &= ~PF_HOTPLUG_CPU;
-       up(&cpucontrol);
+       unlock_cpu_hotplug();
        return ret;
 }
index e0d0b77343f880b60d8551338c26e05420c47291..fb8572a4229743baef22241dbab6ae8356f633c7 100644 (file)
@@ -263,7 +263,7 @@ static inline int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
                rb_parent = &tmp->vm_rb;
 
                mm->map_count++;
-               retval = copy_page_range(mm, oldmm, tmp);
+               retval = copy_page_range(mm, oldmm, mpnt);
 
                if (tmp->vm_ops && tmp->vm_ops->open)
                        tmp->vm_ops->open(tmp);
@@ -1124,8 +1124,6 @@ static task_t *copy_process(unsigned long clone_flags,
        if (unlikely(p->ptrace & PT_PTRACED))
                __ptrace_link(p, current->parent);
 
-       cpuset_fork(p);
-
        attach_pid(p, PIDTYPE_PID, p->pid);
        attach_pid(p, PIDTYPE_TGID, p->tgid);
        if (thread_group_leader(p)) {
@@ -1135,13 +1133,14 @@ static task_t *copy_process(unsigned long clone_flags,
                        __get_cpu_var(process_counts)++;
        }
 
-       proc_fork_connector(p);
        if (!current->signal->tty && p->signal->tty)
                p->signal->tty = NULL;
 
        nr_threads++;
        total_forks++;
        write_unlock_irq(&tasklist_lock);
+       proc_fork_connector(p);
+       cpuset_fork(p);
        retval = 0;
 
 fork_out:
index aca8d10704f675cbdf35267d49bb984669c49f44..5e71a6bf6f6b47fb9b93cc1540e0632b5dd5b4e7 100644 (file)
@@ -201,21 +201,6 @@ static int get_futex_key(unsigned long uaddr, union futex_key *key)
         * from swap.  But that's a lot of code to duplicate here
         * for a rare case, so we simply fetch the page.
         */
-
-       /*
-        * Do a quick atomic lookup first - this is the fastpath.
-        */
-       page = follow_page(mm, uaddr, FOLL_TOUCH|FOLL_GET);
-       if (likely(page != NULL)) {
-               key->shared.pgoff =
-                       page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
-               put_page(page);
-               return 0;
-       }
-
-       /*
-        * Do it the general way.
-        */
        err = get_user_pages(current, mm, uaddr, 1, 0, 0, &page, NULL);
        if (err >= 0) {
                key->shared.pgoff =
@@ -285,7 +270,13 @@ static void wake_futex(struct futex_q *q)
        /*
         * The waiting task can free the futex_q as soon as this is written,
         * without taking any locks.  This must come last.
+        *
+        * A memory barrier is required here to prevent the following store
+        * to lock_ptr from getting ahead of the wakeup. Clearing the lock
+        * at the end of wake_up_all() does not prevent this store from
+        * moving.
         */
+       wmb();
        q->lock_ptr = NULL;
 }
 
index 3bd7226d15fa10b5c4d6183506cff3368d4b7dfd..81c49a4d679eb03e54b9be8bb70d5f8f98447a41 100644 (file)
@@ -36,6 +36,9 @@ void synchronize_irq(unsigned int irq)
 {
        struct irq_desc *desc = irq_desc + irq;
 
+       if (irq >= NR_IRQS)
+               return;
+
        while (desc->status & IRQ_INPROGRESS)
                cpu_relax();
 }
@@ -60,6 +63,9 @@ void disable_irq_nosync(unsigned int irq)
        irq_desc_t *desc = irq_desc + irq;
        unsigned long flags;
 
+       if (irq >= NR_IRQS)
+               return;
+
        spin_lock_irqsave(&desc->lock, flags);
        if (!desc->depth++) {
                desc->status |= IRQ_DISABLED;
@@ -86,6 +92,9 @@ void disable_irq(unsigned int irq)
 {
        irq_desc_t *desc = irq_desc + irq;
 
+       if (irq >= NR_IRQS)
+               return;
+
        disable_irq_nosync(irq);
        if (desc->action)
                synchronize_irq(irq);
@@ -108,6 +117,9 @@ void enable_irq(unsigned int irq)
        irq_desc_t *desc = irq_desc + irq;
        unsigned long flags;
 
+       if (irq >= NR_IRQS)
+               return;
+
        spin_lock_irqsave(&desc->lock, flags);
        switch (desc->depth) {
        case 0:
@@ -163,6 +175,9 @@ int setup_irq(unsigned int irq, struct irqaction * new)
        unsigned long flags;
        int shared = 0;
 
+       if (irq >= NR_IRQS)
+               return -EINVAL;
+
        if (desc->handler == &no_irq_type)
                return -ENOSYS;
        /*
index 5beda378cc7518b353dc5f0551c636d8dd81b02a..3bb71e63a37e0bfa47217c99b2b5e6dbe0a8f2d5 100644 (file)
@@ -246,6 +246,19 @@ static int __kprobes aggr_break_handler(struct kprobe *p, struct pt_regs *regs)
        return ret;
 }
 
+/* Walks the list and increments nmissed count for multiprobe case */
+void __kprobes kprobes_inc_nmissed_count(struct kprobe *p)
+{
+       struct kprobe *kp;
+       if (p->pre_handler != aggr_pre_handler) {
+               p->nmissed++;
+       } else {
+               list_for_each_entry_rcu(kp, &p->list, list)
+                       kp->nmissed++;
+       }
+       return;
+}
+
 /* Called with kretprobe_lock held */
 struct kretprobe_instance __kprobes *get_free_rp_inst(struct kretprobe *rp)
 {
@@ -399,10 +412,7 @@ static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
        INIT_LIST_HEAD(&ap->list);
        list_add_rcu(&p->list, &ap->list);
 
-       INIT_HLIST_NODE(&ap->hlist);
-       hlist_del_rcu(&p->hlist);
-       hlist_add_head_rcu(&ap->hlist,
-               &kprobe_table[hash_ptr(ap->addr, KPROBE_HASH_BITS)]);
+       hlist_replace_rcu(&p->hlist, &ap->hlist);
 }
 
 /*
@@ -462,9 +472,16 @@ int __kprobes register_kprobe(struct kprobe *p)
        int ret = 0;
        unsigned long flags = 0;
        struct kprobe *old_p;
+       struct module *mod;
+
+       if ((!kernel_text_address((unsigned long) p->addr)) ||
+               in_kprobes_functions((unsigned long) p->addr))
+               return -EINVAL;
+
+       if ((mod = module_text_address((unsigned long) p->addr)) &&
+                       (unlikely(!try_module_get(mod))))
+               return -EINVAL;
 
-       if ((ret = in_kprobes_functions((unsigned long) p->addr)) != 0)
-               return ret;
        if ((ret = arch_prepare_kprobe(p)) != 0)
                goto rm_kprobe;
 
@@ -488,6 +505,8 @@ out:
 rm_kprobe:
        if (ret == -EEXIST)
                arch_remove_kprobe(p);
+       if (ret && mod)
+               module_put(mod);
        return ret;
 }
 
@@ -495,6 +514,7 @@ void __kprobes unregister_kprobe(struct kprobe *p)
 {
        unsigned long flags;
        struct kprobe *old_p;
+       struct module *mod;
 
        spin_lock_irqsave(&kprobe_lock, flags);
        old_p = get_kprobe(p->addr);
@@ -506,6 +526,10 @@ void __kprobes unregister_kprobe(struct kprobe *p)
                        cleanup_kprobe(p, flags);
 
                synchronize_sched();
+
+               if ((mod = module_text_address((unsigned long)p->addr)))
+                       module_put(mod);
+
                if (old_p->pre_handler == aggr_pre_handler &&
                                list_empty(&old_p->list))
                        kfree(old_p);
index 47ba69547945a7ffcec55a7fc72f8ae35a9c4c77..c76ad25e6a214df9d534f5142da9f2a1a1729b52 100644 (file)
@@ -619,7 +619,7 @@ static void __init param_sysfs_builtin(void)
 
 
 /* module-related sysfs stuff */
-#ifdef CONFIG_MODULES
+#ifdef CONFIG_SYSFS
 
 #define to_module_attr(n) container_of(n, struct module_attribute, attr);
 #define to_module_kobject(n) container_of(n, struct module_kobject, kobj);
index 84af54c39e1b0c31ff32854b45cbb15a512a4ba5..cae4f572899714369bcd8d5d18dad16f84d690a4 100644 (file)
@@ -36,7 +36,7 @@ timespec_to_sample(clockid_t which_clock, const struct timespec *tp)
        union cpu_time_count ret;
        ret.sched = 0;          /* high half always zero when .cpu used */
        if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
-               ret.sched = tp->tv_sec * NSEC_PER_SEC + tp->tv_nsec;
+               ret.sched = (unsigned long long)tp->tv_sec * NSEC_PER_SEC + tp->tv_nsec;
        } else {
                ret.cpu = timespec_to_cputime(tp);
        }
index 6ee2cad530e8971f4ad69da2f94d96455039fc5e..d253f3ae2fa5743d9c003c38468f1c4c823193e0 100644 (file)
@@ -24,7 +24,7 @@
 
 DECLARE_MUTEX(pm_sem);
 
-struct pm_ops * pm_ops = NULL;
+struct pm_ops *pm_ops;
 suspend_disk_method_t pm_disk_mode = PM_DISK_SHUTDOWN;
 
 /**
@@ -151,6 +151,18 @@ static char *pm_states[PM_SUSPEND_MAX] = {
 #endif
 };
 
+static inline int valid_state(suspend_state_t state)
+{
+       /* Suspend-to-disk does not really need low-level support.
+        * It can work with reboot if needed. */
+       if (state == PM_SUSPEND_DISK)
+               return 1;
+
+       if (pm_ops && pm_ops->valid && !pm_ops->valid(state))
+               return 0;
+       return 1;
+}
+
 
 /**
  *     enter_state - Do common work of entering low-power state.
@@ -167,7 +179,7 @@ static int enter_state(suspend_state_t state)
 {
        int error;
 
-       if (pm_ops && pm_ops->valid && !pm_ops->valid(state))
+       if (!valid_state(state))
                return -ENODEV;
        if (down_trylock(&pm_sem))
                return -EBUSY;
@@ -238,9 +250,8 @@ static ssize_t state_show(struct subsystem * subsys, char * buf)
        char * s = buf;
 
        for (i = 0; i < PM_SUSPEND_MAX; i++) {
-               if (pm_states[i] && pm_ops && (!pm_ops->valid
-                       ||(pm_ops->valid && pm_ops->valid(i))))
-                       s += sprintf(s,"%s ",pm_states[i]);
+               if (pm_states[i] && valid_state(i))
+                       s += sprintf(s,"%s ", pm_states[i]);
        }
        s += sprintf(s,"\n");
        return (s - buf);
index ac8a08f3620786f266374d321312629c73e6ac01..5287be83e3e7951740bfe4350dbc763f8d663981 100644 (file)
@@ -956,7 +956,7 @@ int unregister_console(struct console *console)
        if (console_drivers == console) {
                console_drivers=console->next;
                res = 0;
-       } else {
+       } else if (console_drivers) {
                for (a=console_drivers->next, b=console_drivers ;
                     a; b=a, a=b->next) {
                        if (a == console) {
index 17ee7e5a34516f7485250b7a7ef94546907f9b39..656476eedb1bfe9a4de0286d7dd35aad8023c8d1 100644 (file)
@@ -241,7 +241,8 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in
                if (write) {
                        copy_to_user_page(vma, page, addr,
                                          maddr + offset, buf, bytes);
-                       set_page_dirty_lock(page);
+                       if (!PageCompound(page))
+                               set_page_dirty_lock(page);
                } else {
                        copy_from_user_page(vma, page, addr,
                                            buf, maddr + offset, bytes);
index c4d159a21e042cc184a6d04e64b7b2273dfb5872..48d3bce465b88e38b0715a46a5b7fe8c95820c2d 100644 (file)
@@ -116,6 +116,10 @@ void fastcall call_rcu(struct rcu_head *head,
        local_irq_restore(flags);
 }
 
+static atomic_t rcu_barrier_cpu_count;
+static struct semaphore rcu_barrier_sema;
+static struct completion rcu_barrier_completion;
+
 /**
  * call_rcu_bh - Queue an RCU for invocation after a quicker grace period.
  * @head: structure to be used for queueing the RCU updates.
@@ -162,6 +166,42 @@ long rcu_batches_completed(void)
        return rcu_ctrlblk.completed;
 }
 
+static void rcu_barrier_callback(struct rcu_head *notused)
+{
+       if (atomic_dec_and_test(&rcu_barrier_cpu_count))
+               complete(&rcu_barrier_completion);
+}
+
+/*
+ * Called with preemption disabled, and from cross-cpu IRQ context.
+ */
+static void rcu_barrier_func(void *notused)
+{
+       int cpu = smp_processor_id();
+       struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
+       struct rcu_head *head;
+
+       head = &rdp->barrier;
+       atomic_inc(&rcu_barrier_cpu_count);
+       call_rcu(head, rcu_barrier_callback);
+}
+
+/**
+ * rcu_barrier - Wait until all the in-flight RCUs are complete.
+ */
+void rcu_barrier(void)
+{
+       BUG_ON(in_interrupt());
+       /* Take cpucontrol semaphore to protect against CPU hotplug */
+       down(&rcu_barrier_sema);
+       init_completion(&rcu_barrier_completion);
+       atomic_set(&rcu_barrier_cpu_count, 0);
+       on_each_cpu(rcu_barrier_func, NULL, 0, 1);
+       wait_for_completion(&rcu_barrier_completion);
+       up(&rcu_barrier_sema);
+}
+EXPORT_SYMBOL_GPL(rcu_barrier);
+
 /*
  * Invoke the completed RCU callbacks. They are expected to be in
  * a per-cpu list.
@@ -217,15 +257,23 @@ static void rcu_start_batch(struct rcu_ctrlblk *rcp, struct rcu_state *rsp,
 
        if (rcp->next_pending &&
                        rcp->completed == rcp->cur) {
-               /* Can't change, since spin lock held. */
-               cpus_andnot(rsp->cpumask, cpu_online_map, nohz_cpu_mask);
-
                rcp->next_pending = 0;
-               /* next_pending == 0 must be visible in __rcu_process_callbacks()
-                * before it can see new value of cur.
+               /*
+                * next_pending == 0 must be visible in
+                * __rcu_process_callbacks() before it can see new value of cur.
                 */
                smp_wmb();
                rcp->cur++;
+
+               /*
+                * Accessing nohz_cpu_mask before incrementing rcp->cur needs a
+                * Barrier  Otherwise it can cause tickless idle CPUs to be
+                * included in rsp->cpumask, which will extend graceperiods
+                * unnecessarily.
+                */
+               smp_mb();
+               cpus_andnot(rsp->cpumask, cpu_online_map, nohz_cpu_mask);
+
        }
 }
 
@@ -457,6 +505,7 @@ static struct notifier_block __devinitdata rcu_nb = {
  */
 void __init rcu_init(void)
 {
+       sema_init(&rcu_barrier_sema, 1);
        rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE,
                        (void *)(long)smp_processor_id());
        /* Register notifier for non-boot CPUs */
index 88c28d476550d004fe3232ab284d54473f5885a9..49fbbeff201ce7c27c72e7077b2555c31f478040 100644 (file)
@@ -409,9 +409,8 @@ rcu_torture_cleanup(void)
        stats_task = NULL;
 
        /* Wait for all RCU callbacks to fire.  */
+       rcu_barrier();
 
-       for (i = 0; i < RCU_TORTURE_PIPE_LEN; i++)
-               synchronize_rcu();
        rcu_torture_stats_print();  /* -After- the stats thread is stopped! */
        printk(KERN_ALERT TORTURE_FLAG
               "--- End of test: %s\n",
index bce933ebb29f458908806101dae497332004b2e2..eecf84526afeca15c7e82894c5c3e898239fa062 100644 (file)
@@ -32,6 +32,7 @@
 
 #include <linux/compat.h>
 #include <linux/syscalls.h>
+#include <linux/kprobes.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -168,7 +169,7 @@ EXPORT_SYMBOL(notifier_chain_unregister);
  *     of the last notifier function called.
  */
  
-int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
+int __kprobes notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
 {
        int ret=NOTIFY_DONE;
        struct notifier_block *nb = *n;
index 9990e10192e8e645c62d1e640b67b48edefe762d..b53115b882e1d55b9b78a9d807ad12f7610db009 100644 (file)
@@ -2192,29 +2192,32 @@ int sysctl_string(ctl_table *table, int __user *name, int nlen,
                  void __user *oldval, size_t __user *oldlenp,
                  void __user *newval, size_t newlen, void **context)
 {
-       size_t l, len;
-       
        if (!table->data || !table->maxlen) 
                return -ENOTDIR;
        
        if (oldval && oldlenp) {
-               if (get_user(len, oldlenp))
+               size_t bufsize;
+               if (get_user(bufsize, oldlenp))
                        return -EFAULT;
-               if (len) {
-                       l = strlen(table->data);
-                       if (len > l) len = l;
-                       if (len >= table->maxlen)
+               if (bufsize) {
+                       size_t len = strlen(table->data), copied;
+
+                       /* This shouldn't trigger for a well-formed sysctl */
+                       if (len > table->maxlen)
                                len = table->maxlen;
-                       if(copy_to_user(oldval, table->data, len))
-                               return -EFAULT;
-                       if(put_user(0, ((char __user *) oldval) + len))
+
+                       /* Copy up to a max of bufsize-1 bytes of the string */
+                       copied = (len >= bufsize) ? bufsize - 1 : len;
+
+                       if (copy_to_user(oldval, table->data, copied) ||
+                           put_user(0, (char __user *)(oldval + copied)))
                                return -EFAULT;
-                       if(put_user(len, oldlenp))
+                       if (put_user(len, oldlenp))
                                return -EFAULT;
                }
        }
        if (newval && newlen) {
-               len = newlen;
+               size_t len = newlen;
                if (len > table->maxlen)
                        len = table->maxlen;
                if(copy_from_user(table->data, newval, len))
@@ -2223,7 +2226,7 @@ int sysctl_string(ctl_table *table, int __user *name, int nlen,
                        len--;
                ((char *) table->data)[len] = 0;
        }
-       return 0;
+       return 1;
 }
 
 /*
index 245d595a13cb9f566f67c2ac6ab6dfb8c0af1143..b94bfa8c03e0ce045c02195942dcdfc16172bdab 100644 (file)
@@ -561,6 +561,28 @@ void getnstimeofday(struct timespec *tv)
 EXPORT_SYMBOL_GPL(getnstimeofday);
 #endif
 
+void getnstimestamp(struct timespec *ts)
+{
+       unsigned int seq;
+       struct timespec wall2mono;
+
+       /* synchronize with settimeofday() changes */
+       do {
+               seq = read_seqbegin(&xtime_lock);
+               getnstimeofday(ts);
+               wall2mono = wall_to_monotonic;
+       } while(unlikely(read_seqretry(&xtime_lock, seq)));
+
+       /* adjust to monotonicaly-increasing values */
+       ts->tv_sec += wall2mono.tv_sec;
+       ts->tv_nsec += wall2mono.tv_nsec;
+       while (unlikely(ts->tv_nsec >= NSEC_PER_SEC)) {
+               ts->tv_nsec -= NSEC_PER_SEC;
+               ts->tv_sec++;
+       }
+}
+EXPORT_SYMBOL_GPL(getnstimestamp);
+
 #if (BITS_PER_LONG < 64)
 u64 get_jiffies_64(void)
 {
index 42df83d7fad21d7176efdfef13282ef693f3c6ba..2bd5aee1c7369af14c8f8ba71a9715ad6f03346b 100644 (file)
@@ -102,7 +102,7 @@ int fastcall queue_work(struct workqueue_struct *wq, struct work_struct *work)
 
        if (!test_and_set_bit(0, &work->pending)) {
                if (unlikely(is_single_threaded(wq)))
-                       cpu = 0;
+                       cpu = any_online_cpu(cpu_online_map);
                BUG_ON(!list_empty(&work->entry));
                __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
                ret = 1;
@@ -118,7 +118,7 @@ static void delayed_work_timer_fn(unsigned long __data)
        int cpu = smp_processor_id();
 
        if (unlikely(is_single_threaded(wq)))
-               cpu = 0;
+               cpu = any_online_cpu(cpu_online_map);
 
        __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
 }
@@ -266,8 +266,8 @@ void fastcall flush_workqueue(struct workqueue_struct *wq)
        might_sleep();
 
        if (is_single_threaded(wq)) {
-               /* Always use cpu 0's area. */
-               flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, 0));
+               /* Always use first cpu's area. */
+               flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, any_online_cpu(cpu_online_map)));
        } else {
                int cpu;
 
@@ -320,7 +320,7 @@ struct workqueue_struct *__create_workqueue(const char *name,
        lock_cpu_hotplug();
        if (singlethread) {
                INIT_LIST_HEAD(&wq->list);
-               p = create_workqueue_thread(wq, 0);
+               p = create_workqueue_thread(wq, any_online_cpu(cpu_online_map));
                if (!p)
                        destroy = 1;
                else
@@ -374,7 +374,7 @@ void destroy_workqueue(struct workqueue_struct *wq)
        /* We don't need the distraction of CPUs appearing and vanishing. */
        lock_cpu_hotplug();
        if (is_single_threaded(wq))
-               cleanup_workqueue_thread(wq, 0);
+               cleanup_workqueue_thread(wq, any_online_cpu(cpu_online_map));
        else {
                for_each_online_cpu(cpu)
                        cleanup_workqueue_thread(wq, cpu);
index d6d30d2e71664629304bc4795b533fbb89914e11..9ce0a6a3b85ac49d2f160dda9c732ec65698f078 100644 (file)
@@ -95,12 +95,10 @@ unsigned long gen_pool_alloc(struct gen_pool *poolp, int size)
        if (size > max_chunk_size)
                return 0;
 
-       i = 0;
-
        size = max(size, 1 << ALLOC_MIN_SHIFT);
-       s = roundup_pow_of_two(size);
-
-       j = i;
+       i = fls(size - 1);
+       s = 1 << i;
+       j = i -= ALLOC_MIN_SHIFT;
 
        spin_lock_irqsave(&poolp->lock, flags);
        while (!h[j].next) {
@@ -153,10 +151,10 @@ void gen_pool_free(struct gen_pool *poolp, unsigned long ptr, int size)
        if (size > max_chunk_size)
                return;
 
-       i = 0;
-
        size = max(size, 1 << ALLOC_MIN_SHIFT);
-       s = roundup_pow_of_two(size);
+       i = fls(size - 1);
+       s = 1 << i;
+       i -= ALLOC_MIN_SHIFT;
 
        a = ptr;
 
index 906ad101eab3cf612eab214fa466c6ce872c08c5..dcd4be9bd4e56801ffe12d1f87a789b0b2a9b8d4 100644 (file)
@@ -20,7 +20,8 @@ static void spin_bug(spinlock_t *lock, const char *msg)
                if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT)
                        owner = lock->owner;
                printk("BUG: spinlock %s on CPU#%d, %s/%d\n",
-                       msg, smp_processor_id(), current->comm, current->pid);
+                       msg, raw_smp_processor_id(),
+                       current->comm, current->pid);
                printk(" lock: %p, .magic: %08x, .owner: %s/%d, .owner_cpu: %d\n",
                        lock, lock->magic,
                        owner ? owner->comm : "<none>",
@@ -78,8 +79,8 @@ static void __spin_lock_debug(spinlock_t *lock)
                if (print_once) {
                        print_once = 0;
                        printk("BUG: spinlock lockup on CPU#%d, %s/%d, %p\n",
-                               smp_processor_id(), current->comm, current->pid,
-                                       lock);
+                               raw_smp_processor_id(), current->comm,
+                               current->pid, lock);
                        dump_stack();
                }
        }
@@ -120,7 +121,8 @@ static void rwlock_bug(rwlock_t *lock, const char *msg)
 
        if (xchg(&print_once, 0)) {
                printk("BUG: rwlock %s on CPU#%d, %s/%d, %p\n", msg,
-                       smp_processor_id(), current->comm, current->pid, lock);
+                       raw_smp_processor_id(), current->comm,
+                       current->pid, lock);
                dump_stack();
 #ifdef CONFIG_SMP
                /*
@@ -148,8 +150,8 @@ static void __read_lock_debug(rwlock_t *lock)
                if (print_once) {
                        print_once = 0;
                        printk("BUG: read-lock lockup on CPU#%d, %s/%d, %p\n",
-                               smp_processor_id(), current->comm, current->pid,
-                                       lock);
+                               raw_smp_processor_id(), current->comm,
+                               current->pid, lock);
                        dump_stack();
                }
        }
@@ -220,8 +222,8 @@ static void __write_lock_debug(rwlock_t *lock)
                if (print_once) {
                        print_once = 0;
                        printk("BUG: write-lock lockup on CPU#%d, %s/%d, %p\n",
-                               smp_processor_id(), current->comm, current->pid,
-                                       lock);
+                               raw_smp_processor_id(), current->comm,
+                               current->pid, lock);
                        dump_stack();
                }
        }
index 57216f3544cad435e2986df9d83b9dbf4ddf37ad..1ff8dcebf7c6edf33abb7eb2583d5b6eab37ce29 100644 (file)
@@ -704,8 +704,9 @@ swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
                addr = SG_ENT_VIRT_ADDRESS(sg);
                dev_addr = virt_to_phys(addr);
                if (swiotlb_force || address_needs_mapping(hwdev, dev_addr)) {
-                       sg->dma_address = (dma_addr_t) virt_to_phys(map_single(hwdev, addr, sg->length, dir));
-                       if (!sg->dma_address) {
+                       void *map = map_single(hwdev, addr, sg->length, dir);
+                       sg->dma_address = virt_to_bus(map);
+                       if (!map) {
                                /* Don't panic here, we expect map_sg users
                                   to do proper error handling. */
                                swiotlb_full(hwdev, sg->length, dir, 0);
index ae9ce6b73e8a8351d1a5533349f141bbb5492e3a..21eb51d4da8fde9e987f22618bbdd609a8065116 100644 (file)
@@ -125,12 +125,10 @@ comment "Memory hotplug is currently incompatible with Software Suspend"
 # space can be handled with less contention: split it at this NR_CPUS.
 # Default to 4 for wider testing, though 8 might be more appropriate.
 # ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock.
-# PA-RISC's debug spinlock_t is too large for the 32-bit struct page.
-# ARM26 and SPARC32 and PPC64 may use one page for multiple page tables.
+# PA-RISC 7xxx's spinlock_t would enlarge struct page from 32 to 44 bytes.
 #
 config SPLIT_PTLOCK_CPUS
        int
        default "4096" if ARM && !CPU_CACHE_VIPT
-       default "4096" if PARISC && DEBUG_SPINLOCK && !64BIT
-       default "4096" if ARM26 || SPARC32 || PPC64
+       default "4096" if PARISC && !PA20
        default "4"
index e8c567177dcf83e0b8d7352c581c0565c400844c..16b9465eb4ebb385114558dcacdaf7af21678612 100644 (file)
@@ -204,6 +204,8 @@ restart_scan:
                unsigned long j;
                i = find_next_zero_bit(bdata->node_bootmem_map, eidx, i);
                i = ALIGN(i, incr);
+               if (i >= eidx)
+                       break;
                if (test_bit(i, bdata->node_bootmem_map))
                        continue;
                for (j = i + 1; j < i + areasize; ++j) {
index d862be3bc3e31f6d1914995b6bc2a6d5fa75e180..9f381e58bf4471faf6ba14bad1d93a118f12ffbc 100644 (file)
@@ -27,24 +27,20 @@ static int zap_pte(struct mm_struct *mm, struct vm_area_struct *vma,
        struct page *page = NULL;
 
        if (pte_present(pte)) {
-               unsigned long pfn = pte_pfn(pte);
-               flush_cache_page(vma, addr, pfn);
+               flush_cache_page(vma, addr, pte_pfn(pte));
                pte = ptep_clear_flush(vma, addr, ptep);
-               if (unlikely(!pfn_valid(pfn))) {
-                       print_bad_pte(vma, pte, addr);
-                       goto out;
+               page = vm_normal_page(vma, addr, pte);
+               if (page) {
+                       if (pte_dirty(pte))
+                               set_page_dirty(page);
+                       page_remove_rmap(page);
+                       page_cache_release(page);
                }
-               page = pfn_to_page(pfn);
-               if (pte_dirty(pte))
-                       set_page_dirty(page);
-               page_remove_rmap(page);
-               page_cache_release(page);
        } else {
                if (!pte_file(pte))
                        free_swap_and_cache(pte_to_swp_entry(pte));
                pte_clear(mm, addr, ptep);
        }
-out:
        return !!page;
 }
 
@@ -59,22 +55,10 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma,
        pgoff_t size;
        int err = -ENOMEM;
        pte_t *pte;
-       pmd_t *pmd;
-       pud_t *pud;
-       pgd_t *pgd;
        pte_t pte_val;
        spinlock_t *ptl;
 
-       BUG_ON(vma->vm_flags & VM_RESERVED);
-
-       pgd = pgd_offset(mm, addr);
-       pud = pud_alloc(mm, pgd, addr);
-       if (!pud)
-               goto out;
-       pmd = pmd_alloc(mm, pud, addr);
-       if (!pmd)
-               goto out;
-       pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
+       pte = get_locked_pte(mm, addr, &ptl);
        if (!pte)
                goto out;
 
@@ -116,22 +100,10 @@ int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma,
 {
        int err = -ENOMEM;
        pte_t *pte;
-       pmd_t *pmd;
-       pud_t *pud;
-       pgd_t *pgd;
        pte_t pte_val;
        spinlock_t *ptl;
 
-       BUG_ON(vma->vm_flags & VM_RESERVED);
-
-       pgd = pgd_offset(mm, addr);
-       pud = pud_alloc(mm, pgd, addr);
-       if (!pud)
-               goto out;
-       pmd = pmd_alloc(mm, pud, addr);
-       if (!pmd)
-               goto out;
-       pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
+       pte = get_locked_pte(mm, addr, &ptl);
        if (!pte)
                goto out;
 
@@ -204,12 +176,10 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
         * Make sure the vma is shared, that it supports prefaulting,
         * and that the remapped range is valid and fully within
         * the single existing vma.  vm_private_data is used as a
-        * swapout cursor in a VM_NONLINEAR vma (unless VM_RESERVED
-        * or VM_LOCKED, but VM_LOCKED could be revoked later on).
+        * swapout cursor in a VM_NONLINEAR vma.
         */
        if (vma && (vma->vm_flags & VM_SHARED) &&
-               (!vma->vm_private_data ||
-                       (vma->vm_flags & (VM_NONLINEAR|VM_RESERVED))) &&
+               (!vma->vm_private_data || (vma->vm_flags & VM_NONLINEAR)) &&
                vma->vm_ops && vma->vm_ops->populate &&
                        end > start && start >= vma->vm_start &&
                                end <= vma->vm_end) {
index 728e9bda12ea9971c1cf0212184b1ca2c2d94020..3e52df7c471bb944736f8b130058048416a86580 100644 (file)
@@ -22,6 +22,10 @@ unsigned long max_huge_pages;
 static struct list_head hugepage_freelists[MAX_NUMNODES];
 static unsigned int nr_huge_pages_node[MAX_NUMNODES];
 static unsigned int free_huge_pages_node[MAX_NUMNODES];
+
+/*
+ * Protects updates to hugepage_freelists, nr_huge_pages, and free_huge_pages
+ */
 static DEFINE_SPINLOCK(hugetlb_lock);
 
 static void enqueue_huge_page(struct page *page)
@@ -61,8 +65,10 @@ static struct page *alloc_fresh_huge_page(void)
                                        HUGETLB_PAGE_ORDER);
        nid = (nid + 1) % num_online_nodes();
        if (page) {
+               spin_lock(&hugetlb_lock);
                nr_huge_pages++;
                nr_huge_pages_node[page_to_nid(page)]++;
+               spin_unlock(&hugetlb_lock);
        }
        return page;
 }
index 17aaf3e1644983a5a4fac14bef8f009f71fe866c..2b7cf0400a217cd453641eaf097d1291125e1431 100644 (file)
@@ -126,7 +126,7 @@ static long madvise_dontneed(struct vm_area_struct * vma,
                             unsigned long start, unsigned long end)
 {
        *prev = vma;
-       if (vma->vm_flags & (VM_LOCKED|VM_HUGETLB|VM_RESERVED))
+       if (vma->vm_flags & (VM_LOCKED|VM_HUGETLB|VM_PFNMAP))
                return -EINVAL;
 
        if (unlikely(vma->vm_flags & VM_NONLINEAR)) {
index 2998cfc12f5bc2c2a60d5ad6a724e953e7765e1b..d8dde07a36566fc6463b7b9b95305d9b0505427e 100644 (file)
@@ -333,9 +333,9 @@ static inline void add_mm_rss(struct mm_struct *mm, int file_rss, int anon_rss)
 }
 
 /*
- * This function is called to print an error when a pte in a
- * !VM_RESERVED region is found pointing to an invalid pfn (which
- * is an error.
+ * This function is called to print an error when a bad pte
+ * is found. For example, we might have a PFN-mapped pte in
+ * a region that doesn't allow it.
  *
  * The calling function must still handle the error.
  */
@@ -349,6 +349,66 @@ void print_bad_pte(struct vm_area_struct *vma, pte_t pte, unsigned long vaddr)
        dump_stack();
 }
 
+static inline int is_cow_mapping(unsigned int flags)
+{
+       return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
+}
+
+/*
+ * This function gets the "struct page" associated with a pte.
+ *
+ * NOTE! Some mappings do not have "struct pages". A raw PFN mapping
+ * will have each page table entry just pointing to a raw page frame
+ * number, and as far as the VM layer is concerned, those do not have
+ * pages associated with them - even if the PFN might point to memory
+ * that otherwise is perfectly fine and has a "struct page".
+ *
+ * The way we recognize those mappings is through the rules set up
+ * by "remap_pfn_range()": the vma will have the VM_PFNMAP bit set,
+ * and the vm_pgoff will point to the first PFN mapped: thus every
+ * page that is a raw mapping will always honor the rule
+ *
+ *     pfn_of_page == vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT)
+ *
+ * and if that isn't true, the page has been COW'ed (in which case it
+ * _does_ have a "struct page" associated with it even if it is in a
+ * VM_PFNMAP range).
+ */
+struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
+{
+       unsigned long pfn = pte_pfn(pte);
+
+       if (vma->vm_flags & VM_PFNMAP) {
+               unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT;
+               if (pfn == vma->vm_pgoff + off)
+                       return NULL;
+               if (!is_cow_mapping(vma->vm_flags))
+                       return NULL;
+       }
+
+       /*
+        * Add some anal sanity checks for now. Eventually,
+        * we should just do "return pfn_to_page(pfn)", but
+        * in the meantime we check that we get a valid pfn,
+        * and that the resulting page looks ok.
+        *
+        * Remove this test eventually!
+        */
+       if (unlikely(!pfn_valid(pfn))) {
+               print_bad_pte(vma, pte, addr);
+               return NULL;
+       }
+
+       /*
+        * NOTE! We still have PageReserved() pages in the page 
+        * tables. 
+        *
+        * The PAGE_ZERO() pages and various VDSO mappings can
+        * cause them to exist.
+        */
+       return pfn_to_page(pfn);
+}
+
 /*
  * copy one vm_area from one task to the other. Assumes the page tables
  * already present in the new task to be cleared in the whole range
@@ -363,7 +423,6 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
        unsigned long vm_flags = vma->vm_flags;
        pte_t pte = *src_pte;
        struct page *page;
-       unsigned long pfn;
 
        /* pte contains position in swap or file, so copy. */
        if (unlikely(!pte_present(pte))) {
@@ -381,28 +440,11 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
                goto out_set_pte;
        }
 
-       /* If the region is VM_RESERVED, the mapping is not
-        * mapped via rmap - duplicate the pte as is.
-        */
-       if (vm_flags & VM_RESERVED)
-               goto out_set_pte;
-
-       pfn = pte_pfn(pte);
-       /* If the pte points outside of valid memory but
-        * the region is not VM_RESERVED, we have a problem.
-        */
-       if (unlikely(!pfn_valid(pfn))) {
-               print_bad_pte(vma, pte, addr);
-               goto out_set_pte; /* try to do something sane */
-       }
-
-       page = pfn_to_page(pfn);
-
        /*
         * If it's a COW mapping, write protect it both
         * in the parent and the child
         */
-       if ((vm_flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE) {
+       if (is_cow_mapping(vm_flags)) {
                ptep_set_wrprotect(src_mm, addr, src_pte);
                pte = *src_pte;
        }
@@ -414,9 +456,13 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
        if (vm_flags & VM_SHARED)
                pte = pte_mkclean(pte);
        pte = pte_mkold(pte);
-       get_page(page);
-       page_dup_rmap(page);
-       rss[!!PageAnon(page)]++;
+
+       page = vm_normal_page(vma, addr, pte);
+       if (page) {
+               get_page(page);
+               page_dup_rmap(page);
+               rss[!!PageAnon(page)]++;
+       }
 
 out_set_pte:
        set_pte_at(dst_mm, addr, dst_pte, pte);
@@ -528,7 +574,7 @@ int copy_page_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
         * readonly mappings. The tradeoff is that copy_page_range is more
         * efficient than faulting.
         */
-       if (!(vma->vm_flags & (VM_HUGETLB|VM_NONLINEAR|VM_RESERVED))) {
+       if (!(vma->vm_flags & (VM_HUGETLB|VM_NONLINEAR|VM_PFNMAP|VM_INSERTPAGE))) {
                if (!vma->anon_vma)
                        return 0;
        }
@@ -568,17 +614,11 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
                        continue;
                }
                if (pte_present(ptent)) {
-                       struct page *page = NULL;
+                       struct page *page;
 
                        (*zap_work) -= PAGE_SIZE;
 
-                       if (!(vma->vm_flags & VM_RESERVED)) {
-                               unsigned long pfn = pte_pfn(ptent);
-                               if (unlikely(!pfn_valid(pfn)))
-                                       print_bad_pte(vma, ptent, addr);
-                               else
-                                       page = pfn_to_page(pfn);
-                       }
+                       page = vm_normal_page(vma, addr, ptent);
                        if (unlikely(details) && page) {
                                /*
                                 * unmap_shared_mapping_pages() wants to
@@ -834,7 +874,7 @@ unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
 /*
  * Do a quick page-table lookup for a single page.
  */
-struct page *follow_page(struct mm_struct *mm, unsigned long address,
+struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
                        unsigned int flags)
 {
        pgd_t *pgd;
@@ -842,8 +882,8 @@ struct page *follow_page(struct mm_struct *mm, unsigned long address,
        pmd_t *pmd;
        pte_t *ptep, pte;
        spinlock_t *ptl;
-       unsigned long pfn;
        struct page *page;
+       struct mm_struct *mm = vma->vm_mm;
 
        page = follow_huge_addr(mm, address, flags & FOLL_WRITE);
        if (!IS_ERR(page)) {
@@ -879,11 +919,10 @@ struct page *follow_page(struct mm_struct *mm, unsigned long address,
                goto unlock;
        if ((flags & FOLL_WRITE) && !pte_write(pte))
                goto unlock;
-       pfn = pte_pfn(pte);
-       if (!pfn_valid(pfn))
+       page = vm_normal_page(vma, address, pte);
+       if (unlikely(!page))
                goto unlock;
 
-       page = pfn_to_page(pfn);
        if (flags & FOLL_GET)
                get_page(page);
        if (flags & FOLL_TOUCH) {
@@ -956,8 +995,10 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                                return i ? : -EFAULT;
                        }
                        if (pages) {
-                               pages[i] = pte_page(*pte);
-                               get_page(pages[i]);
+                               struct page *page = vm_normal_page(gate_vma, start, *pte);
+                               pages[i] = page;
+                               if (page)
+                                       get_page(page);
                        }
                        pte_unmap(pte);
                        if (vmas)
@@ -968,7 +1009,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                        continue;
                }
 
-               if (!vma || (vma->vm_flags & (VM_IO | VM_RESERVED))
+               if (!vma || (vma->vm_flags & (VM_IO | VM_PFNMAP))
                                || !(vm_flags & vma->vm_flags))
                        return i ? : -EFAULT;
 
@@ -992,7 +1033,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                                foll_flags |= FOLL_WRITE;
 
                        cond_resched();
-                       while (!(page = follow_page(mm, start, foll_flags))) {
+                       while (!(page = follow_page(vma, start, foll_flags))) {
                                int ret;
                                ret = __handle_mm_fault(mm, vma, start,
                                                foll_flags & FOLL_WRITE);
@@ -1112,6 +1153,86 @@ int zeromap_page_range(struct vm_area_struct *vma,
        return err;
 }
 
+pte_t * fastcall get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)
+{
+       pgd_t * pgd = pgd_offset(mm, addr);
+       pud_t * pud = pud_alloc(mm, pgd, addr);
+       if (pud) {
+               pmd_t * pmd = pmd_alloc(mm, pud, addr);
+               if (pmd)
+                       return pte_alloc_map_lock(mm, pmd, addr, ptl);
+       }
+       return NULL;
+}
+
+/*
+ * This is the old fallback for page remapping.
+ *
+ * For historical reasons, it only allows reserved pages. Only
+ * old drivers should use this, and they needed to mark their
+ * pages reserved for the old functions anyway.
+ */
+static int insert_page(struct mm_struct *mm, unsigned long addr, struct page *page, pgprot_t prot)
+{
+       int retval;
+       pte_t *pte;
+       spinlock_t *ptl;  
+
+       retval = -EINVAL;
+       if (PageAnon(page))
+               goto out;
+       retval = -ENOMEM;
+       flush_dcache_page(page);
+       pte = get_locked_pte(mm, addr, &ptl);
+       if (!pte)
+               goto out;
+       retval = -EBUSY;
+       if (!pte_none(*pte))
+               goto out_unlock;
+
+       /* Ok, finally just insert the thing.. */
+       get_page(page);
+       inc_mm_counter(mm, file_rss);
+       page_add_file_rmap(page);
+       set_pte_at(mm, addr, pte, mk_pte(page, prot));
+
+       retval = 0;
+out_unlock:
+       pte_unmap_unlock(pte, ptl);
+out:
+       return retval;
+}
+
+/*
+ * This allows drivers to insert individual pages they've allocated
+ * into a user vma.
+ *
+ * The page has to be a nice clean _individual_ kernel allocation.
+ * If you allocate a compound page, you need to have marked it as
+ * such (__GFP_COMP), or manually just split the page up yourself
+ * (which is mainly an issue of doing "set_page_count(page, 1)" for
+ * each sub-page, and then freeing them one by one when you free
+ * them rather than freeing it as a compound page).
+ *
+ * NOTE! Traditionally this was done with "remap_pfn_range()" which
+ * took an arbitrary page protection parameter. This doesn't allow
+ * that. Your vma protection will have to be set up correctly, which
+ * means that if you want a shared writable mapping, you'd better
+ * ask for a shared writable mapping!
+ *
+ * The page does not need to be reserved.
+ */
+int vm_insert_page(struct vm_area_struct *vma, unsigned long addr, struct page *page)
+{
+       if (addr < vma->vm_start || addr >= vma->vm_end)
+               return -EFAULT;
+       if (!page_count(page))
+               return -EINVAL;
+       vma->vm_flags |= VM_INSERTPAGE;
+       return insert_page(vma->vm_mm, addr, page, vma->vm_page_prot);
+}
+EXPORT_SYMBOL(vm_insert_page);
+
 /*
  * maps a range of physical memory into the requested pages. the old
  * mappings are removed. any references to nonexistent pages results
@@ -1191,10 +1312,26 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
         * rest of the world about it:
         *   VM_IO tells people not to look at these pages
         *      (accesses can have side effects).
-        *   VM_RESERVED tells the core MM not to "manage" these pages
-         *     (e.g. refcount, mapcount, try to swap them out).
+        *   VM_RESERVED is specified all over the place, because
+        *      in 2.4 it kept swapout's vma scan off this vma; but
+        *      in 2.6 the LRU scan won't even find its pages, so this
+        *      flag means no more than count its pages in reserved_vm,
+        *      and omit it from core dump, even when VM_IO turned off.
+        *   VM_PFNMAP tells the core MM that the base pages are just
+        *      raw PFN mappings, and do not have a "struct page" associated
+        *      with them.
+        *
+        * There's a horrible special case to handle copy-on-write
+        * behaviour that some programs depend on. We mark the "original"
+        * un-COW'ed pages by matching them up with "vma->vm_pgoff".
         */
-       vma->vm_flags |= VM_IO | VM_RESERVED;
+       if (is_cow_mapping(vma->vm_flags)) {
+               if (addr != vma->vm_start || end != vma->vm_end)
+                       return -EINVAL;
+               vma->vm_pgoff = pfn;
+       }
+
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
 
        BUG_ON(addr >= end);
        pfn -= addr >> PAGE_SHIFT;
@@ -1249,6 +1386,33 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)
        return pte;
 }
 
+static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va)
+{
+       /*
+        * If the source page was a PFN mapping, we don't have
+        * a "struct page" for it. We do a best-effort copy by
+        * just copying from the original user address. If that
+        * fails, we just zero-fill it. Live with it.
+        */
+       if (unlikely(!src)) {
+               void *kaddr = kmap_atomic(dst, KM_USER0);
+               void __user *uaddr = (void __user *)(va & PAGE_MASK);
+
+               /*
+                * This really shouldn't fail, because the page is there
+                * in the page tables. But it might just be unreadable,
+                * in which case we just give up and fill the result with
+                * zeroes.
+                */
+               if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
+                       memset(kaddr, 0, PAGE_SIZE);
+               kunmap_atomic(kaddr, KM_USER0);
+               return;
+               
+       }
+       copy_user_highpage(dst, src, va);
+}
+
 /*
  * This routine handles present pages, when users try to write
  * to a shared page. It is done by copying the page to a new address
@@ -1272,27 +1436,18 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
                spinlock_t *ptl, pte_t orig_pte)
 {
        struct page *old_page, *new_page;
-       unsigned long pfn = pte_pfn(orig_pte);
        pte_t entry;
        int ret = VM_FAULT_MINOR;
 
-       BUG_ON(vma->vm_flags & VM_RESERVED);
-
-       if (unlikely(!pfn_valid(pfn))) {
-               /*
-                * Page table corrupted: show pte and kill process.
-                */
-               print_bad_pte(vma, orig_pte, address);
-               ret = VM_FAULT_OOM;
-               goto unlock;
-       }
-       old_page = pfn_to_page(pfn);
+       old_page = vm_normal_page(vma, address, orig_pte);
+       if (!old_page)
+               goto gotten;
 
        if (PageAnon(old_page) && !TestSetPageLocked(old_page)) {
                int reuse = can_share_swap_page(old_page);
                unlock_page(old_page);
                if (reuse) {
-                       flush_cache_page(vma, address, pfn);
+                       flush_cache_page(vma, address, pte_pfn(orig_pte));
                        entry = pte_mkyoung(orig_pte);
                        entry = maybe_mkwrite(pte_mkdirty(entry), vma);
                        ptep_set_access_flags(vma, address, page_table, entry, 1);
@@ -1307,6 +1462,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
         * Ok, we need to copy. Oh, well..
         */
        page_cache_get(old_page);
+gotten:
        pte_unmap_unlock(page_table, ptl);
 
        if (unlikely(anon_vma_prepare(vma)))
@@ -1319,7 +1475,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
                new_page = alloc_page_vma(GFP_HIGHUSER, vma, address);
                if (!new_page)
                        goto oom;
-               copy_user_highpage(new_page, old_page, address);
+               cow_user_page(new_page, old_page, address);
        }
 
        /*
@@ -1327,12 +1483,15 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
         */
        page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
        if (likely(pte_same(*page_table, orig_pte))) {
-               page_remove_rmap(old_page);
-               if (!PageAnon(old_page)) {
+               if (old_page) {
+                       page_remove_rmap(old_page);
+                       if (!PageAnon(old_page)) {
+                               dec_mm_counter(mm, file_rss);
+                               inc_mm_counter(mm, anon_rss);
+                       }
+               } else
                        inc_mm_counter(mm, anon_rss);
-                       dec_mm_counter(mm, file_rss);
-               }
-               flush_cache_page(vma, address, pfn);
+               flush_cache_page(vma, address, pte_pfn(orig_pte));
                entry = mk_pte(new_page, vma->vm_page_prot);
                entry = maybe_mkwrite(pte_mkdirty(entry), vma);
                ptep_establish(vma, address, page_table, entry);
@@ -1345,13 +1504,16 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
                new_page = old_page;
                ret |= VM_FAULT_WRITE;
        }
-       page_cache_release(new_page);
-       page_cache_release(old_page);
+       if (new_page)
+               page_cache_release(new_page);
+       if (old_page)
+               page_cache_release(old_page);
 unlock:
        pte_unmap_unlock(page_table, ptl);
        return ret;
 oom:
-       page_cache_release(old_page);
+       if (old_page)
+               page_cache_release(old_page);
        return VM_FAULT_OOM;
 }
 
@@ -1849,6 +2011,7 @@ static int do_no_page(struct mm_struct *mm, struct vm_area_struct *vma,
        int anon = 0;
 
        pte_unmap(page_table);
+       BUG_ON(vma->vm_flags & VM_PFNMAP);
 
        if (vma->vm_file) {
                mapping = vma->vm_file->f_mapping;
@@ -1924,7 +2087,7 @@ retry:
                        inc_mm_counter(mm, anon_rss);
                        lru_cache_add_active(new_page);
                        page_add_anon_rmap(new_page, vma, address);
-               } else if (!(vma->vm_flags & VM_RESERVED)) {
+               } else {
                        inc_mm_counter(mm, file_rss);
                        page_add_file_rmap(new_page);
                }
@@ -2101,6 +2264,12 @@ int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
        spin_unlock(&mm->page_table_lock);
        return 0;
 }
+#else
+/* Workaround for gcc 2.96 */
+int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+{
+       return 0;
+}
 #endif /* __PAGETABLE_PUD_FOLDED */
 
 #ifndef __PAGETABLE_PMD_FOLDED
@@ -2129,6 +2298,12 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
        spin_unlock(&mm->page_table_lock);
        return 0;
 }
+#else
+/* Workaround for gcc 2.96 */
+int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
+{
+       return 0;
+}
 #endif /* __PAGETABLE_PMD_FOLDED */
 
 int make_pages_present(unsigned long addr, unsigned long end)
@@ -2203,7 +2378,7 @@ static int __init gate_vma_init(void)
        gate_vma.vm_start = FIXADDR_USER_START;
        gate_vma.vm_end = FIXADDR_USER_END;
        gate_vma.vm_page_prot = PAGE_READONLY;
-       gate_vma.vm_flags = VM_RESERVED;
+       gate_vma.vm_flags = 0;
        return 0;
 }
 __initcall(gate_vma_init);
index 431a64f021c0ed7c5dc9a40c63096f99ba16d464..f6d4af8af8a8f5a491f837d9bb9c108313ecb7f0 100644 (file)
@@ -104,7 +104,7 @@ static void grow_pgdat_span(struct pglist_data *pgdat,
                pgdat->node_start_pfn = start_pfn;
 
        if (end_pfn > old_pgdat_end_pfn)
-               pgdat->node_spanned_pages = end_pfn - pgdat->node_spanned_pages;
+               pgdat->node_spanned_pages = end_pfn - pgdat->node_start_pfn;
 }
 
 int online_pages(unsigned long pfn, unsigned long nr_pages)
index 5abc57c2b8bdd3804708267832fd20d29a65be71..72f402cc9c9af77f6d6c765c166e35d0bb4764ae 100644 (file)
@@ -161,6 +161,10 @@ static struct mempolicy *mpol_new(int mode, nodemask_t *nodes)
        switch (mode) {
        case MPOL_INTERLEAVE:
                policy->v.nodes = *nodes;
+               if (nodes_weight(*nodes) == 0) {
+                       kmem_cache_free(policy_cache, policy);
+                       return ERR_PTR(-EINVAL);
+               }
                break;
        case MPOL_PREFERRED:
                policy->v.preferred_node = first_node(*nodes);
@@ -189,17 +193,15 @@ static int check_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 
        orig_pte = pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
        do {
-               unsigned long pfn;
+               struct page *page;
                unsigned int nid;
 
                if (!pte_present(*pte))
                        continue;
-               pfn = pte_pfn(*pte);
-               if (!pfn_valid(pfn)) {
-                       print_bad_pte(vma, *pte, addr);
+               page = vm_normal_page(vma, addr, *pte);
+               if (!page)
                        continue;
-               }
-               nid = pfn_to_nid(pfn);
+               nid = page_to_nid(page);
                if (!node_isset(nid, *nodes))
                        break;
        } while (pte++, addr += PAGE_SIZE, addr != end);
@@ -269,8 +271,6 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
        first = find_vma(mm, start);
        if (!first)
                return ERR_PTR(-EFAULT);
-       if (first->vm_flags & VM_RESERVED)
-               return ERR_PTR(-EACCES);
        prev = NULL;
        for (vma = first; vma && vma->vm_start < end; vma = vma->vm_next) {
                if (!vma->vm_next && vma->vm_end < end)
index 4f8def03428ce967d91f7a1fa738733d8a386758..64ba4dbcb7def44e02c278a01926b061d0417f40 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -611,7 +611,7 @@ again:                      remove_next = 1 + (end > next->vm_end);
  * If the vma has a ->close operation then the driver probably needs to release
  * per-vma resources, so we don't attempt to merge those.
  */
-#define VM_SPECIAL (VM_IO | VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED)
+#define VM_SPECIAL (VM_IO | VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED | VM_PFNMAP)
 
 static inline int is_mergeable_vma(struct vm_area_struct *vma,
                        struct file *file, unsigned long vm_flags)
@@ -1076,17 +1076,6 @@ munmap_back:
                error = file->f_op->mmap(file, vma);
                if (error)
                        goto unmap_and_free_vma;
-               if ((vma->vm_flags & (VM_SHARED | VM_WRITE | VM_RESERVED))
-                                               == (VM_WRITE | VM_RESERVED)) {
-                       printk(KERN_WARNING "program %s is using MAP_PRIVATE, "
-                               "PROT_WRITE mmap of VM_RESERVED memory, which "
-                               "is deprecated. Please report this to "
-                               "linux-kernel@vger.kernel.org\n",current->comm);
-                       if (vma->vm_ops && vma->vm_ops->close)
-                               vma->vm_ops->close(vma);
-                       error = -EACCES;
-                       goto unmap_and_free_vma;
-               }
        } else if (vm_flags & VM_SHARED) {
                error = shmem_zero_setup(vma);
                if (error)
index 17a2b52b753b0c5ac855abeed9cc5a2934685bd0..653b8571c1ed10e86c94ae727147b77ce0e09788 100644 (file)
@@ -124,14 +124,6 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev,
         * a MAP_NORESERVE private mapping to writable will now reserve.
         */
        if (newflags & VM_WRITE) {
-               if (oldflags & VM_RESERVED) {
-                       BUG_ON(oldflags & VM_WRITE);
-                       printk(KERN_WARNING "program %s is using MAP_PRIVATE, "
-                               "PROT_WRITE mprotect of VM_RESERVED memory, "
-                               "which is deprecated. Please report this to "
-                               "linux-kernel@vger.kernel.org\n",current->comm);
-                       return -EACCES;
-               }
                if (!(oldflags & (VM_ACCOUNT|VM_WRITE|VM_SHARED|VM_HUGETLB))) {
                        charged = nrpages;
                        if (security_vm_enough_memory(charged))
index b535438c363cfb9c6d80528c2c056962ef2e038a..ddaeee9a0b69e5a5e5b232377ae97801fd6a438e 100644 (file)
@@ -323,7 +323,7 @@ unsigned long do_mremap(unsigned long addr,
        /* We can't remap across vm area boundaries */
        if (old_len > vma->vm_end - addr)
                goto out;
-       if (vma->vm_flags & VM_DONTEXPAND) {
+       if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP)) {
                if (new_len > old_len)
                        goto out;
        }
index 0e040e9c39d835a7cf938468be6a9b7bccb95c2d..1b5b6f662dcfd40e3c27122a58c2c1a17e93e295 100644 (file)
@@ -27,7 +27,6 @@ static void msync_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 again:
        pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
        do {
-               unsigned long pfn;
                struct page *page;
 
                if (progress >= 64) {
@@ -40,13 +39,9 @@ again:
                        continue;
                if (!pte_maybe_dirty(*pte))
                        continue;
-               pfn = pte_pfn(*pte);
-               if (unlikely(!pfn_valid(pfn))) {
-                       print_bad_pte(vma, *pte, addr);
+               page = vm_normal_page(vma, addr, *pte);
+               if (!page)
                        continue;
-               }
-               page = pfn_to_page(pfn);
-
                if (ptep_clear_flush_dirty(vma, addr, pte) ||
                    page_test_and_clear_dirty(page))
                        set_page_dirty(page);
@@ -97,9 +92,8 @@ static void msync_page_range(struct vm_area_struct *vma,
        /* For hugepages we can't go walking the page table normally,
         * but that's ok, hugetlbfs is memory based, so we don't need
         * to do anything more on an msync().
-        * Can't do anything with VM_RESERVED regions either.
         */
-       if (vma->vm_flags & (VM_HUGETLB|VM_RESERVED))
+       if (vma->vm_flags & VM_HUGETLB)
                return;
 
        BUG_ON(addr >= end);
index 6deb6ab3d6ada1a27cfcbc65303fa1403d498ac0..c1196812876be984920118078fd817dccbf771f8 100644 (file)
@@ -1045,7 +1045,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
 
 EXPORT_SYMBOL(find_vma);
 
-struct page *follow_page(struct mm_struct *mm, unsigned long address,
+struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
                        unsigned int foll_flags)
 {
        return NULL;
index bd4de592dc238fd3939c16b276cc7e10f7d1e21d..fe14a8c87fc27d8822faeaff71cf990f6f9a95ef 100644 (file)
@@ -140,18 +140,13 @@ static void bad_page(const char *function, struct page *page)
                        1 << PG_reclaim |
                        1 << PG_slab    |
                        1 << PG_swapcache |
-                       1 << PG_writeback |
-                       1 << PG_reserved );
+                       1 << PG_writeback );
        set_page_count(page, 0);
        reset_page_mapcount(page);
        page->mapping = NULL;
        add_taint(TAINT_BAD_PAGE);
 }
 
-#ifndef CONFIG_HUGETLB_PAGE
-#define prep_compound_page(page, order) do { } while (0)
-#define destroy_compound_page(page, order) do { } while (0)
-#else
 /*
  * Higher-order pages are called "compound pages".  They are structured thusly:
  *
@@ -205,7 +200,6 @@ static void destroy_compound_page(struct page *page, unsigned long order)
                ClearPageCompound(p);
        }
 }
-#endif         /* CONFIG_HUGETLB_PAGE */
 
 /*
  * function for dealing with page's order in buddy system.
@@ -340,7 +334,7 @@ static inline void __free_pages_bulk (struct page *page,
        zone->free_area[order].nr_free++;
 }
 
-static inline void free_pages_check(const char *function, struct page *page)
+static inline int free_pages_check(const char *function, struct page *page)
 {
        if (    page_mapcount(page) ||
                page->mapping != NULL ||
@@ -358,6 +352,12 @@ static inline void free_pages_check(const char *function, struct page *page)
                bad_page(function, page);
        if (PageDirty(page))
                __ClearPageDirty(page);
+       /*
+        * For now, we report if PG_reserved was found set, but do not
+        * clear it, and do not free the page.  But we shall soon need
+        * to do more, for when the ZERO_PAGE count wraps negative.
+        */
+       return PageReserved(page);
 }
 
 /*
@@ -397,11 +397,10 @@ void __free_pages_ok(struct page *page, unsigned int order)
 {
        LIST_HEAD(list);
        int i;
+       int reserved = 0;
 
        arch_free_page(page, order);
 
-       mod_page_state(pgfree, 1 << order);
-
 #ifndef CONFIG_MMU
        if (order > 0)
                for (i = 1 ; i < (1 << order) ; ++i)
@@ -409,8 +408,12 @@ void __free_pages_ok(struct page *page, unsigned int order)
 #endif
 
        for (i = 0 ; i < (1 << order) ; ++i)
-               free_pages_check(__FUNCTION__, page + i);
+               reserved += free_pages_check(__FUNCTION__, page + i);
+       if (reserved)
+               return;
+
        list_add(&page->lru, &list);
+       mod_page_state(pgfree, 1 << order);
        kernel_map_pages(page, 1<<order, 0);
        free_pages_bulk(page_zone(page), 1, &list, order);
 }
@@ -468,7 +471,7 @@ void set_page_refs(struct page *page, int order)
 /*
  * This page is about to be returned from the page allocator
  */
-static void prep_new_page(struct page *page, int order)
+static int prep_new_page(struct page *page, int order)
 {
        if (    page_mapcount(page) ||
                page->mapping != NULL ||
@@ -486,12 +489,20 @@ static void prep_new_page(struct page *page, int order)
                        1 << PG_reserved )))
                bad_page(__FUNCTION__, page);
 
+       /*
+        * For now, we report if PG_reserved was found set, but do not
+        * clear it, and do not allocate the page: as a safety net.
+        */
+       if (PageReserved(page))
+               return 1;
+
        page->flags &= ~(1 << PG_uptodate | 1 << PG_error |
                        1 << PG_referenced | 1 << PG_arch_1 |
                        1 << PG_checked | 1 << PG_mappedtodisk);
        set_page_private(page, 0);
        set_page_refs(page, order);
        kernel_map_pages(page, 1 << order, 1);
+       return 0;
 }
 
 /* 
@@ -674,11 +685,14 @@ static void fastcall free_hot_cold_page(struct page *page, int cold)
 
        arch_free_page(page, 0);
 
-       kernel_map_pages(page, 1, 0);
-       inc_page_state(pgfree);
        if (PageAnon(page))
                page->mapping = NULL;
-       free_pages_check(__FUNCTION__, page);
+       if (free_pages_check(__FUNCTION__, page))
+               return;
+
+       inc_page_state(pgfree);
+       kernel_map_pages(page, 1, 0);
+
        pcp = &zone_pcp(zone, get_cpu())->pcp[cold];
        local_irq_save(flags);
        list_add(&page->lru, &pcp->list);
@@ -717,12 +731,14 @@ static struct page *
 buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags)
 {
        unsigned long flags;
-       struct page *page = NULL;
+       struct page *page;
        int cold = !!(gfp_flags & __GFP_COLD);
 
+again:
        if (order == 0) {
                struct per_cpu_pages *pcp;
 
+               page = NULL;
                pcp = &zone_pcp(zone, get_cpu())->pcp[cold];
                local_irq_save(flags);
                if (pcp->count <= pcp->low)
@@ -744,7 +760,8 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags)
        if (page != NULL) {
                BUG_ON(bad_range(zone, page));
                mod_page_state_zone(zone, pgalloc, 1 << order);
-               prep_new_page(page, order);
+               if (prep_new_page(page, order))
+                       goto again;
 
                if (gfp_flags & __GFP_ZERO)
                        prep_zero_page(page, order, gfp_flags);
@@ -756,9 +773,12 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags)
 }
 
 #define ALLOC_NO_WATERMARKS    0x01 /* don't check watermarks at all */
-#define ALLOC_HARDER           0x02 /* try to alloc harder */
-#define ALLOC_HIGH             0x04 /* __GFP_HIGH set */
-#define ALLOC_CPUSET           0x08 /* check for correct cpuset */
+#define ALLOC_WMARK_MIN                0x02 /* use pages_min watermark */
+#define ALLOC_WMARK_LOW                0x04 /* use pages_low watermark */
+#define ALLOC_WMARK_HIGH       0x08 /* use pages_high watermark */
+#define ALLOC_HARDER           0x10 /* try to alloc harder */
+#define ALLOC_HIGH             0x20 /* __GFP_HIGH set */
+#define ALLOC_CPUSET           0x40 /* check for correct cpuset */
 
 /*
  * Return 1 if free pages are above 'mark'. This takes into account the order
@@ -813,7 +833,14 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
                        continue;
 
                if (!(alloc_flags & ALLOC_NO_WATERMARKS)) {
-                       if (!zone_watermark_ok(*z, order, (*z)->pages_low,
+                       unsigned long mark;
+                       if (alloc_flags & ALLOC_WMARK_MIN)
+                               mark = (*z)->pages_min;
+                       else if (alloc_flags & ALLOC_WMARK_LOW)
+                               mark = (*z)->pages_low;
+                       else
+                               mark = (*z)->pages_high;
+                       if (!zone_watermark_ok(*z, order, mark,
                                    classzone_idx, alloc_flags))
                                continue;
                }
@@ -854,7 +881,7 @@ restart:
        }
 
        page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, order,
-                               zonelist, ALLOC_CPUSET);
+                               zonelist, ALLOC_WMARK_LOW|ALLOC_CPUSET);
        if (page)
                goto got_pg;
 
@@ -871,7 +898,7 @@ restart:
         * cannot run direct reclaim, or if the caller has realtime scheduling
         * policy.
         */
-       alloc_flags = 0;
+       alloc_flags = ALLOC_WMARK_MIN;
        if ((unlikely(rt_task(p)) && !in_interrupt()) || !wait)
                alloc_flags |= ALLOC_HARDER;
        if (gfp_mask & __GFP_HIGH)
@@ -942,7 +969,7 @@ rebalance:
                 * under heavy pressure.
                 */
                page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, order,
-                                               zonelist, ALLOC_CPUSET);
+                               zonelist, ALLOC_WMARK_HIGH|ALLOC_CPUSET);
                if (page)
                        goto got_pg;
 
@@ -1745,16 +1772,16 @@ static int __devinit zone_batchsize(struct zone *zone)
                batch = 1;
 
        /*
-        * We will be trying to allcoate bigger chunks of contiguous
-        * memory of the order of fls(batch).  This should result in
-        * better cache coloring.
+        * 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.
         *
-        * A sanity check also to ensure that batch is still in limits.
+        * 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));
-
-       if (fls(batch) >= (PAGE_SHIFT + MAX_ORDER - 2))
-               batch = PAGE_SHIFT + ((MAX_ORDER - 1 - PAGE_SHIFT)/2);
+       batch = (1 << (fls(batch + batch/2)-1)) - 1;
 
        return batch;
 }
@@ -1869,7 +1896,7 @@ static int __devinit pageset_cpuup_callback(struct notifier_block *nfb,
 static struct notifier_block pageset_notifier =
        { &pageset_cpuup_callback, NULL, 0 };
 
-void __init setup_per_cpu_pageset()
+void __init setup_per_cpu_pageset(void)
 {
        int err;
 
index 914d04b98beee0aca9e52eada3b52db6307c7b30..f853c6def15915602e484afdd3a741099d543887 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -225,7 +225,7 @@ vma_address(struct page *page, struct vm_area_struct *vma)
 
 /*
  * At what user virtual address is page expected in vma? checking that the
- * page matches the vma: currently only used by unuse_process, on anon pages.
+ * page matches the vma: currently only used on anon pages, by unuse_vma;
  */
 unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
 {
@@ -234,7 +234,8 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
                    (void *)page->mapping - PAGE_MAPPING_ANON)
                        return -EFAULT;
        } else if (page->mapping && !(vma->vm_flags & VM_NONLINEAR)) {
-               if (vma->vm_file->f_mapping != page->mapping)
+               if (!vma->vm_file ||
+                   vma->vm_file->f_mapping != page->mapping)
                        return -EFAULT;
        } else
                return -EFAULT;
@@ -289,7 +290,7 @@ pte_t *page_check_address(struct page *page, struct mm_struct *mm,
  * repeatedly from either page_referenced_anon or page_referenced_file.
  */
 static int page_referenced_one(struct page *page,
-       struct vm_area_struct *vma, unsigned int *mapcount, int ignore_token)
+       struct vm_area_struct *vma, unsigned int *mapcount)
 {
        struct mm_struct *mm = vma->vm_mm;
        unsigned long address;
@@ -310,7 +311,7 @@ static int page_referenced_one(struct page *page,
 
        /* Pretend the page is referenced if the task has the
           swap token and is in the middle of a page fault. */
-       if (mm != current->mm && !ignore_token && has_swap_token(mm) &&
+       if (mm != current->mm && has_swap_token(mm) &&
                        rwsem_is_locked(&mm->mmap_sem))
                referenced++;
 
@@ -320,7 +321,7 @@ out:
        return referenced;
 }
 
-static int page_referenced_anon(struct page *page, int ignore_token)
+static int page_referenced_anon(struct page *page)
 {
        unsigned int mapcount;
        struct anon_vma *anon_vma;
@@ -333,8 +334,7 @@ static int page_referenced_anon(struct page *page, int ignore_token)
 
        mapcount = page_mapcount(page);
        list_for_each_entry(vma, &anon_vma->head, anon_vma_node) {
-               referenced += page_referenced_one(page, vma, &mapcount,
-                                                       ignore_token);
+               referenced += page_referenced_one(page, vma, &mapcount);
                if (!mapcount)
                        break;
        }
@@ -353,7 +353,7 @@ static int page_referenced_anon(struct page *page, int ignore_token)
  *
  * This function is only called from page_referenced for object-based pages.
  */
-static int page_referenced_file(struct page *page, int ignore_token)
+static int page_referenced_file(struct page *page)
 {
        unsigned int mapcount;
        struct address_space *mapping = page->mapping;
@@ -391,8 +391,7 @@ static int page_referenced_file(struct page *page, int ignore_token)
                        referenced++;
                        break;
                }
-               referenced += page_referenced_one(page, vma, &mapcount,
-                                                       ignore_token);
+               referenced += page_referenced_one(page, vma, &mapcount);
                if (!mapcount)
                        break;
        }
@@ -409,13 +408,10 @@ static int page_referenced_file(struct page *page, int ignore_token)
  * Quick test_and_clear_referenced for all mappings to a page,
  * returns the number of ptes which referenced the page.
  */
-int page_referenced(struct page *page, int is_locked, int ignore_token)
+int page_referenced(struct page *page, int is_locked)
 {
        int referenced = 0;
 
-       if (!swap_token_default_timeout)
-               ignore_token = 1;
-
        if (page_test_and_clear_young(page))
                referenced++;
 
@@ -424,15 +420,14 @@ int page_referenced(struct page *page, int is_locked, int ignore_token)
 
        if (page_mapped(page) && page->mapping) {
                if (PageAnon(page))
-                       referenced += page_referenced_anon(page, ignore_token);
+                       referenced += page_referenced_anon(page);
                else if (is_locked)
-                       referenced += page_referenced_file(page, ignore_token);
+                       referenced += page_referenced_file(page);
                else if (TestSetPageLocked(page))
                        referenced++;
                else {
                        if (page->mapping)
-                               referenced += page_referenced_file(page,
-                                                               ignore_token);
+                               referenced += page_referenced_file(page);
                        unlock_page(page);
                }
        }
@@ -529,10 +524,8 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma)
         * If the page is mlock()d, we cannot swap it out.
         * If it's recently referenced (perhaps page_referenced
         * skipped over this mm) then we should reactivate it.
-        *
-        * Pages belonging to VM_RESERVED regions should not happen here.
         */
-       if ((vma->vm_flags & (VM_LOCKED|VM_RESERVED)) ||
+       if ((vma->vm_flags & VM_LOCKED) ||
                        ptep_clear_flush_young(vma, address, pte)) {
                ret = SWAP_FAIL;
                goto out_unmap;
@@ -613,7 +606,6 @@ static void try_to_unmap_cluster(unsigned long cursor,
        struct page *page;
        unsigned long address;
        unsigned long end;
-       unsigned long pfn;
 
        address = (vma->vm_start + cursor) & CLUSTER_MASK;
        end = address + CLUSTER_SIZE;
@@ -642,21 +634,14 @@ static void try_to_unmap_cluster(unsigned long cursor,
        for (; address < end; pte++, address += PAGE_SIZE) {
                if (!pte_present(*pte))
                        continue;
-
-               pfn = pte_pfn(*pte);
-               if (unlikely(!pfn_valid(pfn))) {
-                       print_bad_pte(vma, *pte, address);
-                       continue;
-               }
-
-               page = pfn_to_page(pfn);
-               BUG_ON(PageAnon(page));
+               page = vm_normal_page(vma, address, *pte);
+               BUG_ON(!page || PageAnon(page));
 
                if (ptep_clear_flush_young(vma, address, pte))
                        continue;
 
                /* Nuke the page table entry. */
-               flush_cache_page(vma, address, pfn);
+               flush_cache_page(vma, address, pte_pfn(*pte));
                pteval = ptep_clear_flush(vma, address, pte);
 
                /* If nonlinear, store the file page offset in the pte. */
@@ -727,7 +712,7 @@ static int try_to_unmap_file(struct page *page)
 
        list_for_each_entry(vma, &mapping->i_mmap_nonlinear,
                                                shared.vm_set.list) {
-               if (vma->vm_flags & (VM_LOCKED|VM_RESERVED))
+               if (vma->vm_flags & VM_LOCKED)
                        continue;
                cursor = (unsigned long) vma->vm_private_data;
                if (cursor > max_nl_cursor)
@@ -761,7 +746,7 @@ static int try_to_unmap_file(struct page *page)
        do {
                list_for_each_entry(vma, &mapping->i_mmap_nonlinear,
                                                shared.vm_set.list) {
-                       if (vma->vm_flags & (VM_LOCKED|VM_RESERVED))
+                       if (vma->vm_flags & VM_LOCKED)
                                continue;
                        cursor = (unsigned long) vma->vm_private_data;
                        while ( cursor < max_nl_cursor &&
@@ -783,11 +768,8 @@ static int try_to_unmap_file(struct page *page)
         * in locked vmas).  Reset cursor on all unreserved nonlinear
         * vmas, now forgetting on which ones it had fallen behind.
         */
-       list_for_each_entry(vma, &mapping->i_mmap_nonlinear,
-                                               shared.vm_set.list) {
-               if (!(vma->vm_flags & VM_RESERVED))
-                       vma->vm_private_data = NULL;
-       }
+       list_for_each_entry(vma, &mapping->i_mmap_nonlinear, shared.vm_set.list)
+               vma->vm_private_data = NULL;
 out:
        spin_unlock(&mapping->i_mmap_lock);
        return ret;
index d09cf7f03e767e57e500ac5f6dd4c35c72c5f9a4..73d351439ef6c9cc34cf9d1ad4887692a7d935b4 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -34,8 +34,6 @@
 /* How many pages do we try to swap or page in/out together? */
 int page_cluster;
 
-#ifdef CONFIG_HUGETLB_PAGE
-
 void put_page(struct page *page)
 {
        if (unlikely(PageCompound(page))) {
@@ -52,7 +50,6 @@ void put_page(struct page *page)
                __page_cache_release(page);
 }
 EXPORT_SYMBOL(put_page);
-#endif
 
 /*
  * Writeback is about to end against a page which has been marked for immediate
index eff3c18c33a10ba802b9743c514a83ccd04aaa09..f4c560b4a2b79862340fe7457af001f8e6141715 100644 (file)
@@ -57,14 +57,17 @@ void grab_swap_token(void)
        /* We have the token. Let others know we still need it. */
        if (has_swap_token(current->mm)) {
                current->mm->recent_pagein = 1;
+               if (unlikely(!swap_token_default_timeout))
+                       disable_swap_token();
                return;
        }
 
        if (time_after(jiffies, swap_token_check)) {
 
-               /* Can't get swapout protection if we exceed our RSS limit. */
-               // if (current->mm->rss > current->mm->rlimit_rss)
-               //      return;
+               if (!swap_token_default_timeout) {
+                       swap_token_check = jiffies + SWAP_TOKEN_CHECK_INTERVAL;
+                       return;
+               }
 
                /* ... or if we recently held the token. */
                if (time_before(jiffies, current->mm->swap_token_time))
@@ -95,6 +98,7 @@ void __put_swap_token(struct mm_struct *mm)
 {
        spin_lock(&swap_token_lock);
        if (likely(mm == swap_token_mm)) {
+               mm->swap_token_time = jiffies + SWAP_TOKEN_CHECK_INTERVAL;
                swap_token_mm = &init_mm;
                swap_token_check = jiffies;
        }
index 29c18f68dc35cd9b1cc17ee6e5f21bf05d3658e7..9173ab500604d904747f6f2681b9eb1305de7b42 100644 (file)
@@ -282,8 +282,8 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
                                         * Zap the rest of the file in one hit.
                                         */
                                        unmap_mapping_range(mapping,
-                                           page_index << PAGE_CACHE_SHIFT,
-                                           (end - page_index + 1)
+                                          (loff_t)page_index<<PAGE_CACHE_SHIFT,
+                                          (loff_t)(end - page_index + 1)
                                                        << PAGE_CACHE_SHIFT,
                                            0);
                                        did_range_unmap = 1;
@@ -292,7 +292,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
                                         * Just zap this page
                                         */
                                        unmap_mapping_range(mapping,
-                                         page_index << PAGE_CACHE_SHIFT,
+                                         (loff_t)page_index<<PAGE_CACHE_SHIFT,
                                          PAGE_CACHE_SIZE, 0);
                                }
                        }
index 28130541270f5ad35b3e18ac878b349c61c6e01f..b0cd81c32de6ca0f601bb1be3c12764beb37a8af 100644 (file)
@@ -201,13 +201,25 @@ static int shrink_slab(unsigned long scanned, gfp_t gfp_mask,
        list_for_each_entry(shrinker, &shrinker_list, list) {
                unsigned long long delta;
                unsigned long total_scan;
+               unsigned long max_pass = (*shrinker->shrinker)(0, gfp_mask);
 
                delta = (4 * scanned) / shrinker->seeks;
-               delta *= (*shrinker->shrinker)(0, gfp_mask);
+               delta *= max_pass;
                do_div(delta, lru_pages + 1);
                shrinker->nr += delta;
-               if (shrinker->nr < 0)
-                       shrinker->nr = LONG_MAX;        /* It wrapped! */
+               if (shrinker->nr < 0) {
+                       printk(KERN_ERR "%s: nr=%ld\n",
+                                       __FUNCTION__, shrinker->nr);
+                       shrinker->nr = max_pass;
+               }
+
+               /*
+                * Avoid risking looping forever due to too large nr value:
+                * never try to free more than twice the estimate number of
+                * freeable entries.
+                */
+               if (shrinker->nr > max_pass * 2)
+                       shrinker->nr = max_pass * 2;
 
                total_scan = shrinker->nr;
                shrinker->nr = 0;
@@ -407,7 +419,7 @@ static int shrink_list(struct list_head *page_list, struct scan_control *sc)
                if (PageWriteback(page))
                        goto keep_locked;
 
-               referenced = page_referenced(page, 1, sc->priority <= 0);
+               referenced = page_referenced(page, 1);
                /* In active use or really unfreeable?  Activate it. */
                if (referenced && page_mapping_inuse(page))
                        goto activate_locked;
@@ -756,7 +768,7 @@ refill_inactive_zone(struct zone *zone, struct scan_control *sc)
                if (page_mapped(page)) {
                        if (!reclaim_mapped ||
                            (total_swap_pages == 0 && PageAnon(page)) ||
-                           page_referenced(page, 0, sc->priority <= 0)) {
+                           page_referenced(page, 0)) {
                                list_add(&page->lru, &l_active);
                                continue;
                        }
@@ -960,6 +972,8 @@ int try_to_free_pages(struct zone **zones, gfp_t gfp_mask)
                sc.nr_reclaimed = 0;
                sc.priority = priority;
                sc.swap_cluster_max = SWAP_CLUSTER_MAX;
+               if (!priority)
+                       disable_swap_token();
                shrink_caches(zones, &sc);
                shrink_slab(sc.nr_scanned, gfp_mask, lru_pages);
                if (reclaim_state) {
@@ -1056,6 +1070,10 @@ loop_again:
                int end_zone = 0;       /* Inclusive.  0 = ZONE_DMA */
                unsigned long lru_pages = 0;
 
+               /* The swap token gets in the way of swapout... */
+               if (!priority)
+                       disable_swap_token();
+
                all_zones_ok = 1;
 
                if (nr_pages == 0) {
@@ -1360,6 +1378,7 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
        sc.nr_reclaimed = 0;
        /* scan at the highest priority */
        sc.priority = 0;
+       disable_swap_token();
 
        if (nr_pages > SWAP_CLUSTER_MAX)
                sc.swap_cluster_max = nr_pages;
index 91e412b0ab005b439e328cf8800f4ee08fb7bdeb..67465b65abe4345181f1029360ac8654e189eaf0 100644 (file)
@@ -753,6 +753,8 @@ static int vlan_ioctl_handler(void __user *arg)
                break;
        case GET_VLAN_REALDEV_NAME_CMD:
                err = vlan_dev_get_realdev_name(args.device1, args.u.device2);
+               if (err)
+                       goto out;
                if (copy_to_user(arg, &args,
                                 sizeof(struct vlan_ioctl_args))) {
                        err = -EFAULT;
@@ -761,6 +763,8 @@ static int vlan_ioctl_handler(void __user *arg)
 
        case GET_VLAN_VID_CMD:
                err = vlan_dev_get_vid(args.device1, &vid);
+               if (err)
+                       goto out;
                args.u.VID = vid;
                if (copy_to_user(arg, &args,
                                 sizeof(struct vlan_ioctl_args))) {
@@ -774,7 +778,7 @@ static int vlan_ioctl_handler(void __user *arg)
                        __FUNCTION__, args.cmd);
                return -EINVAL;
        };
-
+out:
        return err;
 }
 
index b7486488967074b9b40c4b5916533f0b969f265c..f2a8750bbf1d7555633c1b2562883dcd02b800bc 100644 (file)
@@ -165,6 +165,9 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
 
        skb_pull(skb, VLAN_HLEN); /* take off the VLAN header (4 bytes currently) */
 
+       /* Need to correct hardware checksum */
+       skb_postpull_rcsum(skb, vhdr, VLAN_HLEN);
+
        /* Ok, lets check to make sure the device (dev) we
         * came in on is what this VLAN is attached to.
         */
index 7982656b9c830d7ea1c819d427240ca5a797a210..a5144e43aae136896ae646e4048fbdc13b75b25e 100644 (file)
@@ -63,7 +63,7 @@
 #include <linux/atalk.h>
 
 struct datalink_proto *ddp_dl, *aarp_dl;
-static struct proto_ops atalk_dgram_ops;
+static const struct proto_ops atalk_dgram_ops;
 
 /**************************************************************************\
 *                                                                          *
@@ -1763,7 +1763,7 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
  */
 static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
-       int rc = -EINVAL;
+       int rc = -ENOIOCTLCMD;
        struct sock *sk = sock->sk;
        void __user *argp = (void __user *)arg;
 
@@ -1813,23 +1813,6 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        rc = atif_ioctl(cmd, argp);
                        rtnl_unlock();
                        break;
-               /* Physical layer ioctl calls */
-               case SIOCSIFLINK:
-               case SIOCGIFHWADDR:
-               case SIOCSIFHWADDR:
-               case SIOCGIFFLAGS:
-               case SIOCSIFFLAGS:
-               case SIOCGIFTXQLEN:
-               case SIOCSIFTXQLEN:
-               case SIOCGIFMTU:
-               case SIOCGIFCONF:
-               case SIOCADDMULTI:
-               case SIOCDELMULTI:
-               case SIOCGIFCOUNT:
-               case SIOCGIFINDEX:
-               case SIOCGIFNAME:
-                       rc = dev_ioctl(cmd, argp);
-                       break;
        }
 
        return rc;
@@ -1841,7 +1824,7 @@ static struct net_proto_family atalk_family_ops = {
        .owner          = THIS_MODULE,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
        .family         = PF_APPLETALK,
        .owner          = THIS_MODULE,
        .release        = atalk_release,
index 223c7ad5bd0f7a3d524e73667c11aa35edae6733..02cc7e71efea24e36fbe78a5e43ee6e7122f3b64 100644 (file)
@@ -74,11 +74,14 @@ struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
  */
 
 
-int atm_pcr_goal(struct atm_trafprm *tp)
+int atm_pcr_goal(const struct atm_trafprm *tp)
 {
-       if (tp->pcr && tp->pcr != ATM_MAX_PCR) return -tp->pcr;
-       if (tp->min_pcr && !tp->pcr) return tp->min_pcr;
-       if (tp->max_pcr != ATM_MAX_PCR) return -tp->max_pcr;
+       if (tp->pcr && tp->pcr != ATM_MAX_PCR)
+               return -tp->pcr;
+       if (tp->min_pcr && !tp->pcr)
+               return tp->min_pcr;
+       if (tp->max_pcr != ATM_MAX_PCR)
+               return -tp->max_pcr;
        return 0;
 }
 
index 63feea49fb139f6a0e96888c3f4f99c2325ac883..6656b111cc053de334c9885f0f6ccebe4cadd790 100644 (file)
@@ -221,6 +221,29 @@ void vcc_release_async(struct atm_vcc *vcc, int reply)
 EXPORT_SYMBOL(vcc_release_async);
 
 
+void atm_dev_release_vccs(struct atm_dev *dev)
+{
+       int i;
+
+       write_lock_irq(&vcc_sklist_lock);
+       for (i = 0; i < VCC_HTABLE_SIZE; i++) {
+               struct hlist_head *head = &vcc_hash[i];
+               struct hlist_node *node, *tmp;
+               struct sock *s;
+               struct atm_vcc *vcc;
+
+               sk_for_each_safe(s, node, tmp, head) {
+                       vcc = atm_sk(s);
+                       if (vcc->dev == dev) {
+                               vcc_release_async(vcc, -EPIPE);
+                               sk_del_node_init(s);
+                       }
+               }
+       }
+       write_unlock_irq(&vcc_sklist_lock);
+}
+
+
 static int adjust_tp(struct atm_trafprm *tp,unsigned char aal)
 {
        int max_sdu;
@@ -332,12 +355,13 @@ static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, short vpi,
                return -EINVAL;
        if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE))
                return -EPERM;
-       error = 0;
+       error = -ENODEV;
        if (!try_module_get(dev->ops->owner))
-               return -ENODEV;
+               return error;
        vcc->dev = dev;
        write_lock_irq(&vcc_sklist_lock);
-       if ((error = find_ci(vcc, &vpi, &vci))) {
+       if (test_bit(ATM_DF_REMOVED, &dev->flags) || 
+           (error = find_ci(vcc, &vpi, &vci))) {
                write_unlock_irq(&vcc_sklist_lock);
                goto fail_module_put;
        }
@@ -423,33 +447,23 @@ int vcc_connect(struct socket *sock, int itf, short vpi, int vci)
        if (vcc->qos.txtp.traffic_class == ATM_ANYCLASS ||
            vcc->qos.rxtp.traffic_class == ATM_ANYCLASS)
                return -EINVAL;
-       if (itf != ATM_ITF_ANY) {
-               dev = atm_dev_lookup(itf);
-               if (!dev)
-                       return -ENODEV;
-               error = __vcc_connect(vcc, dev, vpi, vci);
-               if (error) {
-                       atm_dev_put(dev);
-                       return error;
-               }
+       if (likely(itf != ATM_ITF_ANY)) {
+               dev = try_then_request_module(atm_dev_lookup(itf), "atm-device-%d", itf);
        } else {
-               struct list_head *p, *next;
-
                dev = NULL;
-               spin_lock(&atm_dev_lock);
-               list_for_each_safe(p, next, &atm_devs) {
-                       dev = list_entry(p, struct atm_dev, dev_list);
+               down(&atm_dev_mutex);
+               if (!list_empty(&atm_devs)) {
+                       dev = list_entry(atm_devs.next, struct atm_dev, dev_list);
                        atm_dev_hold(dev);
-                       spin_unlock(&atm_dev_lock);
-                       if (!__vcc_connect(vcc, dev, vpi, vci))
-                               break;
-                       atm_dev_put(dev);
-                       dev = NULL;
-                       spin_lock(&atm_dev_lock);
                }
-               spin_unlock(&atm_dev_lock);
-               if (!dev)
-                       return -ENODEV;
+               up(&atm_dev_mutex);
+       }
+       if (!dev)
+               return -ENODEV;
+       error = __vcc_connect(vcc, dev, vpi, vci);
+       if (error) {
+               atm_dev_put(dev);
+               return error;
        }
        if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC)
                set_bit(ATM_VF_PARTIAL,&vcc->flags);
index e49ed41c0e337f4683ea0e58cb43b150e8248b29..4887c317cefe99365576c2812875dc730257aa13 100644 (file)
@@ -47,4 +47,6 @@ static inline void atm_proc_exit(void)
 /* SVC */
 int svc_change_qos(struct atm_vcc *vcc,struct atm_qos *qos);
 
+void atm_dev_release_vccs(struct atm_dev *dev);
+
 #endif
index 2684a92da22bdbc3cdc98d4680c27c70fe315943..f2c541774dcd77e14a7dc8cc47c53a36b3b6f3bb 100644 (file)
@@ -102,7 +102,7 @@ static int pvc_getname(struct socket *sock,struct sockaddr *sockaddr,
 }
 
 
-static struct proto_ops pvc_proto_ops = {
+static const struct proto_ops pvc_proto_ops = {
        .family =       PF_ATMPVC,
        .owner =        THIS_MODULE,
 
index 415d2615d475fa3c284d4a11cf565408d8c5c385..c8c459fcb0386a0e597f8b2d811a08b3055a0ef8 100644 (file)
@@ -25,7 +25,7 @@
 
 
 LIST_HEAD(atm_devs);
-DEFINE_SPINLOCK(atm_dev_lock);
+DECLARE_MUTEX(atm_dev_mutex);
 
 static struct atm_dev *__alloc_atm_dev(const char *type)
 {
@@ -52,7 +52,7 @@ static struct atm_dev *__atm_dev_lookup(int number)
 
        list_for_each(p, &atm_devs) {
                dev = list_entry(p, struct atm_dev, dev_list);
-               if ((dev->ops) && (dev->number == number)) {
+               if (dev->number == number) {
                        atm_dev_hold(dev);
                        return dev;
                }
@@ -64,12 +64,13 @@ struct atm_dev *atm_dev_lookup(int number)
 {
        struct atm_dev *dev;
 
-       spin_lock(&atm_dev_lock);
+       down(&atm_dev_mutex);
        dev = __atm_dev_lookup(number);
-       spin_unlock(&atm_dev_lock);
+       up(&atm_dev_mutex);
        return dev;
 }
 
+
 struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
                                 int number, unsigned long *flags)
 {
@@ -81,11 +82,11 @@ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
                    type);
                return NULL;
        }
-       spin_lock(&atm_dev_lock);
+       down(&atm_dev_mutex);
        if (number != -1) {
                if ((inuse = __atm_dev_lookup(number))) {
                        atm_dev_put(inuse);
-                       spin_unlock(&atm_dev_lock);
+                       up(&atm_dev_mutex);
                        kfree(dev);
                        return NULL;
                }
@@ -105,19 +106,17 @@ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
                memset(&dev->flags, 0, sizeof(dev->flags));
        memset(&dev->stats, 0, sizeof(dev->stats));
        atomic_set(&dev->refcnt, 1);
-       list_add_tail(&dev->dev_list, &atm_devs);
-       spin_unlock(&atm_dev_lock);
 
        if (atm_proc_dev_register(dev) < 0) {
                printk(KERN_ERR "atm_dev_register: "
                       "atm_proc_dev_register failed for dev %s\n",
                       type);
-               spin_lock(&atm_dev_lock);
-               list_del(&dev->dev_list);
-               spin_unlock(&atm_dev_lock);
+               up(&atm_dev_mutex);
                kfree(dev);
                return NULL;
        }
+       list_add_tail(&dev->dev_list, &atm_devs);
+       up(&atm_dev_mutex);
 
        return dev;
 }
@@ -125,37 +124,22 @@ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
 
 void atm_dev_deregister(struct atm_dev *dev)
 {
-       unsigned long warning_time;
+       BUG_ON(test_bit(ATM_DF_REMOVED, &dev->flags));
+       set_bit(ATM_DF_REMOVED, &dev->flags);
+
+       /*
+        * if we remove current device from atm_devs list, new device 
+        * with same number can appear, such we need deregister proc, 
+        * release async all vccs and remove them from vccs list too
+        */
+       down(&atm_dev_mutex);
+       list_del(&dev->dev_list);
+       up(&atm_dev_mutex);
 
+       atm_dev_release_vccs(dev);
        atm_proc_dev_deregister(dev);
 
-       spin_lock(&atm_dev_lock);
-       list_del(&dev->dev_list);
-       spin_unlock(&atm_dev_lock);
-
-        warning_time = jiffies;
-        while (atomic_read(&dev->refcnt) != 1) {
-                msleep(250);
-                if ((jiffies - warning_time) > 10 * HZ) {
-                        printk(KERN_EMERG "atm_dev_deregister: waiting for "
-                               "dev %d to become free. Usage count = %d\n",
-                               dev->number, atomic_read(&dev->refcnt));
-                        warning_time = jiffies;
-                }
-        }
-
-       kfree(dev);
-}
-
-void shutdown_atm_dev(struct atm_dev *dev)
-{
-       if (atomic_read(&dev->refcnt) > 1) {
-               set_bit(ATM_DF_CLOSE, &dev->flags);
-               return;
-       }
-       if (dev->ops->dev_close)
-               dev->ops->dev_close(dev);
-       atm_dev_deregister(dev);
+       atm_dev_put(dev);
 }
 
 
@@ -211,16 +195,16 @@ int atm_dev_ioctl(unsigned int cmd, void __user *arg)
                                return -EFAULT;
                        if (get_user(len, &iobuf->length))
                                return -EFAULT;
-                       spin_lock(&atm_dev_lock);
+                       down(&atm_dev_mutex);
                        list_for_each(p, &atm_devs)
                                size += sizeof(int);
                        if (size > len) {
-                               spin_unlock(&atm_dev_lock);
+                               up(&atm_dev_mutex);
                                return -E2BIG;
                        }
                        tmp_buf = kmalloc(size, GFP_ATOMIC);
                        if (!tmp_buf) {
-                               spin_unlock(&atm_dev_lock);
+                               up(&atm_dev_mutex);
                                return -ENOMEM;
                        }
                        tmp_p = tmp_buf;
@@ -228,7 +212,7 @@ int atm_dev_ioctl(unsigned int cmd, void __user *arg)
                                dev = list_entry(p, struct atm_dev, dev_list);
                                *tmp_p++ = dev->number;
                        }
-                       spin_unlock(&atm_dev_lock);
+                       up(&atm_dev_mutex);
                        error = ((copy_to_user(buf, tmp_buf, size)) ||
                                        put_user(size, &iobuf->length))
                                                ? -EFAULT : 0;
@@ -245,7 +229,8 @@ int atm_dev_ioctl(unsigned int cmd, void __user *arg)
        if (get_user(number, &sioc->number))
                return -EFAULT;
 
-       if (!(dev = atm_dev_lookup(number)))
+       if (!(dev = try_then_request_module(atm_dev_lookup(number),
+                                           "atm-device-%d", number)))
                return -ENODEV;
        
        switch (cmd) {
@@ -414,13 +399,13 @@ static __inline__ void *dev_get_idx(loff_t left)
 
 void *atm_dev_seq_start(struct seq_file *seq, loff_t *pos)
 {
-       spin_lock(&atm_dev_lock);
+       down(&atm_dev_mutex);
        return *pos ? dev_get_idx(*pos) : (void *) 1;
 }
 
 void atm_dev_seq_stop(struct seq_file *seq, void *v)
 {
-       spin_unlock(&atm_dev_lock);
+       up(&atm_dev_mutex);
 }
  
 void *atm_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
@@ -434,4 +419,3 @@ void *atm_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 EXPORT_SYMBOL(atm_dev_register);
 EXPORT_SYMBOL(atm_dev_deregister);
 EXPORT_SYMBOL(atm_dev_lookup);
-EXPORT_SYMBOL(shutdown_atm_dev);
index 12910619dbb6cdfed3cb5b56268769263125ad63..b7fb82a93b42951870a1e327b99b1f8a0f954391 100644 (file)
@@ -11,8 +11,7 @@
 
 
 extern struct list_head atm_devs;
-extern spinlock_t atm_dev_lock;
-
+extern struct semaphore atm_dev_mutex;
 
 int atm_dev_ioctl(unsigned int cmd, void __user *arg);
 
index d7b266136bf64168d0ce7ac8cc5796801fc11f13..3a180cfd7b48ee37116f9b78a1dc98081a9528d5 100644 (file)
@@ -613,7 +613,7 @@ static int svc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        return error;
 }
 
-static struct proto_ops svc_proto_ops = {
+static const struct proto_ops svc_proto_ops = {
        .family =       PF_ATMSVC,
        .owner =        THIS_MODULE,
 
index 1b683f302657d376f438b8f9ea68805bdd14118c..e8753c7fcad17d1464e06006af3abb96dad6ba30 100644 (file)
@@ -54,7 +54,7 @@
 HLIST_HEAD(ax25_list);
 DEFINE_SPINLOCK(ax25_list_lock);
 
-static struct proto_ops ax25_proto_ops;
+static const struct proto_ops ax25_proto_ops;
 
 static void ax25_free_sock(struct sock *sk)
 {
@@ -1827,7 +1827,7 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                break;
 
        default:
-               res = dev_ioctl(cmd, argp);
+               res = -ENOIOCTLCMD;
                break;
        }
        release_sock(sk);
@@ -1944,7 +1944,7 @@ static struct net_proto_family ax25_family_ops = {
        .owner  =       THIS_MODULE,
 };
 
-static struct proto_ops ax25_proto_ops = {
+static const struct proto_ops ax25_proto_ops = {
        .family         = PF_AX25,
        .owner          = THIS_MODULE,
        .release        = ax25_release,
index ea616e3fc98e73f3806a5dc04e9770b6fba38425..fb031fe9be9ed140bce6fdfe6092f3ab6df8ff87 100644 (file)
@@ -287,10 +287,9 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
                timeo = schedule_timeout(timeo);
                lock_sock(sk);
 
-               if (sk->sk_err) {
-                       err = sock_error(sk);
+               err = sock_error(sk);
+               if (err)
                        break;
-               }
        }
        set_current_state(TASK_RUNNING);
        remove_wait_queue(sk->sk_sleep, &wait);
index 9778c6acd53bb5785482794f33fb903be719c215..ccbaf69afc5b0d000b1c389bb11ebdc33657bb9f 100644 (file)
@@ -146,7 +146,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
        return 0;
 }
 
-static struct proto_ops bnep_sock_ops = {
+static const struct proto_ops bnep_sock_ops = {
        .family     = PF_BLUETOOTH,
        .owner      = THIS_MODULE,
        .release    = bnep_sock_release,
index beb045bf5714bd54e4b9d60fef75498959a31b2c..5e22343b6090a5aabf6ad593c601ff44d89c4711 100644 (file)
@@ -137,7 +137,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
        return -EINVAL;
 }
 
-static struct proto_ops cmtp_sock_ops = {
+static const struct proto_ops cmtp_sock_ops = {
        .family         = PF_BLUETOOTH,
        .owner          = THIS_MODULE,
        .release        = cmtp_sock_release,
index 1d6d0a15c099a8c4e8f38a63ed78925c0c6f827e..84e6c93a044ad50e934fe8aaa008b4e48354d0fc 100644 (file)
@@ -575,7 +575,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
        return 0;
 }
 
-static struct proto_ops hci_sock_ops = {
+static const struct proto_ops hci_sock_ops = {
        .family         = PF_BLUETOOTH,
        .owner          = THIS_MODULE,
        .release        = hci_sock_release,
index f8986f8814319a242beb06788af564e7f70f3b34..8f8dd931b2948b1746c7163f97084c307442155a 100644 (file)
@@ -143,7 +143,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
        return -EINVAL;
 }
 
-static struct proto_ops hidp_sock_ops = {
+static const struct proto_ops hidp_sock_ops = {
        .family         = PF_BLUETOOTH,
        .owner          = THIS_MODULE,
        .release        = hidp_sock_release,
index e3bb11ca4235562af24b7748873ef8de5ba1d362..7f0781e4326f0cb944d6f43bc121eb9f3b695a49 100644 (file)
@@ -57,7 +57,7 @@
 
 #define VERSION "2.8"
 
-static struct proto_ops l2cap_sock_ops;
+static const struct proto_ops l2cap_sock_ops;
 
 static struct bt_sock_list l2cap_sk_list = {
        .lock = RW_LOCK_UNLOCKED
@@ -767,8 +767,9 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms
 
        BT_DBG("sock %p, sk %p", sock, sk);
 
-       if (sk->sk_err)
-               return sock_error(sk);
+       err = sock_error(sk);
+       if (err)
+               return err;
 
        if (msg->msg_flags & MSG_OOB)
                return -EOPNOTSUPP;
@@ -2160,7 +2161,7 @@ static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
 
 static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
 
-static struct proto_ops l2cap_sock_ops = {
+static const struct proto_ops l2cap_sock_ops = {
        .family         = PF_BLUETOOTH,
        .owner          = THIS_MODULE,
        .release        = l2cap_sock_release,
index 6c34261b232e4cd2d9d0b254e7ae8701a3dfd021..757d2dd3b02f1bb710e49e982ca3c55a790cbae7 100644 (file)
@@ -58,7 +58,7 @@
 #define BT_DBG(D...)
 #endif
 
-static struct proto_ops rfcomm_sock_ops;
+static const struct proto_ops rfcomm_sock_ops;
 
 static struct bt_sock_list rfcomm_sk_list = {
        .lock = RW_LOCK_UNLOCKED
@@ -907,7 +907,7 @@ static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf)
 
 static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL);
 
-static struct proto_ops rfcomm_sock_ops = {
+static const struct proto_ops rfcomm_sock_ops = {
        .family         = PF_BLUETOOTH,
        .owner          = THIS_MODULE,
        .release        = rfcomm_sock_release,
index 9cb00dc6c08c6d18b4cf1031a4405e144d1f69c0..6b61323ce23cad772371657cf18833027f56d0f9 100644 (file)
@@ -56,7 +56,7 @@
 
 #define VERSION "0.5"
 
-static struct proto_ops sco_sock_ops;
+static const struct proto_ops sco_sock_ops;
 
 static struct bt_sock_list sco_sk_list = {
        .lock = RW_LOCK_UNLOCKED
@@ -637,8 +637,9 @@ static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
 
        BT_DBG("sock %p, sk %p", sock, sk);
 
-       if (sk->sk_err)
-               return sock_error(sk);
+       err = sock_error(sk);
+       if (err)
+               return err;
 
        if (msg->msg_flags & MSG_OOB)
                return -EOPNOTSUPP;
@@ -913,7 +914,7 @@ static ssize_t sco_sysfs_show(struct class *dev, char *buf)
 
 static CLASS_ATTR(sco, S_IRUGO, sco_sysfs_show, NULL);
 
-static struct proto_ops sco_sock_ops = {
+static const struct proto_ops sco_sock_ops = {
        .family         = PF_BLUETOOTH,
        .owner          = THIS_MODULE,
        .release        = sco_sock_release,
index f8f184942aaf47899a246d50afd3076b55b64bdc..188cc1ac49eb76ab2c5c806cbb03a406a3c59bf7 100644 (file)
@@ -67,3 +67,4 @@ EXPORT_SYMBOL(br_should_route_hook);
 module_init(br_init)
 module_exit(br_deinit)
 MODULE_LICENSE("GPL");
+MODULE_VERSION(BR_VERSION);
index f564ee99782d248dab471e124f3d02dadeb5512a..0b33a7b3a00cd5c05b0b8e16ec91f0aec4a58599 100644 (file)
@@ -15,7 +15,9 @@
 
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
-#include <linux/module.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+
 #include <asm/uaccess.h>
 #include "br_private.h"
 
@@ -82,6 +84,87 @@ static int br_change_mtu(struct net_device *dev, int new_mtu)
        return 0;
 }
 
+/* Allow setting mac address of pseudo-bridge to be same as
+ * any of the bound interfaces
+ */
+static int br_set_mac_address(struct net_device *dev, void *p)
+{
+       struct net_bridge *br = netdev_priv(dev);
+       struct sockaddr *addr = p;
+       struct net_bridge_port *port;
+       int err = -EADDRNOTAVAIL;
+
+       spin_lock_bh(&br->lock);
+       list_for_each_entry(port, &br->port_list, list) {
+               if (!compare_ether_addr(port->dev->dev_addr, addr->sa_data)) {
+                       br_stp_change_bridge_id(br, addr->sa_data);
+                       err = 0;
+                       break;
+               }
+       }
+       spin_unlock_bh(&br->lock);
+
+       return err;
+}
+
+static void br_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)
+{
+       strcpy(info->driver, "bridge");
+       strcpy(info->version, BR_VERSION);
+       strcpy(info->fw_version, "N/A");
+       strcpy(info->bus_info, "N/A");
+}
+
+static int br_set_sg(struct net_device *dev, u32 data)
+{
+       struct net_bridge *br = netdev_priv(dev);
+
+       if (data)
+               br->feature_mask |= NETIF_F_SG;
+       else
+               br->feature_mask &= ~NETIF_F_SG;
+
+       br_features_recompute(br);
+       return 0;
+}
+
+static int br_set_tso(struct net_device *dev, u32 data)
+{
+       struct net_bridge *br = netdev_priv(dev);
+
+       if (data)
+               br->feature_mask |= NETIF_F_TSO;
+       else
+               br->feature_mask &= ~NETIF_F_TSO;
+
+       br_features_recompute(br);
+       return 0;
+}
+
+static int br_set_tx_csum(struct net_device *dev, u32 data)
+{
+       struct net_bridge *br = netdev_priv(dev);
+
+       if (data)
+               br->feature_mask |= NETIF_F_IP_CSUM;
+       else
+               br->feature_mask &= ~NETIF_F_IP_CSUM;
+
+       br_features_recompute(br);
+       return 0;
+}
+
+static struct ethtool_ops br_ethtool_ops = {
+       .get_drvinfo = br_getinfo,
+       .get_link = ethtool_op_get_link,
+       .get_sg = ethtool_op_get_sg,
+       .set_sg = br_set_sg,
+       .get_tx_csum = ethtool_op_get_tx_csum,
+       .set_tx_csum = br_set_tx_csum,
+       .get_tso = ethtool_op_get_tso,
+       .set_tso = br_set_tso,
+};
+
 void br_dev_setup(struct net_device *dev)
 {
        memset(dev->dev_addr, 0, ETH_ALEN);
@@ -96,8 +179,12 @@ void br_dev_setup(struct net_device *dev)
        dev->change_mtu = br_change_mtu;
        dev->destructor = free_netdev;
        SET_MODULE_OWNER(dev);
+       SET_ETHTOOL_OPS(dev, &br_ethtool_ops);
        dev->stop = br_dev_stop;
        dev->tx_queue_len = 0;
-       dev->set_mac_address = NULL;
+       dev->set_mac_address = br_set_mac_address;
        dev->priv_flags = IFF_EBRIDGE;
+
+       dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
+               | NETIF_F_HIGHDMA | NETIF_F_TSO | NETIF_F_IP_CSUM;
 }
index defcf6a8607c3714f54dbb225b471570837dc630..11321197338ee802a70808db37b69a7e574375f4 100644 (file)
@@ -32,9 +32,8 @@
  * ethtool, use ethtool_ops.  Also, since driver might sleep need to
  * not be holding any locks.
  */
-static int br_initial_port_cost(struct net_device *dev)
+static int port_cost(struct net_device *dev)
 {
-
        struct ethtool_cmd ecmd = { ETHTOOL_GSET };
        struct ifreq ifr;
        mm_segment_t old_fs;
@@ -58,10 +57,6 @@ static int br_initial_port_cost(struct net_device *dev)
                        return 2;
                case SPEED_10:
                        return 100;
-               default:
-                       pr_info("bridge: can't decode speed from %s: %d\n",
-                               dev->name, ecmd.speed);
-                       return 100;
                }
        }
 
@@ -75,6 +70,35 @@ static int br_initial_port_cost(struct net_device *dev)
        return 100;     /* assume old 10Mbps */
 }
 
+
+/*
+ * Check for port carrier transistions.
+ * Called from work queue to allow for calling functions that
+ * might sleep (such as speed check), and to debounce.
+ */
+static void port_carrier_check(void *arg)
+{
+       struct net_bridge_port *p = arg;
+
+       rtnl_lock();
+       if (netif_carrier_ok(p->dev)) {
+               u32 cost = port_cost(p->dev);
+
+               spin_lock_bh(&p->br->lock);
+               if (p->state == BR_STATE_DISABLED) {
+                       p->path_cost = cost;
+                       br_stp_enable_port(p);
+               }
+               spin_unlock_bh(&p->br->lock);
+       } else {
+               spin_lock_bh(&p->br->lock);
+               if (p->state != BR_STATE_DISABLED)
+                       br_stp_disable_port(p);
+               spin_unlock_bh(&p->br->lock);
+       }
+       rtnl_unlock();
+}
+
 static void destroy_nbp(struct net_bridge_port *p)
 {
        struct net_device *dev = p->dev;
@@ -102,6 +126,9 @@ static void del_nbp(struct net_bridge_port *p)
        dev->br_port = NULL;
        dev_set_promiscuity(dev, -1);
 
+       cancel_delayed_work(&p->carrier_check);
+       flush_scheduled_work();
+
        spin_lock_bh(&br->lock);
        br_stp_disable_port(p);
        spin_unlock_bh(&br->lock);
@@ -155,6 +182,7 @@ static struct net_device *new_bridge_dev(const char *name)
        br->bridge_id.prio[1] = 0x00;
        memset(br->bridge_id.addr, 0, ETH_ALEN);
 
+       br->feature_mask = dev->features;
        br->stp_enabled = 0;
        br->designated_root = br->bridge_id;
        br->root_path_cost = 0;
@@ -195,10 +223,9 @@ static int find_portno(struct net_bridge *br)
        return (index >= BR_MAX_PORTS) ? -EXFULL : index;
 }
 
-/* called with RTNL */
+/* called with RTNL but without bridge lock */
 static struct net_bridge_port *new_nbp(struct net_bridge *br, 
-                                      struct net_device *dev,
-                                      unsigned long cost)
+                                      struct net_device *dev)
 {
        int index;
        struct net_bridge_port *p;
@@ -215,12 +242,13 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
        p->br = br;
        dev_hold(dev);
        p->dev = dev;
-       p->path_cost = cost;
+       p->path_cost = port_cost(dev);
        p->priority = 0x8000 >> BR_PORT_BITS;
        dev->br_port = p;
        p->port_no = index;
        br_init_port(p);
        p->state = BR_STATE_DISABLED;
+       INIT_WORK(&p->carrier_check, port_carrier_check, p);
        kobject_init(&p->kobj);
 
        return p;
@@ -322,9 +350,8 @@ 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 */
+       features = br->feature_mask &~ NETIF_F_IP_CSUM;
+       checksum = br->feature_mask & NETIF_F_IP_CSUM;
 
        list_for_each_entry(p, &br->port_list, list) {
                if (!(p->dev->features 
@@ -351,7 +378,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
        if (dev->br_port != NULL)
                return -EBUSY;
 
-       if (IS_ERR(p = new_nbp(br, dev, br_initial_port_cost(dev))))
+       if (IS_ERR(p = new_nbp(br, dev)))
                return PTR_ERR(p);
 
        if ((err = br_fdb_insert(br, p, dev->dev_addr)))
@@ -366,6 +393,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
 
                spin_lock_bh(&br->lock);
                br_stp_recalculate_bridge_id(br);
+               br_features_recompute(br);
                if ((br->dev->flags & IFF_UP) 
                    && (dev->flags & IFF_UP) && netif_carrier_ok(dev))
                        br_stp_enable_port(p);
index b88220a64cd8e0a7009971cc09f6507fc3f9b117..c387852f753afaf5b37c62cad02bd3fc2877fac7 100644 (file)
@@ -53,6 +53,11 @@ int br_handle_frame_finish(struct sk_buff *skb)
        /* insert into forwarding database after filtering to avoid spoofing */
        br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
 
+       if (p->state == BR_STATE_LEARNING) {
+               kfree_skb(skb);
+               goto out;
+       }
+
        if (br->dev->flags & IFF_PROMISC) {
                struct sk_buff *skb2;
 
@@ -107,9 +112,6 @@ 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)
-               br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
-
        if (p->br->stp_enabled &&
            !memcmp(dest, bridge_ula, 5) &&
            !(dest[5] & 0xF0)) {
@@ -118,9 +120,10 @@ int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
                                NULL, br_stp_handle_bpdu);
                        return 1;
                }
+               goto err;
        }
 
-       else if (p->state == BR_STATE_FORWARDING) {
+       if (p->state == BR_STATE_FORWARDING || p->state == BR_STATE_LEARNING) {
                if (br_should_route_hook) {
                        if (br_should_route_hook(pskb)) 
                                return 0;
index d8e36b7751255b17e736f35060dead6b21eebb69..223f8270daeef94bb139f7c8df6d2efa99c41a77 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/ip.h>
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
+#include <linux/if_arp.h>
 #include <linux/if_ether.h>
 #include <linux/if_vlan.h>
 #include <linux/netfilter_bridge.h>
 #include <linux/netfilter_ipv6.h>
 #include <linux/netfilter_arp.h>
 #include <linux/in_route.h>
+
 #include <net/ip.h>
 #include <net/ipv6.h>
+#include <net/route.h>
+
 #include <asm/uaccess.h>
 #include <asm/checksum.h>
 #include "br_private.h"
@@ -295,7 +299,7 @@ static int check_hbh_len(struct sk_buff *skb)
        len -= 2;
 
        while (len > 0) {
-               int optlen = raw[off+1]+2;
+               int optlen = skb->nh.raw[off+1]+2;
 
                switch (skb->nh.raw[off]) {
                case IPV6_TLV_PAD0:
@@ -308,18 +312,15 @@ static int check_hbh_len(struct sk_buff *skb)
                case IPV6_TLV_JUMBO:
                        if (skb->nh.raw[off+1] != 4 || (off&3) != 2)
                                goto bad;
-
                        pkt_len = ntohl(*(u32*)(skb->nh.raw+off+2));
-
+                       if (pkt_len <= IPV6_MAXPLEN ||
+                           skb->nh.ipv6h->payload_len)
+                               goto bad;
                        if (pkt_len > skb->len - sizeof(struct ipv6hdr))
                                goto bad;
-                       if (pkt_len + sizeof(struct ipv6hdr) < skb->len) {
-                               if (__pskb_trim(skb,
-                                   pkt_len + sizeof(struct ipv6hdr)))
-                                       goto bad;
-                               if (skb->ip_summed == CHECKSUM_HW)
-                                       skb->ip_summed = CHECKSUM_NONE;
-                       }
+                       if (pskb_trim_rcsum(skb,
+                           pkt_len+sizeof(struct ipv6hdr)))
+                               goto bad;
                        break;
                default:
                        if (optlen > len)
@@ -372,6 +373,7 @@ static unsigned int br_nf_pre_routing_ipv6(unsigned int hook,
        if (hdr->nexthdr == NEXTHDR_HOP && check_hbh_len(skb))
                        goto inhdr_error;
 
+       nf_bridge_put(skb->nf_bridge);
        if ((nf_bridge = nf_bridge_alloc(skb)) == NULL)
                return NF_DROP;
        setup_pre_routing(skb);
@@ -455,6 +457,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
                        skb->ip_summed = CHECKSUM_NONE;
        }
 
+       nf_bridge_put(skb->nf_bridge);
        if ((nf_bridge = nf_bridge_alloc(skb)) == NULL)
                return NF_DROP;
        setup_pre_routing(skb);
index 917311c6828b9c5c70d2290c617c4ebaf9be3405..a43a9c1d50d7daa21c732523e9d2cdb3d36e3a9e 100644 (file)
@@ -52,17 +52,9 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
                br_stp_recalculate_bridge_id(br);
                break;
 
-       case NETDEV_CHANGE:     /* device is up but carrier changed */
-               if (!(br->dev->flags & IFF_UP))
-                       break;
-
-               if (netif_carrier_ok(dev)) {
-                       if (p->state == BR_STATE_DISABLED)
-                               br_stp_enable_port(p);
-               } else {
-                       if (p->state != BR_STATE_DISABLED)
-                               br_stp_disable_port(p);
-               }
+       case NETDEV_CHANGE:
+               if (br->dev->flags & IFF_UP)
+                       schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE);
                break;
 
        case NETDEV_FEAT_CHANGE:
index bdf95a74d8cd3294ec5765dabf94de1edd20de93..c5bd631ffcd5793d67c29009151c380b6af03cac 100644 (file)
 #define BR_PORT_BITS   10
 #define BR_MAX_PORTS   (1<<BR_PORT_BITS)
 
+#define BR_PORT_DEBOUNCE (HZ/10)
+
+#define BR_VERSION     "2.1"
+
 typedef struct bridge_id bridge_id;
 typedef struct mac_addr mac_addr;
 typedef __u16 port_id;
@@ -78,6 +82,7 @@ struct net_bridge_port
        struct timer_list               hold_timer;
        struct timer_list               message_age_timer;
        struct kobject                  kobj;
+       struct work_struct              carrier_check;
        struct rcu_head                 rcu;
 };
 
@@ -90,6 +95,7 @@ struct net_bridge
        spinlock_t                      hash_lock;
        struct hlist_head               hash[BR_HASH_SIZE];
        struct list_head                age_list;
+       unsigned long                   feature_mask;
 
        /* STP */
        bridge_id                       designated_root;
@@ -201,6 +207,7 @@ extern void br_stp_disable_bridge(struct net_bridge *br);
 extern void br_stp_enable_port(struct net_bridge_port *p);
 extern void br_stp_disable_port(struct net_bridge_port *p);
 extern void br_stp_recalculate_bridge_id(struct net_bridge *br);
+extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a);
 extern void br_stp_set_bridge_priority(struct net_bridge *br,
                                       u16 newprio);
 extern void br_stp_set_port_priority(struct net_bridge_port *p,
index ac09b6a2352317cde8ee4a43a2db1a01a3caab71..cc047f7fb6efc9c4deb42d6aab17f48a778d0474 100644 (file)
@@ -120,8 +120,7 @@ void br_stp_disable_port(struct net_bridge_port *p)
 }
 
 /* called under bridge lock */
-static void br_stp_change_bridge_id(struct net_bridge *br, 
-                                   const unsigned char *addr)
+void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *addr)
 {
        unsigned char oldaddr[6];
        struct net_bridge_port *p;
@@ -158,7 +157,7 @@ void br_stp_recalculate_bridge_id(struct net_bridge *br)
 
        list_for_each_entry(p, &br->port_list, list) {
                if (addr == br_mac_zero ||
-                   compare_ether_addr(p->dev->dev_addr, addr) < 0)
+                   memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
                        addr = p->dev->dev_addr;
 
        }
index c70b3be230265fda2951a5d25bff0516c0921f4d..b84fc6075fe1ad9f33d1de0a2947f607de6a32a1 100644 (file)
@@ -196,9 +196,13 @@ config BRIDGE_EBT_LOG
          To compile it as a module, choose M here.  If unsure, say N.
 
 config BRIDGE_EBT_ULOG
-       tristate "ebt: ulog support"
+       tristate "ebt: ulog support (OBSOLETE)"
        depends on BRIDGE_NF_EBTABLES
        help
+         This option enables the old bridge-specific "ebt_ulog" implementation
+         which has been obsoleted by the new "nfnetlink_log" code (see
+         CONFIG_NETFILTER_NETLINK_LOG).
+
          This option adds the ulog watcher, that you can use in any rule
          in any ebtables table. The packet is passed to a userspace
          logging daemon using netlink multicast sockets. This differs
index 662975be3d1d1aaef6f20aecccbb9a01128cace1..9f6e0193ae100cef83b4952b7a3fc20c70b7a1ae 100644 (file)
@@ -3,13 +3,16 @@
  *
  *     Authors:
  *     Bart De Schuymer <bdschuym@pandora.be>
+ *     Harald Welte <laforge@netfilter.org>
  *
  *  April, 2002
  *
  */
 
+#include <linux/in.h>
 #include <linux/netfilter_bridge/ebtables.h>
 #include <linux/netfilter_bridge/ebt_log.h>
+#include <linux/netfilter.h>
 #include <linux/module.h>
 #include <linux/ip.h>
 #include <linux/if_arp.h>
@@ -55,27 +58,30 @@ static void print_MAC(unsigned char *p)
 }
 
 #define myNIPQUAD(a) a[0], a[1], a[2], a[3]
-static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,
-   const struct net_device *in, const struct net_device *out,
-   const void *data, unsigned int datalen)
+static void
+ebt_log_packet(unsigned int pf, unsigned int hooknum,
+   const struct sk_buff *skb, const struct net_device *in,
+   const struct net_device *out, const struct nf_loginfo *loginfo,
+   const char *prefix)
 {
-       struct ebt_log_info *info = (struct ebt_log_info *)data;
-       char level_string[4] = "< >";
+       unsigned int bitmask;
 
-       level_string[1] = '0' + info->loglevel;
        spin_lock_bh(&ebt_log_lock);
-       printk(level_string);
-       printk("%s IN=%s OUT=%s ", info->prefix, in ? in->name : "",
-          out ? out->name : "");
+       printk("<%c>%s IN=%s OUT=%s MAC source = ", '0' + loginfo->u.log.level,
+              prefix, in ? in->name : "", out ? out->name : "");
 
-       printk("MAC source = ");
        print_MAC(eth_hdr(skb)->h_source);
        printk("MAC dest = ");
        print_MAC(eth_hdr(skb)->h_dest);
 
        printk("proto = 0x%04x", ntohs(eth_hdr(skb)->h_proto));
 
-       if ((info->bitmask & EBT_LOG_IP) && eth_hdr(skb)->h_proto ==
+       if (loginfo->type == NF_LOG_TYPE_LOG)
+               bitmask = loginfo->u.log.logflags;
+       else
+               bitmask = NF_LOG_MASK;
+
+       if ((bitmask & EBT_LOG_IP) && eth_hdr(skb)->h_proto ==
           htons(ETH_P_IP)){
                struct iphdr _iph, *ih;
 
@@ -84,10 +90,9 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,
                        printk(" INCOMPLETE IP header");
                        goto out;
                }
-               printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u,",
-                  NIPQUAD(ih->saddr), NIPQUAD(ih->daddr));
-               printk(" IP tos=0x%02X, IP proto=%d", ih->tos,
-                      ih->protocol);
+               printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u, IP "
+                      "tos=0x%02X, IP proto=%d", NIPQUAD(ih->saddr),
+                      NIPQUAD(ih->daddr), ih->tos, ih->protocol);
                if (ih->protocol == IPPROTO_TCP ||
                    ih->protocol == IPPROTO_UDP) {
                        struct tcpudphdr _ports, *pptr;
@@ -104,7 +109,7 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,
                goto out;
        }
 
-       if ((info->bitmask & EBT_LOG_ARP) &&
+       if ((bitmask & EBT_LOG_ARP) &&
            ((eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) ||
             (eth_hdr(skb)->h_proto == htons(ETH_P_RARP)))) {
                struct arphdr _arph, *ah;
@@ -144,6 +149,21 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,
 out:
        printk("\n");
        spin_unlock_bh(&ebt_log_lock);
+
+}
+
+static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,
+   const struct net_device *in, const struct net_device *out,
+   const void *data, unsigned int datalen)
+{
+       struct ebt_log_info *info = (struct ebt_log_info *)data;
+       struct nf_loginfo li;
+
+       li.type = NF_LOG_TYPE_LOG;
+       li.u.log.level = info->loglevel;
+       li.u.log.logflags = info->bitmask;
+
+       nf_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li, info->prefix);
 }
 
 static struct ebt_watcher log =
@@ -154,13 +174,32 @@ static struct ebt_watcher log =
        .me             = THIS_MODULE,
 };
 
+static struct nf_logger ebt_log_logger = {
+       .name           = "ebt_log",
+       .logfn          = &ebt_log_packet,
+       .me             = THIS_MODULE,
+};
+
 static int __init init(void)
 {
-       return ebt_register_watcher(&log);
+       int ret;
+
+       ret = ebt_register_watcher(&log);
+       if (ret < 0)
+               return ret;
+       if (nf_log_register(PF_BRIDGE, &ebt_log_logger) < 0) {
+               printk(KERN_WARNING "ebt_log: not logging via system console "
+                      "since somebody else already registered for PF_INET\n");
+               /* we cannot make module load fail here, since otherwise 
+                * ebtables userspace would abort */
+       }
+
+       return 0;
 }
 
 static void __exit fini(void)
 {
+       nf_log_unregister_logger(&ebt_log_logger);
        ebt_unregister_watcher(&log);
 }
 
index aae26ae2e61f5ec990c0a7f5d23caeaa1e642e68..ce617b3dbbb8dbb4c9a77cfcfe70c25c5748f304 100644 (file)
@@ -3,6 +3,7 @@
  *
  *     Authors:
  *     Bart De Schuymer <bdschuym@pandora.be>
+ *     Harald Welte <laforge@netfilter.org>
  *
  *  November, 2004
  *
@@ -115,14 +116,13 @@ static struct sk_buff *ulog_alloc_skb(unsigned int size)
        return skb;
 }
 
-static void ebt_ulog(const struct sk_buff *skb, unsigned int hooknr,
+static void ebt_ulog_packet(unsigned int hooknr, const struct sk_buff *skb,
    const struct net_device *in, const struct net_device *out,
-   const void *data, unsigned int datalen)
+   const struct ebt_ulog_info *uloginfo, const char *prefix)
 {
        ebt_ulog_packet_msg_t *pm;
        size_t size, copy_len;
        struct nlmsghdr *nlh;
-       struct ebt_ulog_info *uloginfo = (struct ebt_ulog_info *)data;
        unsigned int group = uloginfo->nlgroup;
        ebt_ulog_buff_t *ub = &ulog_buffers[group];
        spinlock_t *lock = &ub->lock;
@@ -216,6 +216,39 @@ alloc_failure:
        goto unlock;
 }
 
+/* this function is registered with the netfilter core */
+static void ebt_log_packet(unsigned int pf, unsigned int hooknum,
+   const struct sk_buff *skb, const struct net_device *in,
+   const struct net_device *out, const struct nf_loginfo *li,
+   const char *prefix)
+{
+       struct ebt_ulog_info loginfo;
+
+       if (!li || li->type != NF_LOG_TYPE_ULOG) {
+               loginfo.nlgroup = EBT_ULOG_DEFAULT_NLGROUP;
+               loginfo.cprange = 0;
+               loginfo.qthreshold = EBT_ULOG_DEFAULT_QTHRESHOLD;
+               loginfo.prefix[0] = '\0';
+       } else {
+               loginfo.nlgroup = li->u.ulog.group;
+               loginfo.cprange = li->u.ulog.copy_len;
+               loginfo.qthreshold = li->u.ulog.qthreshold;
+               strlcpy(loginfo.prefix, prefix, sizeof(loginfo.prefix));
+       }
+
+       ebt_ulog_packet(hooknum, skb, in, out, &loginfo, prefix);
+}
+
+static void ebt_ulog(const struct sk_buff *skb, unsigned int hooknr,
+   const struct net_device *in, const struct net_device *out,
+   const void *data, unsigned int datalen)
+{
+       struct ebt_ulog_info *uloginfo = (struct ebt_ulog_info *)data;
+
+       ebt_ulog_packet(hooknr, skb, in, out, uloginfo, NULL);
+}
+
+
 static int ebt_ulog_check(const char *tablename, unsigned int hookmask,
    const struct ebt_entry *e, void *data, unsigned int datalen)
 {
@@ -240,6 +273,12 @@ static struct ebt_watcher ulog = {
        .me             = THIS_MODULE,
 };
 
+static struct nf_logger ebt_ulog_logger = {
+       .name           = EBT_ULOG_WATCHER,
+       .logfn          = &ebt_log_packet,
+       .me             = THIS_MODULE,
+};
+
 static int __init init(void)
 {
        int i, ret = 0;
@@ -265,6 +304,13 @@ static int __init init(void)
        else if ((ret = ebt_register_watcher(&ulog)))
                sock_release(ebtulognl->sk_socket);
 
+       if (nf_log_register(PF_BRIDGE, &ebt_ulog_logger) < 0) {
+               printk(KERN_WARNING "ebt_ulog: not logging via ulog "
+                      "since somebody else already registered for PF_BRIDGE\n");
+               /* we cannot make module load fail here, since otherwise
+                * ebtables userspace would abort */
+       }
+
        return ret;
 }
 
@@ -273,6 +319,7 @@ static void __exit fini(void)
        ebt_ulog_buff_t *ub;
        int i;
 
+       nf_log_unregister_logger(&ebt_ulog_logger);
        ebt_unregister_watcher(&ulog);
        for (i = 0; i < EBT_ULOG_MAXNLGROUPS; i++) {
                ub = &ulog_buffers[i];
index 1bcfef51ac581562988c54fe9cee885572f819d6..f8d322e1ea9276c3f581fbda2393c829b6fd17f0 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/rtnetlink.h>
 #include <linux/poll.h>
 #include <linux/highmem.h>
+#include <linux/spinlock.h>
 
 #include <net/protocol.h>
 #include <linux/skbuff.h>
@@ -199,6 +200,41 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
        kfree_skb(skb);
 }
 
+/**
+ *     skb_kill_datagram - Free a datagram skbuff forcibly
+ *     @sk: socket
+ *     @skb: datagram skbuff
+ *     @flags: MSG_ flags
+ *
+ *     This function frees a datagram skbuff that was received by
+ *     skb_recv_datagram.  The flags argument must match the one
+ *     used for skb_recv_datagram.
+ *
+ *     If the MSG_PEEK flag is set, and the packet is still on the
+ *     receive queue of the socket, it will be taken off the queue
+ *     before it is freed.
+ *
+ *     This function currently only disables BH when acquiring the
+ *     sk_receive_queue lock.  Therefore it must not be used in a
+ *     context where that lock is acquired in an IRQ context.
+ */
+
+void skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)
+{
+       if (flags & MSG_PEEK) {
+               spin_lock_bh(&sk->sk_receive_queue.lock);
+               if (skb == skb_peek(&sk->sk_receive_queue)) {
+                       __skb_unlink(skb, &sk->sk_receive_queue);
+                       atomic_dec(&skb->users);
+               }
+               spin_unlock_bh(&sk->sk_receive_queue.lock);
+       }
+
+       kfree_skb(skb);
+}
+
+EXPORT_SYMBOL(skb_kill_datagram);
+
 /**
  *     skb_copy_datagram_iovec - Copy a datagram to an iovec.
  *     @skb: buffer to copy
index 0b48e294aafec9e7f8c0f7d43212164652afabf6..5081287923d52dce220fa21a3fb1b3a0f81a354a 100644 (file)
@@ -626,7 +626,7 @@ struct net_device * dev_get_by_flags(unsigned short if_flags, unsigned short mas
  *     Network device names need to be valid file names to
  *     to allow sysfs to work
  */
-static int dev_valid_name(const char *name)
+int dev_valid_name(const char *name)
 {
        return !(*name == '\0' 
                 || !strcmp(name, ".")
@@ -1113,7 +1113,8 @@ out:
 void netdev_rx_csum_fault(struct net_device *dev)
 {
        if (net_ratelimit()) {
-               printk(KERN_ERR "%s: hw csum failure.\n", dev->name);
+               printk(KERN_ERR "%s: hw csum failure.\n", 
+                       dev ? dev->name : "<unknown>");
                dump_stack();
        }
 }
@@ -3269,13 +3270,13 @@ EXPORT_SYMBOL(__dev_get_by_index);
 EXPORT_SYMBOL(__dev_get_by_name);
 EXPORT_SYMBOL(__dev_remove_pack);
 EXPORT_SYMBOL(__skb_linearize);
+EXPORT_SYMBOL(dev_valid_name);
 EXPORT_SYMBOL(dev_add_pack);
 EXPORT_SYMBOL(dev_alloc_name);
 EXPORT_SYMBOL(dev_close);
 EXPORT_SYMBOL(dev_get_by_flags);
 EXPORT_SYMBOL(dev_get_by_index);
 EXPORT_SYMBOL(dev_get_by_name);
-EXPORT_SYMBOL(dev_ioctl);
 EXPORT_SYMBOL(dev_open);
 EXPORT_SYMBOL(dev_queue_xmit);
 EXPORT_SYMBOL(dev_remove_pack);
index 079c2edff789e95ccc9fbcec96184c2eb2772e84..8964d344558889bdf6c62c2d4383a265a38a433c 100644 (file)
@@ -13,6 +13,7 @@
  * 2 of the License, or (at your option) any later version.
  *
  * Andi Kleen - Fix a few bad bugs and races.
+ * Kris Katterjohn - Added many additional checks in sk_chk_filter()
  */
 
 #include <linux/module.h>
@@ -116,8 +117,6 @@ int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
                        A /= X;
                        continue;
                case BPF_ALU|BPF_DIV|BPF_K:
-                       if (fentry->k == 0)
-                               return 0;
                        A /= fentry->k;
                        continue;
                case BPF_ALU|BPF_AND|BPF_X:
@@ -252,7 +251,7 @@ load_b:
                        mem[fentry->k] = X;
                        continue;
                default:
-                       /* Invalid instruction counts as RET */
+                       WARN_ON(1);
                        return 0;
                }
 
@@ -285,8 +284,8 @@ load_b:
  *
  * Check the user's filter code. If we let some ugly
  * filter code slip through kaboom! The filter must contain
- * no references or jumps that are out of range, no illegal instructions
- * and no backward jumps. It must end with a RET instruction
+ * no references or jumps that are out of range, no illegal
+ * instructions, and must end with a RET instruction.
  *
  * Returns 0 if the rule set is legal or a negative errno code if not.
  */
@@ -295,41 +294,92 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
        struct sock_filter *ftest;
        int pc;
 
-       if (((unsigned int)flen >= (~0U / sizeof(struct sock_filter))) || flen == 0)
+       if (flen == 0 || flen > BPF_MAXINSNS)
                return -EINVAL;
 
        /* check the filter code now */
        for (pc = 0; pc < flen; pc++) {
                /* all jumps are forward as they are not signed */
                ftest = &filter[pc];
-               if (BPF_CLASS(ftest->code) == BPF_JMP) {
-                       /* but they mustn't jump off the end */
-                       if (BPF_OP(ftest->code) == BPF_JA) {
-                               /*
-                                * Note, the large ftest->k might cause loops.
-                                * Compare this with conditional jumps below,
-                                * where offsets are limited. --ANK (981016)
-                                */
-                               if (ftest->k >= (unsigned)(flen-pc-1))
-                                       return -EINVAL;
-                       } else {
-                               /* for conditionals both must be safe */
-                               if (pc + ftest->jt +1 >= flen ||
-                                   pc + ftest->jf +1 >= flen)
-                                       return -EINVAL;
-                       }
-               }
 
-               /* check that memory operations use valid addresses. */
-               if (ftest->k >= BPF_MEMWORDS) {
-                       /* but it might not be a memory operation... */
-                       switch (ftest->code) {
-                       case BPF_ST:    
-                       case BPF_STX:   
-                       case BPF_LD|BPF_MEM:    
-                       case BPF_LDX|BPF_MEM:   
+               /* Only allow valid instructions */
+               switch (ftest->code) {
+               case BPF_ALU|BPF_ADD|BPF_K:
+               case BPF_ALU|BPF_ADD|BPF_X:
+               case BPF_ALU|BPF_SUB|BPF_K:
+               case BPF_ALU|BPF_SUB|BPF_X:
+               case BPF_ALU|BPF_MUL|BPF_K:
+               case BPF_ALU|BPF_MUL|BPF_X:
+               case BPF_ALU|BPF_DIV|BPF_X:
+               case BPF_ALU|BPF_AND|BPF_K:
+               case BPF_ALU|BPF_AND|BPF_X:
+               case BPF_ALU|BPF_OR|BPF_K:
+               case BPF_ALU|BPF_OR|BPF_X:
+               case BPF_ALU|BPF_LSH|BPF_K:
+               case BPF_ALU|BPF_LSH|BPF_X:
+               case BPF_ALU|BPF_RSH|BPF_K:
+               case BPF_ALU|BPF_RSH|BPF_X:
+               case BPF_ALU|BPF_NEG:
+               case BPF_LD|BPF_W|BPF_ABS:
+               case BPF_LD|BPF_H|BPF_ABS:
+               case BPF_LD|BPF_B|BPF_ABS:
+               case BPF_LD|BPF_W|BPF_LEN:
+               case BPF_LD|BPF_W|BPF_IND:
+               case BPF_LD|BPF_H|BPF_IND:
+               case BPF_LD|BPF_B|BPF_IND:
+               case BPF_LD|BPF_IMM:
+               case BPF_LDX|BPF_W|BPF_LEN:
+               case BPF_LDX|BPF_B|BPF_MSH:
+               case BPF_LDX|BPF_IMM:
+               case BPF_MISC|BPF_TAX:
+               case BPF_MISC|BPF_TXA:
+               case BPF_RET|BPF_K:
+               case BPF_RET|BPF_A:
+                       break;
+
+               /* Some instructions need special checks */
+
+               case BPF_ALU|BPF_DIV|BPF_K:
+                       /* check for division by zero */
+                       if (ftest->k == 0)
                                return -EINVAL;
-                       }
+                       break;
+
+               case BPF_LD|BPF_MEM:
+               case BPF_LDX|BPF_MEM:
+               case BPF_ST:
+               case BPF_STX:
+                       /* check for invalid memory addresses */
+                       if (ftest->k >= BPF_MEMWORDS)
+                               return -EINVAL;
+                       break;
+
+               case BPF_JMP|BPF_JA:
+                       /*
+                        * Note, the large ftest->k might cause loops.
+                        * Compare this with conditional jumps below,
+                        * where offsets are limited. --ANK (981016)
+                        */
+                       if (ftest->k >= (unsigned)(flen-pc-1))
+                               return -EINVAL;
+                       break;
+
+               case BPF_JMP|BPF_JEQ|BPF_K:
+               case BPF_JMP|BPF_JEQ|BPF_X:
+               case BPF_JMP|BPF_JGE|BPF_K:
+               case BPF_JMP|BPF_JGE|BPF_X:
+               case BPF_JMP|BPF_JGT|BPF_K:
+               case BPF_JMP|BPF_JGT|BPF_X:
+               case BPF_JMP|BPF_JSET|BPF_K:
+               case BPF_JMP|BPF_JSET|BPF_X:
+                       /* for conditionals both must be safe */
+                       if (pc + ftest->jt + 1 >= flen ||
+                           pc + ftest->jf + 1 >= flen)
+                               return -EINVAL;
+                       break;
+
+               default:
+                       return -EINVAL;
                }
        }
 
@@ -358,7 +408,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
        int err;
 
        /* Make sure new filter is there and in the right amounts. */
-        if (fprog->filter == NULL || fprog->len > BPF_MAXINSNS)
+        if (fprog->filter == NULL)
                 return -EINVAL;
 
        fp = sock_kmalloc(sk, fsize+sizeof(*fp), GFP_KERNEL);
index 7e95b39de9fdd369d0ae0011a42c993c554f37f2..c4f25385029f86ae4c0bcdd7d3fe0d3b151727df 100644 (file)
@@ -23,6 +23,7 @@
 #include <net/flow.h>
 #include <asm/atomic.h>
 #include <asm/semaphore.h>
+#include <linux/security.h>
 
 struct flow_cache_entry {
        struct flow_cache_entry *next;
@@ -30,6 +31,7 @@ struct flow_cache_entry {
        u8                      dir;
        struct flowi            key;
        u32                     genid;
+       u32                     sk_sid;
        void                    *object;
        atomic_t                *object_ref;
 };
@@ -162,7 +164,7 @@ static int flow_key_compare(struct flowi *key1, struct flowi *key2)
        return 0;
 }
 
-void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
+void *flow_cache_lookup(struct flowi *key, u32 sk_sid, u16 family, u8 dir,
                        flow_resolve_t resolver)
 {
        struct flow_cache_entry *fle, **head;
@@ -186,6 +188,7 @@ void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
        for (fle = *head; fle; fle = fle->next) {
                if (fle->family == family &&
                    fle->dir == dir &&
+                   fle->sk_sid == sk_sid &&
                    flow_key_compare(key, &fle->key) == 0) {
                        if (fle->genid == atomic_read(&flow_cache_genid)) {
                                void *ret = fle->object;
@@ -210,6 +213,7 @@ void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
                        *head = fle;
                        fle->family = family;
                        fle->dir = dir;
+                       fle->sk_sid = sk_sid;
                        memcpy(&fle->key, key, sizeof(*key));
                        fle->object = NULL;
                        flow_count(cpu)++;
@@ -221,7 +225,7 @@ nocache:
                void *obj;
                atomic_t *obj_ref;
 
-               resolver(key, family, dir, &obj, &obj_ref);
+               resolver(key, sk_sid, family, dir, &obj, &obj_ref);
 
                if (fle) {
                        fle->genid = atomic_read(&flow_cache_genid);
index 49424a42a2c0385b2924510a11ff89dfdfcfcf2f..281a632fa6a6eaf37085797076177f394b55327a 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/string.h>
+#include <linux/if_arp.h>
 #include <linux/inetdevice.h>
 #include <linux/inet.h>
 #include <linux/interrupt.h>
index 7fc3e9e28c34c3353b3e48082916d4cb737ad5e8..06cad2d63e8adafa21215da07ed3d2e64bb3ffd1 100644 (file)
@@ -487,9 +487,9 @@ static unsigned int fmt_ip6(char *s,const char ip[16]);
 
 /* Module parameters, defaults. */
 static int pg_count_d = 1000; /* 1000 pkts by default */
-static int pg_delay_d = 0;
-static int pg_clone_skb_d = 0;
-static int debug = 0;
+static int pg_delay_d;
+static int pg_clone_skb_d;
+static int debug;
 
 static DECLARE_MUTEX(pktgen_sem);
 static struct pktgen_thread *pktgen_threads = NULL;
index b7d13a4fff48568df05b7bea20c94e31869761ce..070f91cfde598cf20c20b1b291479a832922657b 100644 (file)
@@ -135,17 +135,13 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here)
 struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
                            int fclone)
 {
+       struct skb_shared_info *shinfo;
        struct sk_buff *skb;
        u8 *data;
 
        /* Get the HEAD */
-       if (fclone)
-               skb = kmem_cache_alloc(skbuff_fclone_cache,
-                                      gfp_mask & ~__GFP_DMA);
-       else
-               skb = kmem_cache_alloc(skbuff_head_cache,
-                                      gfp_mask & ~__GFP_DMA);
-
+       skb = kmem_cache_alloc(fclone ? skbuff_fclone_cache : skbuff_head_cache,
+                               gfp_mask & ~__GFP_DMA);
        if (!skb)
                goto out;
 
@@ -162,6 +158,16 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
        skb->data = data;
        skb->tail = data;
        skb->end  = data + size;
+       /* make sure we initialize shinfo sequentially */
+       shinfo = skb_shinfo(skb);
+       atomic_set(&shinfo->dataref, 1);
+       shinfo->nr_frags  = 0;
+       shinfo->tso_size = 0;
+       shinfo->tso_segs = 0;
+       shinfo->ufo_size = 0;
+       shinfo->ip6_frag_id = 0;
+       shinfo->frag_list = NULL;
+
        if (fclone) {
                struct sk_buff *child = skb + 1;
                atomic_t *fclone_ref = (atomic_t *) (child + 1);
@@ -171,13 +177,6 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
 
                child->fclone = SKB_FCLONE_UNAVAILABLE;
        }
-       atomic_set(&(skb_shinfo(skb)->dataref), 1);
-       skb_shinfo(skb)->nr_frags  = 0;
-       skb_shinfo(skb)->tso_size = 0;
-       skb_shinfo(skb)->tso_segs = 0;
-       skb_shinfo(skb)->frag_list = NULL;
-       skb_shinfo(skb)->ufo_size = 0;
-       skb_shinfo(skb)->ip6_frag_id = 0;
 out:
        return skb;
 nodata:
@@ -1725,7 +1724,7 @@ unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
  * of the skb if any page alloc fails user this procedure returns  -ENOMEM
  */
 int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
-                       int getfrag(void *from, char *to, int offset,
+                       int (*getfrag)(void *from, char *to, int offset,
                                        int len, int odd, struct sk_buff *skb),
                        void *from, int length)
 {
index 13cc3be4f056fb92f86cd660b6dcd29ba88ed30d..6465b0e4c8cbe734190e01052703de66d8ed29c8 100644 (file)
@@ -1488,7 +1488,7 @@ int proto_register(struct proto *prot, int alloc_slab)
                        }
                }
 
-               if (prot->twsk_obj_size) {
+               if (prot->twsk_prot != NULL) {
                        static const char mask[] = "tw_sock_%s";
 
                        timewait_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
@@ -1497,11 +1497,12 @@ int proto_register(struct proto *prot, int alloc_slab)
                                goto out_free_request_sock_slab;
 
                        sprintf(timewait_sock_slab_name, mask, prot->name);
-                       prot->twsk_slab = kmem_cache_create(timewait_sock_slab_name,
-                                                           prot->twsk_obj_size,
-                                                           0, SLAB_HWCACHE_ALIGN,
-                                                           NULL, NULL);
-                       if (prot->twsk_slab == NULL)
+                       prot->twsk_prot->twsk_slab =
+                               kmem_cache_create(timewait_sock_slab_name,
+                                                 prot->twsk_prot->twsk_obj_size,
+                                                 0, SLAB_HWCACHE_ALIGN,
+                                                 NULL, NULL);
+                       if (prot->twsk_prot->twsk_slab == NULL)
                                goto out_free_timewait_sock_slab_name;
                }
        }
@@ -1548,12 +1549,12 @@ void proto_unregister(struct proto *prot)
                prot->rsk_prot->slab = NULL;
        }
 
-       if (prot->twsk_slab != NULL) {
-               const char *name = kmem_cache_name(prot->twsk_slab);
+       if (prot->twsk_prot != NULL && prot->twsk_prot->twsk_slab != NULL) {
+               const char *name = kmem_cache_name(prot->twsk_prot->twsk_slab);
 
-               kmem_cache_destroy(prot->twsk_slab);
+               kmem_cache_destroy(prot->twsk_prot->twsk_slab);
                kfree(name);
-               prot->twsk_slab = NULL;
+               prot->twsk_prot->twsk_slab = NULL;
        }
 }
 
index 15bfd03e8024e95c9804c20f29d09cd8e5abc985..35e25259fd95712a0145853eeea4f01493ad5599 100644 (file)
@@ -55,8 +55,9 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
        int done;
 
        do {
-               if (sk->sk_err)
-                       return sock_error(sk);
+               int err = sock_error(sk);
+               if (err)
+                       return err;
                if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV))
                        return -EPIPE;
                if (!*timeo_p)
@@ -67,6 +68,7 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
                prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
                sk->sk_write_pending++;
                done = sk_wait_event(sk, timeo_p,
+                                    !sk->sk_err &&
                                     !((1 << sk->sk_state) & 
                                       ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)));
                finish_wait(sk->sk_sleep, &wait);
@@ -137,7 +139,9 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
 
                set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
                sk->sk_write_pending++;
-               sk_wait_event(sk, &current_timeo, sk_stream_memory_free(sk) &&
+               sk_wait_event(sk, &current_timeo, !sk->sk_err && 
+                                                 !(sk->sk_shutdown & SEND_SHUTDOWN) &&
+                                                 sk_stream_memory_free(sk) &&
                                                  vm_wait);
                sk->sk_write_pending--;
 
index 7b5970fc9e407f7886332cba4d95b8ee3cf2c011..587eb7787debf04561517a0e0f0a070d5bff84e3 100644 (file)
@@ -175,7 +175,7 @@ __u32 in_aton(const char *str)
                if (*str != '\0')
                {
                        val = 0;
-                       while (*str != '\0' && *str != '.')
+                       while (*str != '\0' && *str != '.' && *str != '\n')
                        {
                                val *= 10;
                                val += *str - '0';
index 344a8da153fc90d798497d4ec821b8ccf509a56d..87b27fff6e3b9122715cb44454c0e052d5b2a267 100644 (file)
@@ -1,3 +1,7 @@
+obj-$(CONFIG_IPV6) += dccp_ipv6.o
+
+dccp_ipv6-y := ipv6.o
+
 obj-$(CONFIG_IP_DCCP) += dccp.o
 
 dccp-y := ccid.o input.o ipv4.o minisocks.o options.o output.o proto.o \
index c9a62cca22fcf1a92db7861d9c96049c59f03297..ce9cb77c5c29c272b7f6462c0b0a835cd1383454 100644 (file)
@@ -55,8 +55,8 @@ int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb)
        from = av->dccpav_buf + av->dccpav_buf_head;
 
        /* Check if buf_head wraps */
-       if (av->dccpav_buf_head + len > av->dccpav_vec_len) {
-               const u32 tailsize = (av->dccpav_vec_len - av->dccpav_buf_head);
+       if ((int)av->dccpav_buf_head + len > av->dccpav_vec_len) {
+               const u32 tailsize = av->dccpav_vec_len - av->dccpav_buf_head;
 
                memcpy(to, from, tailsize);
                to   += tailsize;
@@ -93,8 +93,14 @@ int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb)
 struct dccp_ackvec *dccp_ackvec_alloc(const unsigned int len,
                                      const gfp_t priority)
 {
-       struct dccp_ackvec *av = kmalloc(sizeof(*av) + len, priority);
+       struct dccp_ackvec *av;
 
+       BUG_ON(len == 0);
+
+       if (len > DCCP_MAX_ACKVEC_LEN)
+               return NULL;
+
+       av = kmalloc(sizeof(*av) + len, priority);
        if (av != NULL) {
                av->dccpav_buf_len      = len;
                av->dccpav_buf_head     =
@@ -117,13 +123,13 @@ void dccp_ackvec_free(struct dccp_ackvec *av)
 }
 
 static inline u8 dccp_ackvec_state(const struct dccp_ackvec *av,
-                                  const unsigned int index)
+                                  const u8 index)
 {
        return av->dccpav_buf[index] & DCCP_ACKVEC_STATE_MASK;
 }
 
 static inline u8 dccp_ackvec_len(const struct dccp_ackvec *av,
-                                const unsigned int index)
+                                const u8 index)
 {
        return av->dccpav_buf[index] & DCCP_ACKVEC_LEN_MASK;
 }
@@ -135,7 +141,7 @@ static inline u8 dccp_ackvec_len(const struct dccp_ackvec *av,
  */
 static inline int dccp_ackvec_set_buf_head_state(struct dccp_ackvec *av,
                                                 const unsigned int packets,
-                                                 const unsigned char state)
+                                                const unsigned char state)
 {
        unsigned int gap;
        signed long new_head;
@@ -223,7 +229,7 @@ int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk,
                 *      could reduce the complexity of this scan.)
                 */
                u64 delta = dccp_delta_seqno(ackno, av->dccpav_buf_ackno);
-               unsigned int index = av->dccpav_buf_head;
+               u8 index = av->dccpav_buf_head;
 
                while (1) {
                        const u8 len = dccp_ackvec_len(av, index);
@@ -291,7 +297,7 @@ void dccp_ackvec_print(const struct dccp_ackvec *av)
 }
 #endif
 
-static void dccp_ackvec_trow_away_ack_record(struct dccp_ackvec *av)
+static void dccp_ackvec_throw_away_ack_record(struct dccp_ackvec *av)
 {
        /*
         * As we're keeping track of the ack vector size (dccpav_vec_len) and
@@ -301,9 +307,10 @@ static void dccp_ackvec_trow_away_ack_record(struct dccp_ackvec *av)
         * draft-ietf-dccp-spec-11.txt Appendix A. -acme
         */
 #if 0
-       av->dccpav_buf_tail = av->dccpav_ack_ptr + 1;
-       if (av->dccpav_buf_tail >= av->dccpav_vec_len)
-               av->dccpav_buf_tail -= av->dccpav_vec_len;
+       u32 new_buf_tail = av->dccpav_ack_ptr + 1;
+       if (new_buf_tail >= av->dccpav_vec_len)
+               new_buf_tail -= av->dccpav_vec_len;
+       av->dccpav_buf_tail = new_buf_tail;
 #endif
        av->dccpav_vec_len -= av->dccpav_sent_len;
 }
@@ -326,7 +333,7 @@ void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av, struct sock *sk,
                              debug_prefix, 1,
                              (unsigned long long)av->dccpav_ack_seqno,
                              (unsigned long long)av->dccpav_ack_ackno);
-               dccp_ackvec_trow_away_ack_record(av);
+               dccp_ackvec_throw_away_ack_record(av);
                av->dccpav_ack_seqno = DCCP_MAX_SEQNO + 1;
        }
 }
@@ -389,7 +396,7 @@ static void dccp_ackvec_check_rcv_ackvector(struct dccp_ackvec *av,
                                              av->dccpav_ack_seqno,
                                              (unsigned long long)
                                              av->dccpav_ack_ackno);
-                               dccp_ackvec_trow_away_ack_record(av);
+                               dccp_ackvec_throw_away_ack_record(av);
                        }
                        /*
                         * If dccpav_ack_seqno was not received, no problem
index d0fd6c60c574d2277839cda38955bf7223da586c..f7dfb5f67b873adb3c2613b215c83177c1e83c7b 100644 (file)
  * @dccpav_buf - circular buffer of acknowledgeable packets
  */
 struct dccp_ackvec {
-       unsigned int    dccpav_buf_head;
-       unsigned int    dccpav_buf_tail;
        u64             dccpav_buf_ackno;
        u64             dccpav_ack_seqno;
        u64             dccpav_ack_ackno;
-       unsigned int    dccpav_ack_ptr;
-       unsigned int    dccpav_sent_len;
-       unsigned int    dccpav_vec_len;
-       unsigned int    dccpav_buf_len;
        struct timeval  dccpav_time;
+       u8              dccpav_buf_head;
+       u8              dccpav_buf_tail;
+       u8              dccpav_ack_ptr;
+       u8              dccpav_sent_len;
+       u8              dccpav_vec_len;
+       u8              dccpav_buf_len;
        u8              dccpav_buf_nonce;
        u8              dccpav_ack_nonce;
        u8              dccpav_buf[0];
index c37eeeaf5c6e21982c341391d8d8db1a9929bdb9..de681c6ad081307c8fd1069eb6c370b4854177cd 100644 (file)
@@ -21,6 +21,8 @@
 
 #define CCID_MAX 255
 
+struct tcp_info;
+
 struct ccid {
        unsigned char   ccid_id;
        const char      *ccid_name;
index f97b85d55ad80ebab0e8388783eafb7a5ad3bcc8..93f26dd6e6cbd79f636086316f41800aee6d2faf 100644 (file)
@@ -59,7 +59,7 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
 
 #define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */
 
-extern struct proto dccp_v4_prot;
+extern struct proto dccp_prot;
 
 /* is seq1 < seq2 ? */
 static inline int before48(const u64 seq1, const u64 seq2)
@@ -228,6 +228,9 @@ extern int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
 extern int dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
                                const struct dccp_hdr *dh, const unsigned len);
 
+extern int dccp_v4_init_sock(struct sock *sk);
+extern int dccp_v4_destroy_sock(struct sock *sk);
+
 extern void            dccp_close(struct sock *sk, long timeout);
 extern struct sk_buff  *dccp_make_response(struct sock *sk,
                                            struct dst_entry *dst,
@@ -238,6 +241,7 @@ extern struct sk_buff       *dccp_make_reset(struct sock *sk,
 
 extern int        dccp_connect(struct sock *sk);
 extern int        dccp_disconnect(struct sock *sk, int flags);
+extern void       dccp_unhash(struct sock *sk);
 extern int        dccp_getsockopt(struct sock *sk, int level, int optname,
                                   char __user *optval, int __user *optlen);
 extern int        dccp_setsockopt(struct sock *sk, int level, int optname,
@@ -249,6 +253,13 @@ extern int    dccp_recvmsg(struct kiocb *iocb, struct sock *sk,
                                struct msghdr *msg, size_t len, int nonblock,
                                int flags, int *addr_len);
 extern void       dccp_shutdown(struct sock *sk, int how);
+extern int        inet_dccp_listen(struct socket *sock, int backlog);
+extern unsigned int dccp_poll(struct file *file, struct socket *sock,
+                            poll_table *wait);
+extern void       dccp_v4_send_check(struct sock *sk, int len,
+                                     struct sk_buff *skb);
+extern int        dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
+                                  int addr_len);
 
 extern int        dccp_v4_checksum(const struct sk_buff *skb,
                                    const u32 saddr, const u32 daddr);
@@ -256,6 +267,17 @@ extern int    dccp_v4_checksum(const struct sk_buff *skb,
 extern int        dccp_v4_send_reset(struct sock *sk,
                                      enum dccp_reset_codes code);
 extern void       dccp_send_close(struct sock *sk, const int active);
+extern int        dccp_invalid_packet(struct sk_buff *skb);
+
+static inline int dccp_bad_service_code(const struct sock *sk,
+                                       const __u32 service)
+{
+       const struct dccp_sock *dp = dccp_sk(sk);
+
+       if (dp->dccps_service == service)
+               return 0;
+       return !dccp_list_has_service(dp->dccps_service_list, service);
+}
 
 struct dccp_skb_cb {
        __u8  dccpd_type:4;
index f675d8e642d3e4d2d57c706fc18652c26ba25e7e..3f78c00e3822277ca7ef1eef8adbb39cb82372ad 100644 (file)
@@ -28,7 +28,7 @@ static void dccp_get_info(struct sock *sk, struct tcp_info *info)
        info->tcpi_retransmits  = icsk->icsk_retransmits;
        info->tcpi_probes       = icsk->icsk_probes_out;
        info->tcpi_backoff      = icsk->icsk_backoff;
-       info->tcpi_pmtu         = dp->dccps_pmtu_cookie;
+       info->tcpi_pmtu         = icsk->icsk_pmtu_cookie;
 
        if (dp->dccps_options.dccpo_send_ack_vector)
                info->tcpi_options |= TCPI_OPT_SACK;
index 3454d59419006d7f83e4d3858cfecb3e93af773d..b6cba72b44e84e723b397969c4704a880c671f50 100644 (file)
@@ -151,29 +151,12 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb)
        return 0;
 }
 
-int dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
-                        const struct dccp_hdr *dh, const unsigned len)
+static inline int __dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
+                                        const struct dccp_hdr *dh,
+                                        const unsigned len)
 {
        struct dccp_sock *dp = dccp_sk(sk);
 
-       if (dccp_check_seqno(sk, skb))
-               goto discard;
-
-       if (dccp_parse_options(sk, skb))
-               goto discard;
-
-       if (DCCP_SKB_CB(skb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
-               dccp_event_ack_recv(sk, skb);
-
-       if (dp->dccps_options.dccpo_send_ack_vector &&
-           dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk,
-                           DCCP_SKB_CB(skb)->dccpd_seq,
-                           DCCP_ACKVEC_STATE_RECEIVED))
-               goto discard;
-
-       ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
-       ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
-
        switch (dccp_hdr(skb)->dccph_type) {
        case DCCP_PKT_DATAACK:
        case DCCP_PKT_DATA:
@@ -250,6 +233,37 @@ discard:
        return 0;
 }
 
+int dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
+                        const struct dccp_hdr *dh, const unsigned len)
+{
+       struct dccp_sock *dp = dccp_sk(sk);
+
+       if (dccp_check_seqno(sk, skb))
+               goto discard;
+
+       if (dccp_parse_options(sk, skb))
+               goto discard;
+
+       if (DCCP_SKB_CB(skb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
+               dccp_event_ack_recv(sk, skb);
+
+       if (dp->dccps_options.dccpo_send_ack_vector &&
+           dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk,
+                           DCCP_SKB_CB(skb)->dccpd_seq,
+                           DCCP_ACKVEC_STATE_RECEIVED))
+               goto discard;
+
+       ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
+       ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
+
+       return __dccp_rcv_established(sk, skb, dh, len);
+discard:
+       __kfree_skb(skb);
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(dccp_rcv_established);
+
 static int dccp_rcv_request_sent_state_process(struct sock *sk,
                                               struct sk_buff *skb,
                                               const struct dccp_hdr *dh,
@@ -286,6 +300,12 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
                        goto out_invalid_packet;
                }
 
+                if (dp->dccps_options.dccpo_send_ack_vector &&
+                    dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk,
+                                    DCCP_SKB_CB(skb)->dccpd_seq,
+                                    DCCP_ACKVEC_STATE_RECEIVED))
+                        goto out_invalid_packet; /* FIXME: change error code */
+
                dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq;
                dccp_update_gsr(sk, dp->dccps_isr);
                /*
@@ -309,7 +329,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
                        goto out_invalid_packet;
                }
 
-               dccp_sync_mss(sk, dp->dccps_pmtu_cookie);
+               dccp_sync_mss(sk, icsk->icsk_pmtu_cookie);
 
                /*
                 *    Step 10: Process REQUEST state (second part)
@@ -329,7 +349,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
                dccp_set_state(sk, DCCP_PARTOPEN);
 
                /* Make sure socket is routed, for correct metrics. */
-               inet_sk_rebuild_header(sk);
+               icsk->icsk_af_ops->rebuild_header(sk);
 
                if (!sock_flag(sk, SOCK_DEAD)) {
                        sk->sk_state_change(sk);
@@ -398,9 +418,9 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk,
 
                if (dh->dccph_type == DCCP_PKT_DATAACK ||
                    dh->dccph_type == DCCP_PKT_DATA) {
-                       dccp_rcv_established(sk, skb, dh, len);
+                       __dccp_rcv_established(sk, skb, dh, len);
                        queued = 1; /* packet was queued
-                                      (by dccp_rcv_established) */
+                                      (by __dccp_rcv_established) */
                }
                break;
        }
@@ -444,7 +464,8 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
         */
        if (sk->sk_state == DCCP_LISTEN) {
                if (dh->dccph_type == DCCP_PKT_REQUEST) {
-                       if (dccp_v4_conn_request(sk, skb) < 0)
+                       if (inet_csk(sk)->icsk_af_ops->conn_request(sk,
+                                                                   skb) < 0)
                                return 1;
 
                        /* FIXME: do congestion control initialization */
@@ -471,14 +492,14 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                if (dcb->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
                        dccp_event_ack_recv(sk, skb);
 
-               ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
-               ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
-
                if (dp->dccps_options.dccpo_send_ack_vector &&
                    dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk,
                                    DCCP_SKB_CB(skb)->dccpd_seq,
                                    DCCP_ACKVEC_STATE_RECEIVED))
                        goto discard;
+
+               ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
+               ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
        }
 
        /*
@@ -566,3 +587,5 @@ discard:
        }
        return 0;
 }
+
+EXPORT_SYMBOL_GPL(dccp_rcv_state_process);
index ca03521112c52bfa4e279b351aee54c980105e71..3f244670764ae94fad1826439a748f860d1b808c 100644 (file)
@@ -19,7 +19,9 @@
 
 #include <net/icmp.h>
 #include <net/inet_hashtables.h>
+#include <net/inet_sock.h>
 #include <net/sock.h>
+#include <net/timewait_sock.h>
 #include <net/tcp_states.h>
 #include <net/xfrm.h>
 
@@ -37,7 +39,8 @@ EXPORT_SYMBOL_GPL(dccp_hashinfo);
 
 static int dccp_v4_get_port(struct sock *sk, const unsigned short snum)
 {
-       return inet_csk_get_port(&dccp_hashinfo, sk, snum);
+       return inet_csk_get_port(&dccp_hashinfo, sk, snum,
+                                inet_csk_bind_conflict);
 }
 
 static void dccp_v4_hash(struct sock *sk)
@@ -45,171 +48,14 @@ static void dccp_v4_hash(struct sock *sk)
        inet_hash(&dccp_hashinfo, sk);
 }
 
-static void dccp_v4_unhash(struct sock *sk)
+void dccp_unhash(struct sock *sk)
 {
        inet_unhash(&dccp_hashinfo, sk);
 }
 
-/* called with local bh disabled */
-static int __dccp_v4_check_established(struct sock *sk, const __u16 lport,
-                                     struct inet_timewait_sock **twp)
-{
-       struct inet_sock *inet = inet_sk(sk);
-       const u32 daddr = inet->rcv_saddr;
-       const u32 saddr = inet->daddr;
-       const int dif = sk->sk_bound_dev_if;
-       INET_ADDR_COOKIE(acookie, saddr, daddr)
-       const __u32 ports = INET_COMBINED_PORTS(inet->dport, lport);
-       unsigned int hash = inet_ehashfn(daddr, lport, saddr, inet->dport);
-       struct inet_ehash_bucket *head = inet_ehash_bucket(&dccp_hashinfo, hash);
-       const struct sock *sk2;
-       const struct hlist_node *node;
-       struct inet_timewait_sock *tw;
-
-       prefetch(head->chain.first);
-       write_lock(&head->lock);
-
-       /* Check TIME-WAIT sockets first. */
-       sk_for_each(sk2, node, &(head + dccp_hashinfo.ehash_size)->chain) {
-               tw = inet_twsk(sk2);
-
-               if (INET_TW_MATCH(sk2, hash, acookie, saddr, daddr, ports, dif))
-                       goto not_unique;
-       }
-       tw = NULL;
-
-       /* And established part... */
-       sk_for_each(sk2, node, &head->chain) {
-               if (INET_MATCH(sk2, hash, acookie, saddr, daddr, ports, dif))
-                       goto not_unique;
-       }
+EXPORT_SYMBOL_GPL(dccp_unhash);
 
-       /* Must record num and sport now. Otherwise we will see
-        * in hash table socket with a funny identity. */
-       inet->num = lport;
-       inet->sport = htons(lport);
-       sk->sk_hash = hash;
-       BUG_TRAP(sk_unhashed(sk));
-       __sk_add_node(sk, &head->chain);
-       sock_prot_inc_use(sk->sk_prot);
-       write_unlock(&head->lock);
-
-       if (twp != NULL) {
-               *twp = tw;
-               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
-       } else if (tw != NULL) {
-               /* Silly. Should hash-dance instead... */
-               inet_twsk_deschedule(tw, &dccp_death_row);
-               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
-
-               inet_twsk_put(tw);
-       }
-
-       return 0;
-
-not_unique:
-       write_unlock(&head->lock);
-       return -EADDRNOTAVAIL;
-}
-
-/*
- * Bind a port for a connect operation and hash it.
- */
-static int dccp_v4_hash_connect(struct sock *sk)
-{
-       const unsigned short snum = inet_sk(sk)->num;
-       struct inet_bind_hashbucket *head;
-       struct inet_bind_bucket *tb;
-       int ret;
-
-       if (snum == 0) {
-               int low = sysctl_local_port_range[0];
-               int high = sysctl_local_port_range[1];
-               int remaining = (high - low) + 1;
-               int rover = net_random() % (high - low) + low;
-               struct hlist_node *node;
-               struct inet_timewait_sock *tw = NULL;
-
-               local_bh_disable();
-               do {
-                       head = &dccp_hashinfo.bhash[inet_bhashfn(rover,
-                                                   dccp_hashinfo.bhash_size)];
-                       spin_lock(&head->lock);
-
-                       /* Does not bother with rcv_saddr checks,
-                        * because the established check is already
-                        * unique enough.
-                        */
-                       inet_bind_bucket_for_each(tb, node, &head->chain) {
-                               if (tb->port == rover) {
-                                       BUG_TRAP(!hlist_empty(&tb->owners));
-                                       if (tb->fastreuse >= 0)
-                                               goto next_port;
-                                       if (!__dccp_v4_check_established(sk,
-                                                                        rover,
-                                                                        &tw))
-                                               goto ok;
-                                       goto next_port;
-                               }
-                       }
-
-                       tb = inet_bind_bucket_create(dccp_hashinfo.bind_bucket_cachep,
-                                                    head, rover);
-                       if (tb == NULL) {
-                               spin_unlock(&head->lock);
-                               break;
-                       }
-                       tb->fastreuse = -1;
-                       goto ok;
-
-               next_port:
-                       spin_unlock(&head->lock);
-                       if (++rover > high)
-                               rover = low;
-               } while (--remaining > 0);
-
-               local_bh_enable();
-
-               return -EADDRNOTAVAIL;
-
-ok:
-               /* All locks still held and bhs disabled */
-               inet_bind_hash(sk, tb, rover);
-               if (sk_unhashed(sk)) {
-                       inet_sk(sk)->sport = htons(rover);
-                       __inet_hash(&dccp_hashinfo, sk, 0);
-               }
-               spin_unlock(&head->lock);
-
-               if (tw != NULL) {
-                       inet_twsk_deschedule(tw, &dccp_death_row);
-                       inet_twsk_put(tw);
-               }
-
-               ret = 0;
-               goto out;
-       }
-
-       head = &dccp_hashinfo.bhash[inet_bhashfn(snum,
-                                                dccp_hashinfo.bhash_size)];
-       tb   = inet_csk(sk)->icsk_bind_hash;
-       spin_lock_bh(&head->lock);
-       if (sk_head(&tb->owners) == sk && sk->sk_bind_node.next == NULL) {
-               __inet_hash(&dccp_hashinfo, sk, 0);
-               spin_unlock_bh(&head->lock);
-               return 0;
-       } else {
-               spin_unlock(&head->lock);
-               /* No definite answer... Walk to established hash table */
-               ret = __dccp_v4_check_established(sk, snum, NULL);
-out:
-               local_bh_enable();
-               return ret;
-       }
-}
-
-static int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
-                          int addr_len)
+int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 {
        struct inet_sock *inet = inet_sk(sk);
        struct dccp_sock *dp = dccp_sk(sk);
@@ -259,9 +105,9 @@ static int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
        inet->dport = usin->sin_port;
        inet->daddr = daddr;
 
-       dp->dccps_ext_header_len = 0;
+       inet_csk(sk)->icsk_ext_hdr_len = 0;
        if (inet->opt != NULL)
-               dp->dccps_ext_header_len = inet->opt->optlen;
+               inet_csk(sk)->icsk_ext_hdr_len = inet->opt->optlen;
        /*
         * Socket identity is still unknown (sport may be zero).
         * However we set state to DCCP_REQUESTING and not releasing socket
@@ -269,7 +115,7 @@ static int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
         * complete initialization after this.
         */
        dccp_set_state(sk, DCCP_REQUESTING);
-       err = dccp_v4_hash_connect(sk);
+       err = inet_hash_connect(&dccp_death_row, sk);
        if (err != 0)
                goto failure;
 
@@ -287,16 +133,6 @@ static int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
                                                            usin->sin_port);
        dccp_update_gss(sk, dp->dccps_iss);
 
-       /*
-        * SWL and AWL are initially adjusted so that they are not less than
-        * the initial Sequence Numbers received and sent, respectively:
-        *      SWL := max(GSR + 1 - floor(W/4), ISR),
-        *      AWL := max(GSS - W' + 1, ISS).
-        * These adjustments MUST be applied only at the beginning of the
-        * connection.
-        */
-       dccp_set_seqno(&dp->dccps_awl, max48(dp->dccps_awl, dp->dccps_iss));
-
        inet->id = dp->dccps_iss ^ jiffies;
 
        err = dccp_connect(sk);
@@ -316,6 +152,8 @@ failure:
        goto out;
 }
 
+EXPORT_SYMBOL_GPL(dccp_v4_connect);
+
 /*
  * This routine does path mtu discovery as defined in RFC1191.
  */
@@ -354,7 +192,7 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
        mtu = dst_mtu(dst);
 
        if (inet->pmtudisc != IP_PMTUDISC_DONT &&
-           dp->dccps_pmtu_cookie > mtu) {
+           inet_csk(sk)->icsk_pmtu_cookie > mtu) {
                dccp_sync_mss(sk, mtu);
 
                /*
@@ -606,6 +444,17 @@ out:
        sock_put(sk);
 }
 
+/* This routine computes an IPv4 DCCP checksum. */
+void dccp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
+{
+       const struct inet_sock *inet = inet_sk(sk);
+       struct dccp_hdr *dh = dccp_hdr(skb);
+
+       dh->dccph_checksum = dccp_v4_checksum(skb, inet->saddr, inet->daddr);
+}
+
+EXPORT_SYMBOL_GPL(dccp_v4_send_check);
+
 int dccp_v4_send_reset(struct sock *sk, enum dccp_reset_codes code)
 {
        struct sk_buff *skb;
@@ -641,16 +490,6 @@ static inline u64 dccp_v4_init_sequence(const struct sock *sk,
                                           dccp_hdr(skb)->dccph_sport);
 }
 
-static inline int dccp_bad_service_code(const struct sock *sk,
-                                       const __u32 service)
-{
-       const struct dccp_sock *dp = dccp_sk(sk);
-
-       if (dp->dccps_service == service)
-               return 0;
-       return !dccp_list_has_service(dp->dccps_service_list, service);
-}
-
 int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
 {
        struct inet_request_sock *ireq;
@@ -662,7 +501,6 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        const __u32 service = dccp_hdr_request(skb)->dccph_req_service;
        struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
        __u8 reset_code = DCCP_RESET_CODE_TOO_BUSY;
-       struct dst_entry *dst = NULL;
 
        /* Never answer to DCCP_PKT_REQUESTs send to broadcast or multicast */
        if (((struct rtable *)skb->dst)->rt_flags &
@@ -703,7 +541,6 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        ireq = inet_rsk(req);
        ireq->loc_addr = daddr;
        ireq->rmt_addr = saddr;
-       /* FIXME: Merge Aristeu's option parsing code when ready */
        req->rcv_wnd    = 100; /* Fake, option parsing will get the
                                  right value */
        ireq->opt       = NULL;
@@ -721,23 +558,22 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        dreq->dreq_iss     = dccp_v4_init_sequence(sk, skb);
        dreq->dreq_service = service;
 
-       if (dccp_v4_send_response(sk, req, dst))
+       if (dccp_v4_send_response(sk, req, NULL))
                goto drop_and_free;
 
        inet_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT);
        return 0;
 
 drop_and_free:
-       /*
-        * FIXME: should be reqsk_free after implementing req->rsk_ops
-        */
-       __reqsk_free(req);
+       reqsk_free(req);
 drop:
        DCCP_INC_STATS_BH(DCCP_MIB_ATTEMPTFAILS);
        dcb->dccpd_reset_code = reset_code;
        return -1;
 }
 
+EXPORT_SYMBOL_GPL(dccp_v4_conn_request);
+
 /*
  * The three way handshake has completed - we got a valid ACK or DATAACK -
  * now create the new socket.
@@ -792,6 +628,8 @@ exit:
        return NULL;
 }
 
+EXPORT_SYMBOL_GPL(dccp_v4_request_recv_sock);
+
 static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
 {
        const struct dccp_hdr *dh = dccp_hdr(skb);
@@ -1011,7 +849,9 @@ discard:
        return 0;
 }
 
-static inline int dccp_invalid_packet(struct sk_buff *skb)
+EXPORT_SYMBOL_GPL(dccp_v4_do_rcv);
+
+int dccp_invalid_packet(struct sk_buff *skb)
 {
        const struct dccp_hdr *dh;
 
@@ -1065,29 +905,30 @@ static inline int dccp_invalid_packet(struct sk_buff *skb)
                return 1;
        }
 
-       /* If the header checksum is incorrect, drop packet and return */
-       if (dccp_v4_verify_checksum(skb, skb->nh.iph->saddr,
-                                   skb->nh.iph->daddr) < 0) {
-               LIMIT_NETDEBUG(KERN_WARNING "DCCP: header checksum is "
-                                           "incorrect\n");
-               return 1;
-       }
-
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(dccp_invalid_packet);
+
 /* this is called when real data arrives */
 int dccp_v4_rcv(struct sk_buff *skb)
 {
        const struct dccp_hdr *dh;
        struct sock *sk;
-       int rc;
 
        /* Step 1: Check header basics: */
 
        if (dccp_invalid_packet(skb))
                goto discard_it;
 
+       /* If the header checksum is incorrect, drop packet and return */
+       if (dccp_v4_verify_checksum(skb, skb->nh.iph->saddr,
+                                   skb->nh.iph->daddr) < 0) {
+               LIMIT_NETDEBUG(KERN_WARNING "%s: incorrect header checksum\n",
+                              __FUNCTION__);
+               goto discard_it;
+       }
+
        dh = dccp_hdr(skb);
 
        DCCP_SKB_CB(skb)->dccpd_seq  = dccp_hdr_seq(skb);
@@ -1143,28 +984,10 @@ int dccp_v4_rcv(struct sk_buff *skb)
                 goto do_time_wait;
        }
 
-       if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) {
-               dccp_pr_debug("xfrm4_policy_check failed\n");
+       if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
                goto discard_and_relse;
-       }
-
-        if (sk_filter(sk, skb, 0)) {
-               dccp_pr_debug("sk_filter failed\n");
-                goto discard_and_relse;
-       }
-
-       skb->dev = NULL;
-
-       bh_lock_sock(sk);
-       rc = 0;
-       if (!sock_owned_by_user(sk))
-               rc = dccp_v4_do_rcv(sk, skb);
-       else
-               sk_add_backlog(sk, skb);
-       bh_unlock_sock(sk);
 
-       sock_put(sk);
-       return rc;
+       return sk_receive_skb(sk, skb);
 
 no_dccp_socket:
        if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
@@ -1194,9 +1017,23 @@ do_time_wait:
        goto no_dccp_socket;
 }
 
-static int dccp_v4_init_sock(struct sock *sk)
+struct inet_connection_sock_af_ops dccp_ipv4_af_ops = {
+       .queue_xmit     = ip_queue_xmit,
+       .send_check     = dccp_v4_send_check,
+       .rebuild_header = inet_sk_rebuild_header,
+       .conn_request   = dccp_v4_conn_request,
+       .syn_recv_sock  = dccp_v4_request_recv_sock,
+       .net_header_len = sizeof(struct iphdr),
+       .setsockopt     = ip_setsockopt,
+       .getsockopt     = ip_getsockopt,
+       .addr2sockaddr  = inet_csk_addr2sockaddr,
+       .sockaddr_len   = sizeof(struct sockaddr_in),
+};
+
+int dccp_v4_init_sock(struct sock *sk)
 {
        struct dccp_sock *dp = dccp_sk(sk);
+       struct inet_connection_sock *icsk = inet_csk(sk);
        static int dccp_ctl_socket_init = 1;
 
        dccp_options_init(&dp->dccps_options);
@@ -1236,9 +1073,11 @@ static int dccp_v4_init_sock(struct sock *sk)
                dccp_ctl_socket_init = 0;
 
        dccp_init_xmit_timers(sk);
-       inet_csk(sk)->icsk_rto = DCCP_TIMEOUT_INIT;
+       icsk->icsk_rto = DCCP_TIMEOUT_INIT;
        sk->sk_state = DCCP_CLOSED;
        sk->sk_write_space = dccp_write_space;
+       icsk->icsk_af_ops = &dccp_ipv4_af_ops;
+       icsk->icsk_sync_mss = dccp_sync_mss;
        dp->dccps_mss_cache = 536;
        dp->dccps_role = DCCP_ROLE_UNDEFINED;
        dp->dccps_service = DCCP_SERVICE_INVALID_VALUE;
@@ -1246,12 +1085,14 @@ static int dccp_v4_init_sock(struct sock *sk)
        return 0;
 }
 
-static int dccp_v4_destroy_sock(struct sock *sk)
+EXPORT_SYMBOL_GPL(dccp_v4_init_sock);
+
+int dccp_v4_destroy_sock(struct sock *sk)
 {
        struct dccp_sock *dp = dccp_sk(sk);
 
        /*
-        * DCCP doesn't use sk_qrite_queue, just sk_send_head
+        * DCCP doesn't use sk_write_queue, just sk_send_head
         * for retransmissions
         */
        if (sk->sk_send_head != NULL) {
@@ -1279,6 +1120,8 @@ static int dccp_v4_destroy_sock(struct sock *sk)
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(dccp_v4_destroy_sock);
+
 static void dccp_v4_reqsk_destructor(struct request_sock *req)
 {
        kfree(inet_rsk(req)->opt);
@@ -1293,7 +1136,11 @@ static struct request_sock_ops dccp_request_sock_ops = {
        .send_reset     = dccp_v4_ctl_send_reset,
 };
 
-struct proto dccp_v4_prot = {
+static struct timewait_sock_ops dccp_timewait_sock_ops = {
+       .twsk_obj_size  = sizeof(struct inet_timewait_sock),
+};
+
+struct proto dccp_prot = {
        .name                   = "DCCP",
        .owner                  = THIS_MODULE,
        .close                  = dccp_close,
@@ -1307,7 +1154,7 @@ struct proto dccp_v4_prot = {
        .recvmsg                = dccp_recvmsg,
        .backlog_rcv            = dccp_v4_do_rcv,
        .hash                   = dccp_v4_hash,
-       .unhash                 = dccp_v4_unhash,
+       .unhash                 = dccp_unhash,
        .accept                 = inet_csk_accept,
        .get_port               = dccp_v4_get_port,
        .shutdown               = dccp_shutdown,
@@ -1316,5 +1163,7 @@ struct proto dccp_v4_prot = {
        .max_header             = MAX_DCCP_HEADER,
        .obj_size               = sizeof(struct dccp_sock),
        .rsk_prot               = &dccp_request_sock_ops,
-       .twsk_obj_size          = sizeof(struct inet_timewait_sock),
+       .twsk_prot              = &dccp_timewait_sock_ops,
 };
+
+EXPORT_SYMBOL_GPL(dccp_prot);
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
new file mode 100644 (file)
index 0000000..c609dc7
--- /dev/null
@@ -0,0 +1,1261 @@
+/*
+ *     DCCP over IPv6
+ *     Linux INET6 implementation 
+ *
+ *     Based on net/dccp6/ipv6.c
+ *
+ *     Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
+ *
+ *     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/config.h>
+#include <linux/module.h>
+#include <linux/random.h>
+#include <linux/xfrm.h>
+
+#include <net/addrconf.h>
+#include <net/inet_common.h>
+#include <net/inet_hashtables.h>
+#include <net/inet_sock.h>
+#include <net/inet6_connection_sock.h>
+#include <net/inet6_hashtables.h>
+#include <net/ip6_route.h>
+#include <net/ipv6.h>
+#include <net/protocol.h>
+#include <net/transp_v6.h>
+#include <net/xfrm.h>
+
+#include "dccp.h"
+#include "ipv6.h"
+
+static void dccp_v6_ctl_send_reset(struct sk_buff *skb);
+static void dccp_v6_reqsk_send_ack(struct sk_buff *skb,
+                                  struct request_sock *req);
+static void dccp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb);
+
+static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
+
+static struct inet_connection_sock_af_ops dccp_ipv6_mapped;
+static struct inet_connection_sock_af_ops dccp_ipv6_af_ops;
+
+static int dccp_v6_get_port(struct sock *sk, unsigned short snum)
+{
+       return inet_csk_get_port(&dccp_hashinfo, sk, snum,
+                                inet6_csk_bind_conflict);
+}
+
+static void dccp_v6_hash(struct sock *sk)
+{
+       if (sk->sk_state != DCCP_CLOSED) {
+               if (inet_csk(sk)->icsk_af_ops == &dccp_ipv6_mapped) {
+                       dccp_prot.hash(sk);
+                       return;
+               }
+               local_bh_disable();
+               __inet6_hash(&dccp_hashinfo, sk);
+               local_bh_enable();
+       }
+}
+
+static inline u16 dccp_v6_check(struct dccp_hdr *dh, int len,
+                               struct in6_addr *saddr, 
+                               struct in6_addr *daddr, 
+                               unsigned long base)
+{
+       return csum_ipv6_magic(saddr, daddr, len, IPPROTO_DCCP, base);
+}
+
+static __u32 dccp_v6_init_sequence(struct sock *sk, struct sk_buff *skb)
+{
+       const struct dccp_hdr *dh = dccp_hdr(skb);
+
+       if (skb->protocol == htons(ETH_P_IPV6))
+               return secure_tcpv6_sequence_number(skb->nh.ipv6h->daddr.s6_addr32,
+                                                   skb->nh.ipv6h->saddr.s6_addr32,
+                                                   dh->dccph_dport,
+                                                   dh->dccph_sport);
+       else
+               return secure_dccp_sequence_number(skb->nh.iph->daddr,
+                                                  skb->nh.iph->saddr,
+                                                  dh->dccph_dport,
+                                                  dh->dccph_sport);
+}
+
+static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, 
+                          int addr_len)
+{
+       struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
+       struct inet_connection_sock *icsk = inet_csk(sk);
+       struct inet_sock *inet = inet_sk(sk);
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct dccp_sock *dp = dccp_sk(sk);
+       struct in6_addr *saddr = NULL, *final_p = NULL, final;
+       struct flowi fl;
+       struct dst_entry *dst;
+       int addr_type;
+       int err;
+
+       dp->dccps_role = DCCP_ROLE_CLIENT;
+
+       if (addr_len < SIN6_LEN_RFC2133) 
+               return -EINVAL;
+
+       if (usin->sin6_family != AF_INET6) 
+               return -EAFNOSUPPORT;
+
+       memset(&fl, 0, sizeof(fl));
+
+       if (np->sndflow) {
+               fl.fl6_flowlabel = usin->sin6_flowinfo & IPV6_FLOWINFO_MASK;
+               IP6_ECN_flow_init(fl.fl6_flowlabel);
+               if (fl.fl6_flowlabel & IPV6_FLOWLABEL_MASK) {
+                       struct ip6_flowlabel *flowlabel;
+                       flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
+                       if (flowlabel == NULL)
+                               return -EINVAL;
+                       ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
+                       fl6_sock_release(flowlabel);
+               }
+       }
+
+       /*
+        *      connect() to INADDR_ANY means loopback (BSD'ism).
+        */
+       
+       if (ipv6_addr_any(&usin->sin6_addr))
+               usin->sin6_addr.s6_addr[15] = 0x1; 
+
+       addr_type = ipv6_addr_type(&usin->sin6_addr);
+
+       if(addr_type & IPV6_ADDR_MULTICAST)
+               return -ENETUNREACH;
+
+       if (addr_type & IPV6_ADDR_LINKLOCAL) {
+               if (addr_len >= sizeof(struct sockaddr_in6) &&
+                   usin->sin6_scope_id) {
+                       /* If interface is set while binding, indices
+                        * must coincide.
+                        */
+                       if (sk->sk_bound_dev_if &&
+                           sk->sk_bound_dev_if != usin->sin6_scope_id)
+                               return -EINVAL;
+
+                       sk->sk_bound_dev_if = usin->sin6_scope_id;
+               }
+
+               /* Connect to link-local address requires an interface */
+               if (!sk->sk_bound_dev_if)
+                       return -EINVAL;
+       }
+
+       ipv6_addr_copy(&np->daddr, &usin->sin6_addr);
+       np->flow_label = fl.fl6_flowlabel;
+
+       /*
+        *      DCCP over IPv4
+        */
+
+       if (addr_type == IPV6_ADDR_MAPPED) {
+               u32 exthdrlen = icsk->icsk_ext_hdr_len;
+               struct sockaddr_in sin;
+
+               SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
+
+               if (__ipv6_only_sock(sk))
+                       return -ENETUNREACH;
+
+               sin.sin_family = AF_INET;
+               sin.sin_port = usin->sin6_port;
+               sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
+
+               icsk->icsk_af_ops = &dccp_ipv6_mapped;
+               sk->sk_backlog_rcv = dccp_v4_do_rcv;
+
+               err = dccp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
+
+               if (err) {
+                       icsk->icsk_ext_hdr_len = exthdrlen;
+                       icsk->icsk_af_ops = &dccp_ipv6_af_ops;
+                       sk->sk_backlog_rcv = dccp_v6_do_rcv;
+                       goto failure;
+               } else {
+                       ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF),
+                                     inet->saddr);
+                       ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF),
+                                     inet->rcv_saddr);
+               }
+
+               return err;
+       }
+
+       if (!ipv6_addr_any(&np->rcv_saddr))
+               saddr = &np->rcv_saddr;
+
+       fl.proto = IPPROTO_DCCP;
+       ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
+       ipv6_addr_copy(&fl.fl6_src, saddr ? saddr : &np->saddr);
+       fl.oif = sk->sk_bound_dev_if;
+       fl.fl_ip_dport = usin->sin6_port;
+       fl.fl_ip_sport = inet->sport;
+
+       if (np->opt && np->opt->srcrt) {
+               struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
+               ipv6_addr_copy(&final, &fl.fl6_dst);
+               ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
+               final_p = &final;
+       }
+
+       err = ip6_dst_lookup(sk, &dst, &fl);
+       if (err)
+               goto failure;
+       if (final_p)
+               ipv6_addr_copy(&fl.fl6_dst, final_p);
+
+       if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
+               goto failure;
+
+       if (saddr == NULL) {
+               saddr = &fl.fl6_src;
+               ipv6_addr_copy(&np->rcv_saddr, saddr);
+       }
+
+       /* set the source address */
+       ipv6_addr_copy(&np->saddr, saddr);
+       inet->rcv_saddr = LOOPBACK4_IPV6;
+
+       ip6_dst_store(sk, dst, NULL);
+
+       icsk->icsk_ext_hdr_len = 0;
+       if (np->opt)
+               icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
+                                         np->opt->opt_nflen);
+
+       inet->dport = usin->sin6_port;
+
+       dccp_set_state(sk, DCCP_REQUESTING);
+       err = inet6_hash_connect(&dccp_death_row, sk);
+       if (err)
+               goto late_failure;
+       /* FIXME */
+#if 0
+       dp->dccps_gar = secure_dccp_v6_sequence_number(np->saddr.s6_addr32,
+                                                      np->daddr.s6_addr32,
+                                                      inet->sport,
+                                                      inet->dport);
+#endif
+       err = dccp_connect(sk);
+       if (err)
+               goto late_failure;
+
+       return 0;
+
+late_failure:
+       dccp_set_state(sk, DCCP_CLOSED);
+       __sk_dst_reset(sk);
+failure:
+       inet->dport = 0;
+       sk->sk_route_caps = 0;
+       return err;
+}
+
+static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+                       int type, int code, int offset, __u32 info)
+{
+       struct ipv6hdr *hdr = (struct ipv6hdr *)skb->data;
+       const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset);
+       struct ipv6_pinfo *np;
+       struct sock *sk;
+       int err;
+       __u64 seq;
+
+       sk = inet6_lookup(&dccp_hashinfo, &hdr->daddr, dh->dccph_dport,
+                         &hdr->saddr, dh->dccph_sport, skb->dev->ifindex);
+
+       if (sk == NULL) {
+               ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS);
+               return;
+       }
+
+       if (sk->sk_state == DCCP_TIME_WAIT) {
+               inet_twsk_put((struct inet_timewait_sock *)sk);
+               return;
+       }
+
+       bh_lock_sock(sk);
+       if (sock_owned_by_user(sk))
+               NET_INC_STATS_BH(LINUX_MIB_LOCKDROPPEDICMPS);
+
+       if (sk->sk_state == DCCP_CLOSED)
+               goto out;
+
+       np = inet6_sk(sk);
+
+       if (type == ICMPV6_PKT_TOOBIG) {
+               struct dst_entry *dst = NULL;
+
+               if (sock_owned_by_user(sk))
+                       goto out;
+               if ((1 << sk->sk_state) & (DCCPF_LISTEN | DCCPF_CLOSED))
+                       goto out;
+
+               /* icmp should have updated the destination cache entry */
+               dst = __sk_dst_check(sk, np->dst_cookie);
+
+               if (dst == NULL) {
+                       struct inet_sock *inet = inet_sk(sk);
+                       struct flowi fl;
+
+                       /* BUGGG_FUTURE: Again, it is not clear how
+                          to handle rthdr case. Ignore this complexity
+                          for now.
+                        */
+                       memset(&fl, 0, sizeof(fl));
+                       fl.proto = IPPROTO_DCCP;
+                       ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
+                       ipv6_addr_copy(&fl.fl6_src, &np->saddr);
+                       fl.oif = sk->sk_bound_dev_if;
+                       fl.fl_ip_dport = inet->dport;
+                       fl.fl_ip_sport = inet->sport;
+
+                       if ((err = ip6_dst_lookup(sk, &dst, &fl))) {
+                               sk->sk_err_soft = -err;
+                               goto out;
+                       }
+
+                       if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
+                               sk->sk_err_soft = -err;
+                               goto out;
+                       }
+
+               } else
+                       dst_hold(dst);
+
+               if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
+                       dccp_sync_mss(sk, dst_mtu(dst));
+               } /* else let the usual retransmit timer handle it */
+               dst_release(dst);
+               goto out;
+       }
+
+       icmpv6_err_convert(type, code, &err);
+
+       seq = DCCP_SKB_CB(skb)->dccpd_seq;
+       /* Might be for an request_sock */
+       switch (sk->sk_state) {
+               struct request_sock *req, **prev;
+       case DCCP_LISTEN:
+               if (sock_owned_by_user(sk))
+                       goto out;
+
+               req = inet6_csk_search_req(sk, &prev, dh->dccph_dport,
+                                          &hdr->daddr, &hdr->saddr,
+                                          inet6_iif(skb));
+               if (!req)
+                       goto out;
+
+               /* ICMPs are not backlogged, hence we cannot get
+                * an established socket here.
+                */
+               BUG_TRAP(req->sk == NULL);
+
+               if (seq != dccp_rsk(req)->dreq_iss) {
+                       NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
+                       goto out;
+               }
+
+               inet_csk_reqsk_queue_drop(sk, req, prev);
+               goto out;
+
+       case DCCP_REQUESTING:
+       case DCCP_RESPOND:  /* Cannot happen.
+                              It can, it SYNs are crossed. --ANK */ 
+               if (!sock_owned_by_user(sk)) {
+                       DCCP_INC_STATS_BH(DCCP_MIB_ATTEMPTFAILS);
+                       sk->sk_err = err;
+                       /*
+                        * Wake people up to see the error
+                        * (see connect in sock.c)
+                        */
+                       sk->sk_error_report(sk);
+
+                       dccp_done(sk);
+               } else
+                       sk->sk_err_soft = err;
+               goto out;
+       }
+
+       if (!sock_owned_by_user(sk) && np->recverr) {
+               sk->sk_err = err;
+               sk->sk_error_report(sk);
+       } else
+               sk->sk_err_soft = err;
+
+out:
+       bh_unlock_sock(sk);
+       sock_put(sk);
+}
+
+
+static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
+                                struct dst_entry *dst)
+{
+       struct inet6_request_sock *ireq6 = inet6_rsk(req);
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct sk_buff *skb;
+       struct ipv6_txoptions *opt = NULL;
+       struct in6_addr *final_p = NULL, final;
+       struct flowi fl;
+       int err = -1;
+
+       memset(&fl, 0, sizeof(fl));
+       fl.proto = IPPROTO_DCCP;
+       ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr);
+       ipv6_addr_copy(&fl.fl6_src, &ireq6->loc_addr);
+       fl.fl6_flowlabel = 0;
+       fl.oif = ireq6->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.osrcrt == 2 &&
+                   ireq6->pktopts) {
+                       struct sk_buff *pktopts = ireq6->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));
+               }
+
+               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;
+               }
+
+               err = ip6_dst_lookup(sk, &dst, &fl);
+               if (err)
+                       goto done;
+               if (final_p)
+                       ipv6_addr_copy(&fl.fl6_dst, final_p);
+               if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
+                       goto done;
+       }
+
+       skb = dccp_make_response(sk, dst, req);
+       if (skb != NULL) {
+               struct dccp_hdr *dh = dccp_hdr(skb);
+               dh->dccph_checksum = dccp_v6_check(dh, skb->len,
+                                                  &ireq6->loc_addr,
+                                                  &ireq6->rmt_addr,
+                                                  csum_partial((char *)dh,
+                                                               skb->len,
+                                                               skb->csum));
+               ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr);
+               err = ip6_xmit(sk, skb, &fl, opt, 0);
+               if (err == NET_XMIT_CN)
+                       err = 0;
+       }
+
+done:
+        if (opt && opt != np->opt)
+               sock_kfree_s(sk, opt, opt->tot_len);
+       return err;
+}
+
+static void dccp_v6_reqsk_destructor(struct request_sock *req)
+{
+       if (inet6_rsk(req)->pktopts != NULL)
+               kfree_skb(inet6_rsk(req)->pktopts);
+}
+
+static struct request_sock_ops dccp6_request_sock_ops = {
+       .family         = AF_INET6,
+       .obj_size       = sizeof(struct dccp6_request_sock),
+       .rtx_syn_ack    = dccp_v6_send_response,
+       .send_ack       = dccp_v6_reqsk_send_ack,
+       .destructor     = dccp_v6_reqsk_destructor,
+       .send_reset     = dccp_v6_ctl_send_reset,
+};
+
+static struct timewait_sock_ops dccp6_timewait_sock_ops = {
+       .twsk_obj_size  = sizeof(struct dccp6_timewait_sock),
+};
+
+static void dccp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
+{
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct dccp_hdr *dh = dccp_hdr(skb);
+
+       dh->dccph_checksum = csum_ipv6_magic(&np->saddr, &np->daddr,
+                                            len, IPPROTO_DCCP, 
+                                            csum_partial((char *)dh,
+                                                         dh->dccph_doff << 2,
+                                                         skb->csum));
+}
+
+static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb)
+{
+       struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh; 
+       const int dccp_hdr_reset_len = sizeof(struct dccp_hdr) +
+                                      sizeof(struct dccp_hdr_ext) +
+                                      sizeof(struct dccp_hdr_reset);
+       struct sk_buff *skb;
+       struct flowi fl;
+       u64 seqno;
+
+       if (rxdh->dccph_type == DCCP_PKT_RESET)
+               return;
+
+       if (!ipv6_unicast_destination(rxskb))
+               return; 
+
+       /*
+        * We need to grab some memory, and put together an RST,
+        * and then put it into the queue to be sent.
+        */
+
+       skb = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) +
+                       dccp_hdr_reset_len, GFP_ATOMIC);
+       if (skb == NULL) 
+               return;
+
+       skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr) +
+                   dccp_hdr_reset_len);
+
+       skb->h.raw = skb_push(skb, dccp_hdr_reset_len);
+       dh = dccp_hdr(skb);
+       memset(dh, 0, dccp_hdr_reset_len);
+
+       /* Swap the send and the receive. */
+       dh->dccph_type  = DCCP_PKT_RESET;
+       dh->dccph_sport = rxdh->dccph_dport;
+       dh->dccph_dport = rxdh->dccph_sport;
+       dh->dccph_doff  = dccp_hdr_reset_len / 4;
+       dh->dccph_x     = 1;
+       dccp_hdr_reset(skb)->dccph_reset_code =
+                               DCCP_SKB_CB(rxskb)->dccpd_reset_code;
+
+       /* See "8.3.1. Abnormal Termination" in draft-ietf-dccp-spec-11 */
+       seqno = 0;
+       if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
+               dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1);
+
+       dccp_hdr_set_seq(dh, seqno);
+       dccp_hdr_set_ack(dccp_hdr_ack_bits(skb),
+                        DCCP_SKB_CB(rxskb)->dccpd_seq);
+
+       memset(&fl, 0, sizeof(fl));
+       ipv6_addr_copy(&fl.fl6_dst, &rxskb->nh.ipv6h->saddr);
+       ipv6_addr_copy(&fl.fl6_src, &rxskb->nh.ipv6h->daddr);
+       dh->dccph_checksum = csum_ipv6_magic(&fl.fl6_src, &fl.fl6_dst,
+                                            sizeof(*dh), IPPROTO_DCCP,
+                                            skb->csum);
+       fl.proto = IPPROTO_DCCP;
+       fl.oif = inet6_iif(rxskb);
+       fl.fl_ip_dport = dh->dccph_dport;
+       fl.fl_ip_sport = dh->dccph_sport;
+
+       /* sk = NULL, but it is safe for now. RST socket required. */
+       if (!ip6_dst_lookup(NULL, &skb->dst, &fl)) {
+               if (xfrm_lookup(&skb->dst, &fl, NULL, 0) >= 0) {
+                       ip6_xmit(NULL, skb, &fl, NULL, 0);
+                       DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS);
+                       DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS);
+                       return;
+               }
+       }
+
+       kfree_skb(skb);
+}
+
+static void dccp_v6_ctl_send_ack(struct sk_buff *rxskb)
+{
+       struct flowi fl;
+       struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh;
+       const int dccp_hdr_ack_len = sizeof(struct dccp_hdr) +
+                                    sizeof(struct dccp_hdr_ext) +
+                                    sizeof(struct dccp_hdr_ack_bits);
+       struct sk_buff *skb;
+
+       skb = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) +
+                       dccp_hdr_ack_len, GFP_ATOMIC);
+       if (skb == NULL)
+               return;
+
+       skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr) +
+                        dccp_hdr_ack_len);
+
+       skb->h.raw = skb_push(skb, dccp_hdr_ack_len);
+       dh = dccp_hdr(skb);
+       memset(dh, 0, dccp_hdr_ack_len);
+
+       /* Build DCCP header and checksum it. */
+       dh->dccph_type  = DCCP_PKT_ACK;
+       dh->dccph_sport = rxdh->dccph_dport;
+       dh->dccph_dport = rxdh->dccph_sport;
+       dh->dccph_doff  = dccp_hdr_ack_len / 4;
+       dh->dccph_x     = 1;
+       
+       dccp_hdr_set_seq(dh, DCCP_SKB_CB(rxskb)->dccpd_ack_seq);
+       dccp_hdr_set_ack(dccp_hdr_ack_bits(skb),
+                        DCCP_SKB_CB(rxskb)->dccpd_seq);
+
+       memset(&fl, 0, sizeof(fl));
+       ipv6_addr_copy(&fl.fl6_dst, &rxskb->nh.ipv6h->saddr);
+       ipv6_addr_copy(&fl.fl6_src, &rxskb->nh.ipv6h->daddr);
+
+       /* FIXME: calculate checksum, IPv4 also should... */
+
+       fl.proto = IPPROTO_DCCP;
+       fl.oif = inet6_iif(rxskb);
+       fl.fl_ip_dport = dh->dccph_dport;
+       fl.fl_ip_sport = dh->dccph_sport;
+
+       if (!ip6_dst_lookup(NULL, &skb->dst, &fl)) {
+               if (xfrm_lookup(&skb->dst, &fl, NULL, 0) >= 0) {
+                       ip6_xmit(NULL, skb, &fl, NULL, 0);
+                       DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS);
+                       return;
+               }
+       }
+
+       kfree_skb(skb);
+}
+
+static void dccp_v6_reqsk_send_ack(struct sk_buff *skb,
+                                  struct request_sock *req)
+{
+       dccp_v6_ctl_send_ack(skb);
+}
+
+static struct sock *dccp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
+{
+       const struct dccp_hdr *dh = dccp_hdr(skb);
+       const struct ipv6hdr *iph = skb->nh.ipv6h;
+       struct sock *nsk;
+       struct request_sock **prev;
+       /* Find possible connection requests. */
+       struct request_sock *req = inet6_csk_search_req(sk, &prev,
+                                                       dh->dccph_sport,
+                                                       &iph->saddr,
+                                                       &iph->daddr,
+                                                       inet6_iif(skb));
+       if (req != NULL)
+               return dccp_check_req(sk, skb, req, prev);
+
+       nsk = __inet6_lookup_established(&dccp_hashinfo,
+                                        &iph->saddr, dh->dccph_sport,
+                                        &iph->daddr, ntohs(dh->dccph_dport),
+                                        inet6_iif(skb));
+
+       if (nsk != NULL) {
+               if (nsk->sk_state != DCCP_TIME_WAIT) {
+                       bh_lock_sock(nsk);
+                       return nsk;
+               }
+               inet_twsk_put((struct inet_timewait_sock *)nsk);
+               return NULL;
+       }
+
+       return sk;
+}
+
+static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
+{
+       struct inet_request_sock *ireq;
+       struct dccp_sock dp;
+       struct request_sock *req;
+       struct dccp_request_sock *dreq;
+       struct inet6_request_sock *ireq6;
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       const __u32 service = dccp_hdr_request(skb)->dccph_req_service;
+       struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
+       __u8 reset_code = DCCP_RESET_CODE_TOO_BUSY;
+
+       if (skb->protocol == htons(ETH_P_IP))
+               return dccp_v4_conn_request(sk, skb);
+
+       if (!ipv6_unicast_destination(skb))
+               goto drop; 
+
+       if (dccp_bad_service_code(sk, service)) {
+               reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE;
+               goto drop;
+       }
+       /*
+        *      There are no SYN attacks on IPv6, yet...        
+        */
+       if (inet_csk_reqsk_queue_is_full(sk))
+               goto drop;              
+
+       if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
+               goto drop;
+
+       req = inet6_reqsk_alloc(sk->sk_prot->rsk_prot);
+       if (req == NULL)
+               goto drop;
+
+       /* FIXME: process options */
+
+       dccp_openreq_init(req, &dp, skb);
+
+       ireq6 = inet6_rsk(req);
+       ireq = inet_rsk(req);
+       ipv6_addr_copy(&ireq6->rmt_addr, &skb->nh.ipv6h->saddr);
+       ipv6_addr_copy(&ireq6->loc_addr, &skb->nh.ipv6h->daddr);
+       req->rcv_wnd    = 100; /* Fake, option parsing will get the
+                                 right value */
+       ireq6->pktopts  = NULL;
+
+       if (ipv6_opt_accepted(sk, skb) ||
+           np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
+           np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
+               atomic_inc(&skb->users);
+               ireq6->pktopts = skb;
+       }
+       ireq6->iif = sk->sk_bound_dev_if;
+
+       /* So that link locals have meaning */
+       if (!sk->sk_bound_dev_if &&
+           ipv6_addr_type(&ireq6->rmt_addr) & IPV6_ADDR_LINKLOCAL)
+               ireq6->iif = inet6_iif(skb);
+
+       /* 
+        * Step 3: Process LISTEN state
+        *
+        * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie
+        *
+        * In fact we defer setting S.GSR, S.SWL, S.SWH to
+        * dccp_create_openreq_child.
+        */
+       dreq = dccp_rsk(req);
+       dreq->dreq_isr     = dcb->dccpd_seq;
+       dreq->dreq_iss     = dccp_v6_init_sequence(sk, skb);
+       dreq->dreq_service = service;
+
+       if (dccp_v6_send_response(sk, req, NULL))
+               goto drop_and_free;
+
+       inet6_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT);
+       return 0;
+
+drop_and_free:
+       reqsk_free(req);
+drop:
+       DCCP_INC_STATS_BH(DCCP_MIB_ATTEMPTFAILS);
+       dcb->dccpd_reset_code = reset_code;
+       return -1;
+}
+
+static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
+                                             struct sk_buff *skb,
+                                             struct request_sock *req,
+                                             struct dst_entry *dst)
+{
+       struct inet6_request_sock *ireq6 = inet6_rsk(req);
+       struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
+       struct inet_sock *newinet;
+       struct dccp_sock *newdp;
+       struct dccp6_sock *newdp6;
+       struct sock *newsk;
+       struct ipv6_txoptions *opt;
+
+       if (skb->protocol == htons(ETH_P_IP)) {
+               /*
+                *      v6 mapped
+                */
+
+               newsk = dccp_v4_request_recv_sock(sk, skb, req, dst);
+               if (newsk == NULL) 
+                       return NULL;
+
+               newdp6 = (struct dccp6_sock *)newsk;
+               newdp = dccp_sk(newsk);
+               newinet = inet_sk(newsk);
+               newinet->pinet6 = &newdp6->inet6;
+               newnp = inet6_sk(newsk);
+
+               memcpy(newnp, np, sizeof(struct ipv6_pinfo));
+
+               ipv6_addr_set(&newnp->daddr, 0, 0, htonl(0x0000FFFF),
+                             newinet->daddr);
+
+               ipv6_addr_set(&newnp->saddr, 0, 0, htonl(0x0000FFFF),
+                             newinet->saddr);
+
+               ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
+
+               inet_csk(newsk)->icsk_af_ops = &dccp_ipv6_mapped;
+               newsk->sk_backlog_rcv = dccp_v4_do_rcv;
+               newnp->pktoptions  = NULL;
+               newnp->opt         = NULL;
+               newnp->mcast_oif   = inet6_iif(skb);
+               newnp->mcast_hops  = skb->nh.ipv6h->hop_limit;
+
+               /*
+                * No need to charge this sock to the relevant IPv6 refcnt debug socks count
+                * here, dccp_create_openreq_child now does this for us, see the comment in
+                * that function for the gory details. -acme
+                */
+
+               /* It is tricky place. Until this moment IPv4 tcp
+                  worked with IPv6 icsk.icsk_af_ops.
+                  Sync it now.
+                */
+               dccp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
+
+               return newsk;
+       }
+
+       opt = np->opt;
+
+       if (sk_acceptq_is_full(sk))
+               goto out_overflow;
+
+       if (np->rxopt.bits.osrcrt == 2 &&
+           opt == NULL && ireq6->pktopts) {
+               struct inet6_skb_parm *rxopt = IP6CB(ireq6->pktopts);
+               if (rxopt->srcrt)
+                       opt = ipv6_invert_rthdr(sk,
+                               (struct ipv6_rt_hdr *)(ireq6->pktopts->nh.raw +
+                                                      rxopt->srcrt));
+       }
+
+       if (dst == NULL) {
+               struct in6_addr *final_p = NULL, final;
+               struct flowi fl;
+
+               memset(&fl, 0, sizeof(fl));
+               fl.proto = IPPROTO_DCCP;
+               ipv6_addr_copy(&fl.fl6_dst, &ireq6->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, &ireq6->loc_addr);
+               fl.oif = sk->sk_bound_dev_if;
+               fl.fl_ip_dport = inet_rsk(req)->rmt_port;
+               fl.fl_ip_sport = inet_sk(sk)->sport;
+
+               if (ip6_dst_lookup(sk, &dst, &fl))
+                       goto out;
+
+               if (final_p)
+                       ipv6_addr_copy(&fl.fl6_dst, final_p);
+
+               if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0)
+                       goto out;
+       } 
+
+       newsk = dccp_create_openreq_child(sk, req, skb);
+       if (newsk == NULL)
+               goto out;
+
+       /*
+        * No need to charge this sock to the relevant IPv6 refcnt debug socks
+        * count here, dccp_create_openreq_child now does this for us, see the
+        * comment in that function for the gory details. -acme
+        */
+
+       ip6_dst_store(newsk, dst, NULL);
+       newsk->sk_route_caps = dst->dev->features &
+               ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
+
+       newdp6 = (struct dccp6_sock *)newsk;
+       newinet = inet_sk(newsk);
+       newinet->pinet6 = &newdp6->inet6;
+       newdp = dccp_sk(newsk);
+       newnp = inet6_sk(newsk);
+
+       memcpy(newnp, np, sizeof(struct ipv6_pinfo));
+
+       ipv6_addr_copy(&newnp->daddr, &ireq6->rmt_addr);
+       ipv6_addr_copy(&newnp->saddr, &ireq6->loc_addr);
+       ipv6_addr_copy(&newnp->rcv_saddr, &ireq6->loc_addr);
+       newsk->sk_bound_dev_if = ireq6->iif;
+
+       /* Now IPv6 options... 
+
+          First: no IPv4 options.
+        */
+       newinet->opt = NULL;
+
+       /* Clone RX bits */
+       newnp->rxopt.all = np->rxopt.all;
+
+       /* Clone pktoptions received with SYN */
+       newnp->pktoptions = NULL;
+       if (ireq6->pktopts != NULL) {
+               newnp->pktoptions = skb_clone(ireq6->pktopts, GFP_ATOMIC);
+               kfree_skb(ireq6->pktopts);
+               ireq6->pktopts = NULL;
+               if (newnp->pktoptions)
+                       skb_set_owner_r(newnp->pktoptions, newsk);
+       }
+       newnp->opt        = NULL;
+       newnp->mcast_oif  = inet6_iif(skb);
+       newnp->mcast_hops = skb->nh.ipv6h->hop_limit;
+
+       /* Clone native IPv6 options from listening socket (if any)
+
+          Yes, keeping reference count would be much more clever,
+          but we make one more one thing there: reattach optmem
+          to newsk.
+        */
+       if (opt) {
+               newnp->opt = ipv6_dup_options(newsk, opt);
+               if (opt != np->opt)
+                       sock_kfree_s(sk, opt, opt->tot_len);
+       }
+
+       inet_csk(newsk)->icsk_ext_hdr_len = 0;
+       if (newnp->opt)
+               inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
+                                                    newnp->opt->opt_flen);
+
+       dccp_sync_mss(newsk, dst_mtu(dst));
+
+       newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6;
+
+       __inet6_hash(&dccp_hashinfo, newsk);
+       inet_inherit_port(&dccp_hashinfo, sk, newsk);
+
+       return newsk;
+
+out_overflow:
+       NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS);
+out:
+       NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS);
+       if (opt && opt != np->opt)
+               sock_kfree_s(sk, opt, opt->tot_len);
+       dst_release(dst);
+       return NULL;
+}
+
+/* The socket must have it's spinlock held when we get
+ * here.
+ *
+ * We have a potential double-lock case here, so even when
+ * doing backlog processing we use the BH locking scheme.
+ * This is because we cannot sleep with the original spinlock
+ * held.
+ */
+static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
+{
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct sk_buff *opt_skb = NULL;
+
+       /* Imagine: socket is IPv6. IPv4 packet arrives,
+          goes to IPv4 receive handler and backlogged.
+          From backlog it always goes here. Kerboom...
+          Fortunately, dccp_rcv_established and rcv_established
+          handle them correctly, but it is not case with
+          dccp_v6_hnd_req and dccp_v6_ctl_send_reset().   --ANK
+        */
+
+       if (skb->protocol == htons(ETH_P_IP))
+               return dccp_v4_do_rcv(sk, skb);
+
+       if (sk_filter(sk, skb, 0))
+               goto discard;
+
+       /*
+        *      socket locking is here for SMP purposes as backlog rcv
+        *      is currently called with bh processing disabled.
+        */
+
+       /* Do Stevens' IPV6_PKTOPTIONS.
+
+          Yes, guys, it is the only place in our code, where we
+          may make it not affecting IPv4.
+          The rest of code is protocol independent,
+          and I do not like idea to uglify IPv4.
+
+          Actually, all the idea behind IPV6_PKTOPTIONS
+          looks not very well thought. For now we latch
+          options, received in the last packet, enqueued
+          by tcp. Feel free to propose better solution.
+                                              --ANK (980728)
+        */
+       if (np->rxopt.all)
+               opt_skb = skb_clone(skb, GFP_ATOMIC);
+
+       if (sk->sk_state == DCCP_OPEN) { /* Fast path */
+               if (dccp_rcv_established(sk, skb, dccp_hdr(skb), skb->len))
+                       goto reset;
+               return 0;
+       }
+
+       if (sk->sk_state == DCCP_LISTEN) { 
+               struct sock *nsk = dccp_v6_hnd_req(sk, skb);
+               if (!nsk)
+                       goto discard;
+
+               /*
+                * Queue it on the new socket if the new socket is active,
+                * otherwise we just shortcircuit this and continue with
+                * the new socket..
+                */
+               if(nsk != sk) {
+                       if (dccp_child_process(sk, nsk, skb))
+                               goto reset;
+                       if (opt_skb)
+                               __kfree_skb(opt_skb);
+                       return 0;
+               }
+       }
+
+       if (dccp_rcv_state_process(sk, skb, dccp_hdr(skb), skb->len))
+               goto reset;
+       return 0;
+
+reset:
+       dccp_v6_ctl_send_reset(skb);
+discard:
+       if (opt_skb)
+               __kfree_skb(opt_skb);
+       kfree_skb(skb);
+       return 0;
+}
+
+static int dccp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
+{
+       const struct dccp_hdr *dh;
+       struct sk_buff *skb = *pskb;
+       struct sock *sk;
+
+       /* Step 1: Check header basics: */
+
+       if (dccp_invalid_packet(skb))
+               goto discard_it;
+
+       dh = dccp_hdr(skb);
+
+       DCCP_SKB_CB(skb)->dccpd_seq  = dccp_hdr_seq(skb);
+       DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
+
+       if (dccp_packet_without_ack(skb))
+               DCCP_SKB_CB(skb)->dccpd_ack_seq = DCCP_PKT_WITHOUT_ACK_SEQ;
+       else
+               DCCP_SKB_CB(skb)->dccpd_ack_seq = dccp_hdr_ack_seq(skb);
+
+       /* Step 2:
+        *      Look up flow ID in table and get corresponding socket */
+       sk = __inet6_lookup(&dccp_hashinfo, &skb->nh.ipv6h->saddr,
+                           dh->dccph_sport,
+                           &skb->nh.ipv6h->daddr, ntohs(dh->dccph_dport),
+                           inet6_iif(skb));
+       /* 
+        * Step 2:
+        *      If no socket ...
+        *              Generate Reset(No Connection) unless P.type == Reset
+        *              Drop packet and return
+        */
+       if (sk == NULL)
+               goto no_dccp_socket;
+
+       /* 
+        * Step 2:
+        *      ... or S.state == TIMEWAIT,
+        *              Generate Reset(No Connection) unless P.type == Reset
+        *              Drop packet and return
+        */
+              
+       if (sk->sk_state == DCCP_TIME_WAIT)
+                goto do_time_wait;
+
+       if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
+               goto discard_and_relse;
+
+       return sk_receive_skb(sk, skb) ? -1 : 0;
+
+no_dccp_socket:
+       if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
+               goto discard_it;
+       /*
+        * Step 2:
+        *              Generate Reset(No Connection) unless P.type == Reset
+        *              Drop packet and return
+        */
+       if (dh->dccph_type != DCCP_PKT_RESET) {
+               DCCP_SKB_CB(skb)->dccpd_reset_code =
+                                       DCCP_RESET_CODE_NO_CONNECTION;
+               dccp_v6_ctl_send_reset(skb);
+       }
+discard_it:
+
+       /*
+        *      Discard frame
+        */
+
+       kfree_skb(skb);
+       return 0;
+
+discard_and_relse:
+       sock_put(sk);
+       goto discard_it;
+
+do_time_wait:
+       inet_twsk_put((struct inet_timewait_sock *)sk);
+       goto no_dccp_socket;
+}
+
+static struct inet_connection_sock_af_ops dccp_ipv6_af_ops = {
+       .queue_xmit     =       inet6_csk_xmit,
+       .send_check     =       dccp_v6_send_check,
+       .rebuild_header =       inet6_sk_rebuild_header,
+       .conn_request   =       dccp_v6_conn_request,
+       .syn_recv_sock  =       dccp_v6_request_recv_sock,
+       .net_header_len =       sizeof(struct ipv6hdr),
+       .setsockopt     =       ipv6_setsockopt,
+       .getsockopt     =       ipv6_getsockopt,
+       .addr2sockaddr  =       inet6_csk_addr2sockaddr,
+       .sockaddr_len   =       sizeof(struct sockaddr_in6)
+};
+
+/*
+ *     DCCP over IPv4 via INET6 API
+ */
+static struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
+       .queue_xmit     =       ip_queue_xmit,
+       .send_check     =       dccp_v4_send_check,
+       .rebuild_header =       inet_sk_rebuild_header,
+       .conn_request   =       dccp_v6_conn_request,
+       .syn_recv_sock  =       dccp_v6_request_recv_sock,
+       .net_header_len =       sizeof(struct iphdr),
+       .setsockopt     =       ipv6_setsockopt,
+       .getsockopt     =       ipv6_getsockopt,
+       .addr2sockaddr  =       inet6_csk_addr2sockaddr,
+       .sockaddr_len   =       sizeof(struct sockaddr_in6)
+};
+
+/* NOTE: A lot of things set to zero explicitly by call to
+ *       sk_alloc() so need not be done here.
+ */
+static int dccp_v6_init_sock(struct sock *sk)
+{
+       int err = dccp_v4_init_sock(sk);
+
+       if (err == 0)
+               inet_csk(sk)->icsk_af_ops = &dccp_ipv6_af_ops;
+
+       return err;
+}
+
+static int dccp_v6_destroy_sock(struct sock *sk)
+{
+       dccp_v4_destroy_sock(sk);
+       return inet6_destroy_sock(sk);
+}
+
+static struct proto dccp_v6_prot = {
+       .name                   = "DCCPv6",
+       .owner                  = THIS_MODULE,
+       .close                  = dccp_close,
+       .connect                = dccp_v6_connect,
+       .disconnect             = dccp_disconnect,
+       .ioctl                  = dccp_ioctl,
+       .init                   = dccp_v6_init_sock,
+       .setsockopt             = dccp_setsockopt,
+       .getsockopt             = dccp_getsockopt,
+       .sendmsg                = dccp_sendmsg,
+       .recvmsg                = dccp_recvmsg,
+       .backlog_rcv            = dccp_v6_do_rcv,
+       .hash                   = dccp_v6_hash,
+       .unhash                 = dccp_unhash,
+       .accept                 = inet_csk_accept,
+       .get_port               = dccp_v6_get_port,
+       .shutdown               = dccp_shutdown,
+       .destroy                = dccp_v6_destroy_sock,
+       .orphan_count           = &dccp_orphan_count,
+       .max_header             = MAX_DCCP_HEADER,
+       .obj_size               = sizeof(struct dccp6_sock),
+       .rsk_prot               = &dccp6_request_sock_ops,
+       .twsk_prot              = &dccp6_timewait_sock_ops,
+};
+
+static struct inet6_protocol dccp_v6_protocol = {
+       .handler        =       dccp_v6_rcv,
+       .err_handler    =       dccp_v6_err,
+       .flags          =       INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL,
+};
+
+static struct proto_ops inet6_dccp_ops = {
+       .family         = PF_INET6,
+       .owner          = THIS_MODULE,
+       .release        = inet6_release,
+       .bind           = inet6_bind,
+       .connect        = inet_stream_connect,
+       .socketpair     = sock_no_socketpair,
+       .accept         = inet_accept,
+       .getname        = inet6_getname,
+       .poll           = dccp_poll,
+       .ioctl          = inet6_ioctl,
+       .listen         = inet_dccp_listen,
+       .shutdown       = inet_shutdown,
+       .setsockopt     = sock_common_setsockopt,
+       .getsockopt     = sock_common_getsockopt,
+       .sendmsg        = inet_sendmsg,
+       .recvmsg        = sock_common_recvmsg,
+       .mmap           = sock_no_mmap,
+       .sendpage       = sock_no_sendpage,
+};
+
+static struct inet_protosw dccp_v6_protosw = {
+       .type           = SOCK_DCCP,
+       .protocol       = IPPROTO_DCCP,
+       .prot           = &dccp_v6_prot,
+       .ops            = &inet6_dccp_ops,
+       .capability     = -1,
+       .flags          = INET_PROTOSW_ICSK,
+};
+
+static int __init dccp_v6_init(void)
+{
+       int err = proto_register(&dccp_v6_prot, 1);
+
+       if (err != 0)
+               goto out;
+
+       err = inet6_add_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
+       if (err != 0)
+               goto out_unregister_proto;
+
+       inet6_register_protosw(&dccp_v6_protosw);
+out:
+       return err;
+out_unregister_proto:
+       proto_unregister(&dccp_v6_prot);
+       goto out;
+}
+
+static void __exit dccp_v6_exit(void)
+{
+       inet6_del_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
+       inet6_unregister_protosw(&dccp_v6_protosw);
+       proto_unregister(&dccp_v6_prot);
+}
+
+module_init(dccp_v6_init);
+module_exit(dccp_v6_exit);
+
+/*
+ * __stringify doesn't likes enums, so use SOCK_DCCP (6) and IPPROTO_DCCP (33)
+ * values directly, Also cover the case where the protocol is not specified,
+ * i.e. net-pf-PF_INET6-proto-0-type-SOCK_DCCP
+ */
+MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-33-type-6");
+MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-0-type-6");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
+MODULE_DESCRIPTION("DCCPv6 - Datagram Congestion Controlled Protocol");
diff --git a/net/dccp/ipv6.h b/net/dccp/ipv6.h
new file mode 100644 (file)
index 0000000..e4d4e93
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _DCCP_IPV6_H
+#define _DCCP_IPV6_H
+/*
+ *  net/dccp/ipv6.h
+ *
+ *  An implementation of the DCCP protocol
+ *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
+ *
+ *     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/dccp.h>
+#include <linux/ipv6.h>
+
+struct dccp6_sock {
+       struct dccp_sock  dccp;
+       /*
+        * ipv6_pinfo has to be the last member of dccp6_sock,
+        * see inet6_sk_generic.
+        */
+       struct ipv6_pinfo inet6;
+};
+
+struct dccp6_request_sock {
+       struct dccp_request_sock  dccp;
+       struct inet6_request_sock inet6;
+};
+
+struct dccp6_timewait_sock {
+       struct inet_timewait_sock   inet;
+       struct inet6_timewait_sock  tw6;
+};
+
+#endif /* _DCCP_IPV6_H */
index 1393461898bbb277994c7707d009ddebbf68ac90..29261fc198e76161215d275109ba7163390901db 100644 (file)
@@ -40,6 +40,8 @@ struct inet_timewait_death_row dccp_death_row = {
                                            (unsigned long)&dccp_death_row),
 };
 
+EXPORT_SYMBOL_GPL(dccp_death_row);
+
 void dccp_time_wait(struct sock *sk, int state, int timeo)
 {
        struct inet_timewait_sock *tw = NULL;
@@ -50,7 +52,18 @@ void dccp_time_wait(struct sock *sk, int state, int timeo)
        if (tw != NULL) {
                const struct inet_connection_sock *icsk = inet_csk(sk);
                const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
-
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+               if (tw->tw_family == PF_INET6) {
+                       const struct ipv6_pinfo *np = inet6_sk(sk);
+                       struct inet6_timewait_sock *tw6;
+
+                       tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot);
+                       tw6 = inet6_twsk((struct sock *)tw);
+                       ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr);
+                       ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr);
+                       tw->tw_ipv6only = np->ipv6only;
+               }
+#endif
                /* Linkage updates. */
                __inet_twsk_hashdance(tw, sk, &dccp_hashinfo);
 
@@ -170,6 +183,8 @@ out_free:
        return newsk;
 }
 
+EXPORT_SYMBOL_GPL(dccp_create_openreq_child);
+
 /* 
  * Process an incoming packet for RESPOND sockets represented
  * as an request_sock.
@@ -214,7 +229,7 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
                goto drop;
        }
 
-       child = dccp_v4_request_recv_sock(sk, skb, req, NULL);
+       child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL);
        if (child == NULL)
                goto listen_overflow;
 
@@ -236,6 +251,8 @@ drop:
        goto out;
 }
 
+EXPORT_SYMBOL_GPL(dccp_check_req);
+
 /*
  *  Queue segment on the new socket if the new socket is active,
  *  otherwise we just shortcircuit this and continue with
@@ -266,3 +283,5 @@ int dccp_child_process(struct sock *parent, struct sock *child,
        sock_put(child);
        return ret;
 }
+
+EXPORT_SYMBOL_GPL(dccp_child_process);
index 74ff870258785b3790bb325b62aebe2435f3769a..efd7ffb903a149a46d38d57e691b20bfba416c67 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/kernel.h>
 #include <linux/skbuff.h>
 
+#include <net/inet_sock.h>
 #include <net/sock.h>
 
 #include "ackvec.h"
@@ -43,6 +44,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 {
        if (likely(skb != NULL)) {
                const struct inet_sock *inet = inet_sk(sk);
+               const struct inet_connection_sock *icsk = inet_csk(sk);
                struct dccp_sock *dp = dccp_sk(sk);
                struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
                struct dccp_hdr *dh;
@@ -108,8 +110,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                        break;
                }
 
-               dh->dccph_checksum = dccp_v4_checksum(skb, inet->saddr,
-                                                     inet->daddr);
+               icsk->icsk_af_ops->send_check(sk, skb->len, skb);
 
                if (set_ack)
                        dccp_event_ack_sent(sk);
@@ -117,7 +118,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
 
                memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
-               err = ip_queue_xmit(skb, 0);
+               err = icsk->icsk_af_ops->queue_xmit(skb, 0);
                if (err <= 0)
                        return err;
 
@@ -134,20 +135,13 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 
 unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
 {
+       struct inet_connection_sock *icsk = inet_csk(sk);
        struct dccp_sock *dp = dccp_sk(sk);
-       int mss_now;
-
-       /*
-        * FIXME: we really should be using the af_specific thing to support
-        *        IPv6.
-        * mss_now = pmtu - tp->af_specific->net_header_len -
-        *           sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext);
-        */
-       mss_now = pmtu - sizeof(struct iphdr) - sizeof(struct dccp_hdr) -
-                 sizeof(struct dccp_hdr_ext);
+       int mss_now = (pmtu - icsk->icsk_af_ops->net_header_len -
+                      sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext));
 
        /* Now subtract optional transport overhead */
-       mss_now -= dp->dccps_ext_header_len;
+       mss_now -= icsk->icsk_ext_hdr_len;
 
        /*
         * FIXME: this should come from the CCID infrastructure, where, say,
@@ -160,12 +154,14 @@ unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
        mss_now -= ((5 + 6 + 10 + 6 + 6 + 6 + 3) / 4) * 4;
 
        /* And store cached results */
-       dp->dccps_pmtu_cookie = pmtu;
+       icsk->icsk_pmtu_cookie = pmtu;
        dp->dccps_mss_cache = mss_now;
 
        return mss_now;
 }
 
+EXPORT_SYMBOL_GPL(dccp_sync_mss);
+
 void dccp_write_space(struct sock *sk)
 {
        read_lock(&sk->sk_callback_lock);
@@ -266,7 +262,7 @@ int dccp_write_xmit(struct sock *sk, struct sk_buff *skb, long *timeo)
 
 int dccp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
 {
-       if (inet_sk_rebuild_header(sk) != 0)
+       if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk) != 0)
                return -EHOSTUNREACH; /* Routing failure or similar. */
 
        return dccp_transmit_skb(sk, (skb_cloned(skb) ?
@@ -321,6 +317,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
        return skb;
 }
 
+EXPORT_SYMBOL_GPL(dccp_make_response);
+
 struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst,
                                const enum dccp_reset_codes code)
                                   
@@ -377,6 +375,7 @@ struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst,
  */
 static inline void dccp_connect_init(struct sock *sk)
 {
+       struct dccp_sock *dp = dccp_sk(sk);
        struct dst_entry *dst = __sk_dst_get(sk);
        struct inet_connection_sock *icsk = inet_csk(sk);
 
@@ -385,10 +384,16 @@ static inline void dccp_connect_init(struct sock *sk)
        
        dccp_sync_mss(sk, dst_mtu(dst));
 
-       /*
-        * FIXME: set dp->{dccps_swh,dccps_swl}, with
-        * something like dccp_inc_seq
-        */
+       dccp_update_gss(sk, dp->dccps_iss);
+       /*
+        * SWL and AWL are initially adjusted so that they are not less than
+        * the initial Sequence Numbers received and sent, respectively:
+        *      SWL := max(GSR + 1 - floor(W/4), ISR),
+        *      AWL := max(GSS - W' + 1, ISS).
+        * These adjustments MUST be applied only at the beginning of the
+        * connection.
+        */
+       dccp_set_seqno(&dp->dccps_awl, max48(dp->dccps_awl, dp->dccps_iss));
 
        icsk->icsk_retransmits = 0;
 }
@@ -420,6 +425,8 @@ int dccp_connect(struct sock *sk)
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(dccp_connect);
+
 void dccp_send_ack(struct sock *sk)
 {
        /* If we have been reset, we may not send again. */
index e0ace7cbb9960cc5d145304b7ce8bf8a8a5de2a2..65b11ea90d858818db105a4855b2a285aacf7ab2 100644 (file)
@@ -24,7 +24,7 @@
 #include <net/checksum.h>
 
 #include <net/inet_common.h>
-#include <net/ip.h>
+#include <net/inet_sock.h>
 #include <net/protocol.h>
 #include <net/sock.h>
 #include <net/xfrm.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
 #include <linux/poll.h>
-#include <linux/dccp.h>
 
 #include "ccid.h"
 #include "dccp.h"
 
 DEFINE_SNMP_STAT(struct dccp_mib, dccp_statistics) __read_mostly;
 
+EXPORT_SYMBOL_GPL(dccp_statistics);
+
 atomic_t dccp_orphan_count = ATOMIC_INIT(0);
 
+EXPORT_SYMBOL_GPL(dccp_orphan_count);
+
 static struct net_protocol dccp_protocol = {
        .handler        = dccp_v4_rcv,
        .err_handler    = dccp_v4_err,
+       .no_policy      = 1,
 };
 
 const char *dccp_packet_name(const int type)
@@ -148,6 +152,8 @@ int dccp_disconnect(struct sock *sk, int flags)
        return err;
 }
 
+EXPORT_SYMBOL_GPL(dccp_disconnect);
+
 /*
  *     Wait for a DCCP event.
  *
@@ -155,8 +161,8 @@ int dccp_disconnect(struct sock *sk, int flags)
  *     take care of normal races (between the test and the event) and we don't
  *     go look at any of the socket buffers directly.
  */
-static unsigned int dccp_poll(struct file *file, struct socket *sock,
-                             poll_table *wait)
+unsigned int dccp_poll(struct file *file, struct socket *sock,
+                      poll_table *wait)
 {
        unsigned int mask;
        struct sock *sk = sock->sk;
@@ -204,12 +210,16 @@ static unsigned int dccp_poll(struct file *file, struct socket *sock,
        return mask;
 }
 
+EXPORT_SYMBOL_GPL(dccp_poll);
+
 int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 {
        dccp_pr_debug("entry\n");
        return -ENOIOCTLCMD;
 }
 
+EXPORT_SYMBOL_GPL(dccp_ioctl);
+
 static int dccp_setsockopt_service(struct sock *sk, const u32 service,
                                   char __user *optval, int optlen)
 {
@@ -253,7 +263,9 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
        int val;
 
        if (level != SOL_DCCP)
-               return ip_setsockopt(sk, level, optname, optval, optlen);
+               return inet_csk(sk)->icsk_af_ops->setsockopt(sk, level,
+                                                            optname, optval,
+                                                            optlen);
 
        if (optlen < sizeof(int))
                return -EINVAL;
@@ -281,6 +293,8 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
        return err;
 }
 
+EXPORT_SYMBOL_GPL(dccp_setsockopt);
+
 static int dccp_getsockopt_service(struct sock *sk, int len,
                                   u32 __user *optval,
                                   int __user *optlen)
@@ -319,8 +333,9 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
        int val, len;
 
        if (level != SOL_DCCP)
-               return ip_getsockopt(sk, level, optname, optval, optlen);
-
+               return inet_csk(sk)->icsk_af_ops->getsockopt(sk, level,
+                                                            optname, optval,
+                                                            optlen);
        if (get_user(len, optlen))
                return -EFAULT;
 
@@ -353,6 +368,8 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(dccp_getsockopt);
+
 int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                 size_t len)
 {
@@ -409,6 +426,8 @@ out_discard:
        goto out_release;
 }
 
+EXPORT_SYMBOL_GPL(dccp_sendmsg);
+
 int dccp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                 size_t len, int nonblock, int flags, int *addr_len)
 {
@@ -506,7 +525,9 @@ out:
        return len;
 }
 
-static int inet_dccp_listen(struct socket *sock, int backlog)
+EXPORT_SYMBOL_GPL(dccp_recvmsg);
+
+int inet_dccp_listen(struct socket *sock, int backlog)
 {
        struct sock *sk = sock->sk;
        unsigned char old_state;
@@ -542,6 +563,8 @@ out:
        return err;
 }
 
+EXPORT_SYMBOL_GPL(inet_dccp_listen);
+
 static const unsigned char dccp_new_state[] = {
        /* current state:   new state:      action:     */
        [0]               = DCCP_CLOSED,
@@ -647,12 +670,16 @@ adjudge_to_death:
        sock_put(sk);
 }
 
+EXPORT_SYMBOL_GPL(dccp_close);
+
 void dccp_shutdown(struct sock *sk, int how)
 {
        dccp_pr_debug("entry\n");
 }
 
-static struct proto_ops inet_dccp_ops = {
+EXPORT_SYMBOL_GPL(dccp_shutdown);
+
+static const struct proto_ops inet_dccp_ops = {
        .family         = PF_INET,
        .owner          = THIS_MODULE,
        .release        = inet_release,
@@ -680,11 +707,11 @@ extern struct net_proto_family inet_family_ops;
 static struct inet_protosw dccp_v4_protosw = {
        .type           = SOCK_DCCP,
        .protocol       = IPPROTO_DCCP,
-       .prot           = &dccp_v4_prot,
+       .prot           = &dccp_prot,
        .ops            = &inet_dccp_ops,
        .capability     = -1,
        .no_check       = 0,
-       .flags          = 0,
+       .flags          = INET_PROTOSW_ICSK,
 };
 
 /*
@@ -759,13 +786,15 @@ MODULE_PARM_DESC(thash_entries, "Number of ehash buckets");
 int dccp_debug;
 module_param(dccp_debug, int, 0444);
 MODULE_PARM_DESC(dccp_debug, "Enable debug messages");
+
+EXPORT_SYMBOL_GPL(dccp_debug);
 #endif
 
 static int __init dccp_init(void)
 {
        unsigned long goal;
        int ehash_order, bhash_order, i;
-       int rc = proto_register(&dccp_v4_prot, 1);
+       int rc = proto_register(&dccp_prot, 1);
 
        if (rc)
                goto out;
@@ -868,7 +897,7 @@ out_free_bind_bucket_cachep:
        kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep);
        dccp_hashinfo.bind_bucket_cachep = NULL;
 out_proto_unregister:
-       proto_unregister(&dccp_v4_prot);
+       proto_unregister(&dccp_prot);
        goto out;
 }
 
@@ -891,7 +920,7 @@ static void __exit dccp_fini(void)
                   get_order(dccp_hashinfo.ehash_size *
                             sizeof(struct inet_ehash_bucket)));
        kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep);
-       proto_unregister(&dccp_v4_prot);
+       proto_unregister(&dccp_prot);
 }
 
 module_init(dccp_init);
index f89e55f814d9b8c1a23737d10db90fd5914502ec..78ec5344be86e6f65f2c02121a84145bf4bc1cfc 100644 (file)
@@ -149,10 +149,11 @@ static void dn_keepalive(struct sock *sk);
 #define DN_SK_HASH_MASK (DN_SK_HASH_SIZE - 1)
 
 
-static struct proto_ops dn_proto_ops;
+static const struct proto_ops dn_proto_ops;
 static DEFINE_RWLOCK(dn_hash_lock);
 static struct hlist_head dn_sk_hash[DN_SK_HASH_SIZE];
 static struct hlist_head dn_wild_sk;
+static atomic_t decnet_memory_allocated;
 
 static int __dn_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen, int flags);
 static int __dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen, int flags);
@@ -446,10 +447,26 @@ static void dn_destruct(struct sock *sk)
        dst_release(xchg(&sk->sk_dst_cache, NULL));
 }
 
+static int dn_memory_pressure;
+
+static void dn_enter_memory_pressure(void)
+{
+       if (!dn_memory_pressure) {
+               dn_memory_pressure = 1;
+       }
+}
+
 static struct proto dn_proto = {
-       .name     = "DECNET",
-       .owner    = THIS_MODULE,
-       .obj_size = sizeof(struct dn_sock),
+       .name                   = "NSP",
+       .owner                  = THIS_MODULE,
+       .enter_memory_pressure  = dn_enter_memory_pressure,
+       .memory_pressure        = &dn_memory_pressure,
+       .memory_allocated       = &decnet_memory_allocated,
+       .sysctl_mem             = sysctl_decnet_mem,
+       .sysctl_wmem            = sysctl_decnet_wmem,
+       .sysctl_rmem            = sysctl_decnet_rmem,
+       .max_header             = DN_MAX_NSP_DATA_HEADER + 64,
+       .obj_size               = sizeof(struct dn_sock),
 };
 
 static struct sock *dn_alloc_sock(struct socket *sock, gfp_t gfp)
@@ -470,6 +487,8 @@ static struct sock *dn_alloc_sock(struct socket *sock, gfp_t gfp)
        sk->sk_family      = PF_DECnet;
        sk->sk_protocol    = 0;
        sk->sk_allocation  = gfp;
+       sk->sk_sndbuf      = sysctl_decnet_wmem[1];
+       sk->sk_rcvbuf      = sysctl_decnet_rmem[1];
 
        /* Initialization of DECnet Session Control Port                */
        scp = DN_SK(sk);
@@ -1233,7 +1252,7 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                break;
 
        default:
-               err = dev_ioctl(cmd, (void __user *)arg);
+               err = -ENOIOCTLCMD;
                break;
        }
 
@@ -2323,7 +2342,7 @@ static struct net_proto_family    dn_family_ops = {
        .owner  =       THIS_MODULE,
 };
 
-static struct proto_ops dn_proto_ops = {
+static const struct proto_ops dn_proto_ops = {
        .family =       AF_DECnet,
        .owner =        THIS_MODULE,
        .release =      dn_release,
index 8d0cc3cf3e491a636f258af31262b36f54a1efa4..33ab256cfd4a2c00eeda867fa5ecc309f5db50bc 100644 (file)
@@ -408,11 +408,14 @@ int dn_neigh_router_hello(struct sk_buff *skb)
                        }
                }
 
-               if (!dn_db->router) {
-                       dn_db->router = neigh_clone(neigh);
-               } else {
-                       if (msg->priority > ((struct dn_neigh *)dn_db->router)->priority)
-                               neigh_release(xchg(&dn_db->router, neigh_clone(neigh)));
+               /* Only use routers in our area */
+               if ((dn_ntohs(src)>>10) == dn_ntohs((decnet_address)>>10)) {
+                       if (!dn_db->router) {
+                               dn_db->router = neigh_clone(neigh);
+                       } else {
+                               if (msg->priority > ((struct dn_neigh *)dn_db->router)->priority)
+                                       neigh_release(xchg(&dn_db->router, neigh_clone(neigh)));
+                       }
                }
                write_unlock(&neigh->lock);
                neigh_release(neigh);
index 369f25b60f3f3a3966ccfb2ba93982cece27dd21..44bda85e678f50c03a0974cacdbe4dd48b95b94c 100644 (file)
@@ -793,7 +793,6 @@ static int dn_nsp_rx_packet(struct sk_buff *skb)
 got_it:
        if (sk != NULL) {
                struct dn_scp *scp = DN_SK(sk);
-               int ret;
 
                /* Reset backoff */
                scp->nsp_rxtshift = 0;
@@ -807,21 +806,7 @@ got_it:
                                goto free_out;
                }
 
-               bh_lock_sock(sk);
-               ret = NET_RX_SUCCESS;
-               if (decnet_debug_level & 8)
-                       printk(KERN_DEBUG "NSP: 0x%02x 0x%02x 0x%04x 0x%04x %d\n",
-                               (int)cb->rt_flags, (int)cb->nsp_flags, 
-                               (int)cb->src_port, (int)cb->dst_port, 
-                               !!sock_owned_by_user(sk));
-               if (!sock_owned_by_user(sk))
-                       ret = dn_nsp_backlog_rcv(sk, skb);
-               else
-                       sk_add_backlog(sk, skb);
-               bh_unlock_sock(sk);
-               sock_put(sk);
-
-               return ret;
+               return sk_receive_skb(sk, skb);
        }
 
        return dn_nsp_no_socket(skb, reason);
index 02bca49cb5084b60c4779b6d5badab8dde35ac93..0e9d2c5711655b37bd9f9f48f6f4baf2c9b21f53 100644 (file)
@@ -10,6 +10,7 @@
  *
  * Changes:
  * Steve Whitehouse - C99 changes and default device handling
+ * Steve Whitehouse - Memory buffer settings, like the tcp ones
  *
  */
 #include <linux/config.h>
@@ -37,6 +38,11 @@ int decnet_dr_count = 3;
 int decnet_log_martians = 1;
 int decnet_no_fc_max_cwnd = NSP_MIN_WINDOW;
 
+/* Reasonable defaults, I hope, based on tcp's defaults */
+int sysctl_decnet_mem[3] = { 768 << 3, 1024 << 3, 1536 << 3 };
+int sysctl_decnet_wmem[3] = { 4 * 1024, 16 * 1024, 128 * 1024 };
+int sysctl_decnet_rmem[3] = { 4 * 1024, 87380, 87380 * 2 };
+
 #ifdef CONFIG_SYSCTL
 extern int decnet_dst_gc_interval;
 static int min_decnet_time_wait[] = { 5 };
@@ -428,6 +434,33 @@ static ctl_table dn_table[] = {
                .extra1 = &min_decnet_no_fc_max_cwnd,
                .extra2 = &max_decnet_no_fc_max_cwnd
        },
+       {
+                .ctl_name = NET_DECNET_MEM,
+                .procname = "decnet_mem",
+                .data = &sysctl_decnet_mem,
+                .maxlen = sizeof(sysctl_decnet_mem),
+                .mode = 0644,
+                .proc_handler = &proc_dointvec,
+                .strategy = &sysctl_intvec,
+        },
+        {
+                .ctl_name = NET_DECNET_RMEM,
+                .procname = "decnet_rmem",
+                .data = &sysctl_decnet_rmem,
+                .maxlen = sizeof(sysctl_decnet_rmem),
+                .mode = 0644,
+                .proc_handler = &proc_dointvec,
+                .strategy = &sysctl_intvec,
+        },
+        {
+                .ctl_name = NET_DECNET_WMEM,
+                .procname = "decnet_wmem",
+                .data = &sysctl_decnet_wmem,
+                .maxlen = sizeof(sysctl_decnet_wmem),
+                .mode = 0644,
+                .proc_handler = &proc_dointvec,
+                .strategy = &sysctl_intvec,
+        },
        {
                .ctl_name = NET_DECNET_DEBUG_LEVEL,
                .procname = "debug",
index 34fdac51df965d45d22b850da9aa379e17cfeac0..c792994d795257a90aaa87ad33d305db31613dd2 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/if_arp.h>
 #include <linux/wireless.h>
 #include <linux/skbuff.h>
+#include <linux/udp.h>
 #include <net/sock.h>
 #include <net/inet_common.h>
 #include <linux/stat.h>
@@ -45,7 +46,7 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-static struct proto_ops econet_ops;
+static const struct proto_ops econet_ops;
 static struct hlist_head econet_sklist;
 static DEFINE_RWLOCK(econet_lock);
 
@@ -56,7 +57,7 @@ static struct net_device *net2dev_map[256];
 #define EC_PORT_IP     0xd2
 
 #ifdef CONFIG_ECONET_AUNUDP
-static spinlock_t aun_queue_lock;
+static DEFINE_SPINLOCK(aun_queue_lock);
 static struct socket *udpsock;
 #define AUN_PORT       0x8000
 
@@ -686,7 +687,7 @@ static int econet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
                        break;
 
                default:
-                       return dev_ioctl(cmd, argp);
+                       return -ENOIOCTLCMD;
        }
        /*NOTREACHED*/
        return 0;
@@ -698,7 +699,7 @@ static struct net_proto_family econet_family_ops = {
        .owner  =       THIS_MODULE,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(econet_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(econet_ops) = {
        .family =       PF_ECONET,
        .owner =        THIS_MODULE,
        .release =      econet_release,
index 91b16fbf91f0c88ace7137e2e5709b5dfac4a0ae..d18ccba3ea9e7f2dcb9f6b1708c4bf86094b0145 100644 (file)
@@ -55,7 +55,7 @@ config IEEE80211_CRYPT_CCMP
 
 config IEEE80211_CRYPT_TKIP
        tristate "IEEE 802.11i TKIP encryption"
-       depends on IEEE80211
+       depends on IEEE80211 && NET_RADIO
        select CRYPTO
        select CRYPTO_MICHAEL_MIC
        ---help---
index 03efaacbdb737349999667995d092aaf96485491..4cc6f41c693087484b9876f22b5754bb45af0614 100644 (file)
@@ -410,9 +410,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
                return 1;
        }
 
-       if ((is_multicast_ether_addr(hdr->addr1) ||
-            is_broadcast_ether_addr(hdr->addr2)) ? ieee->host_mc_decrypt :
-           ieee->host_decrypt) {
+       if (is_multicast_ether_addr(hdr->addr1)
+           ? ieee->host_mc_decrypt : ieee->host_decrypt) {
                int idx = 0;
                if (skb->len >= hdrlen + 3)
                        idx = skb->data[hdrlen + 3] >> 6;
index e55136ae09f40708bbcdd50004abe97822ba0a71..011cca7ae02bee12f4cd61c609a9105b06a5b23e 100644 (file)
@@ -456,6 +456,14 @@ config TCP_CONG_BIC
        increase provides TCP friendliness.
        See http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/
 
+config TCP_CONG_CUBIC
+       tristate "CUBIC TCP"
+       default m
+       ---help---
+       This is version 2.0 of BIC-TCP which uses a cubic growth function
+       among other techniques.
+       See http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/cubic-paper.pdf
+
 config TCP_CONG_WESTWOOD
        tristate "TCP Westwood+"
        default m
index f0435d00db6befe152f8afaf730d6bdf1b975d6b..c54edd76de098d2b3826f439d3bf1a03973a4139 100644 (file)
@@ -34,6 +34,7 @@ obj-$(CONFIG_INET_DIAG) += inet_diag.o
 obj-$(CONFIG_IP_ROUTE_MULTIPATH_CACHED) += multipath.o
 obj-$(CONFIG_INET_TCP_DIAG) += tcp_diag.o
 obj-$(CONFIG_TCP_CONG_BIC) += tcp_bic.o
+obj-$(CONFIG_TCP_CONG_CUBIC) += tcp_cubic.o
 obj-$(CONFIG_TCP_CONG_WESTWOOD) += tcp_westwood.o
 obj-$(CONFIG_TCP_CONG_HSTCP) += tcp_highspeed.o
 obj-$(CONFIG_TCP_CONG_HYBLA) += tcp_hybla.o
index eaa150c33b0403204fa22224d6434e5c45f7695c..966a071a408c86203985917886d0dcf2360abcf2 100644 (file)
@@ -93,6 +93,7 @@
 #include <linux/smp_lock.h>
 #include <linux/inet.h>
 #include <linux/igmp.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <net/ip.h>
 #include <net/protocol.h>
@@ -228,13 +229,14 @@ static int inet_create(struct socket *sock, int protocol)
        unsigned char answer_flags;
        char answer_no_check;
        int try_loading_module = 0;
-       int err = -ESOCKTNOSUPPORT;
+       int err;
 
        sock->state = SS_UNCONNECTED;
 
        /* Look for the requested type/protocol pair. */
        answer = NULL;
 lookup_protocol:
+       err = -ESOCKTNOSUPPORT;
        rcu_read_lock();
        list_for_each_rcu(p, &inetsw[sock->type]) {
                answer = list_entry(p, struct inet_protosw, list);
@@ -252,6 +254,7 @@ lookup_protocol:
                        if (IPPROTO_IP == answer->protocol)
                                break;
                }
+               err = -EPROTONOSUPPORT;
                answer = NULL;
        }
 
@@ -280,9 +283,6 @@ lookup_protocol:
        err = -EPERM;
        if (answer->capability > 0 && !capable(answer->capability))
                goto out_rcu_unlock;
-       err = -EPROTONOSUPPORT;
-       if (!protocol)
-               goto out_rcu_unlock;
 
        sock->ops = answer->ops;
        answer_prot = answer->prot;
@@ -303,6 +303,7 @@ lookup_protocol:
                sk->sk_reuse = 1;
 
        inet = inet_sk(sk);
+       inet->is_icsk = INET_PROTOSW_ICSK & answer_flags;
 
        if (SOCK_RAW == sock->type) {
                inet->num = protocol;
@@ -776,16 +777,16 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        err = devinet_ioctl(cmd, (void __user *)arg);
                        break;
                default:
-                       if (!sk->sk_prot->ioctl ||
-                           (err = sk->sk_prot->ioctl(sk, cmd, arg)) ==
-                                                               -ENOIOCTLCMD)
-                               err = dev_ioctl(cmd, (void __user *)arg);
+                       if (sk->sk_prot->ioctl)
+                               err = sk->sk_prot->ioctl(sk, cmd, arg);
+                       else
+                               err = -ENOIOCTLCMD;
                        break;
        }
        return err;
 }
 
-struct proto_ops inet_stream_ops = {
+const struct proto_ops inet_stream_ops = {
        .family =       PF_INET,
        .owner =        THIS_MODULE,
        .release =      inet_release,
@@ -806,7 +807,7 @@ struct proto_ops inet_stream_ops = {
        .sendpage =     tcp_sendpage
 };
 
-struct proto_ops inet_dgram_ops = {
+const struct proto_ops inet_dgram_ops = {
        .family =       PF_INET,
        .owner =        THIS_MODULE,
        .release =      inet_release,
@@ -831,7 +832,7 @@ struct proto_ops inet_dgram_ops = {
  * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without
  * udp_poll
  */
-static struct proto_ops inet_sockraw_ops = {
+static const struct proto_ops inet_sockraw_ops = {
        .family =       PF_INET,
        .owner =        THIS_MODULE,
        .release =      inet_release,
@@ -870,7 +871,8 @@ static struct inet_protosw inetsw_array[] =
                 .ops =        &inet_stream_ops,
                 .capability = -1,
                 .no_check =   0,
-                .flags =      INET_PROTOSW_PERMANENT,
+                .flags =      INET_PROTOSW_PERMANENT |
+                             INET_PROTOSW_ICSK,
         },
 
         {
index 035ad2c9e1bad3cdc9fd1382004bfcca2da966eb..aed537fa2c88507440c68daf87076c6a56332cb6 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/crypto.h>
 #include <linux/pfkeyv2.h>
 #include <net/icmp.h>
+#include <net/protocol.h>
 #include <asm/scatterlist.h>
 
 
index b425748f02d7cbc1a088fcfb4bcecb1e68fc34cf..37432088fe6d3d97c353d6491d31e6bd404d7862 100644 (file)
@@ -86,6 +86,7 @@
 #include <linux/in.h>
 #include <linux/mm.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/fddidevice.h>
index 4ec4b2ca6ab15440eabc8f9e22b80a592d0067d1..7b9bb28e2ee9587a7c287f616f36f93d80b2b7cb 100644 (file)
@@ -58,6 +58,7 @@
 #endif
 #include <linux/kmod.h>
 
+#include <net/arp.h>
 #include <net/ip.h>
 #include <net/route.h>
 #include <net/ip_fib.h>
@@ -234,7 +235,10 @@ 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;
+       struct in_ifaddr *ifa, *ifa1 = *ifap;
+       struct in_ifaddr *last_prim = in_dev->ifa_list;
+       struct in_ifaddr *prev_prom = NULL;
+       int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
 
        ASSERT_RTNL();
 
@@ -243,18 +247,22 @@ static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
         **/
 
        if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
-               struct in_ifaddr *ifa;
                struct in_ifaddr **ifap1 = &ifa1->ifa_next;
 
                while ((ifa = *ifap1) != NULL) {
+                       if (!(ifa->ifa_flags & IFA_F_SECONDARY) && 
+                           ifa1->ifa_scope <= ifa->ifa_scope)
+                               last_prim = ifa;
+
                        if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
                            ifa1->ifa_mask != ifa->ifa_mask ||
                            !inet_ifa_match(ifa1->ifa_address, ifa)) {
                                ifap1 = &ifa->ifa_next;
+                               prev_prom = ifa;
                                continue;
                        }
 
-                       if (!IN_DEV_PROMOTE_SECONDARIES(in_dev)) {
+                       if (!do_promote) {
                                *ifap1 = ifa->ifa_next;
 
                                rtmsg_ifa(RTM_DELADDR, ifa);
@@ -283,18 +291,31 @@ static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
         */
        rtmsg_ifa(RTM_DELADDR, ifa1);
        notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
-       if (destroy) {
-               inet_free_ifa(ifa1);
 
-               if (!in_dev->ifa_list)
-                       inetdev_destroy(in_dev);
-       }
+       if (promote) {
+
+               if (prev_prom) {
+                       prev_prom->ifa_next = promote->ifa_next;
+                       promote->ifa_next = last_prim->ifa_next;
+                       last_prim->ifa_next = promote;
+               }
 
-       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);
+               for (ifa = promote->ifa_next; ifa; ifa = ifa->ifa_next) {
+                       if (ifa1->ifa_mask != ifa->ifa_mask ||
+                           !inet_ifa_match(ifa1->ifa_address, ifa))
+                                       continue;
+                       fib_add_ifaddr(ifa);
+               }
+
+       }
+       if (destroy) {
+               inet_free_ifa(ifa1);
+
+               if (!in_dev->ifa_list)
+                       inetdev_destroy(in_dev);
        }
 }
 
index 1b18ce66e7b7ac1781c8c334c9f44d3dbac017a2..73bfcae8af9c367b3d88ffdf9f8e14afa476e927 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/pfkeyv2.h>
 #include <linux/random.h>
 #include <net/icmp.h>
+#include <net/protocol.h>
 #include <net/udp.h>
 
 /* decapsulation data for use when post-processing */
index 2267c1fad879f6d047d86a52d572b270d3af5af0..18f5e509281a29f2b52e296a7622bc7d934c45c9 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/errno.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/skbuff.h>
@@ -407,7 +408,7 @@ static void fib_magic(int cmd, int type, u32 dst, int dst_len, struct in_ifaddr
                tb->tb_delete(tb, &req.rtm, &rta, &req.nlh, NULL);
 }
 
-static void fib_add_ifaddr(struct in_ifaddr *ifa)
+void fib_add_ifaddr(struct in_ifaddr *ifa)
 {
        struct in_device *in_dev = ifa->ifa_dev;
        struct net_device *dev = in_dev->dev;
@@ -544,12 +545,16 @@ 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);
+       skb = skb_dequeue(&sk->sk_receive_queue);
        nlh = (struct nlmsghdr *)skb->data;
+       if (skb->len < NLMSG_SPACE(0) || skb->len < nlh->nlmsg_len ||
+           nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*frn))) {
+               kfree_skb(skb);
+               return;
+       }
        
        frn = (struct fib_result_nl *) NLMSG_DATA(nlh);
        tb = fib_get_table(frn->tb_id_in);
index 2a8c9afc3695d88a673e2f35cba900d0aa63c409..e2890ec8159ec39edabd8e9d463c20aa88defdaa 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/errno.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/proc_fs.h>
@@ -975,7 +976,7 @@ static void fib_seq_stop(struct seq_file *seq, void *v)
 
 static unsigned fib_flag_trans(int type, u32 mask, struct fib_info *fi)
 {
-       static unsigned type2flags[RTN_MAX + 1] = {
+       static const unsigned type2flags[RTN_MAX + 1] = {
                [7] = RTF_REJECT, [8] = RTF_REJECT,
        };
        unsigned flags = type2flags[type];
index 0b298bbc1518139d4dec18e6a8ebed9eb99a020e..0dd4d06e456d7e3d56ee44482db85e882ff2e1c7 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/errno.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/proc_fs.h>
index 186f20c4a45e06a65cfaee8cbfba41ab00dfbf00..ef4724de7350ad3ccf613b19a55afe4c662b0ab7 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/errno.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/proc_fs.h>
@@ -36,6 +37,7 @@
 #include <linux/netlink.h>
 #include <linux/init.h>
 
+#include <net/arp.h>
 #include <net/ip.h>
 #include <net/protocol.h>
 #include <net/route.h>
@@ -83,7 +85,7 @@ for (nhsel=0; nhsel < 1; nhsel++)
 #define endfor_nexthops(fi) }
 
 
-static struct 
+static const struct 
 {
        int     error;
        u8      scope;
index 66247f38b3716193637ab4c79020e22d9f65e1dd..e320b32373e5703edac6e7b7f9e2c3310100cd1b 100644 (file)
  *             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.
+ *
+ * Substantial contributions to this work comes from:
+ *
+ *             David S. Miller, <davem@davemloft.net>
+ *             Stephen Hemminger <shemminger@osdl.org>
+ *             Paul E. McKenney <paulmck@us.ibm.com>
+ *             Patrick McHardy <kaber@trash.net>
  */
 
 #define VERSION "0.404"
@@ -59,6 +66,7 @@
 #include <linux/errno.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/proc_fs.h>
@@ -2378,6 +2386,7 @@ static unsigned fib_flag_trans(int type, u32 mask, const struct fib_info *fi)
  */
 static int fib_route_seq_show(struct seq_file *seq, void *v)
 {
+       const struct fib_trie_iter *iter = seq->private;
        struct leaf *l = v;
        int i;
        char bf[128];
@@ -2389,6 +2398,8 @@ static int fib_route_seq_show(struct seq_file *seq, void *v)
                return 0;
        }
 
+       if (iter->trie == trie_local)
+               return 0;
        if (IS_TNODE(l))
                return 0;
 
index e3eceecd0496eeb752964ee276bdc2e0c79e4de3..be5a519cd2f8737c12659dbd2b76ee480a11eb68 100644 (file)
@@ -73,6 +73,7 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/string.h>
 #include <linux/netfilter_ipv4.h>
@@ -220,7 +221,7 @@ struct icmp_control {
        short   error;          /* This ICMP is classed as an error message */
 };
 
-static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
+static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
 
 /*
  *     The ICMP socket(s). This is the most convenient way to flow control
@@ -994,7 +995,7 @@ error:
 /*
  *     This table is the definition of how we handle ICMP.
  */
-static struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
+static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
        [ICMP_ECHOREPLY] = {
                .output_entry = ICMP_MIB_OUTECHOREPS,
                .input_entry = ICMP_MIB_INECHOREPS,
index c04607b49212ec538499eee7340374427b25379b..34758118c10ca4a791ab80764b003bec60f50707 100644 (file)
@@ -91,6 +91,8 @@
 #include <linux/if_arp.h>
 #include <linux/rtnetlink.h>
 #include <linux/times.h>
+
+#include <net/arp.h>
 #include <net/ip.h>
 #include <net/protocol.h>
 #include <net/route.h>
@@ -897,7 +899,10 @@ int igmp_rcv(struct sk_buff *skb)
                /* Is it our report looped back? */
                if (((struct rtable*)skb->dst)->fl.iif == 0)
                        break;
-               igmp_heard_report(in_dev, ih->group);
+               /* don't rely on MC router hearing unicast reports */
+               if (skb->pkt_type == PACKET_MULTICAST ||
+                   skb->pkt_type == PACKET_BROADCAST)
+                       igmp_heard_report(in_dev, ih->group);
                break;
        case IGMP_PIM:
 #ifdef CONFIG_IP_PIMSM_V1
index 3fe021f1a566ad40353fa8a92e1c6d049409a7ad..ae20281d8deb085e58eec67def12fef96da3b1fd 100644 (file)
@@ -37,7 +37,8 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg);
  */
 int sysctl_local_port_range[2] = { 1024, 4999 };
 
-static inline int inet_csk_bind_conflict(struct sock *sk, struct inet_bind_bucket *tb)
+int inet_csk_bind_conflict(const struct sock *sk,
+                          const struct inet_bind_bucket *tb)
 {
        const u32 sk_rcv_saddr = inet_rcv_saddr(sk);
        struct sock *sk2;
@@ -62,11 +63,15 @@ static inline int inet_csk_bind_conflict(struct sock *sk, struct inet_bind_bucke
        return node != NULL;
 }
 
+EXPORT_SYMBOL_GPL(inet_csk_bind_conflict);
+
 /* Obtain a reference to a local port for the given sock,
  * if snum is zero it means select any available local port.
  */
 int inet_csk_get_port(struct inet_hashinfo *hashinfo,
-                     struct sock *sk, unsigned short snum)
+                     struct sock *sk, unsigned short snum,
+                     int (*bind_conflict)(const struct sock *sk,
+                                          const struct inet_bind_bucket *tb))
 {
        struct inet_bind_hashbucket *head;
        struct hlist_node *node;
@@ -125,7 +130,7 @@ tb_found:
                        goto success;
                } else {
                        ret = 1;
-                       if (inet_csk_bind_conflict(sk, tb))
+                       if (bind_conflict(sk, tb))
                                goto fail_unlock;
                }
        }
@@ -380,7 +385,7 @@ struct request_sock *inet_csk_search_req(const struct sock *sk,
 EXPORT_SYMBOL_GPL(inet_csk_search_req);
 
 void inet_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
-                                  const unsigned timeout)
+                                  unsigned long timeout)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt;
@@ -631,3 +636,15 @@ void inet_csk_listen_stop(struct sock *sk)
 }
 
 EXPORT_SYMBOL_GPL(inet_csk_listen_stop);
+
+void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr)
+{
+       struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
+       const struct inet_sock *inet = inet_sk(sk);
+
+       sin->sin_family         = AF_INET;
+       sin->sin_addr.s_addr    = inet->daddr;
+       sin->sin_port           = inet->dport;
+}
+
+EXPORT_SYMBOL_GPL(inet_csk_addr2sockaddr);
index 39061ed53cfdd2471f2293a2e44c8a76109f478d..c49908192047032d035cd75b531e9784896b0466 100644 (file)
@@ -112,12 +112,12 @@ static int inet_diag_fill(struct sk_buff *skb, struct sock *sk,
                r->idiag_inode = 0;
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
                if (r->idiag_family == AF_INET6) {
-                       const struct tcp6_timewait_sock *tcp6tw = tcp6_twsk(sk);
+                       const struct inet6_timewait_sock *tw6 = inet6_twsk(sk);
 
                        ipv6_addr_copy((struct in6_addr *)r->id.idiag_src,
-                                      &tcp6tw->tw_v6_rcv_saddr);
+                                      &tw6->tw_v6_rcv_saddr);
                        ipv6_addr_copy((struct in6_addr *)r->id.idiag_dst,
-                                      &tcp6tw->tw_v6_daddr);
+                                      &tw6->tw_v6_daddr);
                }
 #endif
                nlh->nlmsg_len = skb->tail - b;
@@ -489,9 +489,9 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
        if (r->idiag_family == AF_INET6) {
                ipv6_addr_copy((struct in6_addr *)r->id.idiag_src,
-                              &tcp6_rsk(req)->loc_addr);
+                              &inet6_rsk(req)->loc_addr);
                ipv6_addr_copy((struct in6_addr *)r->id.idiag_dst,
-                              &tcp6_rsk(req)->rmt_addr);
+                              &inet6_rsk(req)->rmt_addr);
        }
 #endif
        nlh->nlmsg_len = skb->tail - b;
@@ -553,13 +553,13 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk,
                                entry.saddr =
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
                                        (entry.family == AF_INET6) ?
-                                       tcp6_rsk(req)->loc_addr.s6_addr32 :
+                                       inet6_rsk(req)->loc_addr.s6_addr32 :
 #endif
                                        &ireq->loc_addr;
                                entry.daddr = 
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
                                        (entry.family == AF_INET6) ?
-                                       tcp6_rsk(req)->rmt_addr.s6_addr32 :
+                                       inet6_rsk(req)->rmt_addr.s6_addr32 :
 #endif
                                        &ireq->rmt_addr;
                                entry.dport = ntohs(ireq->rmt_port);
index e8d29fe736d29ade84886500ec61bab103a54ceb..33228115cda43725481b4882a060f84b445b776b 100644 (file)
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/random.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/wait.h>
 
 #include <net/inet_connection_sock.h>
 #include <net/inet_hashtables.h>
+#include <net/ip.h>
 
 /*
  * Allocate and initialize a new local port bind bucket.
@@ -163,3 +165,179 @@ struct sock *__inet_lookup_listener(const struct hlist_head *head, const u32 dad
 }
 
 EXPORT_SYMBOL_GPL(__inet_lookup_listener);
+
+/* called with local bh disabled */
+static int __inet_check_established(struct inet_timewait_death_row *death_row,
+                                   struct sock *sk, __u16 lport,
+                                   struct inet_timewait_sock **twp)
+{
+       struct inet_hashinfo *hinfo = death_row->hashinfo;
+       struct inet_sock *inet = inet_sk(sk);
+       u32 daddr = inet->rcv_saddr;
+       u32 saddr = inet->daddr;
+       int dif = sk->sk_bound_dev_if;
+       INET_ADDR_COOKIE(acookie, saddr, daddr)
+       const __u32 ports = INET_COMBINED_PORTS(inet->dport, lport);
+       unsigned int hash = inet_ehashfn(daddr, lport, saddr, inet->dport);
+       struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash);
+       struct sock *sk2;
+       const struct hlist_node *node;
+       struct inet_timewait_sock *tw;
+
+       prefetch(head->chain.first);
+       write_lock(&head->lock);
+
+       /* Check TIME-WAIT sockets first. */
+       sk_for_each(sk2, node, &(head + hinfo->ehash_size)->chain) {
+               tw = inet_twsk(sk2);
+
+               if (INET_TW_MATCH(sk2, hash, acookie, saddr, daddr, ports, dif)) {
+                       if (twsk_unique(sk, sk2, twp))
+                               goto unique;
+                       else
+                               goto not_unique;
+               }
+       }
+       tw = NULL;
+
+       /* And established part... */
+       sk_for_each(sk2, node, &head->chain) {
+               if (INET_MATCH(sk2, hash, acookie, saddr, daddr, ports, dif))
+                       goto not_unique;
+       }
+
+unique:
+       /* Must record num and sport now. Otherwise we will see
+        * in hash table socket with a funny identity. */
+       inet->num = lport;
+       inet->sport = htons(lport);
+       sk->sk_hash = hash;
+       BUG_TRAP(sk_unhashed(sk));
+       __sk_add_node(sk, &head->chain);
+       sock_prot_inc_use(sk->sk_prot);
+       write_unlock(&head->lock);
+
+       if (twp) {
+               *twp = tw;
+               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
+       } else if (tw) {
+               /* Silly. Should hash-dance instead... */
+               inet_twsk_deschedule(tw, death_row);
+               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
+
+               inet_twsk_put(tw);
+       }
+
+       return 0;
+
+not_unique:
+       write_unlock(&head->lock);
+       return -EADDRNOTAVAIL;
+}
+
+static inline u32 inet_sk_port_offset(const struct sock *sk)
+{
+       const struct inet_sock *inet = inet_sk(sk);
+       return secure_ipv4_port_ephemeral(inet->rcv_saddr, inet->daddr, 
+                                         inet->dport);
+}
+
+/*
+ * Bind a port for a connect operation and hash it.
+ */
+int inet_hash_connect(struct inet_timewait_death_row *death_row,
+                     struct sock *sk)
+{
+       struct inet_hashinfo *hinfo = death_row->hashinfo;
+       const unsigned short snum = inet_sk(sk)->num;
+       struct inet_bind_hashbucket *head;
+       struct inet_bind_bucket *tb;
+       int ret;
+
+       if (!snum) {
+               int low = sysctl_local_port_range[0];
+               int high = sysctl_local_port_range[1];
+               int range = high - low;
+               int i;
+               int port;
+               static u32 hint;
+               u32 offset = hint + inet_sk_port_offset(sk);
+               struct hlist_node *node;
+               struct inet_timewait_sock *tw = NULL;
+
+               local_bh_disable();
+               for (i = 1; i <= range; i++) {
+                       port = low + (i + offset) % range;
+                       head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
+                       spin_lock(&head->lock);
+
+                       /* Does not bother with rcv_saddr checks,
+                        * because the established check is already
+                        * unique enough.
+                        */
+                       inet_bind_bucket_for_each(tb, node, &head->chain) {
+                               if (tb->port == port) {
+                                       BUG_TRAP(!hlist_empty(&tb->owners));
+                                       if (tb->fastreuse >= 0)
+                                               goto next_port;
+                                       if (!__inet_check_established(death_row,
+                                                                     sk, port,
+                                                                     &tw))
+                                               goto ok;
+                                       goto next_port;
+                               }
+                       }
+
+                       tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep, head, port);
+                       if (!tb) {
+                               spin_unlock(&head->lock);
+                               break;
+                       }
+                       tb->fastreuse = -1;
+                       goto ok;
+
+               next_port:
+                       spin_unlock(&head->lock);
+               }
+               local_bh_enable();
+
+               return -EADDRNOTAVAIL;
+
+ok:
+               hint += i;
+
+               /* Head lock still held and bh's disabled */
+               inet_bind_hash(sk, tb, port);
+               if (sk_unhashed(sk)) {
+                       inet_sk(sk)->sport = htons(port);
+                       __inet_hash(hinfo, sk, 0);
+               }
+               spin_unlock(&head->lock);
+
+               if (tw) {
+                       inet_twsk_deschedule(tw, death_row);;
+                       inet_twsk_put(tw);
+               }
+
+               ret = 0;
+               goto out;
+       }
+
+       head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
+       tb  = inet_csk(sk)->icsk_bind_hash;
+       spin_lock_bh(&head->lock);
+       if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
+               __inet_hash(hinfo, sk, 0);
+               spin_unlock_bh(&head->lock);
+               return 0;
+       } else {
+               spin_unlock(&head->lock);
+               /* No definite answer... Walk to established hash table */
+               ret = __inet_check_established(death_row, sk, snum, NULL);
+out:
+               local_bh_enable();
+               return ret;
+       }
+}
+
+EXPORT_SYMBOL_GPL(inet_hash_connect);
index a010e9a68811cf325f75b6b894849cd2a58303cc..417f126c749e0539d335ee7c3e1c3a35a516a124 100644 (file)
@@ -90,8 +90,9 @@ EXPORT_SYMBOL_GPL(__inet_twsk_hashdance);
 
 struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int state)
 {
-       struct inet_timewait_sock *tw = kmem_cache_alloc(sk->sk_prot_creator->twsk_slab,
-                                                        SLAB_ATOMIC);
+       struct inet_timewait_sock *tw =
+               kmem_cache_alloc(sk->sk_prot_creator->twsk_prot->twsk_slab,
+                                SLAB_ATOMIC);
        if (tw != NULL) {
                const struct inet_sock *inet = inet_sk(sk);
 
index 2fc3fd38924f21844bd82841148db79fa491e884..ce5fe3f74a3d868cc68a3a395e7685c0608bbbd0 100644 (file)
@@ -401,6 +401,7 @@ struct inet_peer *inet_getpeer(__u32 daddr, int create)
                return NULL;
        n->v4daddr = daddr;
        atomic_set(&n->refcnt, 1);
+       atomic_set(&n->rid, 0);
        n->ip_id_count = secure_ip_id(daddr);
        n->tcp_ts_stamp = 0;
 
index 8ce0ce2ee48e1d75308aaa3711b23989a4a07214..ce2b70ce4018dffdbb6842ad6b47129f5209a75c 100644 (file)
@@ -22,6 +22,7 @@
  *             Patrick McHardy :       LRU queue of frag heads for evictor.
  */
 
+#include <linux/compiler.h>
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
@@ -38,6 +39,7 @@
 #include <net/ip.h>
 #include <net/icmp.h>
 #include <net/checksum.h>
+#include <net/inetpeer.h>
 #include <linux/tcp.h>
 #include <linux/udp.h>
 #include <linux/inet.h>
@@ -56,6 +58,8 @@
 int sysctl_ipfrag_high_thresh = 256*1024;
 int sysctl_ipfrag_low_thresh = 192*1024;
 
+int sysctl_ipfrag_max_dist = 64;
+
 /* Important NOTE! Fragment queue must be destroyed before MSL expires.
  * RFC791 is wrong proposing to prolongate timer each fragment arrival by TTL.
  */
@@ -89,8 +93,10 @@ struct ipq {
        spinlock_t      lock;
        atomic_t        refcnt;
        struct timer_list timer;        /* when will this queue expire?         */
-       int             iif;
        struct timeval  stamp;
+       int             iif;
+       unsigned int    rid;
+       struct inet_peer *peer;
 };
 
 /* Hash table. */
@@ -195,6 +201,9 @@ static void ip_frag_destroy(struct ipq *qp, int *work)
        BUG_TRAP(qp->last_in&COMPLETE);
        BUG_TRAP(del_timer(&qp->timer) == 0);
 
+       if (qp->peer)
+               inet_putpeer(qp->peer);
+
        /* Release all fragment data. */
        fp = qp->fragments;
        while (fp) {
@@ -353,6 +362,7 @@ static struct ipq *ip_frag_create(unsigned hash, struct iphdr *iph, u32 user)
        qp->meat = 0;
        qp->fragments = NULL;
        qp->iif = 0;
+       qp->peer = sysctl_ipfrag_max_dist ? inet_getpeer(iph->saddr, 1) : NULL;
 
        /* Initialize a timer for this entry. */
        init_timer(&qp->timer);
@@ -398,6 +408,56 @@ static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
        return ip_frag_create(hash, iph, user);
 }
 
+/* Is the fragment too far ahead to be part of ipq? */
+static inline int ip_frag_too_far(struct ipq *qp)
+{
+       struct inet_peer *peer = qp->peer;
+       unsigned int max = sysctl_ipfrag_max_dist;
+       unsigned int start, end;
+
+       int rc;
+
+       if (!peer || !max)
+               return 0;
+
+       start = qp->rid;
+       end = atomic_inc_return(&peer->rid);
+       qp->rid = end;
+
+       rc = qp->fragments && (end - start) > max;
+
+       if (rc) {
+               IP_INC_STATS_BH(IPSTATS_MIB_REASMFAILS);
+       }
+
+       return rc;
+}
+
+static int ip_frag_reinit(struct ipq *qp)
+{
+       struct sk_buff *fp;
+
+       if (!mod_timer(&qp->timer, jiffies + sysctl_ipfrag_time)) {
+               atomic_inc(&qp->refcnt);
+               return -ETIMEDOUT;
+       }
+
+       fp = qp->fragments;
+       do {
+               struct sk_buff *xp = fp->next;
+               frag_kfree_skb(fp, NULL);
+               fp = xp;
+       } while (fp);
+
+       qp->last_in = 0;
+       qp->len = 0;
+       qp->meat = 0;
+       qp->fragments = NULL;
+       qp->iif = 0;
+
+       return 0;
+}
+
 /* Add new segment to existing queue. */
 static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
 {
@@ -408,6 +468,12 @@ static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
        if (qp->last_in & COMPLETE)
                goto err;
 
+       if (!(IPCB(skb)->flags & IPSKB_FRAG_COMPLETE) &&
+           unlikely(ip_frag_too_far(qp)) && unlikely(ip_frag_reinit(qp))) {
+               ipq_kill(qp);
+               goto err;
+       }
+
        offset = ntohs(skb->nh.iph->frag_off);
        flags = offset & ~IP_OFFSET;
        offset &= IP_OFFSET;
index 4e9c74b54b150b3cec895023b2489d104866c710..46f9d9cf7a5f41b64c0d2a9e68d8ab19be8e14c5 100644 (file)
@@ -618,7 +618,7 @@ static int ipgre_rcv(struct sk_buff *skb)
 
                skb->mac.raw = skb->nh.raw;
                skb->nh.raw = __pskb_pull(skb, offset);
-               skb_postpull_rcsum(skb, skb->mac.raw, offset);
+               skb_postpull_rcsum(skb, skb->h.raw, offset);
                memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
                skb->pkt_type = PACKET_HOST;
 #ifdef CONFIG_NET_IPGRE_BROADCAST
@@ -1217,7 +1217,7 @@ static int ipgre_tunnel_init(struct net_device *dev)
        return 0;
 }
 
-int __init ipgre_fb_tunnel_init(struct net_device *dev)
+static int __init ipgre_fb_tunnel_init(struct net_device *dev)
 {
        struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv;
        struct iphdr *iph = &tunnel->parms.iph;
index 473d0f2b2e0d6b5a4252f7c825ea870a2afc2c91..e45846ae570bba9c3b3da568e5e8b7e46598e7f3 100644 (file)
 #include <linux/sockios.h>
 #include <linux/in.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 
index dbe12da8d8b3960fe7dc796de97eae2546e1528d..d3f6c468faf43ac20e4a8e56e1d5325ca96f14e0 100644 (file)
@@ -22,6 +22,7 @@
 #include <net/sock.h>
 #include <net/ip.h>
 #include <net/icmp.h>
+#include <net/route.h>
 
 /* 
  * Write options to IP header, record destination address to
index 11c2f68254f0a8a04602222216a03578c0327d20..2a830de3a6993cf47bf42d60c8ea409f3baaab7d 100644 (file)
@@ -445,6 +445,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
 
        hlen = iph->ihl * 4;
        mtu = dst_mtu(&rt->u.dst) - hlen;       /* Size of data space */
+       IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE;
 
        /* When frag_list is given, use it. First, check its validity:
         * some transformers could create wrong frag_list or break existing
@@ -690,7 +691,7 @@ csum_page(struct page *page, int offset, int copy)
        return csum;
 }
 
-inline int ip_ufo_append_data(struct sock *sk,
+static inline int ip_ufo_append_data(struct sock *sk,
                        int getfrag(void *from, char *to, int offset, int len,
                               int odd, struct sk_buff *skb),
                        void *from, int length, int hh_len, int fragheaderlen,
index 4f2d8725730958f498b3d319c9e3dca68cd50722..6986e11d65cca0fb6f94383076e902ac8eb23a78 100644 (file)
 #include <linux/skbuff.h>
 #include <linux/ip.h>
 #include <linux/icmp.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <net/sock.h>
 #include <net/ip.h>
 #include <net/icmp.h>
-#include <net/tcp.h>
-#include <linux/tcp.h>
+#include <net/tcp_states.h>
 #include <linux/udp.h>
 #include <linux/igmp.h>
 #include <linux/netfilter.h>
@@ -427,8 +427,8 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
                        err = ip_options_get_from_user(&opt, optval, optlen);
                        if (err)
                                break;
-                       if (sk->sk_type == SOCK_STREAM) {
-                               struct tcp_sock *tp = tcp_sk(sk);
+                       if (inet->is_icsk) {
+                               struct inet_connection_sock *icsk = inet_csk(sk);
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                                if (sk->sk_family == PF_INET ||
                                    (!((1 << sk->sk_state) &
@@ -436,10 +436,10 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
                                     inet->daddr != LOOPBACK4_IPV6)) {
 #endif
                                        if (inet->opt)
-                                               tp->ext_header_len -= inet->opt->optlen;
+                                               icsk->icsk_ext_hdr_len -= inet->opt->optlen;
                                        if (opt)
-                                               tp->ext_header_len += opt->optlen;
-                                       tcp_sync_mss(sk, tp->pmtu_cookie);
+                                               icsk->icsk_ext_hdr_len += opt->optlen;
+                                       icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                                }
 #endif
index fc718df17b40d9b1a0719d39798331cf30a2fca3..d64e2ec8da7b454f0bd6bc273c9b4fde707fcb9e 100644 (file)
@@ -28,6 +28,7 @@
 #include <net/xfrm.h>
 #include <net/icmp.h>
 #include <net/ipcomp.h>
+#include <net/protocol.h>
 
 struct ipcomp_tfms {
        struct list_head list;
index e8674baaa8d99034ee0d56a7fdbdfc66d205abf6..bb3613ec448c59438158fbf72c95116810fbd659 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/in.h>
 #include <linux/if.h>
 #include <linux/inet.h>
+#include <linux/inetdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/skbuff.h>
@@ -58,6 +59,7 @@
 #include <net/arp.h>
 #include <net/ip.h>
 #include <net/ipconfig.h>
+#include <net/route.h>
 
 #include <asm/uaccess.h>
 #include <net/checksum.h>
index 302b7eb507c97ebae6365f6b99122650174e95b5..caa3b7d2e48a04db0b05b08c0df3e357f8cb7386 100644 (file)
@@ -52,6 +52,7 @@
 #include <net/ip.h>
 #include <net/protocol.h>
 #include <linux/skbuff.h>
+#include <net/route.h>
 #include <net/sock.h>
 #include <net/icmp.h>
 #include <net/udp.h>
index d7eb680101c25311233b9195faedca1aa17d812b..9b176a942ac519f1b24b4953e375707d7e709029 100644 (file)
@@ -224,34 +224,6 @@ void unregister_ip_vs_app(struct ip_vs_app *app)
 }
 
 
-#if 0000
-/*
- *     Get reference to app by name (called from user context)
- */
-struct ip_vs_app *ip_vs_app_get_by_name(char *appname)
-{
-       struct ip_vs_app *app, *a = NULL;
-
-       down(&__ip_vs_app_mutex);
-
-       list_for_each_entry(ent, &ip_vs_app_list, a_list) {
-               if (strcmp(app->name, appname))
-                       continue;
-
-               /* softirq may call ip_vs_app_get too, so the caller
-                  must disable softirq on the current CPU */
-               if (ip_vs_app_get(app))
-                       a = app;
-               break;
-       }
-
-       up(&__ip_vs_app_mutex);
-
-       return a;
-}
-#endif
-
-
 /*
  *     Bind ip_vs_conn to its ip_vs_app (called by cp constructor)
  */
index f828fa2eb7dea154ff534e342fc75cdf8217b1ba..81d90354c92828513866092eff1f23f63b134927 100644 (file)
  *
  */
 
+#include <linux/in.h>
+#include <linux/net.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/vmalloc.h>
 #include <linux/proc_fs.h>             /* for proc_net_* */
 #include <linux/seq_file.h>
@@ -219,7 +222,7 @@ struct ip_vs_conn *ip_vs_conn_in_get
        if (!cp && atomic_read(&ip_vs_conn_no_cport_cnt))
                cp = __ip_vs_conn_in_get(protocol, s_addr, 0, d_addr, d_port);
 
-       IP_VS_DBG(7, "lookup/in %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
+       IP_VS_DBG(9, "lookup/in %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
                  ip_vs_proto_name(protocol),
                  NIPQUAD(s_addr), ntohs(s_port),
                  NIPQUAD(d_addr), ntohs(d_port),
@@ -254,7 +257,7 @@ struct ip_vs_conn *ip_vs_ct_in_get
   out:
        ct_read_unlock(hash);
 
-       IP_VS_DBG(7, "template lookup/in %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
+       IP_VS_DBG(9, "template lookup/in %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
                  ip_vs_proto_name(protocol),
                  NIPQUAD(s_addr), ntohs(s_port),
                  NIPQUAD(d_addr), ntohs(d_port),
@@ -295,7 +298,7 @@ struct ip_vs_conn *ip_vs_conn_out_get
 
        ct_read_unlock(hash);
 
-       IP_VS_DBG(7, "lookup/out %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
+       IP_VS_DBG(9, "lookup/out %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
                  ip_vs_proto_name(protocol),
                  NIPQUAD(s_addr), ntohs(s_port),
                  NIPQUAD(d_addr), ntohs(d_port),
@@ -391,8 +394,9 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)
        cp->flags |= atomic_read(&dest->conn_flags);
        cp->dest = dest;
 
-       IP_VS_DBG(9, "Bind-dest %s c:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d "
-                 "d:%u.%u.%u.%u:%d fwd:%c s:%u flg:%X cnt:%d destcnt:%d\n",
+       IP_VS_DBG(7, "Bind-dest %s c:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d "
+                 "d:%u.%u.%u.%u:%d fwd:%c s:%u conn->flags:%X conn->refcnt:%d "
+                 "dest->refcnt:%d\n",
                  ip_vs_proto_name(cp->protocol),
                  NIPQUAD(cp->caddr), ntohs(cp->cport),
                  NIPQUAD(cp->vaddr), ntohs(cp->vport),
@@ -430,8 +434,9 @@ static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)
        if (!dest)
                return;
 
-       IP_VS_DBG(9, "Unbind-dest %s c:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d "
-                 "d:%u.%u.%u.%u:%d fwd:%c s:%u flg:%X cnt:%d destcnt:%d\n",
+       IP_VS_DBG(7, "Unbind-dest %s c:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d "
+                 "d:%u.%u.%u.%u:%d fwd:%c s:%u conn->flags:%X conn->refcnt:%d "
+                 "dest->refcnt:%d\n",
                  ip_vs_proto_name(cp->protocol),
                  NIPQUAD(cp->caddr), ntohs(cp->cport),
                  NIPQUAD(cp->vaddr), ntohs(cp->vport),
@@ -571,7 +576,7 @@ static void ip_vs_conn_expire(unsigned long data)
        ip_vs_conn_hash(cp);
 
   expire_later:
-       IP_VS_DBG(7, "delayed: refcnt-1=%d conn.n_control=%d\n",
+       IP_VS_DBG(7, "delayed: conn->refcnt-1=%d conn->n_control=%d\n",
                  atomic_read(&cp->refcnt)-1,
                  atomic_read(&cp->n_control));
 
@@ -771,7 +776,7 @@ static inline int todrop_entry(struct ip_vs_conn *cp)
         * The drop rate array needs tuning for real environments.
         * Called from timer bh only => no locking
         */
-       static char todrop_rate[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
+       static const char todrop_rate[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
        static char todrop_counter[9] = {0};
        int i;
 
index 1a0843cd58a9e40d84e03b003ed0984e16763edf..1aca94a9fd8b977ef877fb8e507e808eb8aa2de5 100644 (file)
@@ -426,7 +426,7 @@ ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
                return NULL;
 
        IP_VS_DBG(6, "Schedule fwd:%c c:%u.%u.%u.%u:%u v:%u.%u.%u.%u:%u "
-                 "d:%u.%u.%u.%u:%u flg:%X cnt:%d\n",
+                 "d:%u.%u.%u.%u:%u conn->flags:%X conn->refcnt:%d\n",
                  ip_vs_fwd_tag(cp),
                  NIPQUAD(cp->caddr), ntohs(cp->cport),
                  NIPQUAD(cp->vaddr), ntohs(cp->vport),
index 2d66848e7aa06bb75df50aad715d6c45837535e7..c935c5086d3351af11542845ebcd8371dfef91b0 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/netfilter_ipv4.h>
 
 #include <net/ip.h>
+#include <net/route.h>
 #include <net/sock.h>
 
 #include <asm/uaccess.h>
@@ -447,7 +448,7 @@ ip_vs_service_get(__u32 fwmark, __u16 protocol, __u32 vaddr, __u16 vport)
   out:
        read_unlock(&__ip_vs_svc_lock);
 
-       IP_VS_DBG(6, "lookup service: fwm %u %s %u.%u.%u.%u:%u %s\n",
+       IP_VS_DBG(9, "lookup service: fwm %u %s %u.%u.%u.%u:%u %s\n",
                  fwmark, ip_vs_proto_name(protocol),
                  NIPQUAD(vaddr), ntohs(vport),
                  svc?"hit":"not hit");
@@ -597,7 +598,7 @@ ip_vs_trash_get_dest(struct ip_vs_service *svc, __u32 daddr, __u16 dport)
         */
        list_for_each_entry_safe(dest, nxt, &ip_vs_dest_trash, n_list) {
                IP_VS_DBG(3, "Destination %u/%u.%u.%u.%u:%u still in trash, "
-                         "refcnt=%d\n",
+                         "dest->refcnt=%d\n",
                          dest->vfwmark,
                          NIPQUAD(dest->addr), ntohs(dest->port),
                          atomic_read(&dest->refcnt));
@@ -804,7 +805,7 @@ ip_vs_add_dest(struct ip_vs_service *svc, struct ip_vs_dest_user *udest)
        dest = ip_vs_trash_get_dest(svc, daddr, dport);
        if (dest != NULL) {
                IP_VS_DBG(3, "Get destination %u.%u.%u.%u:%u from trash, "
-                         "refcnt=%d, service %u/%u.%u.%u.%u:%u\n",
+                         "dest->refcnt=%d, service %u/%u.%u.%u.%u:%u\n",
                          NIPQUAD(daddr), ntohs(dport),
                          atomic_read(&dest->refcnt),
                          dest->vfwmark,
@@ -949,7 +950,8 @@ static void __ip_vs_del_dest(struct ip_vs_dest *dest)
                atomic_dec(&dest->svc->refcnt);
                kfree(dest);
        } else {
-               IP_VS_DBG(3, "Moving dest %u.%u.%u.%u:%u into trash, refcnt=%d\n",
+               IP_VS_DBG(3, "Moving dest %u.%u.%u.%u:%u into trash, "
+                         "dest->refcnt=%d\n",
                          NIPQUAD(dest->addr), ntohs(dest->port),
                          atomic_read(&dest->refcnt));
                list_add(&dest->n_list, &ip_vs_dest_trash);
@@ -1909,7 +1911,7 @@ static int ip_vs_set_timeout(struct ip_vs_timeout_user *u)
 #define DAEMON_ARG_LEN         (sizeof(struct ip_vs_daemon_user))
 #define MAX_ARG_LEN            SVCDEST_ARG_LEN
 
-static unsigned char set_arglen[SET_CMDID(IP_VS_SO_SET_MAX)+1] = {
+static const unsigned char set_arglen[SET_CMDID(IP_VS_SO_SET_MAX)+1] = {
        [SET_CMDID(IP_VS_SO_SET_ADD)]           = SERVICE_ARG_LEN,
        [SET_CMDID(IP_VS_SO_SET_EDIT)]          = SERVICE_ARG_LEN,
        [SET_CMDID(IP_VS_SO_SET_DEL)]           = SERVICE_ARG_LEN,
@@ -2180,7 +2182,7 @@ __ip_vs_get_timeouts(struct ip_vs_timeout_user *u)
 #define GET_TIMEOUT_ARG_LEN    (sizeof(struct ip_vs_timeout_user))
 #define GET_DAEMON_ARG_LEN     (sizeof(struct ip_vs_daemon_user) * 2)
 
-static unsigned char get_arglen[GET_CMDID(IP_VS_SO_GET_MAX)+1] = {
+static const unsigned char get_arglen[GET_CMDID(IP_VS_SO_GET_MAX)+1] = {
        [GET_CMDID(IP_VS_SO_GET_VERSION)]       = 64,
        [GET_CMDID(IP_VS_SO_GET_INFO)]          = GET_INFO_ARG_LEN,
        [GET_CMDID(IP_VS_SO_GET_SERVICES)]      = GET_SERVICES_ARG_LEN,
index f3bc320dce93a66e5902f4032d2ee05cf2a1f41f..9fee19c4c6179958f5ea5eb39c4a550e67b314ee 100644 (file)
  *
  */
 
+#include <linux/ip.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/skbuff.h>
 
 #include <net/ip_vs.h>
 
index 67b3e2fc1fa142afb5e0cfcf0e77480fd8caf09b..e7004741ac73ca0bd3b661c436e2de54b03a380d 100644 (file)
  * Changes:
  *
  */
+#include <linux/config.h>
 #include <linux/kernel.h>
+#include <linux/jiffies.h>
+#include <linux/slab.h>
 #include <linux/types.h>
 
 #include <net/ip_vs.h>
index 561cda326fa8092cf2b27da87cac78d68cded80e..6e5cb92a5c83b114d4751093f13e6691c323a15f 100644 (file)
  * me to write this module.
  */
 
+#include <linux/ip.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/skbuff.h>
 
 /* for sysctl */
 #include <linux/fs.h>
@@ -228,33 +230,6 @@ ip_vs_lblc_hash(struct ip_vs_lblc_table *tbl, struct ip_vs_lblc_entry *en)
 }
 
 
-#if 0000
-/*
- *     Unhash ip_vs_lblc_entry from ip_vs_lblc_table.
- *     returns bool success.
- */
-static int ip_vs_lblc_unhash(struct ip_vs_lblc_table *tbl,
-                            struct ip_vs_lblc_entry *en)
-{
-       if (list_empty(&en->list)) {
-               IP_VS_ERR("ip_vs_lblc_unhash(): request for not hashed entry, "
-                         "called from %p\n", __builtin_return_address(0));
-               return 0;
-       }
-
-       /*
-        * Remove it from the table
-        */
-       write_lock(&tbl->lock);
-       list_del(&en->list);
-       INIT_LIST_HEAD(&en->list);
-       write_unlock(&tbl->lock);
-
-       return 1;
-}
-#endif
-
-
 /*
  *  Get ip_vs_lblc_entry associated with supplied parameters.
  */
index ce456dbf09a54967c4edde5d648ffd3661e400a1..32ba37ba72d855cadbd92979df7edf1734f388ca 100644 (file)
  *
  */
 
+#include <linux/ip.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/skbuff.h>
 
 /* for sysctl */
 #include <linux/fs.h>
@@ -414,33 +416,6 @@ ip_vs_lblcr_hash(struct ip_vs_lblcr_table *tbl, struct ip_vs_lblcr_entry *en)
 }
 
 
-#if 0000
-/*
- *     Unhash ip_vs_lblcr_entry from ip_vs_lblcr_table.
- *     returns bool success.
- */
-static int ip_vs_lblcr_unhash(struct ip_vs_lblcr_table *tbl,
-                            struct ip_vs_lblcr_entry *en)
-{
-       if (list_empty(&en->list)) {
-               IP_VS_ERR("ip_vs_lblcr_unhash(): request for not hashed entry, "
-                         "called from %p\n", __builtin_return_address(0));
-               return 0;
-       }
-
-       /*
-        * Remove it from the table
-        */
-       write_lock(&tbl->lock);
-       list_del(&en->list);
-       INIT_LIST_HEAD(&en->list);
-       write_unlock(&tbl->lock);
-
-       return 1;
-}
-#endif
-
-
 /*
  *  Get ip_vs_lblcr_entry associated with supplied parameters.
  */
index 453e94a0bbd7330cb58d26dcb607260751d46770..8b0505b093170af4839c0bba98d115b552772d0a 100644 (file)
@@ -12,6 +12,8 @@
  *
  */
 
+#include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/netfilter.h>
index 478e5c7c7e8e1801fb010ebf7055c10c709434c0..c36ccf057a19fe53942de7a387b7c328fcd24664 100644 (file)
@@ -12,6 +12,8 @@
  *
  */
 
+#include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/netfilter.h>
index c19408973c091d12bb5d4e850c37af7aa3b64e37..bc28b1160a3aad85c93ee520f5c6a3ce660b7bf0 100644 (file)
@@ -251,7 +251,7 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
 #define TCP_DIR_OUTPUT         4
 #define TCP_DIR_INPUT_ONLY     8
 
-static int tcp_state_off[IP_VS_DIR_LAST] = {
+static const int tcp_state_off[IP_VS_DIR_LAST] = {
        [IP_VS_DIR_INPUT]               =       TCP_DIR_INPUT,
        [IP_VS_DIR_OUTPUT]              =       TCP_DIR_OUTPUT,
        [IP_VS_DIR_INPUT_ONLY]          =       TCP_DIR_INPUT_ONLY,
@@ -275,28 +275,6 @@ static int tcp_timeouts[IP_VS_TCP_S_LAST+1] = {
        [IP_VS_TCP_S_LAST]              =       2*HZ,
 };
 
-
-#if 0
-
-/* FIXME: This is going to die */
-
-static int tcp_timeouts_dos[IP_VS_TCP_S_LAST+1] = {
-       [IP_VS_TCP_S_NONE]              =       2*HZ,
-       [IP_VS_TCP_S_ESTABLISHED]       =       8*60*HZ,
-       [IP_VS_TCP_S_SYN_SENT]          =       60*HZ,
-       [IP_VS_TCP_S_SYN_RECV]          =       10*HZ,
-       [IP_VS_TCP_S_FIN_WAIT]          =       60*HZ,
-       [IP_VS_TCP_S_TIME_WAIT]         =       60*HZ,
-       [IP_VS_TCP_S_CLOSE]             =       10*HZ,
-       [IP_VS_TCP_S_CLOSE_WAIT]        =       60*HZ,
-       [IP_VS_TCP_S_LAST_ACK]          =       30*HZ,
-       [IP_VS_TCP_S_LISTEN]            =       2*60*HZ,
-       [IP_VS_TCP_S_SYNACK]            =       100*HZ,
-       [IP_VS_TCP_S_LAST]              =       2*HZ,
-};
-
-#endif
-
 static char * tcp_state_name_table[IP_VS_TCP_S_LAST+1] = {
        [IP_VS_TCP_S_NONE]              =       "NONE",
        [IP_VS_TCP_S_ESTABLISHED]       =       "ESTABLISHED",
@@ -448,7 +426,7 @@ set_tcp_state(struct ip_vs_protocol *pp, struct ip_vs_conn *cp,
                struct ip_vs_dest *dest = cp->dest;
 
                IP_VS_DBG(8, "%s %s [%c%c%c%c] %u.%u.%u.%u:%d->"
-                         "%u.%u.%u.%u:%d state: %s->%s cnt:%d\n",
+                         "%u.%u.%u.%u:%d state: %s->%s conn->refcnt:%d\n",
                          pp->name,
                          (state_off==TCP_DIR_OUTPUT)?"output ":"input ",
                          th->syn? 'S' : '.',
index 8ae5f2e0aefa259ba17a5de3540aed4738ec0178..89d9175d8f288360463fde69a0248acc763abba4 100644 (file)
  *
  */
 
+#include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/kernel.h>
 #include <linux/netfilter_ipv4.h>
+#include <linux/udp.h>
 
 #include <net/ip_vs.h>
 
index 6f7c50e44a39c8ff602bfcb30c0ac7c3245f6635..7775e6cc68be3a4597dc94b4d5ab0fc5e928a614 100644 (file)
  *
  */
 
+#include <linux/ip.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/skbuff.h>
 
 #include <net/ip_vs.h>
 
index 2e5ced3d80622b77577826da486e721da6bed560..1bca714bda3d63c244afea44b39a9d26bb0814a9 100644 (file)
 
 #include <linux/module.h>
 #include <linux/slab.h>
+#include <linux/inetdevice.h>
 #include <linux/net.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
 #include <linux/skbuff.h>
 #include <linux/in.h>
 #include <linux/igmp.h>                 /* for ip_mc_join_group */
+#include <linux/udp.h>
 
 #include <net/ip.h>
 #include <net/sock.h>
index 9d3c8b5f327e8f4c546ae00cfd04e20870439a63..88a60650e6b8d795462c58e9f0a14159bbb96ee6 100644 (file)
@@ -56,8 +56,8 @@ config IP_NF_CONNTRACK_MARK
          instead of the individual packets.
        
 config IP_NF_CONNTRACK_EVENTS
-       bool "Connection tracking events"
-       depends on IP_NF_CONNTRACK
+       bool "Connection tracking events (EXPERIMENTAL)"
+       depends on EXPERIMENTAL && IP_NF_CONNTRACK
        help
          If this option is enabled, the connection tracking code will
          provide a notifier chain that can be used by other kernel code
@@ -66,8 +66,8 @@ config IP_NF_CONNTRACK_EVENTS
          IF unsure, say `N'.
 
 config IP_NF_CONNTRACK_NETLINK
-       tristate 'Connection tracking netlink interface'
-       depends on IP_NF_CONNTRACK && NETFILTER_NETLINK
+       tristate 'Connection tracking netlink interface (EXPERIMENTAL)'
+       depends on EXPERIMENTAL && IP_NF_CONNTRACK && NETFILTER_NETLINK
        depends on IP_NF_CONNTRACK!=y || NETFILTER_NETLINK!=m
        help
          This option enables support for a netlink-based userspace interface
@@ -440,7 +440,7 @@ config IP_NF_MATCH_COMMENT
 config IP_NF_MATCH_CONNMARK
        tristate  'Connection mark match support'
        depends on IP_NF_IPTABLES
-       depends on IP_NF_CONNTRACK_MARK || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
+       depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
        help
          This option adds a `connmark' match, which allows you to match the
          connection mark value previously set for the session by `CONNMARK'. 
@@ -452,7 +452,7 @@ config IP_NF_MATCH_CONNMARK
 config IP_NF_MATCH_CONNBYTES
        tristate  'Connection byte/packet counter match support'
        depends on IP_NF_IPTABLES
-       depends on IP_NF_CT_ACCT || (NF_CT_ACCT && NF_CONNTRACK_IPV4)
+       depends on (IP_NF_CONNTRACK && IP_NF_CT_ACCT) || (NF_CT_ACCT && NF_CONNTRACK_IPV4)
        help
          This option adds a `connbytes' match, which allows you to match the
          number of bytes and/or packets for each direction within a connection.
@@ -767,7 +767,7 @@ config IP_NF_TARGET_TTL
 config IP_NF_TARGET_CONNMARK
        tristate  'CONNMARK target support'
        depends on IP_NF_MANGLE
-       depends on IP_NF_CONNTRACK_MARK || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
+       depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
        help
          This option adds a `CONNMARK' target, which allows one to manipulate
          the connection mark value.  Similar to the MARK target, but
@@ -779,8 +779,8 @@ config IP_NF_TARGET_CONNMARK
 
 config IP_NF_TARGET_CLUSTERIP
        tristate "CLUSTERIP target support (EXPERIMENTAL)"
-       depends on IP_NF_IPTABLES && EXPERIMENTAL
-       depends on IP_NF_CONNTRACK_MARK || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
+       depends on IP_NF_MANGLE && EXPERIMENTAL
+       depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
        help
          The CLUSTERIP target allows you to build load-balancing clusters of
          network servers without having a dedicated load-balancing
index 058c48e258fc560f9a08fc422f280a10bc49cdd1..d0a447e520a23c05c7d8751c77b0792fd70617db 100644 (file)
@@ -12,6 +12,7 @@ ip_nat_pptp-objs      := ip_nat_helper_pptp.o ip_nat_proto_gre.o
 
 # connection tracking
 obj-$(CONFIG_IP_NF_CONNTRACK) += ip_conntrack.o
+obj-$(CONFIG_IP_NF_NAT) += ip_nat.o
 
 # conntrack netlink interface
 obj-$(CONFIG_IP_NF_CONNTRACK_NETLINK) += ip_conntrack_netlink.o
@@ -41,7 +42,7 @@ obj-$(CONFIG_IP_NF_IPTABLES) += ip_tables.o
 # the three instances of ip_tables
 obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o
 obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o
-obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o ip_nat.o
+obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o
 obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o
 
 # matches
index 3c2e9639bba62c777bd05d2121d8e09a668f6982..bba15630469599b7a4d93d32baf03f86b93d1e20 100644 (file)
@@ -68,19 +68,14 @@ struct arpt_table_info {
        unsigned int initial_entries;
        unsigned int hook_entry[NF_ARP_NUMHOOKS];
        unsigned int underflow[NF_ARP_NUMHOOKS];
-       char entries[0] __attribute__((aligned(SMP_CACHE_BYTES)));
+       void *entries[NR_CPUS];
 };
 
 static LIST_HEAD(arpt_target);
 static LIST_HEAD(arpt_tables);
+#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
 #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
 
-#ifdef CONFIG_SMP
-#define TABLE_OFFSET(t,p) (SMP_ALIGN((t)->size)*(p))
-#else
-#define TABLE_OFFSET(t,p) 0
-#endif
-
 static inline int arp_devaddr_compare(const struct arpt_devaddr_info *ap,
                                      char *hdr_addr, int len)
 {
@@ -269,9 +264,7 @@ unsigned int arpt_do_table(struct sk_buff **pskb,
        outdev = out ? out->name : nulldevname;
 
        read_lock_bh(&table->lock);
-       table_base = (void *)table->private->entries
-               + TABLE_OFFSET(table->private,
-                              smp_processor_id());
+       table_base = (void *)table->private->entries[smp_processor_id()];
        e = get_entry(table_base, table->private->hook_entry[hook]);
        back = get_entry(table_base, table->private->underflow[hook]);
 
@@ -462,7 +455,8 @@ static inline int unconditional(const struct arpt_arp *arp)
 /* Figures out from what hook each rule can be called: returns 0 if
  * there are loops.  Puts hook bitmask in comefrom.
  */
-static int mark_source_chains(struct arpt_table_info *newinfo, unsigned int valid_hooks)
+static int mark_source_chains(struct arpt_table_info *newinfo,
+                             unsigned int valid_hooks, void *entry0)
 {
        unsigned int hook;
 
@@ -472,7 +466,7 @@ static int mark_source_chains(struct arpt_table_info *newinfo, unsigned int vali
        for (hook = 0; hook < NF_ARP_NUMHOOKS; hook++) {
                unsigned int pos = newinfo->hook_entry[hook];
                struct arpt_entry *e
-                       = (struct arpt_entry *)(newinfo->entries + pos);
+                       = (struct arpt_entry *)(entry0 + pos);
 
                if (!(valid_hooks & (1 << hook)))
                        continue;
@@ -514,13 +508,13 @@ static int mark_source_chains(struct arpt_table_info *newinfo, unsigned int vali
                                                goto next;
 
                                        e = (struct arpt_entry *)
-                                               (newinfo->entries + pos);
+                                               (entry0 + pos);
                                } while (oldpos == pos + e->next_offset);
 
                                /* Move along one */
                                size = e->next_offset;
                                e = (struct arpt_entry *)
-                                       (newinfo->entries + pos + size);
+                                       (entry0 + pos + size);
                                e->counters.pcnt = pos;
                                pos += size;
                        } else {
@@ -537,7 +531,7 @@ static int mark_source_chains(struct arpt_table_info *newinfo, unsigned int vali
                                        newpos = pos + e->next_offset;
                                }
                                e = (struct arpt_entry *)
-                                       (newinfo->entries + newpos);
+                                       (entry0 + newpos);
                                e->counters.pcnt = pos;
                                pos = newpos;
                        }
@@ -689,6 +683,7 @@ static inline int cleanup_entry(struct arpt_entry *e, unsigned int *i)
 static int translate_table(const char *name,
                           unsigned int valid_hooks,
                           struct arpt_table_info *newinfo,
+                          void *entry0,
                           unsigned int size,
                           unsigned int number,
                           const unsigned int *hook_entries,
@@ -710,11 +705,11 @@ static int translate_table(const char *name,
        i = 0;
 
        /* Walk through entries, checking offsets. */
-       ret = ARPT_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+       ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size,
                                 check_entry_size_and_hooks,
                                 newinfo,
-                                newinfo->entries,
-                                newinfo->entries + size,
+                                entry0,
+                                entry0 + size,
                                 hook_entries, underflows, &i);
        duprintf("translate_table: ARPT_ENTRY_ITERATE gives %d\n", ret);
        if (ret != 0)
@@ -743,29 +738,26 @@ static int translate_table(const char *name,
                }
        }
 
-       if (!mark_source_chains(newinfo, valid_hooks)) {
+       if (!mark_source_chains(newinfo, valid_hooks, entry0)) {
                duprintf("Looping hook\n");
                return -ELOOP;
        }
 
        /* Finally, each sanity check must pass */
        i = 0;
-       ret = ARPT_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+       ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size,
                                 check_entry, name, size, &i);
 
        if (ret != 0) {
-               ARPT_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+               ARPT_ENTRY_ITERATE(entry0, newinfo->size,
                                   cleanup_entry, &i);
                return ret;
        }
 
        /* And one copy for every other CPU */
        for_each_cpu(i) {
-               if (i == 0)
-                       continue;
-               memcpy(newinfo->entries + SMP_ALIGN(newinfo->size) * i,
-                      newinfo->entries,
-                      SMP_ALIGN(newinfo->size));
+               if (newinfo->entries[i] && newinfo->entries[i] != entry0)
+                       memcpy(newinfo->entries[i], entry0, newinfo->size);
        }
 
        return ret;
@@ -807,15 +799,42 @@ static inline int add_entry_to_counter(const struct arpt_entry *e,
        return 0;
 }
 
+static inline int set_entry_to_counter(const struct arpt_entry *e,
+                                      struct arpt_counters total[],
+                                      unsigned int *i)
+{
+       SET_COUNTER(total[*i], e->counters.bcnt, e->counters.pcnt);
+
+       (*i)++;
+       return 0;
+}
+
 static void get_counters(const struct arpt_table_info *t,
                         struct arpt_counters counters[])
 {
        unsigned int cpu;
        unsigned int i;
+       unsigned int curcpu;
+
+       /* Instead of clearing (by a previous call to memset())
+        * the counters and using adds, we set the counters
+        * with data used by 'current' CPU
+        * We dont care about preemption here.
+        */
+       curcpu = raw_smp_processor_id();
+
+       i = 0;
+       ARPT_ENTRY_ITERATE(t->entries[curcpu],
+                          t->size,
+                          set_entry_to_counter,
+                          counters,
+                          &i);
 
        for_each_cpu(cpu) {
+               if (cpu == curcpu)
+                       continue;
                i = 0;
-               ARPT_ENTRY_ITERATE(t->entries + TABLE_OFFSET(t, cpu),
+               ARPT_ENTRY_ITERATE(t->entries[cpu],
                                   t->size,
                                   add_entry_to_counter,
                                   counters,
@@ -831,6 +850,7 @@ static int copy_entries_to_user(unsigned int total_size,
        struct arpt_entry *e;
        struct arpt_counters *counters;
        int ret = 0;
+       void *loc_cpu_entry;
 
        /* We need atomic snapshot of counters: rest doesn't change
         * (other than comefrom, which userspace doesn't care
@@ -843,13 +863,13 @@ static int copy_entries_to_user(unsigned int total_size,
                return -ENOMEM;
 
        /* First, sum counters... */
-       memset(counters, 0, countersize);
        write_lock_bh(&table->lock);
        get_counters(table->private, counters);
        write_unlock_bh(&table->lock);
 
-       /* ... then copy entire thing from CPU 0... */
-       if (copy_to_user(userptr, table->private->entries, total_size) != 0) {
+       loc_cpu_entry = table->private->entries[raw_smp_processor_id()];
+       /* ... then copy entire thing ... */
+       if (copy_to_user(userptr, loc_cpu_entry, total_size) != 0) {
                ret = -EFAULT;
                goto free_counters;
        }
@@ -859,7 +879,7 @@ static int copy_entries_to_user(unsigned int total_size,
        for (off = 0, num = 0; off < total_size; off += e->next_offset, num++){
                struct arpt_entry_target *t;
 
-               e = (struct arpt_entry *)(table->private->entries + off);
+               e = (struct arpt_entry *)(loc_cpu_entry + off);
                if (copy_to_user(userptr + off
                                 + offsetof(struct arpt_entry, counters),
                                 &counters[num],
@@ -911,6 +931,47 @@ static int get_entries(const struct arpt_get_entries *entries,
        return ret;
 }
 
+static void free_table_info(struct arpt_table_info *info)
+{
+       int cpu;
+       for_each_cpu(cpu) {
+               if (info->size <= PAGE_SIZE)
+                       kfree(info->entries[cpu]);
+               else
+                       vfree(info->entries[cpu]);
+       }
+       kfree(info);
+}
+
+static struct arpt_table_info *alloc_table_info(unsigned int size)
+{
+       struct arpt_table_info *newinfo;
+       int cpu;
+       
+       newinfo = kzalloc(sizeof(struct arpt_table_info), GFP_KERNEL);
+       if (!newinfo)
+               return NULL;
+
+       newinfo->size = size;
+
+       for_each_cpu(cpu) {
+               if (size <= PAGE_SIZE)
+                       newinfo->entries[cpu] = kmalloc_node(size,
+                                                       GFP_KERNEL,
+                                                       cpu_to_node(cpu));
+               else
+                       newinfo->entries[cpu] = vmalloc_node(size,
+                                                            cpu_to_node(cpu));
+
+               if (newinfo->entries[cpu] == NULL) {
+                       free_table_info(newinfo);
+                       return NULL;
+               }
+       }
+
+       return newinfo;
+}
+
 static int do_replace(void __user *user, unsigned int len)
 {
        int ret;
@@ -918,6 +979,7 @@ static int do_replace(void __user *user, unsigned int len)
        struct arpt_table *t;
        struct arpt_table_info *newinfo, *oldinfo;
        struct arpt_counters *counters;
+       void *loc_cpu_entry, *loc_cpu_old_entry;
 
        if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
                return -EFAULT;
@@ -930,13 +992,13 @@ static int do_replace(void __user *user, unsigned int len)
        if ((SMP_ALIGN(tmp.size) >> PAGE_SHIFT) + 2 > num_physpages)
                return -ENOMEM;
 
-       newinfo = vmalloc(sizeof(struct arpt_table_info)
-                         + SMP_ALIGN(tmp.size) *
-                                       (highest_possible_processor_id()+1));
+       newinfo = alloc_table_info(tmp.size);
        if (!newinfo)
                return -ENOMEM;
 
-       if (copy_from_user(newinfo->entries, user + sizeof(tmp),
+       /* choose the copy that is on our node/cpu */
+       loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
+       if (copy_from_user(loc_cpu_entry, user + sizeof(tmp),
                           tmp.size) != 0) {
                ret = -EFAULT;
                goto free_newinfo;
@@ -947,10 +1009,9 @@ static int do_replace(void __user *user, unsigned int len)
                ret = -ENOMEM;
                goto free_newinfo;
        }
-       memset(counters, 0, tmp.num_counters * sizeof(struct arpt_counters));
 
        ret = translate_table(tmp.name, tmp.valid_hooks,
-                             newinfo, tmp.size, tmp.num_entries,
+                             newinfo, loc_cpu_entry, tmp.size, tmp.num_entries,
                              tmp.hook_entry, tmp.underflow);
        if (ret != 0)
                goto free_newinfo_counters;
@@ -989,8 +1050,10 @@ static int do_replace(void __user *user, unsigned int len)
        /* Get the old counters. */
        get_counters(oldinfo, counters);
        /* Decrease module usage counts and free resource */
-       ARPT_ENTRY_ITERATE(oldinfo->entries, oldinfo->size, cleanup_entry,NULL);
-       vfree(oldinfo);
+       loc_cpu_old_entry = oldinfo->entries[raw_smp_processor_id()];
+       ARPT_ENTRY_ITERATE(loc_cpu_old_entry, oldinfo->size, cleanup_entry,NULL);
+
+       free_table_info(oldinfo);
        if (copy_to_user(tmp.counters, counters,
                         sizeof(struct arpt_counters) * tmp.num_counters) != 0)
                ret = -EFAULT;
@@ -1002,11 +1065,11 @@ static int do_replace(void __user *user, unsigned int len)
        module_put(t->me);
        up(&arpt_mutex);
  free_newinfo_counters_untrans:
-       ARPT_ENTRY_ITERATE(newinfo->entries, newinfo->size, cleanup_entry, NULL);
+       ARPT_ENTRY_ITERATE(loc_cpu_entry, newinfo->size, cleanup_entry, NULL);
  free_newinfo_counters:
        vfree(counters);
  free_newinfo:
-       vfree(newinfo);
+       free_table_info(newinfo);
        return ret;
 }
 
@@ -1030,6 +1093,7 @@ static int do_add_counters(void __user *user, unsigned int len)
        struct arpt_counters_info tmp, *paddc;
        struct arpt_table *t;
        int ret = 0;
+       void *loc_cpu_entry;
 
        if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
                return -EFAULT;
@@ -1059,7 +1123,9 @@ static int do_add_counters(void __user *user, unsigned int len)
        }
 
        i = 0;
-       ARPT_ENTRY_ITERATE(t->private->entries,
+       /* Choose the copy that is on our node */
+       loc_cpu_entry = t->private->entries[smp_processor_id()];
+       ARPT_ENTRY_ITERATE(loc_cpu_entry,
                           t->private->size,
                           add_counter_to_entry,
                           paddc->counters,
@@ -1220,30 +1286,32 @@ int arpt_register_table(struct arpt_table *table,
        struct arpt_table_info *newinfo;
        static struct arpt_table_info bootstrap
                = { 0, 0, 0, { 0 }, { 0 }, { } };
+       void *loc_cpu_entry;
 
-       newinfo = vmalloc(sizeof(struct arpt_table_info)
-                         + SMP_ALIGN(repl->size) *
-                                       (highest_possible_processor_id()+1));
+       newinfo = alloc_table_info(repl->size);
        if (!newinfo) {
                ret = -ENOMEM;
                return ret;
        }
-       memcpy(newinfo->entries, repl->entries, repl->size);
+
+       /* choose the copy on our node/cpu */
+       loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
+       memcpy(loc_cpu_entry, repl->entries, repl->size);
 
        ret = translate_table(table->name, table->valid_hooks,
-                             newinfo, repl->size,
+                             newinfo, loc_cpu_entry, repl->size,
                              repl->num_entries,
                              repl->hook_entry,
                              repl->underflow);
        duprintf("arpt_register_table: translate table gives %d\n", ret);
        if (ret != 0) {
-               vfree(newinfo);
+               free_table_info(newinfo);
                return ret;
        }
 
        ret = down_interruptible(&arpt_mutex);
        if (ret != 0) {
-               vfree(newinfo);
+               free_table_info(newinfo);
                return ret;
        }
 
@@ -1272,20 +1340,23 @@ int arpt_register_table(struct arpt_table *table,
        return ret;
 
  free_unlock:
-       vfree(newinfo);
+       free_table_info(newinfo);
        goto unlock;
 }
 
 void arpt_unregister_table(struct arpt_table *table)
 {
+       void *loc_cpu_entry;
+
        down(&arpt_mutex);
        LIST_DELETE(&arpt_tables, table);
        up(&arpt_mutex);
 
        /* Decrease module usage counts and free resources */
-       ARPT_ENTRY_ITERATE(table->private->entries, table->private->size,
+       loc_cpu_entry = table->private->entries[raw_smp_processor_id()];
+       ARPT_ENTRY_ITERATE(loc_cpu_entry, table->private->size,
                           cleanup_entry, NULL);
-       vfree(table->private);
+       free_table_info(table->private);
 }
 
 /* The built-in targets: standard (NULL) and error. */
index fa3f914117ec20f66e18b27f92b2cc7e58e47d9a..0366eedb4d7056ce322098129894201798b1e76e 100644 (file)
  *
  */
 
+#include <linux/in.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/netfilter.h>
 #include <linux/ip.h>
 #include <linux/moduleparam.h>
+#include <linux/udp.h>
 #include <net/checksum.h>
 #include <net/udp.h>
 
@@ -37,7 +39,7 @@ MODULE_LICENSE("GPL");
 module_param(master_timeout, int, 0600);
 MODULE_PARM_DESC(master_timeout, "timeout for the master connection");
 
-static char *conns[] = { "DATA ", "MESG ", "INDEX " };
+static const char *conns[] = { "DATA ", "MESG ", "INDEX " };
 
 /* This is slow, but it's simple. --RR */
 static char *amanda_buffer;
index 422ab68ee7fb62599cb410c0b8aac61bda4647d6..84c66dbfedaf83505434124e6bf39621bc84ec96 100644 (file)
@@ -1345,6 +1345,11 @@ static int kill_all(struct ip_conntrack *i, void *data)
        return 1;
 }
 
+void ip_conntrack_flush(void)
+{
+       ip_ct_iterate_cleanup(kill_all, NULL);
+}
+
 static void free_conntrack_hash(struct list_head *hash, int vmalloced,int size)
 {
        if (vmalloced)
@@ -1354,8 +1359,12 @@ static void free_conntrack_hash(struct list_head *hash, int vmalloced,int size)
                           get_order(sizeof(struct list_head) * size));
 }
 
-void ip_conntrack_flush()
+/* Mishearing the voices in his head, our hero wonders how he's
+   supposed to kill the mall. */
+void ip_conntrack_cleanup(void)
 {
+       ip_ct_attach = NULL;
+
        /* This makes sure all current packets have passed through
            netfilter framework.  Roll on, two-stage module
            delete... */
@@ -1363,7 +1372,7 @@ void ip_conntrack_flush()
 
        ip_ct_event_cache_flush();
  i_see_dead_people:
-       ip_ct_iterate_cleanup(kill_all, NULL);
+       ip_conntrack_flush();
        if (atomic_read(&ip_conntrack_count) != 0) {
                schedule();
                goto i_see_dead_people;
@@ -1371,14 +1380,7 @@ void ip_conntrack_flush()
        /* wait until all references to ip_conntrack_untracked are dropped */
        while (atomic_read(&ip_conntrack_untracked.ct_general.use) > 1)
                schedule();
-}
 
-/* Mishearing the voices in his head, our hero wonders how he's
-   supposed to kill the mall. */
-void ip_conntrack_cleanup(void)
-{
-       ip_ct_attach = NULL;
-       ip_conntrack_flush();
        kmem_cache_destroy(ip_conntrack_cachep);
        kmem_cache_destroy(ip_conntrack_expect_cachep);
        free_conntrack_hash(ip_conntrack_hash, ip_conntrack_vmalloc,
@@ -1408,7 +1410,7 @@ static struct list_head *alloc_hashtable(int size, int *vmalloced)
        return hash;
 }
 
-int set_hashsize(const char *val, struct kernel_param *kp)
+static int set_hashsize(const char *val, struct kernel_param *kp)
 {
        int i, bucket, hashsize, vmalloced;
        int old_vmalloced, old_size;
index 59e12b02b22ce82d31ae0c5769bdbce783ca5e24..68b173bcda602498a3b8572555e8a9638f33fd75 100644 (file)
@@ -55,7 +55,7 @@ static int try_rfc959(const char *, size_t, u_int32_t [], char);
 static int try_eprt(const char *, size_t, u_int32_t [], char);
 static int try_epsv_response(const char *, size_t, u_int32_t [], char);
 
-static struct ftp_search {
+static const struct ftp_search {
        enum ip_conntrack_dir dir;
        const char *pattern;
        size_t plen;
index 2dea1db14406a9a39b622dee4618b4401f4f86e6..d7c40421d0d17205fc1d6fcaba5eb0053f7c7477 100644 (file)
@@ -59,7 +59,7 @@ MODULE_PARM_DESC(max_dcc_channels, "max number of expected DCC channels per IRC
 module_param(dcc_timeout, int, 0400);
 MODULE_PARM_DESC(dcc_timeout, "timeout on for unestablished DCC channels");
 
-static char *dccprotos[] = { "SEND ", "CHAT ", "MOVE ", "TSEND ", "SCHAT " };
+static const char *dccprotos[] = { "SEND ", "CHAT ", "MOVE ", "TSEND ", "SCHAT " };
 #define MINMATCHLEN    5
 
 #if 0
index de9f4464438d4b9475833b298d85205a04a44a11..91fe8f2e38ffe500a2f72c6b3c6f69c3a7e548c6 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/errno.h>
 #include <linux/netlink.h>
 #include <linux/spinlock.h>
+#include <linux/interrupt.h>
 #include <linux/notifier.h>
 
 #include <linux/netfilter.h>
@@ -59,11 +60,13 @@ ctnetlink_dump_tuples_proto(struct sk_buff *skb,
 
        NFA_PUT(skb, CTA_PROTO_NUM, sizeof(u_int8_t), &tuple->dst.protonum);
 
+       /* If no protocol helper is found, this function will return the
+        * generic protocol helper, so proto won't *ever* be NULL */
        proto = ip_conntrack_proto_find_get(tuple->dst.protonum);
-       if (likely(proto && proto->tuple_to_nfattr)) {
+       if (likely(proto->tuple_to_nfattr))
                ret = proto->tuple_to_nfattr(skb, tuple);
-               ip_conntrack_proto_put(proto);
-       }
+       
+       ip_conntrack_proto_put(proto);
 
        return ret;
 
@@ -128,9 +131,11 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct ip_conntrack *ct)
 
        struct nfattr *nest_proto;
        int ret;
-       
-       if (!proto || !proto->to_nfattr)
+
+       if (!proto->to_nfattr) {
+               ip_conntrack_proto_put(proto);
                return 0;
+       }
        
        nest_proto = NFA_NEST(skb, CTA_PROTOINFO);
 
@@ -498,7 +503,7 @@ ctnetlink_parse_tuple_ip(struct nfattr *attr, struct ip_conntrack_tuple *tuple)
 }
 
 static const size_t cta_min_proto[CTA_PROTO_MAX] = {
-       [CTA_PROTO_NUM-1]       = sizeof(u_int16_t),
+       [CTA_PROTO_NUM-1]       = sizeof(u_int8_t),
        [CTA_PROTO_SRC_PORT-1]  = sizeof(u_int16_t),
        [CTA_PROTO_DST_PORT-1]  = sizeof(u_int16_t),
        [CTA_PROTO_ICMP_TYPE-1] = sizeof(u_int8_t),
@@ -523,14 +528,14 @@ ctnetlink_parse_tuple_proto(struct nfattr *attr,
 
        if (!tb[CTA_PROTO_NUM-1])
                return -EINVAL;
-       tuple->dst.protonum = *(u_int16_t *)NFA_DATA(tb[CTA_PROTO_NUM-1]);
+       tuple->dst.protonum = *(u_int8_t *)NFA_DATA(tb[CTA_PROTO_NUM-1]);
 
        proto = ip_conntrack_proto_find_get(tuple->dst.protonum);
 
-       if (likely(proto && proto->nfattr_to_tuple)) {
+       if (likely(proto->nfattr_to_tuple))
                ret = proto->nfattr_to_tuple(tb, tuple);
-               ip_conntrack_proto_put(proto);
-       }
+       
+       ip_conntrack_proto_put(proto);
        
        return ret;
 }
@@ -596,8 +601,6 @@ static int ctnetlink_parse_nat_proto(struct nfattr *attr,
                return -EINVAL;
 
        npt = ip_nat_proto_find_get(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum);
-       if (!npt)
-               return 0;
 
        if (!npt->nfattr_to_range) {
                ip_nat_proto_put(npt);
@@ -725,11 +728,9 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        return -ENOENT;
                }
        }       
-       if (del_timer(&ct->timeout)) {
-               ip_conntrack_put(ct);
+       if (del_timer(&ct->timeout))
                ct->timeout.function((unsigned long)ct);
-               return 0;
-       }
+
        ip_conntrack_put(ct);
        DEBUGP("leaving\n");
 
@@ -874,7 +875,7 @@ ctnetlink_change_status(struct ip_conntrack *ct, struct nfattr *cda[])
                DEBUGP("NAT status: %lu\n", 
                       status & (IPS_NAT_MASK | IPS_NAT_DONE_MASK));
                
-               if (ip_nat_initialized(ct, hooknum))
+               if (ip_nat_initialized(ct, HOOK2MANIP(hooknum)))
                        return -EEXIST;
                ip_nat_setup_info(ct, &range, hooknum);
 
@@ -957,8 +958,6 @@ ctnetlink_change_protoinfo(struct ip_conntrack *ct, struct nfattr *cda[])
        nfattr_parse_nested(tb, CTA_PROTOINFO_MAX, attr);
 
        proto = ip_conntrack_proto_find_get(npt);
-       if (!proto)
-               return -EINVAL;
 
        if (proto->from_nfattr)
                err = proto->from_nfattr(tb, ct);
index 744abb9d377a4399463261d759f5f7e83acae2dd..57956dee60c8d354861debd7c1e8f75c97e59e52 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/ip.h>
 #include <linux/in.h>
 #include <linux/list.h>
+#include <linux/seq_file.h>
 
 static DEFINE_RWLOCK(ip_ct_gre_lock);
 #define ASSERT_READ_LOCK(x)
index e4d6b268e8c4ec8abaaa68735839249a5668a590..5f9925db608ef3ab4255f266d0550aec421fc580 100644 (file)
@@ -51,7 +51,7 @@ static int icmp_invert_tuple(struct ip_conntrack_tuple *tuple,
                             const struct ip_conntrack_tuple *orig)
 {
        /* Add 1; spaces filled with 0. */
-       static u_int8_t invmap[]
+       static const u_int8_t invmap[]
                = { [ICMP_ECHO] = ICMP_ECHOREPLY + 1,
                    [ICMP_ECHOREPLY] = ICMP_ECHO + 1,
                    [ICMP_TIMESTAMP] = ICMP_TIMESTAMPREPLY + 1,
@@ -110,7 +110,7 @@ static int icmp_packet(struct ip_conntrack *ct,
        return NF_ACCEPT;
 }
 
-static u_int8_t valid_new[] = { 
+static const u_int8_t valid_new[] = { 
        [ICMP_ECHO] = 1,
        [ICMP_TIMESTAMP] = 1,
        [ICMP_INFO_REQUEST] = 1,
index 59a4a0111dd3fa9d91b2863a25069dbbfee56d8f..977fb59d4563361875826fec0817d92750af00da 100644 (file)
@@ -65,7 +65,7 @@ static unsigned long ip_ct_sctp_timeout_shutdown_sent     = 300 SECS / 1000;
 static unsigned long ip_ct_sctp_timeout_shutdown_recd     = 300 SECS / 1000;
 static unsigned long ip_ct_sctp_timeout_shutdown_ack_sent =   3 SECS;
 
-static unsigned long * sctp_timeouts[]
+static const unsigned long * sctp_timeouts[]
 = { NULL,                                  /* SCTP_CONNTRACK_NONE  */
     &ip_ct_sctp_timeout_closed,                   /* SCTP_CONNTRACK_CLOSED */
     &ip_ct_sctp_timeout_cookie_wait,       /* SCTP_CONNTRACK_COOKIE_WAIT */
@@ -118,7 +118,7 @@ cookie echoed to closed.
 */
 
 /* SCTP conntrack state transitions */
-static enum sctp_conntrack sctp_conntracks[2][9][SCTP_CONNTRACK_MAX] = {
+static const enum sctp_conntrack sctp_conntracks[2][9][SCTP_CONNTRACK_MAX] = {
        {
 /*     ORIGINAL        */
 /*                  sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA */
index ee3b7d6c4d2efbb5c76012b0ed1e6a7fda26ef92..e7fa29e576dc6688f88c9a48c3c5b4b1aa35c495 100644 (file)
@@ -99,7 +99,7 @@ unsigned long ip_ct_tcp_timeout_close =        10 SECS;
    to ~13-30min depending on RTO. */
 unsigned long ip_ct_tcp_timeout_max_retrans =     5 MINS;
  
-static unsigned long * tcp_timeouts[]
+static const unsigned long * tcp_timeouts[]
 = { NULL,                              /*      TCP_CONNTRACK_NONE */
     &ip_ct_tcp_timeout_syn_sent,       /*      TCP_CONNTRACK_SYN_SENT, */
     &ip_ct_tcp_timeout_syn_recv,       /*      TCP_CONNTRACK_SYN_RECV, */
@@ -170,7 +170,7 @@ enum tcp_bit_set {
  *     if they are invalid
  *     or we do not support the request (simultaneous open)
  */
-static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
+static const enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
        {
 /* ORIGINAL */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
@@ -272,9 +272,9 @@ static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sCL -> sCL
  */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
-/*ack*/           { sIV, sIV, sSR, sES, sCW, sCW, sTW, sTW, sCL, sIV },
+/*ack*/           { sIV, sIG, sSR, sES, sCW, sCW, sTW, sTW, sCL, sIV },
 /*
- *     sSS -> sIV      Might be a half-open connection.
+ *     sSS -> sIG      Might be a half-open connection.
  *     sSR -> sSR      Might answer late resent SYN.
  *     sES -> sES      :-)
  *     sFW -> sCW      Normal close request answered by ACK.
@@ -341,9 +341,10 @@ static int tcp_print_conntrack(struct seq_file *s,
 static int tcp_to_nfattr(struct sk_buff *skb, struct nfattr *nfa,
                         const struct ip_conntrack *ct)
 {
-       struct nfattr *nest_parms = NFA_NEST(skb, CTA_PROTOINFO_TCP);
+       struct nfattr *nest_parms;
        
        read_lock_bh(&tcp_lock);
+       nest_parms = NFA_NEST(skb, CTA_PROTOINFO_TCP);
        NFA_PUT(skb, CTA_PROTOINFO_TCP_STATE, sizeof(u_int8_t),
                &ct->proto.tcp.state);
        read_unlock_bh(&tcp_lock);
@@ -817,7 +818,7 @@ void ip_conntrack_tcp_update(struct sk_buff *skb,
 #define        TH_CWR  0x80
 
 /* table of valid flag combinations - ECE and CWR are always valid */
-static u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] =
+static const u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] =
 {
        [TH_SYN]                        = 1,
        [TH_SYN|TH_ACK]                 = 1,
@@ -917,8 +918,12 @@ static int tcp_packet(struct ip_conntrack *conntrack,
 
        switch (new_state) {
        case TCP_CONNTRACK_IGNORE:
-               /* Either SYN in ORIGINAL
-                * or SYN/ACK in REPLY. */
+               /* Ignored packets:
+                * 
+                * a) SYN in ORIGINAL
+                * b) SYN/ACK in REPLY
+                * c) ACK in reply direction after initial SYN in original.
+                */
                if (index == TCP_SYNACK_SET
                    && conntrack->proto.tcp.last_index == TCP_SYN_SET
                    && conntrack->proto.tcp.last_dir != dir
@@ -985,13 +990,20 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                }
        case TCP_CONNTRACK_CLOSE:
                if (index == TCP_RST_SET
-                   && test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
-                   && conntrack->proto.tcp.last_index == TCP_SYN_SET
+                   && ((test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
+                        && conntrack->proto.tcp.last_index == TCP_SYN_SET)
+                       || (!test_bit(IPS_ASSURED_BIT, &conntrack->status)
+                           && conntrack->proto.tcp.last_index == TCP_ACK_SET))
                    && ntohl(th->ack_seq) == conntrack->proto.tcp.last_end) {
-                       /* RST sent to invalid SYN we had let trough
-                        * SYN was in window then, tear down connection.
+                       /* RST sent to invalid SYN or ACK we had let trough
+                        * at a) and c) above:
+                        *
+                        * a) SYN was in window then
+                        * c) we hold a half-open connection.
+                        *
+                        * Delete our connection entry.
                         * We skip window checking, because packet might ACK
-                        * segments we ignored in the SYN. */
+                        * segments we ignored. */
                        goto in_window;
                }
                /* Just fall trough */
index f2dcac7c76607830e28c092494238b9ea548e2ae..46becbe4fe58d5474fda87efbc0635f3c2cbee4a 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/udp.h>
 #include <linux/seq_file.h>
 #include <net/checksum.h>
index dd476b191f4b5c135802839a840aa6bb34f88ed6..a88bcc551244129ae5df46681374c47f9d07b106 100644 (file)
@@ -27,6 +27,7 @@
 #endif
 #include <net/checksum.h>
 #include <net/ip.h>
+#include <net/route.h>
 
 #define ASSERT_READ_LOCK(x)
 #define ASSERT_WRITE_LOCK(x)
index 762f4d93936b93497a31c77415a77bc6b6b78568..c1a61462507fc5c5d38fd884b69a791d37a11ea7 100644 (file)
@@ -49,7 +49,7 @@ static unsigned int ip_nat_htable_size;
 static struct list_head *bysource;
 
 #define MAX_IP_NAT_PROTO 256
-struct ip_nat_protocol *ip_nat_protos[MAX_IP_NAT_PROTO];
+static struct ip_nat_protocol *ip_nat_protos[MAX_IP_NAT_PROTO];
 
 static inline struct ip_nat_protocol *
 __ip_nat_proto_find(u_int8_t protonum)
index 8acb7ed40b47f7c5e25adae81f774601ffaa15ba..4f95d477805c051628ac2ee2fdf440d37f0b6e1c 100644 (file)
@@ -44,6 +44,7 @@
  *
  */
 #include <linux/config.h>
+#include <linux/in.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
@@ -53,6 +54,7 @@
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
 #include <linux/netfilter_ipv4/ip_nat_helper.h>
 #include <linux/ip.h>
+#include <linux/udp.h>
 #include <net/checksum.h>
 #include <net/udp.h>
 #include <asm/uaccess.h>
index 2215317c76b7d177299969b87adbc31feabc6a51..43c3bd7c118e70b1594f11e6397444090ecee1a1 100644 (file)
@@ -42,7 +42,10 @@ static unsigned int help(struct sk_buff **pskb,
                         enum ip_conntrack_info ctinfo,
                         struct ip_conntrack_expect *exp)
 {
-       exp->saved_proto.udp.port = exp->tuple.dst.u.tcp.port;
+       struct ip_conntrack *ct = exp->master;
+
+       exp->saved_proto.udp.port
+               = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.udp.port;
        exp->dir = IP_CT_DIR_REPLY;
        exp->expectfn = ip_nat_follow_master;
        if (ip_conntrack_expect_related(exp) != 0)
index 75c27e92f6abb521ac8f42ff28a2040177470503..2a26d167e1495774e3c7941ced08f39db0398397 100644 (file)
@@ -83,11 +83,6 @@ static DECLARE_MUTEX(ipt_mutex);
    context stops packets coming through and allows user context to read
    the counters or update the rules.
 
-   To be cache friendly on SMP, we arrange them like so:
-   [ n-entries ]
-   ... cache-align padding ...
-   [ n-entries ]
-
    Hence the start of any table is given by get_table() below.  */
 
 /* The table itself */
@@ -105,20 +100,15 @@ struct ipt_table_info
        unsigned int underflow[NF_IP_NUMHOOKS];
 
        /* ipt_entry tables: one per CPU */
-       char entries[0] ____cacheline_aligned;
+       void *entries[NR_CPUS];
 };
 
 static LIST_HEAD(ipt_target);
 static LIST_HEAD(ipt_match);
 static LIST_HEAD(ipt_tables);
+#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
 #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
 
-#ifdef CONFIG_SMP
-#define TABLE_OFFSET(t,p) (SMP_ALIGN((t)->size)*(p))
-#else
-#define TABLE_OFFSET(t,p) 0
-#endif
-
 #if 0
 #define down(x) do { printk("DOWN:%u:" #x "\n", __LINE__); down(x); } while(0)
 #define down_interruptible(x) ({ int __r; printk("DOWNi:%u:" #x "\n", __LINE__); __r = down_interruptible(x); if (__r != 0) printk("ABORT-DOWNi:%u\n", __LINE__); __r; })
@@ -290,8 +280,7 @@ ipt_do_table(struct sk_buff **pskb,
 
        read_lock_bh(&table->lock);
        IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-       table_base = (void *)table->private->entries
-               + TABLE_OFFSET(table->private, smp_processor_id());
+       table_base = (void *)table->private->entries[smp_processor_id()];
        e = get_entry(table_base, table->private->hook_entry[hook]);
 
 #ifdef CONFIG_NETFILTER_DEBUG
@@ -563,7 +552,8 @@ unconditional(const struct ipt_ip *ip)
 /* Figures out from what hook each rule can be called: returns 0 if
    there are loops.  Puts hook bitmask in comefrom. */
 static int
-mark_source_chains(struct ipt_table_info *newinfo, unsigned int valid_hooks)
+mark_source_chains(struct ipt_table_info *newinfo,
+                  unsigned int valid_hooks, void *entry0)
 {
        unsigned int hook;
 
@@ -572,7 +562,7 @@ mark_source_chains(struct ipt_table_info *newinfo, unsigned int valid_hooks)
        for (hook = 0; hook < NF_IP_NUMHOOKS; hook++) {
                unsigned int pos = newinfo->hook_entry[hook];
                struct ipt_entry *e
-                       = (struct ipt_entry *)(newinfo->entries + pos);
+                       = (struct ipt_entry *)(entry0 + pos);
 
                if (!(valid_hooks & (1 << hook)))
                        continue;
@@ -622,13 +612,13 @@ mark_source_chains(struct ipt_table_info *newinfo, unsigned int valid_hooks)
                                                goto next;
 
                                        e = (struct ipt_entry *)
-                                               (newinfo->entries + pos);
+                                               (entry0 + pos);
                                } while (oldpos == pos + e->next_offset);
 
                                /* Move along one */
                                size = e->next_offset;
                                e = (struct ipt_entry *)
-                                       (newinfo->entries + pos + size);
+                                       (entry0 + pos + size);
                                e->counters.pcnt = pos;
                                pos += size;
                        } else {
@@ -645,7 +635,7 @@ mark_source_chains(struct ipt_table_info *newinfo, unsigned int valid_hooks)
                                        newpos = pos + e->next_offset;
                                }
                                e = (struct ipt_entry *)
-                                       (newinfo->entries + newpos);
+                                       (entry0 + newpos);
                                e->counters.pcnt = pos;
                                pos = newpos;
                        }
@@ -855,6 +845,7 @@ static int
 translate_table(const char *name,
                unsigned int valid_hooks,
                struct ipt_table_info *newinfo,
+               void *entry0,
                unsigned int size,
                unsigned int number,
                const unsigned int *hook_entries,
@@ -875,11 +866,11 @@ translate_table(const char *name,
        duprintf("translate_table: size %u\n", newinfo->size);
        i = 0;
        /* Walk through entries, checking offsets. */
-       ret = IPT_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+       ret = IPT_ENTRY_ITERATE(entry0, newinfo->size,
                                check_entry_size_and_hooks,
                                newinfo,
-                               newinfo->entries,
-                               newinfo->entries + size,
+                               entry0,
+                               entry0 + size,
                                hook_entries, underflows, &i);
        if (ret != 0)
                return ret;
@@ -907,27 +898,24 @@ translate_table(const char *name,
                }
        }
 
-       if (!mark_source_chains(newinfo, valid_hooks))
+       if (!mark_source_chains(newinfo, valid_hooks, entry0))
                return -ELOOP;
 
        /* Finally, each sanity check must pass */
        i = 0;
-       ret = IPT_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+       ret = IPT_ENTRY_ITERATE(entry0, newinfo->size,
                                check_entry, name, size, &i);
 
        if (ret != 0) {
-               IPT_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+               IPT_ENTRY_ITERATE(entry0, newinfo->size,
                                  cleanup_entry, &i);
                return ret;
        }
 
        /* And one copy for every other CPU */
        for_each_cpu(i) {
-               if (i == 0)
-                       continue;
-               memcpy(newinfo->entries + SMP_ALIGN(newinfo->size) * i,
-                      newinfo->entries,
-                      SMP_ALIGN(newinfo->size));
+               if (newinfo->entries[i] && newinfo->entries[i] != entry0)
+                       memcpy(newinfo->entries[i], entry0, newinfo->size);
        }
 
        return ret;
@@ -943,15 +931,12 @@ replace_table(struct ipt_table *table,
 
 #ifdef CONFIG_NETFILTER_DEBUG
        {
-               struct ipt_entry *table_base;
-               unsigned int i;
+               int cpu;
 
-               for_each_cpu(i) {
-                       table_base =
-                               (void *)newinfo->entries
-                               + TABLE_OFFSET(newinfo, i);
-
-                       table_base->comefrom = 0xdead57ac;
+               for_each_cpu(cpu) {
+                       struct ipt_entry *table_base = newinfo->entries[cpu];
+                       if (table_base)
+                               table_base->comefrom = 0xdead57ac;
                }
        }
 #endif
@@ -986,16 +971,44 @@ add_entry_to_counter(const struct ipt_entry *e,
        return 0;
 }
 
+static inline int
+set_entry_to_counter(const struct ipt_entry *e,
+                    struct ipt_counters total[],
+                    unsigned int *i)
+{
+       SET_COUNTER(total[*i], e->counters.bcnt, e->counters.pcnt);
+
+       (*i)++;
+       return 0;
+}
+
 static void
 get_counters(const struct ipt_table_info *t,
             struct ipt_counters counters[])
 {
        unsigned int cpu;
        unsigned int i;
+       unsigned int curcpu;
+
+       /* Instead of clearing (by a previous call to memset())
+        * the counters and using adds, we set the counters
+        * with data used by 'current' CPU
+        * We dont care about preemption here.
+        */
+       curcpu = raw_smp_processor_id();
+
+       i = 0;
+       IPT_ENTRY_ITERATE(t->entries[curcpu],
+                         t->size,
+                         set_entry_to_counter,
+                         counters,
+                         &i);
 
        for_each_cpu(cpu) {
+               if (cpu == curcpu)
+                       continue;
                i = 0;
-               IPT_ENTRY_ITERATE(t->entries + TABLE_OFFSET(t, cpu),
+               IPT_ENTRY_ITERATE(t->entries[cpu],
                                  t->size,
                                  add_entry_to_counter,
                                  counters,
@@ -1012,24 +1025,29 @@ copy_entries_to_user(unsigned int total_size,
        struct ipt_entry *e;
        struct ipt_counters *counters;
        int ret = 0;
+       void *loc_cpu_entry;
 
        /* We need atomic snapshot of counters: rest doesn't change
           (other than comefrom, which userspace doesn't care
           about). */
        countersize = sizeof(struct ipt_counters) * table->private->number;
-       counters = vmalloc(countersize);
+       counters = vmalloc_node(countersize, numa_node_id());
 
        if (counters == NULL)
                return -ENOMEM;
 
        /* First, sum counters... */
-       memset(counters, 0, countersize);
        write_lock_bh(&table->lock);
        get_counters(table->private, counters);
        write_unlock_bh(&table->lock);
 
-       /* ... then copy entire thing from CPU 0... */
-       if (copy_to_user(userptr, table->private->entries, total_size) != 0) {
+       /* choose the copy that is on our node/cpu, ...
+        * This choice is lazy (because current thread is
+        * allowed to migrate to another cpu)
+        */
+       loc_cpu_entry = table->private->entries[raw_smp_processor_id()];
+       /* ... then copy entire thing ... */
+       if (copy_to_user(userptr, loc_cpu_entry, total_size) != 0) {
                ret = -EFAULT;
                goto free_counters;
        }
@@ -1041,7 +1059,7 @@ copy_entries_to_user(unsigned int total_size,
                struct ipt_entry_match *m;
                struct ipt_entry_target *t;
 
-               e = (struct ipt_entry *)(table->private->entries + off);
+               e = (struct ipt_entry *)(loc_cpu_entry + off);
                if (copy_to_user(userptr + off
                                 + offsetof(struct ipt_entry, counters),
                                 &counters[num],
@@ -1110,6 +1128,45 @@ get_entries(const struct ipt_get_entries *entries,
        return ret;
 }
 
+static void free_table_info(struct ipt_table_info *info)
+{
+       int cpu;
+       for_each_cpu(cpu) {
+               if (info->size <= PAGE_SIZE)
+                       kfree(info->entries[cpu]);
+               else
+                       vfree(info->entries[cpu]);
+       }
+       kfree(info);
+}
+
+static struct ipt_table_info *alloc_table_info(unsigned int size)
+{
+       struct ipt_table_info *newinfo;
+       int cpu;
+
+       newinfo = kzalloc(sizeof(struct ipt_table_info), GFP_KERNEL);
+       if (!newinfo)
+               return NULL;
+
+       newinfo->size = size;
+
+       for_each_cpu(cpu) {
+               if (size <= PAGE_SIZE)
+                       newinfo->entries[cpu] = kmalloc_node(size,
+                               GFP_KERNEL,
+                               cpu_to_node(cpu));
+               else
+                       newinfo->entries[cpu] = vmalloc_node(size, cpu_to_node(cpu));
+               if (newinfo->entries[cpu] == 0) {
+                       free_table_info(newinfo);
+                       return NULL;
+               }
+       }
+
+       return newinfo;
+}
+
 static int
 do_replace(void __user *user, unsigned int len)
 {
@@ -1118,6 +1175,7 @@ do_replace(void __user *user, unsigned int len)
        struct ipt_table *t;
        struct ipt_table_info *newinfo, *oldinfo;
        struct ipt_counters *counters;
+       void *loc_cpu_entry, *loc_cpu_old_entry;
 
        if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
                return -EFAULT;
@@ -1130,13 +1188,13 @@ do_replace(void __user *user, unsigned int len)
        if ((SMP_ALIGN(tmp.size) >> PAGE_SHIFT) + 2 > num_physpages)
                return -ENOMEM;
 
-       newinfo = vmalloc(sizeof(struct ipt_table_info)
-                         + SMP_ALIGN(tmp.size) * 
-                               (highest_possible_processor_id()+1));
+       newinfo = alloc_table_info(tmp.size);
        if (!newinfo)
                return -ENOMEM;
 
-       if (copy_from_user(newinfo->entries, user + sizeof(tmp),
+       /* choose the copy that is our node/cpu */
+       loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
+       if (copy_from_user(loc_cpu_entry, user + sizeof(tmp),
                           tmp.size) != 0) {
                ret = -EFAULT;
                goto free_newinfo;
@@ -1147,10 +1205,9 @@ do_replace(void __user *user, unsigned int len)
                ret = -ENOMEM;
                goto free_newinfo;
        }
-       memset(counters, 0, tmp.num_counters * sizeof(struct ipt_counters));
 
        ret = translate_table(tmp.name, tmp.valid_hooks,
-                             newinfo, tmp.size, tmp.num_entries,
+                             newinfo, loc_cpu_entry, tmp.size, tmp.num_entries,
                              tmp.hook_entry, tmp.underflow);
        if (ret != 0)
                goto free_newinfo_counters;
@@ -1189,8 +1246,9 @@ do_replace(void __user *user, unsigned int len)
        /* Get the old counters. */
        get_counters(oldinfo, counters);
        /* Decrease module usage counts and free resource */
-       IPT_ENTRY_ITERATE(oldinfo->entries, oldinfo->size, cleanup_entry,NULL);
-       vfree(oldinfo);
+       loc_cpu_old_entry = oldinfo->entries[raw_smp_processor_id()];
+       IPT_ENTRY_ITERATE(loc_cpu_old_entry, oldinfo->size, cleanup_entry,NULL);
+       free_table_info(oldinfo);
        if (copy_to_user(tmp.counters, counters,
                         sizeof(struct ipt_counters) * tmp.num_counters) != 0)
                ret = -EFAULT;
@@ -1202,11 +1260,11 @@ do_replace(void __user *user, unsigned int len)
        module_put(t->me);
        up(&ipt_mutex);
  free_newinfo_counters_untrans:
-       IPT_ENTRY_ITERATE(newinfo->entries, newinfo->size, cleanup_entry,NULL);
+       IPT_ENTRY_ITERATE(loc_cpu_entry, newinfo->size, cleanup_entry,NULL);
  free_newinfo_counters:
        vfree(counters);
  free_newinfo:
-       vfree(newinfo);
+       free_table_info(newinfo);
        return ret;
 }
 
@@ -1239,6 +1297,7 @@ do_add_counters(void __user *user, unsigned int len)
        struct ipt_counters_info tmp, *paddc;
        struct ipt_table *t;
        int ret = 0;
+       void *loc_cpu_entry;
 
        if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
                return -EFAULT;
@@ -1246,7 +1305,7 @@ do_add_counters(void __user *user, unsigned int len)
        if (len != sizeof(tmp) + tmp.num_counters*sizeof(struct ipt_counters))
                return -EINVAL;
 
-       paddc = vmalloc(len);
+       paddc = vmalloc_node(len, numa_node_id());
        if (!paddc)
                return -ENOMEM;
 
@@ -1268,7 +1327,9 @@ do_add_counters(void __user *user, unsigned int len)
        }
 
        i = 0;
-       IPT_ENTRY_ITERATE(t->private->entries,
+       /* Choose the copy that is on our node */
+       loc_cpu_entry = t->private->entries[raw_smp_processor_id()];
+       IPT_ENTRY_ITERATE(loc_cpu_entry,
                          t->private->size,
                          add_counter_to_entry,
                          paddc->counters,
@@ -1460,28 +1521,31 @@ int ipt_register_table(struct ipt_table *table, const struct ipt_replace *repl)
        struct ipt_table_info *newinfo;
        static struct ipt_table_info bootstrap
                = { 0, 0, 0, { 0 }, { 0 }, { } };
+       void *loc_cpu_entry;
 
-       newinfo = vmalloc(sizeof(struct ipt_table_info)
-                         + SMP_ALIGN(repl->size) * 
-                                       (highest_possible_processor_id()+1));
+       newinfo = alloc_table_info(repl->size);
        if (!newinfo)
                return -ENOMEM;
 
-       memcpy(newinfo->entries, repl->entries, repl->size);
+       /* choose the copy on our node/cpu
+        * but dont care of preemption
+        */
+       loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
+       memcpy(loc_cpu_entry, repl->entries, repl->size);
 
        ret = translate_table(table->name, table->valid_hooks,
-                             newinfo, repl->size,
+                             newinfo, loc_cpu_entry, repl->size,
                              repl->num_entries,
                              repl->hook_entry,
                              repl->underflow);
        if (ret != 0) {
-               vfree(newinfo);
+               free_table_info(newinfo);
                return ret;
        }
 
        ret = down_interruptible(&ipt_mutex);
        if (ret != 0) {
-               vfree(newinfo);
+               free_table_info(newinfo);
                return ret;
        }
 
@@ -1510,20 +1574,23 @@ int ipt_register_table(struct ipt_table *table, const struct ipt_replace *repl)
        return ret;
 
  free_unlock:
-       vfree(newinfo);
+       free_table_info(newinfo);
        goto unlock;
 }
 
 void ipt_unregister_table(struct ipt_table *table)
 {
+       void *loc_cpu_entry;
+
        down(&ipt_mutex);
        LIST_DELETE(&ipt_tables, table);
        up(&ipt_mutex);
 
        /* Decrease module usage counts and free resources */
-       IPT_ENTRY_ITERATE(table->private->entries, table->private->size,
+       loc_cpu_entry = table->private->entries[raw_smp_processor_id()];
+       IPT_ENTRY_ITERATE(loc_cpu_entry, table->private->size,
                          cleanup_entry, NULL);
-       vfree(table->private);
+       free_table_info(table->private);
 }
 
 /* Returns 1 if the port is matched by the range, 0 otherwise */
@@ -1892,7 +1959,7 @@ static int ipt_get_matches(char *buffer, char **start, off_t offset, int length)
        return pos;
 }
 
-static struct { char *name; get_info_t *get_info; } ipt_proc_entry[] =
+static const struct { char *name; get_info_t *get_info; } ipt_proc_entry[] =
 { { "ip_tables_names", ipt_get_tables },
   { "ip_tables_targets", ipt_get_targets },
   { "ip_tables_matches", ipt_get_matches },
index 92ed050fac69bcce35424122c8a69c5d4ac5c48f..30be0f1dae370f6212de7955a972e87272854bef 100644 (file)
@@ -197,7 +197,7 @@ static void dump_packet(const struct nf_loginfo *info,
        }
        case IPPROTO_ICMP: {
                struct icmphdr _icmph, *ich;
-               static size_t required_len[NR_ICMP_TYPES+1]
+               static const size_t required_len[NR_ICMP_TYPES+1]
                        = { [ICMP_ECHOREPLY] = 4,
                            [ICMP_DEST_UNREACH]
                            = 8 + sizeof(struct iphdr),
@@ -351,7 +351,7 @@ static void dump_packet(const struct nf_loginfo *info,
        /* maxlen = 230+   91  + 230 + 252 = 803 */
 }
 
-struct nf_loginfo default_loginfo = {
+static struct nf_loginfo default_loginfo = {
        .type   = NF_LOG_TYPE_LOG,
        .u = {
                .log = {
index 275a174c6fe69c56bf2296cb33323d910a34c49e..27860510ca6dacb4464f65352b5f4e9c917c9921 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/config.h>
 #include <linux/types.h>
+#include <linux/inetdevice.h>
 #include <linux/ip.h>
 #include <linux/timer.h>
 #include <linux/module.h>
@@ -18,6 +19,7 @@
 #include <net/protocol.h>
 #include <net/ip.h>
 #include <net/checksum.h>
+#include <net/route.h>
 #include <linux/netfilter_ipv4.h>
 #include <linux/netfilter_ipv4/ip_nat_rule.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
index 1a53924041fce975327d0f12b3b90d99d53cfb07..03f554857a4d935fdda0398af1f92d12db0e98f3 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/netdevice.h>
 #include <linux/skbuff.h>
 #include <linux/netfilter_ipv4/ipt_physdev.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
index 2d44b07688af3794bfe51b4aa63bfb5417021aa7..261cbb4d4c49b812cc3bcdfce3b2cd737a136ef7 100644 (file)
@@ -532,6 +532,7 @@ match(const struct sk_buff *skb,
                        }
                        if(info->seconds && info->hit_count) {
                                for(pkt_count = 0, hits_found = 0; pkt_count < ip_pkt_list_tot; pkt_count++) {
+                                       if(r_list[location].last_pkts[pkt_count] == 0) break;
                                        if(time_before_eq(now,r_list[location].last_pkts[pkt_count]+info->seconds*HZ)) hits_found++;
                                }
                                if(hits_found >= info->hit_count) ans = !info->invert; else ans = info->invert;
index a65e508fbd40e4681bb9b5649c36d5ed8959b913..39d49dc333a7f0dc47e1bbd1f8d7a7c02c3f2cfb 100644 (file)
@@ -38,6 +38,7 @@
 #include <net/protocol.h>
 #include <net/tcp.h>
 #include <net/udp.h>
+#include <linux/inetdevice.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <net/sock.h>
@@ -98,7 +99,7 @@ fold_field(void *mib[], int offt)
 }
 
 /* snmp items */
-static struct snmp_mib snmp4_ipstats_list[] = {
+static const struct snmp_mib snmp4_ipstats_list[] = {
        SNMP_MIB_ITEM("InReceives", IPSTATS_MIB_INRECEIVES),
        SNMP_MIB_ITEM("InHdrErrors", IPSTATS_MIB_INHDRERRORS),
        SNMP_MIB_ITEM("InAddrErrors", IPSTATS_MIB_INADDRERRORS),
@@ -119,7 +120,7 @@ static struct snmp_mib snmp4_ipstats_list[] = {
        SNMP_MIB_SENTINEL
 };
 
-static struct snmp_mib snmp4_icmp_list[] = {
+static const struct snmp_mib snmp4_icmp_list[] = {
        SNMP_MIB_ITEM("InMsgs", ICMP_MIB_INMSGS),
        SNMP_MIB_ITEM("InErrors", ICMP_MIB_INERRORS),
        SNMP_MIB_ITEM("InDestUnreachs", ICMP_MIB_INDESTUNREACHS),
@@ -149,7 +150,7 @@ static struct snmp_mib snmp4_icmp_list[] = {
        SNMP_MIB_SENTINEL
 };
 
-static struct snmp_mib snmp4_tcp_list[] = {
+static const struct snmp_mib snmp4_tcp_list[] = {
        SNMP_MIB_ITEM("RtoAlgorithm", TCP_MIB_RTOALGORITHM),
        SNMP_MIB_ITEM("RtoMin", TCP_MIB_RTOMIN),
        SNMP_MIB_ITEM("RtoMax", TCP_MIB_RTOMAX),
@@ -167,7 +168,7 @@ static struct snmp_mib snmp4_tcp_list[] = {
        SNMP_MIB_SENTINEL
 };
 
-static struct snmp_mib snmp4_udp_list[] = {
+static const struct snmp_mib snmp4_udp_list[] = {
        SNMP_MIB_ITEM("InDatagrams", UDP_MIB_INDATAGRAMS),
        SNMP_MIB_ITEM("NoPorts", UDP_MIB_NOPORTS),
        SNMP_MIB_ITEM("InErrors", UDP_MIB_INERRORS),
@@ -175,7 +176,7 @@ static struct snmp_mib snmp4_udp_list[] = {
        SNMP_MIB_SENTINEL
 };
 
-static struct snmp_mib snmp4_net_list[] = {
+static const struct snmp_mib snmp4_net_list[] = {
        SNMP_MIB_ITEM("SyncookiesSent", LINUX_MIB_SYNCOOKIESSENT),
        SNMP_MIB_ITEM("SyncookiesRecv", LINUX_MIB_SYNCOOKIESRECV),
        SNMP_MIB_ITEM("SyncookiesFailed", LINUX_MIB_SYNCOOKIESFAILED),
index 381dd6a6aebbedc10ac861b957cdd1a55932dc52..f701a136a6ae010c48fae0204b7e028aafb90c8f 100644 (file)
@@ -1371,7 +1371,7 @@ out:      kfree_skb(skb);
  *     are needed for AMPRnet AX.25 paths.
  */
 
-static unsigned short mtu_plateau[] =
+static const unsigned short mtu_plateau[] =
 {32000, 17914, 8166, 4352, 2002, 1492, 576, 296, 216, 128 };
 
 static __inline__ unsigned short guess_mtu(unsigned short old_mtu)
@@ -3149,8 +3149,7 @@ int __init ip_rt_init(void)
                                        sizeof(struct rt_hash_bucket),
                                        rhash_entries,
                                        (num_physpages >= 128 * 1024) ?
-                                               (27 - PAGE_SHIFT) :
-                                               (29 - PAGE_SHIFT),
+                                       15 : 17,
                                        HASH_HIGHMEM,
                                        &rt_hash_log,
                                        &rt_hash_mask,
index a34e60ea48a15f3b33a0531a4d5cc260a9e62f17..e20be3331f674b14470d1d2b009843f4f6c01747 100644 (file)
@@ -173,10 +173,10 @@ static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb,
                                           struct request_sock *req,
                                           struct dst_entry *dst)
 {
-       struct tcp_sock *tp = tcp_sk(sk);
+       struct inet_connection_sock *icsk = inet_csk(sk);
        struct sock *child;
 
-       child = tp->af_specific->syn_recv_sock(sk, skb, req, dst);
+       child = icsk->icsk_af_ops->syn_recv_sock(sk, skb, req, dst);
        if (child)
                inet_csk_reqsk_queue_add(sk, req, child);
        else
index 01444a02b48b9b40b93b209b746260cbcfedb48b..16984d4a8a065b26a48d51a5bd08c80781d2f21a 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/sysctl.h>
 #include <linux/config.h>
 #include <linux/igmp.h>
+#include <linux/inetdevice.h>
 #include <net/snmp.h>
 #include <net/icmp.h>
 #include <net/ip.h>
@@ -22,6 +23,7 @@
 extern int sysctl_ip_nonlocal_bind;
 
 #ifdef CONFIG_SYSCTL
+static int zero;
 static int tcp_retr1_max = 255; 
 static int ip_local_port_range_min[] = { 1, 1 };
 static int ip_local_port_range_max[] = { 65535, 65535 };
@@ -613,6 +615,15 @@ ctl_table ipv4_table[] = {
                .proc_handler   = &proc_dointvec_jiffies,
                .strategy       = &sysctl_jiffies
        },
+       {
+               .ctl_name       = NET_IPV4_IPFRAG_MAX_DIST,
+               .procname       = "ipfrag_max_dist",
+               .data           = &sysctl_ipfrag_max_dist,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .extra1         = &zero
+       },
        {
                .ctl_name       = NET_TCP_NO_METRICS_SAVE,
                .procname       = "tcp_no_metrics_save",
index 9ac7a4f46bd84ef912f8bea32ce051a09f2bb611..00aa80e9324323305fb72b365f75f96243390d1c 100644 (file)
@@ -1413,7 +1413,7 @@ recv_urg:
  *     closed.
  */
 
-static unsigned char new_state[16] = {
+static const unsigned char new_state[16] = {
   /* current state:        new state:      action:     */
   /* (Invalid)         */ TCP_CLOSE,
   /* TCP_ESTABLISHED   */ TCP_FIN_WAIT1 | TCP_ACTION_FIN,
@@ -1696,8 +1696,8 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
        int err = 0;
 
        if (level != SOL_TCP)
-               return tp->af_specific->setsockopt(sk, level, optname,
-                                                  optval, optlen);
+               return icsk->icsk_af_ops->setsockopt(sk, level, optname,
+                                                    optval, optlen);
 
        /* This is a string value all the others are int's */
        if (optname == TCP_CONGESTION) {
@@ -1914,7 +1914,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
        info->tcpi_last_data_recv = jiffies_to_msecs(now - icsk->icsk_ack.lrcvtime);
        info->tcpi_last_ack_recv = jiffies_to_msecs(now - tp->rcv_tstamp);
 
-       info->tcpi_pmtu = tp->pmtu_cookie;
+       info->tcpi_pmtu = icsk->icsk_pmtu_cookie;
        info->tcpi_rcv_ssthresh = tp->rcv_ssthresh;
        info->tcpi_rtt = jiffies_to_usecs(tp->srtt)>>3;
        info->tcpi_rttvar = jiffies_to_usecs(tp->mdev)>>2;
@@ -1939,8 +1939,8 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
        int val, len;
 
        if (level != SOL_TCP)
-               return tp->af_specific->getsockopt(sk, level, optname,
-                                                  optval, optlen);
+               return icsk->icsk_af_ops->getsockopt(sk, level, optname,
+                                                    optval, optlen);
 
        if (get_user(len, optlen))
                return -EFAULT;
@@ -2065,8 +2065,7 @@ void __init tcp_init(void)
                                        sizeof(struct inet_ehash_bucket),
                                        thash_entries,
                                        (num_physpages >= 128 * 1024) ?
-                                               (25 - PAGE_SHIFT) :
-                                               (27 - PAGE_SHIFT),
+                                       13 : 15,
                                        HASH_HIGHMEM,
                                        &tcp_hashinfo.ehash_size,
                                        NULL,
@@ -2082,8 +2081,7 @@ void __init tcp_init(void)
                                        sizeof(struct inet_bind_hashbucket),
                                        tcp_hashinfo.ehash_size,
                                        (num_physpages >= 128 * 1024) ?
-                                               (25 - PAGE_SHIFT) :
-                                               (27 - PAGE_SHIFT),
+                                       13 : 15,
                                        HASH_HIGHMEM,
                                        &tcp_hashinfo.bhash_size,
                                        NULL,
index 1d0cd86621b1fd31030f5aefafdce48bb3514ffa..035f2092d73ac93a639b0122ed1c8b51867dae0b 100644 (file)
@@ -30,8 +30,6 @@ static int fast_convergence = 1;
 static int max_increment = 16;
 static int low_window = 14;
 static int beta = 819;         /* = 819/1024 (BICTCP_BETA_SCALE) */
-static int low_utilization_threshold = 153;
-static int low_utilization_period = 2;
 static int initial_ssthresh = 100;
 static int smooth_part = 20;
 
@@ -43,10 +41,6 @@ module_param(low_window, int, 0644);
 MODULE_PARM_DESC(low_window, "lower bound on congestion window (for TCP friendliness)");
 module_param(beta, int, 0644);
 MODULE_PARM_DESC(beta, "beta for multiplicative increase");
-module_param(low_utilization_threshold, int, 0644);
-MODULE_PARM_DESC(low_utilization_threshold, "percent (scaled by 1024) for low utilization mode");
-module_param(low_utilization_period, int, 0644);
-MODULE_PARM_DESC(low_utilization_period, "if average delay exceeds then goto to low utilization mode (seconds)");
 module_param(initial_ssthresh, int, 0644);
 MODULE_PARM_DESC(initial_ssthresh, "initial value of slow start threshold");
 module_param(smooth_part, int, 0644);
@@ -60,11 +54,6 @@ struct bictcp {
        u32     loss_cwnd;      /* congestion window at last loss */
        u32     last_cwnd;      /* the last snd_cwnd */
        u32     last_time;      /* time when updated last_cwnd */
-       u32     delay_min;      /* min delay */
-       u32     delay_max;      /* max delay */
-       u32     last_delay;
-       u8      low_utilization;/* 0: high; 1: low */
-       u32     low_utilization_start;  /* starting time of low utilization detection*/
        u32     epoch_start;    /* beginning of an epoch */
 #define ACK_RATIO_SHIFT        4
        u32     delayed_ack;    /* estimate the ratio of Packets/ACKs << 4 */
@@ -77,11 +66,6 @@ static inline void bictcp_reset(struct bictcp *ca)
        ca->loss_cwnd = 0;
        ca->last_cwnd = 0;
        ca->last_time = 0;
-       ca->delay_min = 0;
-       ca->delay_max = 0;
-       ca->last_delay = 0;
-       ca->low_utilization = 0;
-       ca->low_utilization_start = 0;
        ca->epoch_start = 0;
        ca->delayed_ack = 2 << ACK_RATIO_SHIFT;
 }
@@ -143,8 +127,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
        }
 
        /* if in slow start or link utilization is very low */
-       if ( ca->loss_cwnd == 0 ||
-            (cwnd > ca->loss_cwnd && ca->low_utilization)) {
+       if (ca->loss_cwnd == 0) {
                if (ca->cnt > 20) /* increase cwnd 5% per RTT */
                        ca->cnt = 20;
        }
@@ -154,69 +137,12 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
                ca->cnt = 1;
 }
 
-
-/* Detect low utilization in congestion avoidance */
-static inline void bictcp_low_utilization(struct sock *sk, int flag)
-{
-       const struct tcp_sock *tp = tcp_sk(sk);
-       struct bictcp *ca = inet_csk_ca(sk);
-       u32 dist, delay;
-
-       /* No time stamp */
-       if (!(tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr) ||
-            /* Discard delay samples right after fast recovery */
-            tcp_time_stamp < ca->epoch_start + HZ ||
-            /* this delay samples may not be accurate */
-            flag == 0) {
-               ca->last_delay = 0;
-               goto notlow;
-       }
-
-       delay = ca->last_delay<<3;      /* use the same scale as tp->srtt*/
-       ca->last_delay = tcp_time_stamp - tp->rx_opt.rcv_tsecr;
-       if (delay == 0)                 /* no previous delay sample */
-               goto notlow;
-
-       /* first time call or link delay decreases */
-       if (ca->delay_min == 0 || ca->delay_min > delay) {
-               ca->delay_min = ca->delay_max = delay;
-               goto notlow;
-       }
-
-       if (ca->delay_max < delay)
-               ca->delay_max = delay;
-
-       /* utilization is low, if avg delay < dist*threshold
-          for checking_period time */
-       dist = ca->delay_max - ca->delay_min;
-       if (dist <= ca->delay_min>>6 ||
-           tp->srtt - ca->delay_min >=  (dist*low_utilization_threshold)>>10)
-               goto notlow;
-
-       if (ca->low_utilization_start == 0) {
-               ca->low_utilization = 0;
-               ca->low_utilization_start = tcp_time_stamp;
-       } else if ((s32)(tcp_time_stamp - ca->low_utilization_start)
-                       > low_utilization_period*HZ) {
-               ca->low_utilization = 1;
-       }
-
-       return;
-
- notlow:
-       ca->low_utilization = 0;
-       ca->low_utilization_start = 0;
-
-}
-
 static void bictcp_cong_avoid(struct sock *sk, u32 ack,
                              u32 seq_rtt, u32 in_flight, int data_acked)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        struct bictcp *ca = inet_csk_ca(sk);
 
-       bictcp_low_utilization(sk, data_acked);
-
        if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
@@ -249,11 +175,6 @@ static u32 bictcp_recalc_ssthresh(struct sock *sk)
 
        ca->epoch_start = 0;    /* end of epoch */
 
-       /* in case of wrong delay_max*/
-       if (ca->delay_min > 0 && ca->delay_max > ca->delay_min)
-               ca->delay_max = ca->delay_min
-                       + ((ca->delay_max - ca->delay_min)* 90) / 100;
-
        /* Wmax and fast convergence */
        if (tp->snd_cwnd < ca->last_max_cwnd && fast_convergence)
                ca->last_max_cwnd = (tp->snd_cwnd * (BICTCP_BETA_SCALE + beta))
@@ -289,14 +210,14 @@ static void bictcp_state(struct sock *sk, u8 new_state)
                bictcp_reset(inet_csk_ca(sk));
 }
 
-/* Track delayed acknowledgement ratio using sliding window
+/* Track delayed acknowledgment ratio using sliding window
  * ratio = (15*ratio + sample) / 16
  */
 static void bictcp_acked(struct sock *sk, u32 cnt)
 {
        const struct inet_connection_sock *icsk = inet_csk(sk);
 
-       if (cnt > 0 &&  icsk->icsk_ca_state == TCP_CA_Open) {
+       if (cnt > 0 && icsk->icsk_ca_state == TCP_CA_Open) {
                struct bictcp *ca = inet_csk_ca(sk);
                cnt -= ca->delayed_ack >> ACK_RATIO_SHIFT;
                ca->delayed_ack += cnt;
index c7cc62c8dc12cfe8fc2f99810a9070a6a09e4304..e688c687d62d37e6c7537a3a58ffcfe751d5543a 100644 (file)
@@ -174,6 +174,34 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)
        return err;
 }
 
+
+/*
+ * Linear increase during slow start
+ */
+void tcp_slow_start(struct tcp_sock *tp)
+{
+       if (sysctl_tcp_abc) {
+               /* RFC3465: Slow Start
+                * TCP sender SHOULD increase cwnd by the number of
+                * previously unacknowledged bytes ACKed by each incoming
+                * acknowledgment, provided the increase is not more than L
+                */
+               if (tp->bytes_acked < tp->mss_cache)
+                       return;
+
+               /* We MAY increase by 2 if discovered delayed ack */
+               if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) {
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
+               }
+       }
+       tp->bytes_acked = 0;
+
+       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+               tp->snd_cwnd++;
+}
+EXPORT_SYMBOL_GPL(tcp_slow_start);
+
 /*
  * TCP Reno congestion control
  * This is special case used for fallback as well.
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
new file mode 100644 (file)
index 0000000..31a4986
--- /dev/null
@@ -0,0 +1,411 @@
+/*
+ * TCP CUBIC: Binary Increase Congestion control for TCP v2.0
+ *
+ * This is from the implementation of CUBIC TCP in
+ * Injong Rhee, Lisong Xu.
+ *  "CUBIC: A New TCP-Friendly High-Speed TCP Variant
+ *  in PFLDnet 2005
+ * Available from:
+ *  http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/cubic-paper.pdf
+ *
+ * Unless CUBIC is enabled and congestion window is large
+ * this behaves the same as the original Reno.
+ */
+
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <net/tcp.h>
+#include <asm/div64.h>
+
+#define BICTCP_BETA_SCALE    1024      /* Scale factor beta calculation
+                                        * max_cwnd = snd_cwnd * beta
+                                        */
+#define BICTCP_B               4        /*
+                                         * In binary search,
+                                         * go to point (max+min)/N
+                                         */
+#define        BICTCP_HZ               10      /* BIC HZ 2^10 = 1024 */
+
+static int fast_convergence = 1;
+static int max_increment = 16;
+static int beta = 819;         /* = 819/1024 (BICTCP_BETA_SCALE) */
+static int initial_ssthresh = 100;
+static int bic_scale = 41;
+static int tcp_friendliness = 1;
+
+static u32 cube_rtt_scale;
+static u32 beta_scale;
+static u64 cube_factor;
+
+/* Note parameters that are used for precomputing scale factors are read-only */
+module_param(fast_convergence, int, 0644);
+MODULE_PARM_DESC(fast_convergence, "turn on/off fast convergence");
+module_param(max_increment, int, 0644);
+MODULE_PARM_DESC(max_increment, "Limit on increment allowed during binary search");
+module_param(beta, int, 0444);
+MODULE_PARM_DESC(beta, "beta for multiplicative increase");
+module_param(initial_ssthresh, int, 0644);
+MODULE_PARM_DESC(initial_ssthresh, "initial value of slow start threshold");
+module_param(bic_scale, int, 0444);
+MODULE_PARM_DESC(bic_scale, "scale (scaled by 1024) value for bic function (bic_scale/1024)");
+module_param(tcp_friendliness, int, 0644);
+MODULE_PARM_DESC(tcp_friendliness, "turn on/off tcp friendliness");
+
+#include <asm/div64.h>
+
+/* BIC TCP Parameters */
+struct bictcp {
+       u32     cnt;            /* increase cwnd by 1 after ACKs */
+       u32     last_max_cwnd;  /* last maximum snd_cwnd */
+       u32     loss_cwnd;      /* congestion window at last loss */
+       u32     last_cwnd;      /* the last snd_cwnd */
+       u32     last_time;      /* time when updated last_cwnd */
+       u32     bic_origin_point;/* origin point of bic function */
+       u32     bic_K;          /* time to origin point from the beginning of the current epoch */
+       u32     delay_min;      /* min delay */
+       u32     epoch_start;    /* beginning of an epoch */
+       u32     ack_cnt;        /* number of acks */
+       u32     tcp_cwnd;       /* estimated tcp cwnd */
+#define ACK_RATIO_SHIFT        4
+       u32     delayed_ack;    /* estimate the ratio of Packets/ACKs << 4 */
+};
+
+static inline void bictcp_reset(struct bictcp *ca)
+{
+       ca->cnt = 0;
+       ca->last_max_cwnd = 0;
+       ca->loss_cwnd = 0;
+       ca->last_cwnd = 0;
+       ca->last_time = 0;
+       ca->bic_origin_point = 0;
+       ca->bic_K = 0;
+       ca->delay_min = 0;
+       ca->epoch_start = 0;
+       ca->delayed_ack = 2 << ACK_RATIO_SHIFT;
+       ca->ack_cnt = 0;
+       ca->tcp_cwnd = 0;
+}
+
+static void bictcp_init(struct sock *sk)
+{
+       bictcp_reset(inet_csk_ca(sk));
+       if (initial_ssthresh)
+               tcp_sk(sk)->snd_ssthresh = initial_ssthresh;
+}
+
+/* 64bit divisor, dividend and result. dynamic precision */
+static inline u_int64_t div64_64(u_int64_t dividend, u_int64_t divisor)
+{
+       u_int32_t d = divisor;
+
+       if (divisor > 0xffffffffULL) {
+               unsigned int shift = fls(divisor >> 32);
+
+               d = divisor >> shift;
+               dividend >>= shift;
+       }
+
+       /* avoid 64 bit division if possible */
+       if (dividend >> 32)
+               do_div(dividend, d);
+       else
+               dividend = (uint32_t) dividend / d;
+
+       return dividend;
+}
+
+/*
+ * calculate the cubic root of x using Newton-Raphson
+ */
+static u32 cubic_root(u64 a)
+{
+       u32 x, x1;
+
+       /* Initial estimate is based on:
+        * cbrt(x) = exp(log(x) / 3)
+        */
+       x = 1u << (fls64(a)/3);
+
+       /*
+        * Iteration based on:
+        *                         2
+        * x    = ( 2 * x  +  a / x  ) / 3
+        *  k+1          k         k
+        */
+       do {
+               x1 = x;
+               x = (2 * x + (uint32_t) div64_64(a, x*x)) / 3;
+       } while (abs(x1 - x) > 1);
+
+       return x;
+}
+
+/*
+ * Compute congestion window to use.
+ */
+static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
+{
+       u64 offs;
+       u32 delta, t, bic_target, min_cnt, max_cnt;
+
+       ca->ack_cnt++;  /* count the number of ACKs */
+
+       if (ca->last_cwnd == cwnd &&
+           (s32)(tcp_time_stamp - ca->last_time) <= HZ / 32)
+               return;
+
+       ca->last_cwnd = cwnd;
+       ca->last_time = tcp_time_stamp;
+
+       if (ca->epoch_start == 0) {
+               ca->epoch_start = tcp_time_stamp;       /* record the beginning of an epoch */
+               ca->ack_cnt = 1;                        /* start counting */
+               ca->tcp_cwnd = cwnd;                    /* syn with cubic */
+
+               if (ca->last_max_cwnd <= cwnd) {
+                       ca->bic_K = 0;
+                       ca->bic_origin_point = cwnd;
+               } else {
+                       /* Compute new K based on
+                        * (wmax-cwnd) * (srtt>>3 / HZ) / c * 2^(3*bictcp_HZ)
+                        */
+                       ca->bic_K = cubic_root(cube_factor
+                                              * (ca->last_max_cwnd - cwnd));
+                       ca->bic_origin_point = ca->last_max_cwnd;
+               }
+       }
+
+        /* cubic function - calc*/
+        /* calculate c * time^3 / rtt,
+         *  while considering overflow in calculation of time^3
+        * (so time^3 is done by using 64 bit)
+        * and without the support of division of 64bit numbers
+        * (so all divisions are done by using 32 bit)
+         *  also NOTE the unit of those veriables
+         *       time  = (t - K) / 2^bictcp_HZ
+         *       c = bic_scale >> 10
+        * rtt  = (srtt >> 3) / HZ
+        * !!! The following code does not have overflow problems,
+        * if the cwnd < 1 million packets !!!
+         */
+
+       /* change the unit from HZ to bictcp_HZ */
+        t = ((tcp_time_stamp + ca->delay_min - ca->epoch_start)
+            << BICTCP_HZ) / HZ;
+
+        if (t < ca->bic_K)             /* t - K */
+               offs = ca->bic_K - t;
+        else
+                offs = t - ca->bic_K;
+
+       /* c/rtt * (t-K)^3 */
+       delta = (cube_rtt_scale * offs * offs * offs) >> (10+3*BICTCP_HZ);
+        if (t < ca->bic_K)                                     /* below origin*/
+                bic_target = ca->bic_origin_point - delta;
+        else                                                   /* above origin*/
+                bic_target = ca->bic_origin_point + delta;
+
+        /* cubic function - calc bictcp_cnt*/
+        if (bic_target > cwnd) {
+               ca->cnt = cwnd / (bic_target - cwnd);
+        } else {
+                ca->cnt = 100 * cwnd;              /* very small increment*/
+        }
+
+       if (ca->delay_min > 0) {
+               /* max increment = Smax * rtt / 0.1  */
+               min_cnt = (cwnd * HZ * 8)/(10 * max_increment * ca->delay_min);
+               if (ca->cnt < min_cnt)
+                       ca->cnt = min_cnt;
+       }
+
+        /* slow start and low utilization  */
+       if (ca->loss_cwnd == 0)         /* could be aggressive in slow start */
+               ca->cnt = 50;
+
+       /* TCP Friendly */
+       if (tcp_friendliness) {
+               u32 scale = beta_scale;
+               delta = (cwnd * scale) >> 3;
+               while (ca->ack_cnt > delta) {           /* update tcp cwnd */
+                       ca->ack_cnt -= delta;
+                       ca->tcp_cwnd++;
+               }
+
+               if (ca->tcp_cwnd > cwnd){       /* if bic is slower than tcp */
+                       delta = ca->tcp_cwnd - cwnd;
+                       max_cnt = cwnd / delta;
+                       if (ca->cnt > max_cnt)
+                               ca->cnt = max_cnt;
+               }
+        }
+
+       ca->cnt = (ca->cnt << ACK_RATIO_SHIFT) / ca->delayed_ack;
+       if (ca->cnt == 0)                       /* cannot be zero */
+               ca->cnt = 1;
+}
+
+
+/* Keep track of minimum rtt */
+static inline void measure_delay(struct sock *sk)
+{
+       const struct tcp_sock *tp = tcp_sk(sk);
+       struct bictcp *ca = inet_csk_ca(sk);
+       u32 delay;
+
+       /* No time stamp */
+       if (!(tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr) ||
+            /* Discard delay samples right after fast recovery */
+           (s32)(tcp_time_stamp - ca->epoch_start) < HZ)
+               return;
+
+       delay = tcp_time_stamp - tp->rx_opt.rcv_tsecr;
+       if (delay == 0)
+               delay = 1;
+
+       /* first time call or link delay decreases */
+       if (ca->delay_min == 0 || ca->delay_min > delay)
+               ca->delay_min = delay;
+}
+
+static void bictcp_cong_avoid(struct sock *sk, u32 ack,
+                             u32 seq_rtt, u32 in_flight, int data_acked)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+       struct bictcp *ca = inet_csk_ca(sk);
+
+       if (data_acked)
+               measure_delay(sk);
+
+       if (!tcp_is_cwnd_limited(sk, in_flight))
+               return;
+
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
+               tcp_slow_start(tp);
+       else {
+               bictcp_update(ca, tp->snd_cwnd);
+
+               /* In dangerous area, increase slowly.
+                * In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd
+                */
+               if (tp->snd_cwnd_cnt >= ca->cnt) {
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
+                       tp->snd_cwnd_cnt = 0;
+               } else
+                       tp->snd_cwnd_cnt++;
+       }
+
+}
+
+static u32 bictcp_recalc_ssthresh(struct sock *sk)
+{
+       const struct tcp_sock *tp = tcp_sk(sk);
+       struct bictcp *ca = inet_csk_ca(sk);
+
+       ca->epoch_start = 0;    /* end of epoch */
+
+       /* Wmax and fast convergence */
+       if (tp->snd_cwnd < ca->last_max_cwnd && fast_convergence)
+               ca->last_max_cwnd = (tp->snd_cwnd * (BICTCP_BETA_SCALE + beta))
+                       / (2 * BICTCP_BETA_SCALE);
+       else
+               ca->last_max_cwnd = tp->snd_cwnd;
+
+       ca->loss_cwnd = tp->snd_cwnd;
+
+       return max((tp->snd_cwnd * beta) / BICTCP_BETA_SCALE, 2U);
+}
+
+static u32 bictcp_undo_cwnd(struct sock *sk)
+{
+       struct bictcp *ca = inet_csk_ca(sk);
+
+       return max(tcp_sk(sk)->snd_cwnd, ca->last_max_cwnd);
+}
+
+static u32 bictcp_min_cwnd(struct sock *sk)
+{
+       return tcp_sk(sk)->snd_ssthresh;
+}
+
+static void bictcp_state(struct sock *sk, u8 new_state)
+{
+       if (new_state == TCP_CA_Loss)
+               bictcp_reset(inet_csk_ca(sk));
+}
+
+/* Track delayed acknowledgment ratio using sliding window
+ * ratio = (15*ratio + sample) / 16
+ */
+static void bictcp_acked(struct sock *sk, u32 cnt)
+{
+       const struct inet_connection_sock *icsk = inet_csk(sk);
+
+       if (cnt > 0 && icsk->icsk_ca_state == TCP_CA_Open) {
+               struct bictcp *ca = inet_csk_ca(sk);
+               cnt -= ca->delayed_ack >> ACK_RATIO_SHIFT;
+               ca->delayed_ack += cnt;
+       }
+}
+
+
+static struct tcp_congestion_ops cubictcp = {
+       .init           = bictcp_init,
+       .ssthresh       = bictcp_recalc_ssthresh,
+       .cong_avoid     = bictcp_cong_avoid,
+       .set_state      = bictcp_state,
+       .undo_cwnd      = bictcp_undo_cwnd,
+       .min_cwnd       = bictcp_min_cwnd,
+       .pkts_acked     = bictcp_acked,
+       .owner          = THIS_MODULE,
+       .name           = "cubic",
+};
+
+static int __init cubictcp_register(void)
+{
+       BUG_ON(sizeof(struct bictcp) > ICSK_CA_PRIV_SIZE);
+
+       /* Precompute a bunch of the scaling factors that are used per-packet
+        * based on SRTT of 100ms
+        */
+
+       beta_scale = 8*(BICTCP_BETA_SCALE+beta)/ 3 / (BICTCP_BETA_SCALE - beta);
+
+       cube_rtt_scale = (bic_scale << 3) / 10; /* 1024*c/rtt */
+
+       /* calculate the "K" for (wmax-cwnd) = c/rtt * K^3
+        *  so K = cubic_root( (wmax-cwnd)*rtt/c )
+        * the unit of K is bictcp_HZ=2^10, not HZ
+        *
+        *  c = bic_scale >> 10
+        *  rtt = 100ms
+        *
+        * the following code has been designed and tested for
+        * cwnd < 1 million packets
+        * RTT < 100 seconds
+        * HZ < 1,000,00  (corresponding to 10 nano-second)
+        */
+
+       /* 1/c * 2^2*bictcp_HZ * srtt */
+       cube_factor = 1ull << (10+3*BICTCP_HZ); /* 2^40 */
+
+       /* divide by bic_scale and by constant Srtt (100ms) */
+       do_div(cube_factor, bic_scale * 10);
+
+       return tcp_register_congestion_control(&cubictcp);
+}
+
+static void __exit cubictcp_unregister(void)
+{
+       tcp_unregister_congestion_control(&cubictcp);
+}
+
+module_init(cubictcp_register);
+module_exit(cubictcp_unregister);
+
+MODULE_AUTHOR("Sangtae Ha, Stephen Hemminger");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("CUBIC TCP");
+MODULE_VERSION("2.0");
index bf2e23086bcead8b15e02d2a63f1194a40c72093..0a461232329fa328dcf20186054f87049ec3a7bc 100644 (file)
@@ -115,8 +115,8 @@ int sysctl_tcp_abc = 1;
 /* Adapt the MSS value used to make delayed ack decision to the 
  * real world.
  */ 
-static inline void tcp_measure_rcv_mss(struct sock *sk,
-                                      const struct sk_buff *skb)
+static void tcp_measure_rcv_mss(struct sock *sk,
+                               const struct sk_buff *skb)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
        const unsigned int lss = icsk->icsk_ack.last_seg_size; 
@@ -246,8 +246,8 @@ static int __tcp_grow_window(const struct sock *sk, struct tcp_sock *tp,
        return 0;
 }
 
-static inline void tcp_grow_window(struct sock *sk, struct tcp_sock *tp,
-                                  struct sk_buff *skb)
+static void tcp_grow_window(struct sock *sk, struct tcp_sock *tp,
+                           struct sk_buff *skb)
 {
        /* Check #1 */
        if (tp->rcv_ssthresh < tp->window_clamp &&
@@ -341,6 +341,26 @@ static void tcp_clamp_window(struct sock *sk, struct tcp_sock *tp)
                tp->rcv_ssthresh = min(tp->window_clamp, 2U*tp->advmss);
 }
 
+
+/* Initialize RCV_MSS value.
+ * RCV_MSS is an our guess about MSS used by the peer.
+ * We haven't any direct information about the MSS.
+ * It's better to underestimate the RCV_MSS rather than overestimate.
+ * Overestimations make us ACKing less frequently than needed.
+ * Underestimations are more easy to detect and fix by tcp_measure_rcv_mss().
+ */
+void tcp_initialize_rcv_mss(struct sock *sk)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+       unsigned int hint = min_t(unsigned int, tp->advmss, tp->mss_cache);
+
+       hint = min(hint, tp->rcv_wnd/2);
+       hint = min(hint, TCP_MIN_RCVMSS);
+       hint = max(hint, TCP_MIN_MSS);
+
+       inet_csk(sk)->icsk_ack.rcv_mss = hint;
+}
+
 /* Receiver "autotuning" code.
  *
  * The algorithm for RTT estimation w/o timestamps is based on
@@ -735,6 +755,27 @@ __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst)
        return min_t(__u32, cwnd, tp->snd_cwnd_clamp);
 }
 
+/* Set slow start threshold and cwnd not falling to slow start */
+void tcp_enter_cwr(struct sock *sk)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+
+       tp->prior_ssthresh = 0;
+       tp->bytes_acked = 0;
+       if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) {
+               tp->undo_marker = 0;
+               tp->snd_ssthresh = inet_csk(sk)->icsk_ca_ops->ssthresh(sk);
+               tp->snd_cwnd = min(tp->snd_cwnd,
+                                  tcp_packets_in_flight(tp) + 1U);
+               tp->snd_cwnd_cnt = 0;
+               tp->high_seq = tp->snd_nxt;
+               tp->snd_cwnd_stamp = tcp_time_stamp;
+               TCP_ECN_queue_cwr(tp);
+
+               tcp_set_ca_state(sk, TCP_CA_CWR);
+       }
+}
+
 /* Initialize metrics on socket. */
 
 static void tcp_init_metrics(struct sock *sk)
@@ -2070,8 +2111,8 @@ static inline void tcp_ack_update_rtt(struct sock *sk, const int flag,
                tcp_ack_no_tstamp(sk, seq_rtt, flag);
 }
 
-static inline void tcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
-                                 u32 in_flight, int good)
+static void tcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
+                          u32 in_flight, int good)
 {
        const struct inet_connection_sock *icsk = inet_csk(sk);
        icsk->icsk_ca_ops->cong_avoid(sk, ack, rtt, in_flight, good);
@@ -2082,7 +2123,7 @@ static inline void tcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
  * RFC2988 recommends to restart timer to now+rto.
  */
 
-static inline void tcp_ack_packets_out(struct sock *sk, struct tcp_sock *tp)
+static void tcp_ack_packets_out(struct sock *sk, struct tcp_sock *tp)
 {
        if (!tp->packets_out) {
                inet_csk_clear_xmit_timer(sk, ICSK_TIME_RETRANS);
@@ -2147,7 +2188,7 @@ static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb,
        return acked;
 }
 
-static inline u32 tcp_usrtt(const struct sk_buff *skb)
+static u32 tcp_usrtt(const struct sk_buff *skb)
 {
        struct timeval tv, now;
 
@@ -2342,7 +2383,7 @@ static int tcp_ack_update_window(struct sock *sk, struct tcp_sock *tp,
 
                        if (nwin > tp->max_window) {
                                tp->max_window = nwin;
-                               tcp_sync_mss(sk, tp->pmtu_cookie);
+                               tcp_sync_mss(sk, inet_csk(sk)->icsk_pmtu_cookie);
                        }
                }
        }
@@ -2583,8 +2624,8 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
 /* Fast parse options. This hopes to only see timestamps.
  * If it is wrong it falls back on tcp_parse_options().
  */
-static inline int tcp_fast_parse_options(struct sk_buff *skb, struct tcphdr *th,
-                                        struct tcp_sock *tp)
+static int tcp_fast_parse_options(struct sk_buff *skb, struct tcphdr *th,
+                                 struct tcp_sock *tp)
 {
        if (th->doff == sizeof(struct tcphdr)>>2) {
                tp->rx_opt.saw_tstamp = 0;
@@ -2804,8 +2845,7 @@ static void tcp_fin(struct sk_buff *skb, struct sock *sk, struct tcphdr *th)
        }
 }
 
-static __inline__ int
-tcp_sack_extend(struct tcp_sack_block *sp, u32 seq, u32 end_seq)
+static inline int tcp_sack_extend(struct tcp_sack_block *sp, u32 seq, u32 end_seq)
 {
        if (!after(seq, sp->end_seq) && !after(sp->start_seq, end_seq)) {
                if (before(seq, sp->start_seq))
@@ -2817,7 +2857,7 @@ tcp_sack_extend(struct tcp_sack_block *sp, u32 seq, u32 end_seq)
        return 0;
 }
 
-static inline void tcp_dsack_set(struct tcp_sock *tp, u32 seq, u32 end_seq)
+static void tcp_dsack_set(struct tcp_sock *tp, u32 seq, u32 end_seq)
 {
        if (tp->rx_opt.sack_ok && sysctl_tcp_dsack) {
                if (before(seq, tp->rcv_nxt))
@@ -2832,7 +2872,7 @@ static inline void tcp_dsack_set(struct tcp_sock *tp, u32 seq, u32 end_seq)
        }
 }
 
-static inline void tcp_dsack_extend(struct tcp_sock *tp, u32 seq, u32 end_seq)
+static void tcp_dsack_extend(struct tcp_sock *tp, u32 seq, u32 end_seq)
 {
        if (!tp->rx_opt.dsack)
                tcp_dsack_set(tp, seq, end_seq);
@@ -2890,7 +2930,7 @@ static void tcp_sack_maybe_coalesce(struct tcp_sock *tp)
        }
 }
 
-static __inline__ void tcp_sack_swap(struct tcp_sack_block *sack1, struct tcp_sack_block *sack2)
+static inline void tcp_sack_swap(struct tcp_sack_block *sack1, struct tcp_sack_block *sack2)
 {
        __u32 tmp;
 
@@ -3455,7 +3495,7 @@ void tcp_cwnd_application_limited(struct sock *sk)
        tp->snd_cwnd_stamp = tcp_time_stamp;
 }
 
-static inline int tcp_should_expand_sndbuf(struct sock *sk, struct tcp_sock *tp)
+static int tcp_should_expand_sndbuf(struct sock *sk, struct tcp_sock *tp)
 {
        /* If the user specified a specific send buffer setting, do
         * not modify it.
@@ -3502,7 +3542,7 @@ static void tcp_new_space(struct sock *sk)
        sk->sk_write_space(sk);
 }
 
-static inline void tcp_check_space(struct sock *sk)
+static void tcp_check_space(struct sock *sk)
 {
        if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) {
                sock_reset_flag(sk, SOCK_QUEUE_SHRUNK);
@@ -3512,7 +3552,7 @@ static inline void tcp_check_space(struct sock *sk)
        }
 }
 
-static __inline__ void tcp_data_snd_check(struct sock *sk, struct tcp_sock *tp)
+static inline void tcp_data_snd_check(struct sock *sk, struct tcp_sock *tp)
 {
        tcp_push_pending_frames(sk, tp);
        tcp_check_space(sk);
@@ -3544,7 +3584,7 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible)
        }
 }
 
-static __inline__ void tcp_ack_snd_check(struct sock *sk)
+static inline void tcp_ack_snd_check(struct sock *sk)
 {
        if (!inet_csk_ack_scheduled(sk)) {
                /* We sent a data segment already. */
@@ -3692,8 +3732,7 @@ static int __tcp_checksum_complete_user(struct sock *sk, struct sk_buff *skb)
        return result;
 }
 
-static __inline__ int
-tcp_checksum_complete_user(struct sock *sk, struct sk_buff *skb)
+static inline int tcp_checksum_complete_user(struct sock *sk, struct sk_buff *skb)
 {
        return skb->ip_summed != CHECKSUM_UNNECESSARY &&
                __tcp_checksum_complete_user(sk, skb);
@@ -3967,12 +4006,12 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
                                         struct tcphdr *th, unsigned len)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       struct inet_connection_sock *icsk = inet_csk(sk);
        int saved_clamp = tp->rx_opt.mss_clamp;
 
        tcp_parse_options(skb, &tp->rx_opt, 0);
 
        if (th->ack) {
-               struct inet_connection_sock *icsk;
                /* rfc793:
                 * "If the state is SYN-SENT then
                 *    first check the ACK bit
@@ -4061,7 +4100,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
                if (tp->rx_opt.sack_ok && sysctl_tcp_fack)
                        tp->rx_opt.sack_ok |= 2;
 
-               tcp_sync_mss(sk, tp->pmtu_cookie);
+               tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
                tcp_initialize_rcv_mss(sk);
 
                /* Remember, tcp_poll() does not lock socket!
@@ -4072,7 +4111,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
                tcp_set_state(sk, TCP_ESTABLISHED);
 
                /* Make sure socket is routed, for correct metrics.  */
-               tp->af_specific->rebuild_header(sk);
+               icsk->icsk_af_ops->rebuild_header(sk);
 
                tcp_init_metrics(sk);
 
@@ -4098,8 +4137,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
                        sk_wake_async(sk, 0, POLL_OUT);
                }
 
-               icsk = inet_csk(sk);
-
                if (sk->sk_write_pending ||
                    icsk->icsk_accept_queue.rskq_defer_accept ||
                    icsk->icsk_ack.pingpong) {
@@ -4173,7 +4210,7 @@ discard:
                if (tp->ecn_flags&TCP_ECN_OK)
                        sock_set_flag(sk, SOCK_NO_LARGESEND);
 
-               tcp_sync_mss(sk, tp->pmtu_cookie);
+               tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
                tcp_initialize_rcv_mss(sk);
 
 
@@ -4220,6 +4257,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                          struct tcphdr *th, unsigned len)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       struct inet_connection_sock *icsk = inet_csk(sk);
        int queued = 0;
 
        tp->rx_opt.saw_tstamp = 0;
@@ -4236,7 +4274,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        goto discard;
 
                if(th->syn) {
-                       if(tp->af_specific->conn_request(sk, skb) < 0)
+                       if (icsk->icsk_af_ops->conn_request(sk, skb) < 0)
                                return 1;
 
                        /* Now we have several options: In theory there is 
@@ -4349,7 +4387,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                                /* Make sure socket is routed, for
                                 * correct metrics.
                                 */
-                               tp->af_specific->rebuild_header(sk);
+                               icsk->icsk_af_ops->rebuild_header(sk);
 
                                tcp_init_metrics(sk);
 
@@ -4475,3 +4513,4 @@ EXPORT_SYMBOL(sysctl_tcp_abc);
 EXPORT_SYMBOL(tcp_parse_options);
 EXPORT_SYMBOL(tcp_rcv_established);
 EXPORT_SYMBOL(tcp_rcv_state_process);
+EXPORT_SYMBOL(tcp_initialize_rcv_mss);
index 4d5021e1929b991861c0fc788be99c8b568fcb79..e9f83e5b28ce93a7e2a3e76a878526ec227ad497 100644 (file)
@@ -69,6 +69,7 @@
 #include <net/transp_v6.h>
 #include <net/ipv6.h>
 #include <net/inet_common.h>
+#include <net/timewait_sock.h>
 #include <net/xfrm.h>
 
 #include <linux/inet.h>
@@ -86,8 +87,7 @@ int sysctl_tcp_low_latency;
 /* Socket used for sending RSTs */
 static struct socket *tcp_socket;
 
-void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len,
-                      struct sk_buff *skb);
+void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb);
 
 struct inet_hashinfo __cacheline_aligned tcp_hashinfo = {
        .lhash_lock     = RW_LOCK_UNLOCKED,
@@ -97,7 +97,8 @@ struct inet_hashinfo __cacheline_aligned tcp_hashinfo = {
 
 static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
 {
-       return inet_csk_get_port(&tcp_hashinfo, sk, snum);
+       return inet_csk_get_port(&tcp_hashinfo, sk, snum,
+                                inet_csk_bind_conflict);
 }
 
 static void tcp_v4_hash(struct sock *sk)
@@ -118,202 +119,38 @@ static inline __u32 tcp_v4_init_sequence(struct sock *sk, struct sk_buff *skb)
                                          skb->h.th->source);
 }
 
-/* called with local bh disabled */
-static int __tcp_v4_check_established(struct sock *sk, __u16 lport,
-                                     struct inet_timewait_sock **twp)
+int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
 {
-       struct inet_sock *inet = inet_sk(sk);
-       u32 daddr = inet->rcv_saddr;
-       u32 saddr = inet->daddr;
-       int dif = sk->sk_bound_dev_if;
-       INET_ADDR_COOKIE(acookie, saddr, daddr)
-       const __u32 ports = INET_COMBINED_PORTS(inet->dport, lport);
-       unsigned int hash = inet_ehashfn(daddr, lport, saddr, inet->dport);
-       struct inet_ehash_bucket *head = inet_ehash_bucket(&tcp_hashinfo, hash);
-       struct sock *sk2;
-       const struct hlist_node *node;
-       struct inet_timewait_sock *tw;
-
-       prefetch(head->chain.first);
-       write_lock(&head->lock);
-
-       /* Check TIME-WAIT sockets first. */
-       sk_for_each(sk2, node, &(head + tcp_hashinfo.ehash_size)->chain) {
-               tw = inet_twsk(sk2);
-
-               if (INET_TW_MATCH(sk2, hash, acookie, saddr, daddr, ports, dif)) {
-                       const struct tcp_timewait_sock *tcptw = tcp_twsk(sk2);
-                       struct tcp_sock *tp = tcp_sk(sk);
-
-                       /* With PAWS, it is safe from the viewpoint
-                          of data integrity. Even without PAWS it
-                          is safe provided sequence spaces do not
-                          overlap i.e. at data rates <= 80Mbit/sec.
-
-                          Actually, the idea is close to VJ's one,
-                          only timestamp cache is held not per host,
-                          but per port pair and TW bucket is used
-                          as state holder.
+       const struct tcp_timewait_sock *tcptw = tcp_twsk(sktw);
+       struct tcp_sock *tp = tcp_sk(sk);
 
-                          If TW bucket has been already destroyed we
-                          fall back to VJ's scheme and use initial
-                          timestamp retrieved from peer table.
-                        */
-                       if (tcptw->tw_ts_recent_stamp &&
-                           (!twp || (sysctl_tcp_tw_reuse &&
-                                     xtime.tv_sec -
-                                     tcptw->tw_ts_recent_stamp > 1))) {
-                               tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2;
-                               if (tp->write_seq == 0)
-                                       tp->write_seq = 1;
-                               tp->rx_opt.ts_recent       = tcptw->tw_ts_recent;
-                               tp->rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp;
-                               sock_hold(sk2);
-                               goto unique;
-                       } else
-                               goto not_unique;
-               }
-       }
-       tw = NULL;
+       /* With PAWS, it is safe from the viewpoint
+          of data integrity. Even without PAWS it is safe provided sequence
+          spaces do not overlap i.e. at data rates <= 80Mbit/sec.
 
-       /* And established part... */
-       sk_for_each(sk2, node, &head->chain) {
-               if (INET_MATCH(sk2, hash, acookie, saddr, daddr, ports, dif))
-                       goto not_unique;
-       }
+          Actually, the idea is close to VJ's one, only timestamp cache is
+          held not per host, but per port pair and TW bucket is used as state
+          holder.
 
-unique:
-       /* Must record num and sport now. Otherwise we will see
-        * in hash table socket with a funny identity. */
-       inet->num = lport;
-       inet->sport = htons(lport);
-       sk->sk_hash = hash;
-       BUG_TRAP(sk_unhashed(sk));
-       __sk_add_node(sk, &head->chain);
-       sock_prot_inc_use(sk->sk_prot);
-       write_unlock(&head->lock);
-
-       if (twp) {
-               *twp = tw;
-               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
-       } else if (tw) {
-               /* Silly. Should hash-dance instead... */
-               inet_twsk_deschedule(tw, &tcp_death_row);
-               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
-
-               inet_twsk_put(tw);
+          If TW bucket has been already destroyed we fall back to VJ's scheme
+          and use initial timestamp retrieved from peer table.
+        */
+       if (tcptw->tw_ts_recent_stamp &&
+           (twp == NULL || (sysctl_tcp_tw_reuse &&
+                            xtime.tv_sec - tcptw->tw_ts_recent_stamp > 1))) {
+               tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2;
+               if (tp->write_seq == 0)
+                       tp->write_seq = 1;
+               tp->rx_opt.ts_recent       = tcptw->tw_ts_recent;
+               tp->rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp;
+               sock_hold(sktw);
+               return 1;
        }
 
        return 0;
-
-not_unique:
-       write_unlock(&head->lock);
-       return -EADDRNOTAVAIL;
 }
 
-static inline u32 connect_port_offset(const struct sock *sk)
-{
-       const struct inet_sock *inet = inet_sk(sk);
-
-       return secure_tcp_port_ephemeral(inet->rcv_saddr, inet->daddr, 
-                                        inet->dport);
-}
-
-/*
- * Bind a port for a connect operation and hash it.
- */
-static inline int tcp_v4_hash_connect(struct sock *sk)
-{
-       const unsigned short snum = inet_sk(sk)->num;
-       struct inet_bind_hashbucket *head;
-       struct inet_bind_bucket *tb;
-       int ret;
-
-       if (!snum) {
-               int low = sysctl_local_port_range[0];
-               int high = sysctl_local_port_range[1];
-               int range = high - low;
-               int i;
-               int port;
-               static u32 hint;
-               u32 offset = hint + connect_port_offset(sk);
-               struct hlist_node *node;
-               struct inet_timewait_sock *tw = NULL;
-
-               local_bh_disable();
-               for (i = 1; i <= range; i++) {
-                       port = low + (i + offset) % range;
-                       head = &tcp_hashinfo.bhash[inet_bhashfn(port, tcp_hashinfo.bhash_size)];
-                       spin_lock(&head->lock);
-
-                       /* Does not bother with rcv_saddr checks,
-                        * because the established check is already
-                        * unique enough.
-                        */
-                       inet_bind_bucket_for_each(tb, node, &head->chain) {
-                               if (tb->port == port) {
-                                       BUG_TRAP(!hlist_empty(&tb->owners));
-                                       if (tb->fastreuse >= 0)
-                                               goto next_port;
-                                       if (!__tcp_v4_check_established(sk,
-                                                                       port,
-                                                                       &tw))
-                                               goto ok;
-                                       goto next_port;
-                               }
-                       }
-
-                       tb = inet_bind_bucket_create(tcp_hashinfo.bind_bucket_cachep, head, port);
-                       if (!tb) {
-                               spin_unlock(&head->lock);
-                               break;
-                       }
-                       tb->fastreuse = -1;
-                       goto ok;
-
-               next_port:
-                       spin_unlock(&head->lock);
-               }
-               local_bh_enable();
-
-               return -EADDRNOTAVAIL;
-
-ok:
-               hint += i;
-
-               /* Head lock still held and bh's disabled */
-               inet_bind_hash(sk, tb, port);
-               if (sk_unhashed(sk)) {
-                       inet_sk(sk)->sport = htons(port);
-                       __inet_hash(&tcp_hashinfo, sk, 0);
-               }
-               spin_unlock(&head->lock);
-
-               if (tw) {
-                       inet_twsk_deschedule(tw, &tcp_death_row);;
-                       inet_twsk_put(tw);
-               }
-
-               ret = 0;
-               goto out;
-       }
-
-       head = &tcp_hashinfo.bhash[inet_bhashfn(snum, tcp_hashinfo.bhash_size)];
-       tb  = inet_csk(sk)->icsk_bind_hash;
-       spin_lock_bh(&head->lock);
-       if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
-               __inet_hash(&tcp_hashinfo, sk, 0);
-               spin_unlock_bh(&head->lock);
-               return 0;
-       } else {
-               spin_unlock(&head->lock);
-               /* No definite answer... Walk to established hash table */
-               ret = __tcp_v4_check_established(sk, snum, NULL);
-out:
-               local_bh_enable();
-               return ret;
-       }
-}
+EXPORT_SYMBOL_GPL(tcp_twsk_unique);
 
 /* This will initiate an outgoing connection. */
 int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
@@ -383,9 +220,9 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        inet->dport = usin->sin_port;
        inet->daddr = daddr;
 
-       tp->ext_header_len = 0;
+       inet_csk(sk)->icsk_ext_hdr_len = 0;
        if (inet->opt)
-               tp->ext_header_len = inet->opt->optlen;
+               inet_csk(sk)->icsk_ext_hdr_len = inet->opt->optlen;
 
        tp->rx_opt.mss_clamp = 536;
 
@@ -395,7 +232,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
         * complete initialization after this.
         */
        tcp_set_state(sk, TCP_SYN_SENT);
-       err = tcp_v4_hash_connect(sk);
+       err = inet_hash_connect(&tcp_death_row, sk);
        if (err)
                goto failure;
 
@@ -433,12 +270,10 @@ failure:
 /*
  * This routine does path mtu discovery as defined in RFC1191.
  */
-static inline void do_pmtu_discovery(struct sock *sk, struct iphdr *iph,
-                                    u32 mtu)
+static void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, u32 mtu)
 {
        struct dst_entry *dst;
        struct inet_sock *inet = inet_sk(sk);
-       struct tcp_sock *tp = tcp_sk(sk);
 
        /* We are not interested in TCP_LISTEN and open_requests (SYN-ACKs
         * send out by Linux are always <576bytes so they should go through
@@ -467,7 +302,7 @@ static inline void do_pmtu_discovery(struct sock *sk, struct iphdr *iph,
        mtu = dst_mtu(dst);
 
        if (inet->pmtudisc != IP_PMTUDISC_DONT &&
-           tp->pmtu_cookie > mtu) {
+           inet_csk(sk)->icsk_pmtu_cookie > mtu) {
                tcp_sync_mss(sk, mtu);
 
                /* Resend the TCP packet because it's
@@ -644,10 +479,10 @@ out:
 }
 
 /* This routine computes an IPv4 TCP checksum. */
-void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len,
-                      struct sk_buff *skb)
+void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
 {
        struct inet_sock *inet = inet_sk(sk);
+       struct tcphdr *th = skb->h.th;
 
        if (skb->ip_summed == CHECKSUM_HW) {
                th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0);
@@ -826,7 +661,8 @@ static void tcp_v4_reqsk_destructor(struct request_sock *req)
        kfree(inet_rsk(req)->opt);
 }
 
-static inline void syn_flood_warning(struct sk_buff *skb)
+#ifdef CONFIG_SYN_COOKIES
+static void syn_flood_warning(struct sk_buff *skb)
 {
        static unsigned long warntime;
 
@@ -837,12 +673,13 @@ static inline void syn_flood_warning(struct sk_buff *skb)
                       ntohs(skb->h.th->dest));
        }
 }
+#endif
 
 /*
  * 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)
+static struct ip_options *tcp_v4_save_options(struct sock *sk,
+                                             struct sk_buff *skb)
 {
        struct ip_options *opt = &(IPCB(skb)->opt);
        struct ip_options *dopt = NULL;
@@ -869,6 +706,11 @@ struct request_sock_ops tcp_request_sock_ops = {
        .send_reset     =       tcp_v4_send_reset,
 };
 
+static struct timewait_sock_ops tcp_timewait_sock_ops = {
+       .twsk_obj_size  = sizeof(struct tcp_timewait_sock),
+       .twsk_unique    = tcp_twsk_unique,
+};
+
 int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
 {
        struct inet_request_sock *ireq;
@@ -1053,9 +895,9 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        ireq->opt             = NULL;
        newinet->mc_index     = inet_iif(skb);
        newinet->mc_ttl       = skb->nh.iph->ttl;
-       newtp->ext_header_len = 0;
+       inet_csk(newsk)->icsk_ext_hdr_len = 0;
        if (newinet->opt)
-               newtp->ext_header_len = newinet->opt->optlen;
+               inet_csk(newsk)->icsk_ext_hdr_len = newinet->opt->optlen;
        newinet->id = newtp->write_seq ^ jiffies;
 
        tcp_sync_mss(newsk, dst_mtu(dst));
@@ -1314,16 +1156,6 @@ do_time_wait:
        goto discard_it;
 }
 
-static void v4_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
-{
-       struct sockaddr_in *sin = (struct sockaddr_in *) uaddr;
-       struct inet_sock *inet = inet_sk(sk);
-
-       sin->sin_family         = AF_INET;
-       sin->sin_addr.s_addr    = inet->daddr;
-       sin->sin_port           = inet->dport;
-}
-
 /* VJ's idea. Save last timestamp seen from this destination
  * and hold it at least for normal timewait interval to use for duplicate
  * segment detection in subsequent connections, before they enter synchronized
@@ -1382,7 +1214,7 @@ int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw)
        return 0;
 }
 
-struct tcp_func ipv4_specific = {
+struct inet_connection_sock_af_ops ipv4_specific = {
        .queue_xmit     =       ip_queue_xmit,
        .send_check     =       tcp_v4_send_check,
        .rebuild_header =       inet_sk_rebuild_header,
@@ -1392,7 +1224,7 @@ struct tcp_func ipv4_specific = {
        .net_header_len =       sizeof(struct iphdr),
        .setsockopt     =       ip_setsockopt,
        .getsockopt     =       ip_getsockopt,
-       .addr2sockaddr  =       v4_addr2sockaddr,
+       .addr2sockaddr  =       inet_csk_addr2sockaddr,
        .sockaddr_len   =       sizeof(struct sockaddr_in),
 };
 
@@ -1433,7 +1265,8 @@ static int tcp_v4_init_sock(struct sock *sk)
        sk->sk_write_space = sk_stream_write_space;
        sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
 
-       tp->af_specific = &ipv4_specific;
+       icsk->icsk_af_ops = &ipv4_specific;
+       icsk->icsk_sync_mss = tcp_sync_mss;
 
        sk->sk_sndbuf = sysctl_tcp_wmem[1];
        sk->sk_rcvbuf = sysctl_tcp_rmem[1];
@@ -1989,7 +1822,7 @@ struct proto tcp_prot = {
        .sysctl_rmem            = sysctl_tcp_rmem,
        .max_header             = MAX_TCP_HEADER,
        .obj_size               = sizeof(struct tcp_sock),
-       .twsk_obj_size          = sizeof(struct tcp_timewait_sock),
+       .twsk_prot              = &tcp_timewait_sock_ops,
        .rsk_prot               = &tcp_request_sock_ops,
 };
 
index 1b66a2ac4321cb3dfe42326a03baa0897b016f37..2b9b7f6c7f7c101867d1318bcc56d64b995eb0ed 100644 (file)
@@ -274,18 +274,18 @@ kill:
 void tcp_time_wait(struct sock *sk, int state, int timeo)
 {
        struct inet_timewait_sock *tw = NULL;
+       const struct inet_connection_sock *icsk = inet_csk(sk);
        const struct tcp_sock *tp = tcp_sk(sk);
        int recycle_ok = 0;
 
        if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp)
-               recycle_ok = tp->af_specific->remember_stamp(sk);
+               recycle_ok = icsk->icsk_af_ops->remember_stamp(sk);
 
        if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets)
                tw = inet_twsk_alloc(sk, state);
 
        if (tw != NULL) {
                struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw);
-               const struct inet_connection_sock *icsk = inet_csk(sk);
                const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
 
                tw->tw_rcv_wscale       = tp->rx_opt.rcv_wscale;
@@ -298,10 +298,12 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                if (tw->tw_family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
-                       struct tcp6_timewait_sock *tcp6tw = tcp6_twsk((struct sock *)tw);
+                       struct inet6_timewait_sock *tw6;
 
-                       ipv6_addr_copy(&tcp6tw->tw_v6_daddr, &np->daddr);
-                       ipv6_addr_copy(&tcp6tw->tw_v6_rcv_saddr, &np->rcv_saddr);
+                       tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot);
+                       tw6 = inet6_twsk((struct sock *)tw);
+                       ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr);
+                       ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr);
                        tw->tw_ipv6only = np->ipv6only;
                }
 #endif
@@ -456,7 +458,6 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
                           struct request_sock **prev)
 {
        struct tcphdr *th = skb->h.th;
-       struct tcp_sock *tp = tcp_sk(sk);
        u32 flg = tcp_flag_word(th) & (TCP_FLAG_RST|TCP_FLAG_SYN|TCP_FLAG_ACK);
        int paws_reject = 0;
        struct tcp_options_received tmp_opt;
@@ -613,7 +614,8 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
                 * ESTABLISHED STATE. If it will be dropped after
                 * socket is created, wait for troubles.
                 */
-               child = tp->af_specific->syn_recv_sock(sk, skb, req, NULL);
+               child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb,
+                                                                req, NULL);
                if (child == NULL)
                        goto listen_overflow;
 
index 029c70dfb585f74e74383faf40c1816b4e6d410d..a7623ead39a8b6a91fe34b81afd5193d9ed6cce3 100644 (file)
@@ -51,8 +51,8 @@ int sysctl_tcp_retrans_collapse = 1;
  */
 int sysctl_tcp_tso_win_divisor = 3;
 
-static inline void update_send_head(struct sock *sk, struct tcp_sock *tp,
-                                   struct sk_buff *skb)
+static void update_send_head(struct sock *sk, struct tcp_sock *tp,
+                            struct sk_buff *skb)
 {
        sk->sk_send_head = skb->next;
        if (sk->sk_send_head == (struct sk_buff *)&sk->sk_write_queue)
@@ -124,8 +124,8 @@ static void tcp_cwnd_restart(struct sock *sk, struct dst_entry *dst)
        tp->snd_cwnd_used = 0;
 }
 
-static inline void tcp_event_data_sent(struct tcp_sock *tp,
-                                      struct sk_buff *skb, struct sock *sk)
+static void tcp_event_data_sent(struct tcp_sock *tp,
+                               struct sk_buff *skb, struct sock *sk)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
        const u32 now = tcp_time_stamp;
@@ -142,7 +142,7 @@ static inline void tcp_event_data_sent(struct tcp_sock *tp,
                icsk->icsk_ack.pingpong = 1;
 }
 
-static __inline__ void tcp_event_ack_sent(struct sock *sk, unsigned int pkts)
+static inline void tcp_event_ack_sent(struct sock *sk, unsigned int pkts)
 {
        tcp_dec_quickack_mode(sk, pkts);
        inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK);
@@ -212,7 +212,7 @@ void tcp_select_initial_window(int __space, __u32 mss,
  * value can be stuffed directly into th->window for an outgoing
  * frame.
  */
-static __inline__ u16 tcp_select_window(struct sock *sk)
+static u16 tcp_select_window(struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        u32 cur_win = tcp_receive_window(tp);
@@ -250,6 +250,75 @@ static __inline__ u16 tcp_select_window(struct sock *sk)
        return new_win;
 }
 
+static void tcp_build_and_update_options(__u32 *ptr, struct tcp_sock *tp,
+                                        __u32 tstamp)
+{
+       if (tp->rx_opt.tstamp_ok) {
+               *ptr++ = __constant_htonl((TCPOPT_NOP << 24) |
+                                         (TCPOPT_NOP << 16) |
+                                         (TCPOPT_TIMESTAMP << 8) |
+                                         TCPOLEN_TIMESTAMP);
+               *ptr++ = htonl(tstamp);
+               *ptr++ = htonl(tp->rx_opt.ts_recent);
+       }
+       if (tp->rx_opt.eff_sacks) {
+               struct tcp_sack_block *sp = tp->rx_opt.dsack ? tp->duplicate_sack : tp->selective_acks;
+               int this_sack;
+
+               *ptr++ = htonl((TCPOPT_NOP  << 24) |
+                              (TCPOPT_NOP  << 16) |
+                              (TCPOPT_SACK <<  8) |
+                              (TCPOLEN_SACK_BASE + (tp->rx_opt.eff_sacks *
+                                                    TCPOLEN_SACK_PERBLOCK)));
+               for(this_sack = 0; this_sack < tp->rx_opt.eff_sacks; this_sack++) {
+                       *ptr++ = htonl(sp[this_sack].start_seq);
+                       *ptr++ = htonl(sp[this_sack].end_seq);
+               }
+               if (tp->rx_opt.dsack) {
+                       tp->rx_opt.dsack = 0;
+                       tp->rx_opt.eff_sacks--;
+               }
+       }
+}
+
+/* Construct a tcp options header for a SYN or SYN_ACK packet.
+ * If this is every changed make sure to change the definition of
+ * MAX_SYN_SIZE to match the new maximum number of options that you
+ * can generate.
+ */
+static void tcp_syn_build_options(__u32 *ptr, int mss, int ts, int sack,
+                                 int offer_wscale, int wscale, __u32 tstamp,
+                                 __u32 ts_recent)
+{
+       /* We always get an MSS option.
+        * The option bytes which will be seen in normal data
+        * packets should timestamps be used, must be in the MSS
+        * advertised.  But we subtract them from tp->mss_cache so
+        * that calculations in tcp_sendmsg are simpler etc.
+        * So account for this fact here if necessary.  If we
+        * don't do this correctly, as a receiver we won't
+        * recognize data packets as being full sized when we
+        * should, and thus we won't abide by the delayed ACK
+        * rules correctly.
+        * SACKs don't matter, we never delay an ACK when we
+        * have any of those going out.
+        */
+       *ptr++ = htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) | mss);
+       if (ts) {
+               if(sack)
+                       *ptr++ = __constant_htonl((TCPOPT_SACK_PERM << 24) | (TCPOLEN_SACK_PERM << 16) |
+                                                 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
+               else
+                       *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
+                                                 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
+               *ptr++ = htonl(tstamp);         /* TSVAL */
+               *ptr++ = htonl(ts_recent);      /* TSECR */
+       } else if(sack)
+               *ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
+                                         (TCPOPT_SACK_PERM << 8) | TCPOLEN_SACK_PERM);
+       if (offer_wscale)
+               *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_WINDOW << 16) | (TCPOLEN_WINDOW << 8) | (wscale));
+}
 
 /* This routine actually transmits TCP packets queued in by
  * tcp_do_sendmsg().  This is used by both the initial
@@ -262,122 +331,139 @@ static __inline__ u16 tcp_select_window(struct sock *sk)
  * We are working here with either a clone of the original
  * SKB, or a fresh unique copy made by the retransmit engine.
  */
-static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb)
+static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, gfp_t gfp_mask)
 {
-       if (skb != NULL) {
-               const struct inet_connection_sock *icsk = inet_csk(sk);
-               struct inet_sock *inet = inet_sk(sk);
-               struct tcp_sock *tp = tcp_sk(sk);
-               struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
-               int tcp_header_size = tp->tcp_header_len;
-               struct tcphdr *th;
-               int sysctl_flags;
-               int err;
+       const struct inet_connection_sock *icsk = inet_csk(sk);
+       struct inet_sock *inet;
+       struct tcp_sock *tp;
+       struct tcp_skb_cb *tcb;
+       int tcp_header_size;
+       struct tcphdr *th;
+       int sysctl_flags;
+       int err;
+
+       BUG_ON(!skb || !tcp_skb_pcount(skb));
+
+       /* If congestion control is doing timestamping, we must
+        * take such a timestamp before we potentially clone/copy.
+        */
+       if (icsk->icsk_ca_ops->rtt_sample)
+               __net_timestamp(skb);
+
+       if (likely(clone_it)) {
+               if (unlikely(skb_cloned(skb)))
+                       skb = pskb_copy(skb, gfp_mask);
+               else
+                       skb = skb_clone(skb, gfp_mask);
+               if (unlikely(!skb))
+                       return -ENOBUFS;
+       }
 
-               BUG_ON(!tcp_skb_pcount(skb));
+       inet = inet_sk(sk);
+       tp = tcp_sk(sk);
+       tcb = TCP_SKB_CB(skb);
+       tcp_header_size = tp->tcp_header_len;
 
 #define SYSCTL_FLAG_TSTAMPS    0x1
 #define SYSCTL_FLAG_WSCALE     0x2
 #define SYSCTL_FLAG_SACK       0x4
 
-               /* If congestion control is doing timestamping */
-               if (icsk->icsk_ca_ops->rtt_sample)
-                       __net_timestamp(skb);
-
-               sysctl_flags = 0;
-               if (tcb->flags & TCPCB_FLAG_SYN) {
-                       tcp_header_size = sizeof(struct tcphdr) + TCPOLEN_MSS;
-                       if(sysctl_tcp_timestamps) {
-                               tcp_header_size += TCPOLEN_TSTAMP_ALIGNED;
-                               sysctl_flags |= SYSCTL_FLAG_TSTAMPS;
-                       }
-                       if(sysctl_tcp_window_scaling) {
-                               tcp_header_size += TCPOLEN_WSCALE_ALIGNED;
-                               sysctl_flags |= SYSCTL_FLAG_WSCALE;
-                       }
-                       if(sysctl_tcp_sack) {
-                               sysctl_flags |= SYSCTL_FLAG_SACK;
-                               if(!(sysctl_flags & SYSCTL_FLAG_TSTAMPS))
-                                       tcp_header_size += TCPOLEN_SACKPERM_ALIGNED;
-                       }
-               } else if (tp->rx_opt.eff_sacks) {
-                       /* A SACK is 2 pad bytes, a 2 byte header, plus
-                        * 2 32-bit sequence numbers for each SACK block.
-                        */
-                       tcp_header_size += (TCPOLEN_SACK_BASE_ALIGNED +
-                                           (tp->rx_opt.eff_sacks * TCPOLEN_SACK_PERBLOCK));
+       sysctl_flags = 0;
+       if (unlikely(tcb->flags & TCPCB_FLAG_SYN)) {
+               tcp_header_size = sizeof(struct tcphdr) + TCPOLEN_MSS;
+               if(sysctl_tcp_timestamps) {
+                       tcp_header_size += TCPOLEN_TSTAMP_ALIGNED;
+                       sysctl_flags |= SYSCTL_FLAG_TSTAMPS;
                }
-               
-               if (tcp_packets_in_flight(tp) == 0)
-                       tcp_ca_event(sk, CA_EVENT_TX_START);
-
-               th = (struct tcphdr *) skb_push(skb, tcp_header_size);
-               skb->h.th = th;
-               skb_set_owner_w(skb, sk);
-
-               /* Build TCP header and checksum it. */
-               th->source              = inet->sport;
-               th->dest                = inet->dport;
-               th->seq                 = htonl(tcb->seq);
-               th->ack_seq             = htonl(tp->rcv_nxt);
-               *(((__u16 *)th) + 6)    = htons(((tcp_header_size >> 2) << 12) | tcb->flags);
-               if (tcb->flags & TCPCB_FLAG_SYN) {
-                       /* RFC1323: The window in SYN & SYN/ACK segments
-                        * is never scaled.
-                        */
-                       th->window      = htons(tp->rcv_wnd);
-               } else {
-                       th->window      = htons(tcp_select_window(sk));
+               if (sysctl_tcp_window_scaling) {
+                       tcp_header_size += TCPOLEN_WSCALE_ALIGNED;
+                       sysctl_flags |= SYSCTL_FLAG_WSCALE;
                }
-               th->check               = 0;
-               th->urg_ptr             = 0;
-
-               if (tp->urg_mode &&
-                   between(tp->snd_up, tcb->seq+1, tcb->seq+0xFFFF)) {
-                       th->urg_ptr             = htons(tp->snd_up-tcb->seq);
-                       th->urg                 = 1;
+               if (sysctl_tcp_sack) {
+                       sysctl_flags |= SYSCTL_FLAG_SACK;
+                       if (!(sysctl_flags & SYSCTL_FLAG_TSTAMPS))
+                               tcp_header_size += TCPOLEN_SACKPERM_ALIGNED;
                }
+       } else if (unlikely(tp->rx_opt.eff_sacks)) {
+               /* A SACK is 2 pad bytes, a 2 byte header, plus
+                * 2 32-bit sequence numbers for each SACK block.
+                */
+               tcp_header_size += (TCPOLEN_SACK_BASE_ALIGNED +
+                                   (tp->rx_opt.eff_sacks *
+                                    TCPOLEN_SACK_PERBLOCK));
+       }
+               
+       if (tcp_packets_in_flight(tp) == 0)
+               tcp_ca_event(sk, CA_EVENT_TX_START);
+
+       th = (struct tcphdr *) skb_push(skb, tcp_header_size);
+       skb->h.th = th;
+       skb_set_owner_w(skb, sk);
+
+       /* Build TCP header and checksum it. */
+       th->source              = inet->sport;
+       th->dest                = inet->dport;
+       th->seq                 = htonl(tcb->seq);
+       th->ack_seq             = htonl(tp->rcv_nxt);
+       *(((__u16 *)th) + 6)    = htons(((tcp_header_size >> 2) << 12) |
+                                       tcb->flags);
+
+       if (unlikely(tcb->flags & TCPCB_FLAG_SYN)) {
+               /* RFC1323: The window in SYN & SYN/ACK segments
+                * is never scaled.
+                */
+               th->window      = htons(tp->rcv_wnd);
+       } else {
+               th->window      = htons(tcp_select_window(sk));
+       }
+       th->check               = 0;
+       th->urg_ptr             = 0;
 
-               if (tcb->flags & TCPCB_FLAG_SYN) {
-                       tcp_syn_build_options((__u32 *)(th + 1),
-                                             tcp_advertise_mss(sk),
-                                             (sysctl_flags & SYSCTL_FLAG_TSTAMPS),
-                                             (sysctl_flags & SYSCTL_FLAG_SACK),
-                                             (sysctl_flags & SYSCTL_FLAG_WSCALE),
-                                             tp->rx_opt.rcv_wscale,
-                                             tcb->when,
-                                             tp->rx_opt.ts_recent);
-               } else {
-                       tcp_build_and_update_options((__u32 *)(th + 1),
-                                                    tp, tcb->when);
+       if (unlikely(tp->urg_mode &&
+                    between(tp->snd_up, tcb->seq+1, tcb->seq+0xFFFF))) {
+               th->urg_ptr             = htons(tp->snd_up-tcb->seq);
+               th->urg                 = 1;
+       }
 
-                       TCP_ECN_send(sk, tp, skb, tcp_header_size);
-               }
-               tp->af_specific->send_check(sk, th, skb->len, skb);
+       if (unlikely(tcb->flags & TCPCB_FLAG_SYN)) {
+               tcp_syn_build_options((__u32 *)(th + 1),
+                                     tcp_advertise_mss(sk),
+                                     (sysctl_flags & SYSCTL_FLAG_TSTAMPS),
+                                     (sysctl_flags & SYSCTL_FLAG_SACK),
+                                     (sysctl_flags & SYSCTL_FLAG_WSCALE),
+                                     tp->rx_opt.rcv_wscale,
+                                     tcb->when,
+                                     tp->rx_opt.ts_recent);
+       } else {
+               tcp_build_and_update_options((__u32 *)(th + 1),
+                                            tp, tcb->when);
+               TCP_ECN_send(sk, tp, skb, tcp_header_size);
+       }
 
-               if (tcb->flags & TCPCB_FLAG_ACK)
-                       tcp_event_ack_sent(sk, tcp_skb_pcount(skb));
+       icsk->icsk_af_ops->send_check(sk, skb->len, skb);
 
-               if (skb->len != tcp_header_size)
-                       tcp_event_data_sent(tp, skb, sk);
+       if (likely(tcb->flags & TCPCB_FLAG_ACK))
+               tcp_event_ack_sent(sk, tcp_skb_pcount(skb));
 
-               TCP_INC_STATS(TCP_MIB_OUTSEGS);
+       if (skb->len != tcp_header_size)
+               tcp_event_data_sent(tp, skb, sk);
 
-               err = tp->af_specific->queue_xmit(skb, 0);
-               if (err <= 0)
-                       return err;
+       TCP_INC_STATS(TCP_MIB_OUTSEGS);
 
-               tcp_enter_cwr(sk);
+       err = icsk->icsk_af_ops->queue_xmit(skb, 0);
+       if (unlikely(err <= 0))
+               return err;
+
+       tcp_enter_cwr(sk);
+
+       /* NET_XMIT_CN is special. It does not guarantee,
+        * that this packet is lost. It tells that device
+        * is about to start to drop packets or already
+        * drops some packets of the same priority and
+        * invokes us to send less aggressively.
+        */
+       return err == NET_XMIT_CN ? 0 : err;
 
-               /* NET_XMIT_CN is special. It does not guarantee,
-                * that this packet is lost. It tells that device
-                * is about to start to drop packets or already
-                * drops some packets of the same priority and
-                * invokes us to send less aggressively.
-                */
-               return err == NET_XMIT_CN ? 0 : err;
-       }
-       return -ENOBUFS;
 #undef SYSCTL_FLAG_TSTAMPS
 #undef SYSCTL_FLAG_WSCALE
 #undef SYSCTL_FLAG_SACK
@@ -604,7 +690,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
    It is minimum of user_mss and mss received with SYN.
    It also does not include TCP options.
 
-   tp->pmtu_cookie is last pmtu, seen by this function.
+   inet_csk(sk)->icsk_pmtu_cookie is last pmtu, seen by this function.
 
    tp->mss_cache is current effective sending mss, including
    all tcp options except for SACKs. It is evaluated,
@@ -614,26 +700,26 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
    NOTE1. rfc1122 clearly states that advertised MSS
    DOES NOT include either tcp or ip options.
 
-   NOTE2. tp->pmtu_cookie and tp->mss_cache are READ ONLY outside
-   this function.                      --ANK (980731)
+   NOTE2. inet_csk(sk)->icsk_pmtu_cookie and tp->mss_cache
+   are READ ONLY outside this function.                --ANK (980731)
  */
 
 unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       int mss_now;
-
+       struct inet_connection_sock *icsk = inet_csk(sk);
        /* Calculate base mss without TCP options:
           It is MMS_S - sizeof(tcphdr) of rfc1122
         */
-       mss_now = pmtu - tp->af_specific->net_header_len - sizeof(struct tcphdr);
+       int mss_now = (pmtu - icsk->icsk_af_ops->net_header_len -
+                      sizeof(struct tcphdr));
 
        /* Clamp it (mss_clamp does not include tcp options) */
        if (mss_now > tp->rx_opt.mss_clamp)
                mss_now = tp->rx_opt.mss_clamp;
 
        /* Now subtract optional transport overhead */
-       mss_now -= tp->ext_header_len;
+       mss_now -= icsk->icsk_ext_hdr_len;
 
        /* Then reserve room for full set of TCP options and 8 bytes of data */
        if (mss_now < 48)
@@ -647,7 +733,7 @@ unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu)
                mss_now = max((tp->max_window>>1), 68U - tp->tcp_header_len);
 
        /* And store cached results */
-       tp->pmtu_cookie = pmtu;
+       icsk->icsk_pmtu_cookie = pmtu;
        tp->mss_cache = mss_now;
 
        return mss_now;
@@ -677,7 +763,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed)
 
        if (dst) {
                u32 mtu = dst_mtu(dst);
-               if (mtu != tp->pmtu_cookie)
+               if (mtu != inet_csk(sk)->icsk_pmtu_cookie)
                        mss_now = tcp_sync_mss(sk, mtu);
        }
 
@@ -688,9 +774,10 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed)
        xmit_size_goal = mss_now;
 
        if (doing_tso) {
-               xmit_size_goal = 65535 -
-                       tp->af_specific->net_header_len -
-                       tp->ext_header_len - tp->tcp_header_len;
+               xmit_size_goal = (65535 -
+                                 inet_csk(sk)->icsk_af_ops->net_header_len -
+                                 inet_csk(sk)->icsk_ext_hdr_len -
+                                 tp->tcp_header_len);
 
                if (tp->max_window &&
                    (xmit_size_goal > (tp->max_window >> 1)))
@@ -706,7 +793,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed)
 
 /* Congestion window validation. (RFC2861) */
 
-static inline void tcp_cwnd_validate(struct sock *sk, struct tcp_sock *tp)
+static void tcp_cwnd_validate(struct sock *sk, struct tcp_sock *tp)
 {
        __u32 packets_out = tp->packets_out;
 
@@ -755,7 +842,7 @@ static inline unsigned int tcp_cwnd_test(struct tcp_sock *tp, struct sk_buff *sk
 /* This must be invoked the first time we consider transmitting
  * SKB onto the wire.
  */
-static inline int tcp_init_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned int mss_now)
+static int tcp_init_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned int mss_now)
 {
        int tso_segs = tcp_skb_pcount(skb);
 
@@ -1036,7 +1123,7 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
 
                TCP_SKB_CB(skb)->when = tcp_time_stamp;
 
-               if (unlikely(tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC))))
+               if (unlikely(tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC)))
                        break;
 
                /* Advance the send_head.  This one is sent out.
@@ -1109,7 +1196,7 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
                /* Send it out now. */
                TCP_SKB_CB(skb)->when = tcp_time_stamp;
 
-               if (likely(!tcp_transmit_skb(sk, skb_clone(skb, sk->sk_allocation)))) {
+               if (likely(!tcp_transmit_skb(sk, skb, 1, sk->sk_allocation))) {
                        update_send_head(sk, tp, skb);
                        tcp_cwnd_validate(sk, tp);
                        return;
@@ -1405,7 +1492,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
           (sysctl_tcp_retrans_collapse != 0))
                tcp_retrans_try_collapse(sk, skb, cur_mss);
 
-       if(tp->af_specific->rebuild_header(sk))
+       if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk))
                return -EHOSTUNREACH; /* Routing failure or similar. */
 
        /* Some Solaris stacks overoptimize and ignore the FIN on a
@@ -1429,9 +1516,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
         */
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
 
-       err = tcp_transmit_skb(sk, (skb_cloned(skb) ?
-                                   pskb_copy(skb, GFP_ATOMIC):
-                                   skb_clone(skb, GFP_ATOMIC)));
+       err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
 
        if (err == 0) {
                /* Update global TCP statistics. */
@@ -1665,7 +1750,7 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority)
        TCP_SKB_CB(skb)->seq = tcp_acceptable_seq(sk, tp);
        TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq;
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-       if (tcp_transmit_skb(sk, skb))
+       if (tcp_transmit_skb(sk, skb, 0, priority))
                NET_INC_STATS(LINUX_MIB_TCPABORTFAILED);
 }
 
@@ -1700,7 +1785,7 @@ int tcp_send_synack(struct sock *sk)
                TCP_ECN_send_synack(tcp_sk(sk), skb);
        }
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-       return tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC));
+       return tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
 }
 
 /*
@@ -1778,7 +1863,7 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
 /* 
  * Do all connect socket setups that can be done AF independent.
  */ 
-static inline void tcp_connect_init(struct sock *sk)
+static void tcp_connect_init(struct sock *sk)
 {
        struct dst_entry *dst = __sk_dst_get(sk);
        struct tcp_sock *tp = tcp_sk(sk);
@@ -1861,7 +1946,7 @@ int tcp_connect(struct sock *sk)
        __skb_queue_tail(&sk->sk_write_queue, buff);
        sk_charge_skb(sk, buff);
        tp->packets_out += tcp_skb_pcount(buff);
-       tcp_transmit_skb(sk, skb_clone(buff, GFP_KERNEL));
+       tcp_transmit_skb(sk, buff, 1, GFP_KERNEL);
        TCP_INC_STATS(TCP_MIB_ACTIVEOPENS);
 
        /* Timer for repeating the SYN until an answer. */
@@ -1957,7 +2042,7 @@ void tcp_send_ack(struct sock *sk)
                /* Send it off, this clears delayed acks for us. */
                TCP_SKB_CB(buff)->seq = TCP_SKB_CB(buff)->end_seq = tcp_acceptable_seq(sk, tp);
                TCP_SKB_CB(buff)->when = tcp_time_stamp;
-               tcp_transmit_skb(sk, buff);
+               tcp_transmit_skb(sk, buff, 0, GFP_ATOMIC);
        }
 }
 
@@ -1997,7 +2082,7 @@ static int tcp_xmit_probe_skb(struct sock *sk, int urgent)
        TCP_SKB_CB(skb)->seq = urgent ? tp->snd_una : tp->snd_una - 1;
        TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq;
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-       return tcp_transmit_skb(sk, skb);
+       return tcp_transmit_skb(sk, skb, 0, GFP_ATOMIC);
 }
 
 int tcp_write_wakeup(struct sock *sk)
@@ -2030,7 +2115,7 @@ int tcp_write_wakeup(struct sock *sk)
 
                        TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
                        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-                       err = tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC));
+                       err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
                        if (!err) {
                                update_send_head(sk, tp, skb);
                        }
index b7d296a8ac6d2366e2470607d579ef1bac5cc3ab..3b7403495052e31efb9bbaa4c33e740fd99685f2 100644 (file)
@@ -215,14 +215,6 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                vegas->beg_snd_nxt  = tp->snd_nxt;
                vegas->beg_snd_cwnd = tp->snd_cwnd;
 
-               /* Take into account the current RTT sample too, to
-                * decrease the impact of delayed acks. This double counts
-                * this sample since we count it for the next window as well,
-                * but that's not too awful, since we're taking the min,
-                * rather than averaging.
-                */
-               tcp_vegas_rtt_calc(sk, seq_rtt * 1000);
-
                /* We do the Vegas calculations only if we got enough RTT
                 * samples that we can be reasonably sure that we got
                 * at least one RTT sample that wasn't from a delayed ACK.
@@ -333,11 +325,15 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                        else if (tp->snd_cwnd > tp->snd_cwnd_clamp)
                                tp->snd_cwnd = tp->snd_cwnd_clamp;
                }
-       }
 
-       /* Wipe the slate clean for the next RTT. */
-       vegas->cntRTT = 0;
-       vegas->minRTT = 0x7fffffff;
+               /* Wipe the slate clean for the next RTT. */
+               vegas->cntRTT = 0;
+               vegas->minRTT = 0x7fffffff;
+       }
+       /* Use normal slow start */
+       else if (tp->snd_cwnd <= tp->snd_ssthresh) 
+               tcp_slow_start(tp);
+       
 }
 
 /* Extract info for Tcp socket info provided via netlink. */
index 2422a5f7195d002b457f0ced6e43c3dcd5998bff..223abaa72bc53b24b0e39356582cacf86c18e988 100644 (file)
@@ -86,6 +86,7 @@
 #include <linux/module.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
+#include <linux/igmp.h>
 #include <linux/in.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
@@ -846,20 +847,7 @@ out:
 csum_copy_err:
        UDP_INC_STATS_BH(UDP_MIB_INERRORS);
 
-       /* Clear queue. */
-       if (flags&MSG_PEEK) {
-               int clear = 0;
-               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_bh(&sk->sk_receive_queue.lock);
-               if (clear)
-                       kfree_skb(skb);
-       }
-
-       skb_free_datagram(sk, skb);
+       skb_kill_datagram(sk, skb, flags);
 
        if (noblock)
                return -EAGAIN; 
@@ -1094,7 +1082,7 @@ static int udp_v4_mcast_deliver(struct sk_buff *skb, struct udphdr *uh,
  * Otherwise, csum completion requires chacksumming packet body,
  * including udp header and folding it to skb->csum.
  */
-static int udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
+static void udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
                             unsigned short ulen, u32 saddr, u32 daddr)
 {
        if (uh->check == 0) {
@@ -1108,7 +1096,6 @@ static int udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
        /* Probably, we should checksum udp header (it should be in cache
         * in any case) and data in tiny packets (< rx copybreak).
         */
-       return 0;
 }
 
 /*
@@ -1141,8 +1128,7 @@ int udp_rcv(struct sk_buff *skb)
        if (pskb_trim_rcsum(skb, ulen))
                goto short_packet;
 
-       if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0)
-               goto csum_error;
+       udp_checksum_init(skb, uh, ulen, saddr, daddr);
 
        if(rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
                return udp_v4_mcast_deliver(skb, uh, saddr, daddr);
index b2b60f3e9cdd652a1858283e1cf051af88c9a279..42196ba3b0b912701d727b8a4ede46108292b49e 100644 (file)
@@ -182,6 +182,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl)
                case IPPROTO_UDP:
                case IPPROTO_TCP:
                case IPPROTO_SCTP:
+               case IPPROTO_DCCP:
                        if (pskb_may_pull(skb, xprth + 4 - skb->data)) {
                                u16 *ports = (u16 *)xprth;
 
index 6460eec834b7b9f9ca354f0b91622698fc2d4cb8..9601fd7f9d66f2a03912fe90b6a2398acb614cf1 100644 (file)
@@ -8,7 +8,8 @@ ipv6-objs :=    af_inet6.o anycast.o ip6_output.o ip6_input.o addrconf.o sit.o \
                route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o raw.o \
                protocol.o icmp.o mcast.o reassembly.o tcp_ipv6.o \
                exthdrs.o sysctl_net_ipv6.o datagram.o proc.o \
-               ip6_flowlabel.o ipv6_syms.o netfilter.o
+               ip6_flowlabel.o ipv6_syms.o netfilter.o \
+               inet6_connection_sock.o
 
 ipv6-$(CONFIG_XFRM) += xfrm6_policy.o xfrm6_state.o xfrm6_input.o \
        xfrm6_output.o
index 56a09a4ac4105d69d548d0311dfbd50f7bbd8454..704fb73e6c5ff35f83147a96a84fe45be40d471b 100644 (file)
@@ -137,6 +137,7 @@ static int addrconf_ifdown(struct net_device *dev, int how);
 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_dad_run(struct inet6_dev *idev);
 static void addrconf_rs_timer(unsigned long data);
 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
@@ -379,8 +380,8 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
                    dev->type == ARPHRD_NONE ||
                    dev->type == ARPHRD_SIT) {
                        printk(KERN_INFO
-                               "Disabled Privacy Extensions on device %p(%s)\n",
-                               dev, dev->name);
+                              "%s: Disabled Privacy Extensions\n",
+                              dev->name);
                        ndev->cnf.use_tempaddr = -1;
                } else {
                        in6_dev_hold(ndev);
@@ -388,6 +389,9 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
                }
 #endif
 
+               if (netif_carrier_ok(dev))
+                       ndev->if_flags |= IF_READY;
+
                write_lock_bh(&addrconf_lock);
                dev->ip6_ptr = ndev;
                write_unlock_bh(&addrconf_lock);
@@ -415,6 +419,7 @@ static struct inet6_dev * ipv6_find_idev(struct net_device *dev)
                if ((idev = ipv6_add_dev(dev)) == NULL)
                        return NULL;
        }
+
        if (dev->flags&IFF_UP)
                ipv6_mc_up(idev);
        return idev;
@@ -634,8 +639,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
        }
 #endif
 
-       for (ifap = &idev->addr_list; (ifa=*ifap) != NULL;
-            ifap = &ifa->if_next) {
+       for (ifap = &idev->addr_list; (ifa=*ifap) != NULL;) {
                if (ifa == ifp) {
                        *ifap = ifa->if_next;
                        __in6_ifa_put(ifp);
@@ -643,6 +647,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
                        if (!(ifp->flags & IFA_F_PERMANENT) || onlink > 0)
                                break;
                        deleted = 1;
+                       continue;
                } else if (ifp->flags & IFA_F_PERMANENT) {
                        if (ipv6_prefix_equal(&ifa->addr, &ifp->addr,
                                              ifp->prefix_len)) {
@@ -666,6 +671,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
                                }
                        }
                }
+               ifap = &ifa->if_next;
        }
        write_unlock_bh(&idev->lock);
 
@@ -903,11 +909,18 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
 
                        score.addr_type = __ipv6_addr_type(&ifa->addr);
 
-                       /* Rule 0: Candidate Source Address (section 4)
+                       /* Rule 0:
+                        * - Tentative Address (RFC2462 section 5.4)
+                        *  - A tentative address is not considered
+                        *    "assigned to an interface" in the traditional
+                        *    sense.
+                        * - Candidate Source Address (section 4)
                         *  - In any case, anycast addresses, multicast
                         *    addresses, and the unspecified address MUST
                         *    NOT be included in a candidate set.
                         */
+                       if (ifa->flags & IFA_F_TENTATIVE)
+                               continue;
                        if (unlikely(score.addr_type == IPV6_ADDR_ANY ||
                                     score.addr_type & IPV6_ADDR_MULTICAST)) {
                                LIMIT_NETDEBUG(KERN_DEBUG
@@ -985,6 +998,8 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
                        }
 
                        /* Rule 4: Prefer home address -- not implemented yet */
+                       if (hiscore.rule < 4)
+                               hiscore.rule++;
 
                        /* Rule 5: Prefer outgoing interface */
                        if (hiscore.rule < 5) {
@@ -1180,7 +1195,7 @@ struct inet6_ifaddr * ipv6_get_ifaddr(struct in6_addr *addr, struct net_device *
 int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
 {
        const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr;
-       const struct in6_addr *sk2_rcv_saddr6 = tcp_v6_rcv_saddr(sk2);
+       const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2);
        u32 sk_rcv_saddr = inet_sk(sk)->rcv_saddr;
        u32 sk2_rcv_saddr = inet_rcv_saddr(sk2);
        int sk_ipv6only = ipv6_only_sock(sk);
@@ -1213,10 +1228,8 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
 
 /* Gets referenced address, destroys ifaddr */
 
-void addrconf_dad_failure(struct inet6_ifaddr *ifp)
+void addrconf_dad_stop(struct inet6_ifaddr *ifp)
 {
-       if (net_ratelimit())
-               printk(KERN_INFO "%s: duplicate address detected!\n", ifp->idev->dev->name);
        if (ifp->flags&IFA_F_PERMANENT) {
                spin_lock_bh(&ifp->lock);
                addrconf_del_timer(ifp);
@@ -1242,6 +1255,12 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
                ipv6_del_addr(ifp);
 }
 
+void addrconf_dad_failure(struct inet6_ifaddr *ifp)
+{
+       if (net_ratelimit())
+               printk(KERN_INFO "%s: duplicate address detected!\n", ifp->idev->dev->name);
+       addrconf_dad_stop(ifp);
+}
 
 /* Join to solicited addr multicast group. */
 
@@ -1594,9 +1613,17 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
           not good.
         */
        if (valid_lft >= 0x7FFFFFFF/HZ)
-               rt_expires = 0;
+               rt_expires = 0x7FFFFFFF - (0x7FFFFFFF % HZ);
        else
-               rt_expires = jiffies + valid_lft * HZ;
+               rt_expires = valid_lft * HZ;
+
+       /*
+        * We convert this (in jiffies) to clock_t later.
+        * Avoid arithmetic overflow there as well.
+        * Overflow can happen only if HZ < USER_HZ.
+        */
+       if (HZ < USER_HZ && rt_expires > 0x7FFFFFFF / USER_HZ)
+               rt_expires = 0x7FFFFFFF / USER_HZ;
 
        if (pinfo->onlink) {
                struct rt6_info *rt;
@@ -1608,12 +1635,12 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
                                        ip6_del_rt(rt, NULL, NULL, NULL);
                                        rt = NULL;
                                } else {
-                                       rt->rt6i_expires = rt_expires;
+                                       rt->rt6i_expires = jiffies + rt_expires;
                                }
                        }
                } else if (valid_lft) {
                        addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len,
-                                             dev, rt_expires, RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT);
+                                             dev, jiffies_to_clock_t(rt_expires), RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT);
                }
                if (rt)
                        dst_release(&rt->u.dst);
@@ -2123,9 +2150,42 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = (struct net_device *) data;
        struct inet6_dev *idev = __in6_dev_get(dev);
+       int run_pending = 0;
 
        switch(event) {
        case NETDEV_UP:
+       case NETDEV_CHANGE:
+               if (event == NETDEV_UP) {
+                       if (!netif_carrier_ok(dev)) {
+                               /* device is not ready yet. */
+                               printk(KERN_INFO
+                                       "ADDRCONF(NETDEV_UP): %s: "
+                                       "link is not ready\n",
+                                       dev->name);
+                               break;
+                       }
+               } else {
+                       if (!netif_carrier_ok(dev)) {
+                               /* device is still not ready. */
+                               break;
+                       }
+
+                       if (idev) {
+                               if (idev->if_flags & IF_READY) {
+                                       /* device is already configured. */
+                                       break;
+                               }
+                               idev->if_flags |= IF_READY;
+                       }
+
+                       printk(KERN_INFO
+                                       "ADDRCONF(NETDEV_CHANGE): %s: "
+                                       "link becomes ready\n",
+                                       dev->name);
+
+                       run_pending = 1;
+               }
+
                switch(dev->type) {
                case ARPHRD_SIT:
                        addrconf_sit_config(dev);
@@ -2142,6 +2202,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
                        break;
                };
                if (idev) {
+                       if (run_pending)
+                               addrconf_dad_run(idev);
+
                        /* If the MTU changed during the interface down, when the
                           interface up, the changed MTU must be reflected in the
                           idev as well as routers.
@@ -2176,8 +2239,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
                 */
                addrconf_ifdown(dev, event != NETDEV_DOWN);
                break;
-       case NETDEV_CHANGE:
-               break;
+
        case NETDEV_CHANGENAME:
 #ifdef CONFIG_SYSCTL
                if (idev) {
@@ -2258,7 +2320,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
 
        /* Step 3: clear flags for stateless addrconf */
        if (how != 1)
-               idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
+               idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
 
        /* Step 4: clear address list */
 #ifdef CONFIG_IPV6_PRIVACY
@@ -2367,11 +2429,20 @@ out:
 /*
  *     Duplicate Address Detection
  */
+static void addrconf_dad_kick(struct inet6_ifaddr *ifp)
+{
+       unsigned long rand_num;
+       struct inet6_dev *idev = ifp->idev;
+
+       rand_num = net_random() % (idev->cnf.rtr_solicit_delay ? : 1);
+       ifp->probes = idev->cnf.dad_transmits;
+       addrconf_mod_timer(ifp, AC_DAD, rand_num);
+}
+
 static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
 {
        struct inet6_dev *idev = ifp->idev;
        struct net_device *dev = idev->dev;
-       unsigned long rand_num;
 
        addrconf_join_solict(dev, &ifp->addr);
 
@@ -2380,7 +2451,6 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
                                        flags);
 
        net_srandom(ifp->addr.s6_addr32[3]);
-       rand_num = net_random() % (idev->cnf.rtr_solicit_delay ? : 1);
 
        read_lock_bh(&idev->lock);
        if (ifp->dead)
@@ -2397,9 +2467,19 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
                return;
        }
 
-       ifp->probes = idev->cnf.dad_transmits;
-       addrconf_mod_timer(ifp, AC_DAD, rand_num);
-
+       if (!(idev->if_flags & IF_READY)) {
+               spin_unlock_bh(&ifp->lock);
+               read_unlock_bh(&idev->lock);
+               /*
+                * If the defice is not ready:
+                * - keep it tentative if it is a permanent address.
+                * - otherwise, kill it.
+                */
+               in6_ifa_hold(ifp);
+               addrconf_dad_stop(ifp);
+               return;
+       }
+       addrconf_dad_kick(ifp);
        spin_unlock_bh(&ifp->lock);
 out:
        read_unlock_bh(&idev->lock);
@@ -2482,6 +2562,22 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
        }
 }
 
+static void addrconf_dad_run(struct inet6_dev *idev) {
+       struct inet6_ifaddr *ifp;
+
+       read_lock_bh(&idev->lock);
+       for (ifp = idev->addr_list; ifp; ifp = ifp->if_next) {
+               spin_lock_bh(&ifp->lock);
+               if (!(ifp->flags & IFA_F_TENTATIVE)) {
+                       spin_unlock_bh(&ifp->lock);
+                       continue;
+               }
+               spin_unlock_bh(&ifp->lock);
+               addrconf_dad_kick(ifp);
+       }
+       read_unlock_bh(&idev->lock);
+}
+
 #ifdef CONFIG_PROC_FS
 struct if6_iter_state {
        int bucket;
@@ -2627,7 +2723,7 @@ static void addrconf_verify(unsigned long foo)
        for (i=0; i < IN6_ADDR_HSIZE; i++) {
 
 restart:
-               write_lock(&addrconf_hash_lock);
+               read_lock(&addrconf_hash_lock);
                for (ifp=inet6_addr_lst[i]; ifp; ifp=ifp->lst_next) {
                        unsigned long age;
 #ifdef CONFIG_IPV6_PRIVACY
@@ -2649,7 +2745,7 @@ restart:
                        if (age >= ifp->valid_lft) {
                                spin_unlock(&ifp->lock);
                                in6_ifa_hold(ifp);
-                               write_unlock(&addrconf_hash_lock);
+                               read_unlock(&addrconf_hash_lock);
                                ipv6_del_addr(ifp);
                                goto restart;
                        } else if (age >= ifp->prefered_lft) {
@@ -2668,7 +2764,7 @@ restart:
 
                                if (deprecate) {
                                        in6_ifa_hold(ifp);
-                                       write_unlock(&addrconf_hash_lock);
+                                       read_unlock(&addrconf_hash_lock);
 
                                        ipv6_ifa_notify(0, ifp);
                                        in6_ifa_put(ifp);
@@ -2686,7 +2782,10 @@ restart:
                                                in6_ifa_hold(ifp);
                                                in6_ifa_hold(ifpub);
                                                spin_unlock(&ifp->lock);
-                                               write_unlock(&addrconf_hash_lock);
+                                               read_unlock(&addrconf_hash_lock);
+                                               spin_lock(&ifpub->lock);
+                                               ifpub->regen_count = 0;
+                                               spin_unlock(&ifpub->lock);
                                                ipv6_create_tempaddr(ifpub, ifp);
                                                in6_ifa_put(ifpub);
                                                in6_ifa_put(ifp);
@@ -2703,7 +2802,7 @@ restart:
                                spin_unlock(&ifp->lock);
                        }
                }
-               write_unlock(&addrconf_hash_lock);
+               read_unlock(&addrconf_hash_lock);
        }
 
        addr_chk_timer.expires = time_before(next, jiffies + HZ) ? jiffies + HZ : next;
index c63b8ce0e1b5fe646fee384f9508f2f14f45154a..68afc53be6628a0b26c7fc6cf6556ff8c9b4bdc8 100644 (file)
@@ -92,10 +92,13 @@ static int inet6_create(struct socket *sock, int protocol)
        struct proto *answer_prot;
        unsigned char answer_flags;
        char answer_no_check;
-       int rc;
+       int try_loading_module = 0;
+       int err;
 
        /* Look for the requested type/protocol pair. */
        answer = NULL;
+lookup_protocol:
+       err = -ESOCKTNOSUPPORT;
        rcu_read_lock();
        list_for_each_rcu(p, &inetsw6[sock->type]) {
                answer = list_entry(p, struct inet_protosw, list);
@@ -113,21 +116,37 @@ static int inet6_create(struct socket *sock, int protocol)
                        if (IPPROTO_IP == answer->protocol)
                                break;
                }
+               err = -EPROTONOSUPPORT;
                answer = NULL;
        }
 
-       rc = -ESOCKTNOSUPPORT;
-       if (!answer)
-               goto out_rcu_unlock;
-       rc = -EPERM;
+       if (!answer) {
+               if (try_loading_module < 2) {
+                       rcu_read_unlock();
+                       /*
+                        * Be more specific, e.g. net-pf-10-proto-132-type-1
+                        * (net-pf-PF_INET6-proto-IPPROTO_SCTP-type-SOCK_STREAM)
+                        */
+                       if (++try_loading_module == 1)
+                               request_module("net-pf-%d-proto-%d-type-%d",
+                                               PF_INET6, protocol, sock->type);
+                       /*
+                        * Fall back to generic, e.g. net-pf-10-proto-132
+                        * (net-pf-PF_INET6-proto-IPPROTO_SCTP)
+                        */
+                       else
+                               request_module("net-pf-%d-proto-%d",
+                                               PF_INET6, protocol);
+                       goto lookup_protocol;
+               } else
+                       goto out_rcu_unlock;
+       }
+
+       err = -EPERM;
        if (answer->capability > 0 && !capable(answer->capability))
                goto out_rcu_unlock;
-       rc = -EPROTONOSUPPORT;
-       if (!protocol)
-               goto out_rcu_unlock;
 
        sock->ops = answer->ops;
-
        answer_prot = answer->prot;
        answer_no_check = answer->no_check;
        answer_flags = answer->flags;
@@ -135,19 +154,20 @@ static int inet6_create(struct socket *sock, int protocol)
 
        BUG_TRAP(answer_prot->slab != NULL);
 
-       rc = -ENOBUFS;
+       err = -ENOBUFS;
        sk = sk_alloc(PF_INET6, GFP_KERNEL, answer_prot, 1);
        if (sk == NULL)
                goto out;
 
        sock_init_data(sock, sk);
 
-       rc = 0;
+       err = 0;
        sk->sk_no_check = answer_no_check;
        if (INET_PROTOSW_REUSE & answer_flags)
                sk->sk_reuse = 1;
 
        inet = inet_sk(sk);
+       inet->is_icsk = INET_PROTOSW_ICSK & answer_flags;
 
        if (SOCK_RAW == sock->type) {
                inet->num = protocol;
@@ -202,14 +222,14 @@ static int inet6_create(struct socket *sock, int protocol)
                sk->sk_prot->hash(sk);
        }
        if (sk->sk_prot->init) {
-               rc = sk->sk_prot->init(sk);
-               if (rc) {
+               err = sk->sk_prot->init(sk);
+               if (err) {
                        sk_common_release(sk);
                        goto out;
                }
        }
 out:
-       return rc;
+       return err;
 out_rcu_unlock:
        rcu_read_unlock();
        goto out;
@@ -370,6 +390,8 @@ int inet6_destroy_sock(struct sock *sk)
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(inet6_destroy_sock);
+
 /*
  *     This does both peername and sockname.
  */
@@ -412,7 +434,6 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
-       int err = -EINVAL;
 
        switch(cmd) 
        {
@@ -431,16 +452,15 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        case SIOCSIFDSTADDR:
                return addrconf_set_dstaddr((void __user *) arg);
        default:
-               if (!sk->sk_prot->ioctl ||
-                   (err = sk->sk_prot->ioctl(sk, cmd, arg)) == -ENOIOCTLCMD)
-                       return(dev_ioctl(cmd,(void __user *) arg));             
-               return err;
+               if (!sk->sk_prot->ioctl)
+                       return -ENOIOCTLCMD;
+               return sk->sk_prot->ioctl(sk, cmd, arg);
        }
        /*NOTREACHED*/
        return(0);
 }
 
-struct proto_ops inet6_stream_ops = {
+const struct proto_ops inet6_stream_ops = {
        .family =       PF_INET6,
        .owner =        THIS_MODULE,
        .release =      inet6_release,
@@ -461,7 +481,7 @@ struct proto_ops inet6_stream_ops = {
        .sendpage =     tcp_sendpage
 };
 
-struct proto_ops inet6_dgram_ops = {
+const struct proto_ops inet6_dgram_ops = {
        .family =       PF_INET6,
        .owner =        THIS_MODULE,
        .release =      inet6_release,
@@ -489,7 +509,7 @@ static struct net_proto_family inet6_family_ops = {
 };
 
 /* Same as inet6_dgram_ops, sans udp_poll.  */
-static struct proto_ops inet6_sockraw_ops = {
+static const struct proto_ops inet6_sockraw_ops = {
        .family =       PF_INET6,
        .owner =        THIS_MODULE,
        .release =      inet6_release,
@@ -590,6 +610,79 @@ inet6_unregister_protosw(struct inet_protosw *p)
        }
 }
 
+int inet6_sk_rebuild_header(struct sock *sk)
+{
+       int err;
+       struct dst_entry *dst;
+       struct ipv6_pinfo *np = inet6_sk(sk);
+
+       dst = __sk_dst_check(sk, np->dst_cookie);
+
+       if (dst == NULL) {
+               struct inet_sock *inet = inet_sk(sk);
+               struct in6_addr *final_p = NULL, final;
+               struct flowi fl;
+
+               memset(&fl, 0, sizeof(fl));
+               fl.proto = sk->sk_protocol;
+               ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
+               ipv6_addr_copy(&fl.fl6_src, &np->saddr);
+               fl.fl6_flowlabel = np->flow_label;
+               fl.oif = sk->sk_bound_dev_if;
+               fl.fl_ip_dport = inet->dport;
+               fl.fl_ip_sport = inet->sport;
+
+               if (np->opt && np->opt->srcrt) {
+                       struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
+                       ipv6_addr_copy(&final, &fl.fl6_dst);
+                       ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
+                       final_p = &final;
+               }
+
+               err = ip6_dst_lookup(sk, &dst, &fl);
+               if (err) {
+                       sk->sk_route_caps = 0;
+                       return err;
+               }
+               if (final_p)
+                       ipv6_addr_copy(&fl.fl6_dst, final_p);
+
+               if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
+                       sk->sk_err_soft = -err;
+                       return err;
+               }
+
+               ip6_dst_store(sk, dst, NULL);
+               sk->sk_route_caps = dst->dev->features &
+                       ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
+       }
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(inet6_sk_rebuild_header);
+
+int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
+{
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct inet6_skb_parm *opt = IP6CB(skb);
+
+       if (np->rxopt.all) {
+               if ((opt->hop && (np->rxopt.bits.hopopts ||
+                                 np->rxopt.bits.ohopopts)) ||
+                   ((IPV6_FLOWINFO_MASK & *(u32*)skb->nh.raw) &&
+                    np->rxopt.bits.rxflow) ||
+                   (opt->srcrt && (np->rxopt.bits.srcrt ||
+                    np->rxopt.bits.osrcrt)) ||
+                   ((opt->dst1 || opt->dst0) &&
+                    (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts)))
+                       return 1;
+       }
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ipv6_opt_accepted);
+
 int
 snmp6_mib_init(void *ptr[2], size_t mibsize, size_t mibalign)
 {
index f3629730eb157950c9adc0caec507d1a28379e15..13cc7f89558373994ef23d8cf3dd2d09884c003a 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/string.h>
 #include <net/icmp.h>
 #include <net/ipv6.h>
+#include <net/protocol.h>
 #include <net/xfrm.h>
 #include <asm/scatterlist.h>
 
index cc518405b3e1efc29b87aea3cadb4e0c6d60068f..c4a3a993acb7ba5945f422bfa27c7b97d45376e0 100644 (file)
@@ -437,7 +437,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
                                break;
                        case IPPROTO_AH:
                                nexthdr = ptr[0];
-                               len = (ptr[1] + 1) << 2;
+                               len = (ptr[1] + 2) << 2;
                                break;
                        default:
                                nexthdr = ptr[0];
index 40d9a1935ab5e5911e2922499fd571afe0005741..6de8ee1a5ad9ec85227d9527b9b1374ca73e8952 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/random.h>
 #include <net/icmp.h>
 #include <net/ipv6.h>
+#include <net/protocol.h>
 #include <linux/icmpv6.h>
 
 static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
@@ -248,7 +249,7 @@ static u32 esp6_get_max_size(struct xfrm_state *x, int mtu)
        if (esp->conf.padlen)
                mtu = ALIGN(mtu, esp->conf.padlen);
 
-       return mtu + x->props.header_len + esp->auth.icv_full_len;
+       return mtu + x->props.header_len + esp->auth.icv_trunc_len;
 }
 
 static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
index 922549581abc266100d6a3a28676665dd509f858..113374dc342c1fdd116173572131853437076d48 100644 (file)
@@ -413,6 +413,8 @@ ipv6_invert_rthdr(struct sock *sk, struct ipv6_rt_hdr *hdr)
        return opt;
 }
 
+EXPORT_SYMBOL_GPL(ipv6_invert_rthdr);
+
 /**********************************
   Hop-by-hop options.
  **********************************/
@@ -579,6 +581,8 @@ ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt)
        return opt2;
 }
 
+EXPORT_SYMBOL_GPL(ipv6_dup_options);
+
 static int ipv6_renew_option(void *ohdr,
                             struct ipv6_opt_hdr __user *newopt, int newoptlen,
                             int inherit,
@@ -628,6 +632,7 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
        if (!tot_len)
                return NULL;
 
+       tot_len += sizeof(*opt2);
        opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC);
        if (!opt2)
                return ERR_PTR(-ENOBUFS);
@@ -668,7 +673,26 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
 
        return opt2;
 out:
-       sock_kfree_s(sk, p, tot_len);
+       sock_kfree_s(sk, opt2, opt2->tot_len);
        return ERR_PTR(err);
 }
 
+struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
+                                         struct ipv6_txoptions *opt)
+{
+       /*
+        * ignore the dest before srcrt unless srcrt is being included.
+        * --yoshfuji
+        */
+       if (opt && opt->dst0opt && !opt->srcrt) {
+               if (opt_space != opt) {
+                       memcpy(opt_space, opt, sizeof(*opt_space));
+                       opt = opt_space;
+               }
+               opt->opt_nflen -= ipv6_optlen(opt->dst0opt);
+               opt->dst0opt = NULL;
+       }
+
+       return opt;
+}
+
index 1bdf0fb8bf8a05ac8fa44193a434c3fcad5a1dc6..6ec6a2b549bbd6d6930230d8bb8ca00d0e208f1f 100644 (file)
@@ -328,8 +328,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
                iif = skb->dev->ifindex;
 
        /*
-        *      Must not send if we know that source is Anycast also.
-        *      for now we don't know that.
+        *      Must not send error if the source does not uniquely
+        *      identify a single node (RFC2463 Section 2.4).
+        *      We check unspecified / multicast addresses here,
+        *      and anycast addresses will be checked later.
         */
        if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
                LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n");
@@ -373,6 +375,16 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
        err = ip6_dst_lookup(sk, &dst, &fl);
        if (err)
                goto out;
+
+       /*
+        * We won't send icmp if the destination is known
+        * anycast.
+        */
+       if (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) {
+               LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: acast source\n");
+               goto out_dst_release;
+       }
+
        if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
                goto out;
 
@@ -751,7 +763,7 @@ void icmpv6_cleanup(void)
        inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
 }
 
-static struct icmp6_err {
+static const struct icmp6_err {
        int err;
        int fatal;
 } tab_unreach[] = {
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c
new file mode 100644 (file)
index 0000000..792f90f
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * 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.
+ *
+ *             Support for INET6 connection oriented protocols.
+ *
+ * Authors:    See the TCPv6 sources
+ *
+ *             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/config.h>
+#include <linux/module.h>
+#include <linux/in6.h>
+#include <linux/ipv6.h>
+#include <linux/jhash.h>
+
+#include <net/addrconf.h>
+#include <net/inet_connection_sock.h>
+#include <net/inet_ecn.h>
+#include <net/inet_hashtables.h>
+#include <net/ip6_route.h>
+#include <net/sock.h>
+
+int inet6_csk_bind_conflict(const struct sock *sk,
+                           const struct inet_bind_bucket *tb)
+{
+       const struct sock *sk2;
+       const struct hlist_node *node;
+
+       /* We must walk the whole port owner list in this case. -DaveM */
+       sk_for_each_bound(sk2, node, &tb->owners) {
+               if (sk != sk2 &&
+                   (!sk->sk_bound_dev_if ||
+                    !sk2->sk_bound_dev_if ||
+                    sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
+                   (!sk->sk_reuse || !sk2->sk_reuse ||
+                    sk2->sk_state == TCP_LISTEN) &&
+                    ipv6_rcv_saddr_equal(sk, sk2))
+                       break;
+       }
+
+       return node != NULL;
+}
+
+EXPORT_SYMBOL_GPL(inet6_csk_bind_conflict);
+
+/*
+ * request_sock (formerly open request) hash tables.
+ */
+static u32 inet6_synq_hash(const struct in6_addr *raddr, const u16 rport,
+                          const u32 rnd, const u16 synq_hsize)
+{
+       u32 a = raddr->s6_addr32[0];
+       u32 b = raddr->s6_addr32[1];
+       u32 c = raddr->s6_addr32[2];
+
+       a += JHASH_GOLDEN_RATIO;
+       b += JHASH_GOLDEN_RATIO;
+       c += rnd;
+       __jhash_mix(a, b, c);
+
+       a += raddr->s6_addr32[3];
+       b += (u32)rport;
+       __jhash_mix(a, b, c);
+
+       return c & (synq_hsize - 1);
+}
+
+struct request_sock *inet6_csk_search_req(const struct sock *sk,
+                                         struct request_sock ***prevp,
+                                         const __u16 rport,
+                                         const struct in6_addr *raddr,
+                                         const struct in6_addr *laddr,
+                                         const int iif)
+{
+       const struct inet_connection_sock *icsk = inet_csk(sk);
+       struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt;
+       struct request_sock *req, **prev;
+
+       for (prev = &lopt->syn_table[inet6_synq_hash(raddr, rport,
+                                                    lopt->hash_rnd,
+                                                    lopt->nr_table_entries)];
+            (req = *prev) != NULL;
+            prev = &req->dl_next) {
+               const struct inet6_request_sock *treq = inet6_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;
+               }
+       }
+
+       return NULL;
+}
+
+EXPORT_SYMBOL_GPL(inet6_csk_search_req);
+
+void inet6_csk_reqsk_queue_hash_add(struct sock *sk,
+                                   struct request_sock *req,
+                                   const unsigned long timeout)
+{
+       struct inet_connection_sock *icsk = inet_csk(sk);
+       struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt;
+       const u32 h = inet6_synq_hash(&inet6_rsk(req)->rmt_addr,
+                                     inet_rsk(req)->rmt_port,
+                                     lopt->hash_rnd, lopt->nr_table_entries);
+
+       reqsk_queue_hash_req(&icsk->icsk_accept_queue, h, req, timeout);
+       inet_csk_reqsk_queue_added(sk, timeout);
+}
+
+EXPORT_SYMBOL_GPL(inet6_csk_reqsk_queue_hash_add);
+
+void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
+{
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr;
+
+       sin6->sin6_family = AF_INET6;
+       ipv6_addr_copy(&sin6->sin6_addr, &np->daddr);
+       sin6->sin6_port = inet_sk(sk)->dport;
+       /* We do not store received flowlabel for TCP */
+       sin6->sin6_flowinfo = 0;
+       sin6->sin6_scope_id = 0;
+       if (sk->sk_bound_dev_if &&
+           ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
+               sin6->sin6_scope_id = sk->sk_bound_dev_if;
+}
+
+EXPORT_SYMBOL_GPL(inet6_csk_addr2sockaddr);
+
+int inet6_csk_xmit(struct sk_buff *skb, int ipfragok)
+{
+       struct sock *sk = skb->sk;
+       struct inet_sock *inet = inet_sk(sk);
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct flowi fl;
+       struct dst_entry *dst;
+       struct in6_addr *final_p = NULL, final;
+
+       memset(&fl, 0, sizeof(fl));
+       fl.proto = sk->sk_protocol;
+       ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
+       ipv6_addr_copy(&fl.fl6_src, &np->saddr);
+       fl.fl6_flowlabel = np->flow_label;
+       IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel);
+       fl.oif = sk->sk_bound_dev_if;
+       fl.fl_ip_sport = inet->sport;
+       fl.fl_ip_dport = inet->dport;
+
+       if (np->opt && np->opt->srcrt) {
+               struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
+               ipv6_addr_copy(&final, &fl.fl6_dst);
+               ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
+               final_p = &final;
+       }
+
+       dst = __sk_dst_check(sk, np->dst_cookie);
+
+       if (dst == NULL) {
+               int err = ip6_dst_lookup(sk, &dst, &fl);
+
+               if (err) {
+                       sk->sk_err_soft = -err;
+                       return err;
+               }
+
+               if (final_p)
+                       ipv6_addr_copy(&fl.fl6_dst, final_p);
+
+               if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
+                       sk->sk_route_caps = 0;
+                       return err;
+               }
+
+               ip6_dst_store(sk, dst, NULL);
+               sk->sk_route_caps = dst->dev->features &
+                       ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
+       }
+
+       skb->dst = dst_clone(dst);
+
+       /* Restore final destination back after routing done */
+       ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
+
+       return ip6_xmit(sk, skb, &fl, np->opt, 0);
+}
+
+EXPORT_SYMBOL_GPL(inet6_csk_xmit);
index 01d5f46d4e40056f865a9f2e5d0547f232f957c6..4154f3a8b6cf3e28a5c8a81f0274279a594c6f70 100644 (file)
@@ -5,7 +5,8 @@
  *
  *             Generic INET6 transport hashtables
  *
- * Authors:    Lotsa people, from code originally in tcp
+ * Authors:    Lotsa people, from code originally in tcp, generalised here
+ *             by Arnaldo Carvalho de Melo <acme@mandriva.com>
  *
  *     This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
  */
 
 #include <linux/config.h>
-
 #include <linux/module.h>
+#include <linux/random.h>
 
 #include <net/inet_connection_sock.h>
 #include <net/inet_hashtables.h>
 #include <net/inet6_hashtables.h>
+#include <net/ip.h>
 
 struct sock *inet6_lookup_listener(struct inet_hashinfo *hashinfo,
                                   const struct in6_addr *daddr,
@@ -79,3 +81,180 @@ struct sock *inet6_lookup(struct inet_hashinfo *hashinfo,
 }
 
 EXPORT_SYMBOL_GPL(inet6_lookup);
+
+static int __inet6_check_established(struct inet_timewait_death_row *death_row,
+                                    struct sock *sk, const __u16 lport,
+                                    struct inet_timewait_sock **twp)
+{
+       struct inet_hashinfo *hinfo = death_row->hashinfo;
+       const struct inet_sock *inet = inet_sk(sk);
+       const struct ipv6_pinfo *np = inet6_sk(sk);
+       const struct in6_addr *daddr = &np->rcv_saddr;
+       const struct in6_addr *saddr = &np->daddr;
+       const int dif = sk->sk_bound_dev_if;
+       const u32 ports = INET_COMBINED_PORTS(inet->dport, lport);
+       const unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr,
+                                               inet->dport);
+       struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash);
+       struct sock *sk2;
+       const struct hlist_node *node;
+       struct inet_timewait_sock *tw;
+
+       prefetch(head->chain.first);
+       write_lock(&head->lock);
+
+       /* Check TIME-WAIT sockets first. */
+       sk_for_each(sk2, node, &(head + hinfo->ehash_size)->chain) {
+               const struct inet6_timewait_sock *tw6 = inet6_twsk(sk2);
+
+               tw = inet_twsk(sk2);
+
+               if(*((__u32 *)&(tw->tw_dport)) == ports          &&
+                  sk2->sk_family              == PF_INET6       &&
+                  ipv6_addr_equal(&tw6->tw_v6_daddr, saddr)     &&
+                  ipv6_addr_equal(&tw6->tw_v6_rcv_saddr, daddr) &&
+                  sk2->sk_bound_dev_if == sk->sk_bound_dev_if) {
+                       if (twsk_unique(sk, sk2, twp))
+                               goto unique;
+                       else
+                               goto not_unique;
+               }
+       }
+       tw = NULL;
+
+       /* And established part... */
+       sk_for_each(sk2, node, &head->chain) {
+               if (INET6_MATCH(sk2, hash, saddr, daddr, ports, dif))
+                       goto not_unique;
+       }
+
+unique:
+       BUG_TRAP(sk_unhashed(sk));
+       __sk_add_node(sk, &head->chain);
+       sk->sk_hash = hash;
+       sock_prot_inc_use(sk->sk_prot);
+       write_unlock(&head->lock);
+
+       if (twp != NULL) {
+               *twp = tw;
+               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
+       } else if (tw != NULL) {
+               /* Silly. Should hash-dance instead... */
+               inet_twsk_deschedule(tw, death_row);
+               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
+
+               inet_twsk_put(tw);
+       }
+       return 0;
+
+not_unique:
+       write_unlock(&head->lock);
+       return -EADDRNOTAVAIL;
+}
+
+static inline u32 inet6_sk_port_offset(const struct sock *sk)
+{
+       const struct inet_sock *inet = inet_sk(sk);
+       const struct ipv6_pinfo *np = inet6_sk(sk);
+       return secure_ipv6_port_ephemeral(np->rcv_saddr.s6_addr32,
+                                         np->daddr.s6_addr32,
+                                         inet->dport);
+}
+
+int inet6_hash_connect(struct inet_timewait_death_row *death_row,
+                      struct sock *sk)
+{
+       struct inet_hashinfo *hinfo = death_row->hashinfo;
+       const unsigned short snum = inet_sk(sk)->num;
+       struct inet_bind_hashbucket *head;
+       struct inet_bind_bucket *tb;
+       int ret;
+
+       if (snum == 0) {
+               const int low = sysctl_local_port_range[0];
+               const int high = sysctl_local_port_range[1];
+               const int range = high - low;
+               int i, port;
+               static u32 hint;
+               const u32 offset = hint + inet6_sk_port_offset(sk);
+               struct hlist_node *node;
+               struct inet_timewait_sock *tw = NULL;
+
+               local_bh_disable();
+               for (i = 1; i <= range; i++) {
+                       port = low + (i + offset) % range;
+                       head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
+                       spin_lock(&head->lock);
+
+                       /* Does not bother with rcv_saddr checks,
+                        * because the established check is already
+                        * unique enough.
+                        */
+                       inet_bind_bucket_for_each(tb, node, &head->chain) {
+                               if (tb->port == port) {
+                                       BUG_TRAP(!hlist_empty(&tb->owners));
+                                       if (tb->fastreuse >= 0)
+                                               goto next_port;
+                                       if (!__inet6_check_established(death_row,
+                                                                      sk, port,
+                                                                      &tw))
+                                               goto ok;
+                                       goto next_port;
+                               }
+                       }
+
+                       tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep,
+                                                    head, port);
+                       if (!tb) {
+                               spin_unlock(&head->lock);
+                               break;
+                       }
+                       tb->fastreuse = -1;
+                       goto ok;
+
+               next_port:
+                       spin_unlock(&head->lock);
+               }
+               local_bh_enable();
+
+               return -EADDRNOTAVAIL;
+
+ok:
+               hint += i;
+
+               /* Head lock still held and bh's disabled */
+               inet_bind_hash(sk, tb, port);
+               if (sk_unhashed(sk)) {
+                       inet_sk(sk)->sport = htons(port);
+                       __inet6_hash(hinfo, sk);
+               }
+               spin_unlock(&head->lock);
+
+               if (tw) {
+                       inet_twsk_deschedule(tw, death_row);
+                       inet_twsk_put(tw);
+               }
+
+               ret = 0;
+               goto out;
+       }
+
+       head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
+       tb   = inet_csk(sk)->icsk_bind_hash;
+       spin_lock_bh(&head->lock);
+
+       if (sk_head(&tb->owners) == sk && sk->sk_bind_node.next == NULL) {
+               __inet6_hash(hinfo, sk);
+               spin_unlock_bh(&head->lock);
+               return 0;
+       } else {
+               spin_unlock(&head->lock);
+               /* No definite answer... Walk to established hash table */
+               ret = __inet6_check_established(death_row, sk, snum, NULL);
+out:
+               local_bh_enable();
+               return ret;
+       }
+}
+
+EXPORT_SYMBOL_GPL(inet6_hash_connect);
index bbbe80cdaf72a75a463aff9551e60b31e2f69061..89d12b4817a9fddec6254c24cf5c93f231a7dec5 100644 (file)
@@ -200,6 +200,8 @@ struct ip6_flowlabel * fl6_sock_lookup(struct sock *sk, u32 label)
        return NULL;
 }
 
+EXPORT_SYMBOL_GPL(fl6_sock_lookup);
+
 void fl6_free_socklist(struct sock *sk)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
@@ -225,20 +227,16 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,
                                         struct ip6_flowlabel * fl,
                                         struct ipv6_txoptions * fopt)
 {
-       struct ipv6_txoptions * fl_opt = fl ? fl->opt : NULL;
-
-       if (fopt == NULL || fopt->opt_flen == 0) {
-               if (!fl_opt || !fl_opt->dst0opt || fl_opt->srcrt)
-                       return fl_opt;
-       }
-
+       struct ipv6_txoptions * fl_opt = fl->opt;
+       
+       if (fopt == NULL || fopt->opt_flen == 0)
+               return fl_opt;
+       
        if (fl_opt != NULL) {
                opt_space->hopopt = fl_opt->hopopt;
-               opt_space->dst0opt = fl_opt->srcrt ? fl_opt->dst0opt : NULL;
+               opt_space->dst0opt = fl_opt->dst0opt;
                opt_space->srcrt = fl_opt->srcrt;
                opt_space->opt_nflen = fl_opt->opt_nflen;
-               if (fl_opt->dst0opt && !fl_opt->srcrt)
-                       opt_space->opt_nflen -= ipv6_optlen(fl_opt->dst0opt);
        } else {
                if (fopt->opt_nflen == 0)
                        return fopt;
index c1fa693511a176c71f601cb3d78696ba83e25437..b4c4beba0ede942c774bb4d9c49c30c682871e44 100644 (file)
@@ -774,7 +774,10 @@ out_err_release:
        *dst = NULL;
        return err;
 }
-inline int ip6_ufo_append_data(struct sock *sk,
+
+EXPORT_SYMBOL_GPL(ip6_dst_lookup);
+
+static inline int ip6_ufo_append_data(struct sock *sk,
                        int getfrag(void *from, char *to, int offset, int len,
                        int odd, struct sk_buff *skb),
                        void *from, int length, int hh_len, int fragheaderlen,
index 55917fb170949cfdcd5dd427dc8baf7201c14a17..626dd39685f2c43675871206fb1d7d360b273359 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/rtnetlink.h>
 #include <net/icmp.h>
 #include <net/ipv6.h>
+#include <net/protocol.h>
 #include <linux/ipv6.h>
 #include <linux/icmpv6.h>
 
index 25757ade989f50d23bf2e7d948d1286918678070..c63868dd2ca29c711e3153234578bc8368f4d8d7 100644 (file)
@@ -163,17 +163,17 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
                        sk_refcnt_debug_dec(sk);
 
                        if (sk->sk_protocol == IPPROTO_TCP) {
-                               struct tcp_sock *tp = tcp_sk(sk);
+                               struct inet_connection_sock *icsk = inet_csk(sk);
 
                                local_bh_disable();
                                sock_prot_dec_use(sk->sk_prot);
                                sock_prot_inc_use(&tcp_prot);
                                local_bh_enable();
                                sk->sk_prot = &tcp_prot;
-                               tp->af_specific = &ipv4_specific;
+                               icsk->icsk_af_ops = &ipv4_specific;
                                sk->sk_socket->ops = &inet_stream_ops;
                                sk->sk_family = PF_INET;
-                               tcp_sync_mss(sk, tp->pmtu_cookie);
+                               tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
                        } else {
                                local_bh_disable();
                                sock_prot_dec_use(sk->sk_prot);
@@ -317,14 +317,15 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
                }
 
                retv = 0;
-               if (sk->sk_type == SOCK_STREAM) {
+               if (inet_sk(sk)->is_icsk) {
                        if (opt) {
-                               struct tcp_sock *tp = tcp_sk(sk);
+                               struct inet_connection_sock *icsk = inet_csk(sk);
                                if (!((1 << sk->sk_state) &
                                      (TCPF_LISTEN | TCPF_CLOSE))
                                    && inet_sk(sk)->daddr != LOOPBACK4_IPV6) {
-                                       tp->ext_header_len = opt->opt_flen + opt->opt_nflen;
-                                       tcp_sync_mss(sk, tp->pmtu_cookie);
+                                       icsk->icsk_ext_hdr_len =
+                                               opt->opt_flen + opt->opt_nflen;
+                                       icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
                                }
                        }
                        opt = xchg(&np->opt, opt);
@@ -380,14 +381,15 @@ sticky_done:
                        goto done;
 update:
                retv = 0;
-               if (sk->sk_type == SOCK_STREAM) {
+               if (inet_sk(sk)->is_icsk) {
                        if (opt) {
-                               struct tcp_sock *tp = tcp_sk(sk);
+                               struct inet_connection_sock *icsk = inet_csk(sk);
                                if (!((1 << sk->sk_state) &
                                      (TCPF_LISTEN | TCPF_CLOSE))
                                    && inet_sk(sk)->daddr != LOOPBACK4_IPV6) {
-                                       tp->ext_header_len = opt->opt_flen + opt->opt_nflen;
-                                       tcp_sync_mss(sk, tp->pmtu_cookie);
+                                       icsk->icsk_ext_hdr_len =
+                                               opt->opt_flen + opt->opt_nflen;
+                                       icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
                                }
                        }
                        opt = xchg(&np->opt, opt);
@@ -628,8 +630,8 @@ e_inval:
        return -EINVAL;
 }
 
-int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr,
-                          char __user *optval, int len)
+static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr,
+                                 char __user *optval, int len)
 {
        if (!hdr)
                return 0;
index f15e04ad026effec3f907f6eb2db1eb140e54c3b..1cf305a9f8ddf4067e6e9529c86eb71b25e3a349 100644 (file)
@@ -170,7 +170,7 @@ static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
 #define MLDV2_QQIC(value) MLDV2_EXP(0x80, 4, 3, value)
 #define MLDV2_MRC(value) MLDV2_EXP(0x8000, 12, 3, value)
 
-#define IPV6_MLD_MAX_MSF       10
+#define IPV6_MLD_MAX_MSF       64
 
 int sysctl_mld_max_msf = IPV6_MLD_MAX_MSF;
 
@@ -224,6 +224,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, struct in6_addr *addr)
 
        mc_lst->ifindex = dev->ifindex;
        mc_lst->sfmode = MCAST_EXCLUDE;
+       rwlock_init(&mc_lst->sflock);
        mc_lst->sflist = NULL;
 
        /*
@@ -360,6 +361,7 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
        struct ip6_sf_socklist *psl;
        int i, j, rv;
        int leavegroup = 0;
+       int pmclocked = 0;
        int err;
 
        if (pgsr->gsr_group.ss_family != AF_INET6 ||
@@ -403,6 +405,9 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
                pmc->sfmode = omode;
        }
 
+       write_lock_bh(&pmc->sflock);
+       pmclocked = 1;
+
        psl = pmc->sflist;
        if (!add) {
                if (!psl)
@@ -475,6 +480,8 @@ 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:
+       if (pmclocked)
+               write_unlock_bh(&pmc->sflock);
        read_unlock_bh(&ipv6_sk_mc_lock);
        read_unlock_bh(&idev->lock);
        in6_dev_put(idev);
@@ -510,6 +517,8 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
        dev = idev->dev;
 
        err = 0;
+       read_lock_bh(&ipv6_sk_mc_lock);
+
        if (gsf->gf_fmode == MCAST_INCLUDE && gsf->gf_numsrc == 0) {
                leavegroup = 1;
                goto done;
@@ -549,6 +558,8 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
                newpsl = NULL;
                (void) ip6_mc_add_src(idev, group, gsf->gf_fmode, 0, NULL, 0);
        }
+
+       write_lock_bh(&pmc->sflock);
        psl = pmc->sflist;
        if (psl) {
                (void) ip6_mc_del_src(idev, group, pmc->sfmode,
@@ -558,8 +569,10 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
                (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0);
        pmc->sflist = newpsl;
        pmc->sfmode = gsf->gf_fmode;
+       write_unlock_bh(&pmc->sflock);
        err = 0;
 done:
+       read_unlock_bh(&ipv6_sk_mc_lock);
        read_unlock_bh(&idev->lock);
        in6_dev_put(idev);
        dev_put(dev);
@@ -592,6 +605,11 @@ int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
        dev = idev->dev;
 
        err = -EADDRNOTAVAIL;
+       /*
+        * changes to the ipv6_mc_list require the socket lock and
+        * a read lock on ip6_sk_mc_lock. We have the socket lock,
+        * so reading the list is safe.
+        */
 
        for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) {
                if (pmc->ifindex != gsf->gf_interface)
@@ -614,6 +632,10 @@ int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
            copy_to_user(optval, gsf, GROUP_FILTER_SIZE(0))) {
                return -EFAULT;
        }
+       /* changes to psl require the socket lock, a read lock on
+        * on ipv6_sk_mc_lock and a write lock on pmc->sflock. We
+        * have the socket lock, so reading here is safe.
+        */
        for (i=0; i<copycount; i++) {
                struct sockaddr_in6 *psin6;
                struct sockaddr_storage ss;
@@ -650,6 +672,7 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
                read_unlock(&ipv6_sk_mc_lock);
                return 1;
        }
+       read_lock(&mc->sflock);
        psl = mc->sflist;
        if (!psl) {
                rv = mc->sfmode == MCAST_EXCLUDE;
@@ -665,6 +688,7 @@ int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
                if (mc->sfmode == MCAST_EXCLUDE && i < psl->sl_count)
                        rv = 0;
        }
+       read_unlock(&mc->sflock);
        read_unlock(&ipv6_sk_mc_lock);
 
        return rv;
@@ -1068,23 +1092,64 @@ static void igmp6_group_queried(struct ifmcaddr6 *ma, unsigned long resptime)
        ma->mca_flags |= MAF_TIMER_RUNNING;
 }
 
-static void mld_marksources(struct ifmcaddr6 *pmc, int nsrcs,
+/* mark EXCLUDE-mode sources */
+static int mld_xmarksources(struct ifmcaddr6 *pmc, int nsrcs,
+       struct in6_addr *srcs)
+{
+       struct ip6_sf_list *psf;
+       int i, scount;
+
+       scount = 0;
+       for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
+               if (scount == nsrcs)
+                       break;
+               for (i=0; i<nsrcs; i++) {
+                       /* skip inactive filters */
+                       if (pmc->mca_sfcount[MCAST_INCLUDE] ||
+                           pmc->mca_sfcount[MCAST_EXCLUDE] !=
+                           psf->sf_count[MCAST_EXCLUDE])
+                               continue;
+                       if (ipv6_addr_equal(&srcs[i], &psf->sf_addr)) {
+                               scount++;
+                               break;
+                       }
+               }
+       }
+       pmc->mca_flags &= ~MAF_GSQUERY;
+       if (scount == nsrcs)    /* all sources excluded */
+               return 0;
+       return 1;
+}
+
+static int mld_marksources(struct ifmcaddr6 *pmc, int nsrcs,
        struct in6_addr *srcs)
 {
        struct ip6_sf_list *psf;
        int i, scount;
 
+       if (pmc->mca_sfmode == MCAST_EXCLUDE)
+               return mld_xmarksources(pmc, nsrcs, srcs);
+
+       /* mark INCLUDE-mode sources */
+
        scount = 0;
        for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
                if (scount == nsrcs)
                        break;
-               for (i=0; i<nsrcs; i++)
+               for (i=0; i<nsrcs; i++) {
                        if (ipv6_addr_equal(&srcs[i], &psf->sf_addr)) {
                                psf->sf_gsresp = 1;
                                scount++;
                                break;
                        }
+               }
+       }
+       if (!scount) {
+               pmc->mca_flags &= ~MAF_GSQUERY;
+               return 0;
        }
+       pmc->mca_flags |= MAF_GSQUERY;
+       return 1;
 }
 
 int igmp6_event_query(struct sk_buff *skb)
@@ -1167,7 +1232,7 @@ int igmp6_event_query(struct sk_buff *skb)
                /* mark sources to include, if group & source-specific */
                if (mlh2->nsrcs != 0) {
                        if (!pskb_may_pull(skb, srcs_offset + 
-                               mlh2->nsrcs * sizeof(struct in6_addr))) {
+                           ntohs(mlh2->nsrcs) * sizeof(struct in6_addr))) {
                                in6_dev_put(idev);
                                return -EINVAL;
                        }
@@ -1203,10 +1268,9 @@ int igmp6_event_query(struct sk_buff *skb)
                                else
                                        ma->mca_flags &= ~MAF_GSQUERY;
                        }
-                       if (ma->mca_flags & MAF_GSQUERY)
-                               mld_marksources(ma, ntohs(mlh2->nsrcs),
-                                       mlh2->srcs);
-                       igmp6_group_queried(ma, max_delay);
+                       if (!(ma->mca_flags & MAF_GSQUERY) ||
+                          mld_marksources(ma, ntohs(mlh2->nsrcs), mlh2->srcs))
+                               igmp6_group_queried(ma, max_delay);
                        spin_unlock_bh(&ma->mca_lock);
                        if (group_type != IPV6_ADDR_ANY)
                                break;
@@ -1231,6 +1295,11 @@ int igmp6_event_report(struct sk_buff *skb)
        if (skb->pkt_type == PACKET_LOOPBACK)
                return 0;
 
+       /* send our report if the MC router may not have heard this report */
+       if (skb->pkt_type != PACKET_MULTICAST &&
+           skb->pkt_type != PACKET_BROADCAST)
+               return 0;
+
        if (!pskb_may_pull(skb, sizeof(struct in6_addr)))
                return -EINVAL;
 
@@ -1276,7 +1345,18 @@ static int is_in(struct ifmcaddr6 *pmc, struct ip6_sf_list *psf, int type,
        case MLD2_MODE_IS_EXCLUDE:
                if (gdeleted || sdeleted)
                        return 0;
-               return !((pmc->mca_flags & MAF_GSQUERY) && !psf->sf_gsresp);
+               if (!((pmc->mca_flags & MAF_GSQUERY) && !psf->sf_gsresp)) {
+                       if (pmc->mca_sfmode == MCAST_INCLUDE)
+                               return 1;
+                       /* don't include if this source is excluded
+                        * in all filters
+                        */
+                       if (psf->sf_count[MCAST_INCLUDE])
+                               return 0;
+                       return pmc->mca_sfcount[MCAST_EXCLUDE] ==
+                               psf->sf_count[MCAST_EXCLUDE];
+               }
+               return 0;
        case MLD2_CHANGE_TO_INCLUDE:
                if (gdeleted || sdeleted)
                        return 0;
@@ -1445,7 +1525,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
        struct mld2_report *pmr;
        struct mld2_grec *pgr = NULL;
        struct ip6_sf_list *psf, *psf_next, *psf_prev, **psf_list;
-       int scount, first, isquery, truncate;
+       int scount, stotal, first, isquery, truncate;
 
        if (pmc->mca_flags & MAF_NOREPORT)
                return skb;
@@ -1455,25 +1535,13 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
        truncate = type == MLD2_MODE_IS_EXCLUDE ||
                    type == MLD2_CHANGE_TO_EXCLUDE;
 
+       stotal = scount = 0;
+
        psf_list = sdeleted ? &pmc->mca_tomb : &pmc->mca_sources;
 
-       if (!*psf_list) {
-               if (type == MLD2_ALLOW_NEW_SOURCES ||
-                   type == MLD2_BLOCK_OLD_SOURCES)
-                       return skb;
-               if (pmc->mca_crcount || isquery) {
-                       /* make sure we have room for group header and at
-                        * least one source.
-                        */
-                       if (skb && AVAILABLE(skb) < sizeof(struct mld2_grec)+
-                           sizeof(struct in6_addr)) {
-                               mld_sendpack(skb);
-                               skb = NULL; /* add_grhead will get a new one */
-                       }
-                       skb = add_grhead(skb, pmc, type, &pgr);
-               }
-               return skb;
-       }
+       if (!*psf_list)
+               goto empty_source;
+
        pmr = skb ? (struct mld2_report *)skb->h.raw : NULL;
 
        /* EX and TO_EX get a fresh packet, if needed */
@@ -1486,7 +1554,6 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
                }
        }
        first = 1;
-       scount = 0;
        psf_prev = NULL;
        for (psf=*psf_list; psf; psf=psf_next) {
                struct in6_addr *psrc;
@@ -1520,7 +1587,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
                }
                psrc = (struct in6_addr *)skb_put(skb, sizeof(*psrc));
                *psrc = psf->sf_addr;
-               scount++;
+               scount++; stotal++;
                if ((type == MLD2_ALLOW_NEW_SOURCES ||
                     type == MLD2_BLOCK_OLD_SOURCES) && psf->sf_crcount) {
                        psf->sf_crcount--;
@@ -1535,6 +1602,21 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
                }
                psf_prev = psf;
        }
+
+empty_source:
+       if (!stotal) {
+               if (type == MLD2_ALLOW_NEW_SOURCES ||
+                   type == MLD2_BLOCK_OLD_SOURCES)
+                       return skb;
+               if (pmc->mca_crcount || isquery) {
+                       /* make sure we have room for group header */
+                       if (skb && AVAILABLE(skb) < sizeof(struct mld2_grec)) {
+                               mld_sendpack(skb);
+                               skb = NULL; /* add_grhead will get a new one */
+                       }
+                       skb = add_grhead(skb, pmc, type, &pgr);
+               }
+       }
        if (pgr)
                pgr->grec_nsrcs = htons(scount);
 
@@ -1616,11 +1698,11 @@ static void mld_send_cr(struct inet6_dev *idev)
                        skb = add_grec(skb, pmc, dtype, 1, 1);
                }
                if (pmc->mca_crcount) {
-                       pmc->mca_crcount--;
                        if (pmc->mca_sfmode == MCAST_EXCLUDE) {
                                type = MLD2_CHANGE_TO_INCLUDE;
                                skb = add_grec(skb, pmc, type, 1, 0);
                        }
+                       pmc->mca_crcount--;
                        if (pmc->mca_crcount == 0) {
                                mld_clear_zeros(&pmc->mca_tomb);
                                mld_clear_zeros(&pmc->mca_sources);
@@ -1654,12 +1736,12 @@ static void mld_send_cr(struct inet6_dev *idev)
 
                /* filter mode changes */
                if (pmc->mca_crcount) {
-                       pmc->mca_crcount--;
                        if (pmc->mca_sfmode == MCAST_EXCLUDE)
                                type = MLD2_CHANGE_TO_EXCLUDE;
                        else
                                type = MLD2_CHANGE_TO_INCLUDE;
                        skb = add_grec(skb, pmc, type, 0, 0);
+                       pmc->mca_crcount--;
                }
                spin_unlock_bh(&pmc->mca_lock);
        }
@@ -2018,6 +2100,9 @@ static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
 {
        int err;
 
+       /* callers have the socket lock and a write lock on ipv6_sk_mc_lock,
+        * so no other readers or writers of iml or its sflist
+        */
        if (iml->sflist == 0) {
                /* any-source empty exclude case */
                return ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0);
index 060d61202412c500020205508e874e7e1a63582f..04912f9b35c36a8d80cfeb1a6e245035847b4416 100644 (file)
@@ -211,7 +211,7 @@ config IP6_NF_TARGET_REJECT
 
 config IP6_NF_TARGET_NFQUEUE
        tristate "NFQUEUE Target Support"
-       depends on IP_NF_IPTABLES
+       depends on IP6_NF_IPTABLES
        help
          This Target replaced the old obsolete QUEUE target.
 
index 7d492226c16e8fef4c414872a0916e40e59d9fcc..ea43ef1d94a75de4f9278c00b2c5347cd28b6399 100644 (file)
@@ -15,6 +15,7 @@
  *      - new extension header parser code
  */
 #include <linux/config.h>
+#include <linux/in.h>
 #include <linux/skbuff.h>
 #include <linux/kmod.h>
 #include <linux/vmalloc.h>
@@ -86,11 +87,6 @@ static DECLARE_MUTEX(ip6t_mutex);
    context stops packets coming through and allows user context to read
    the counters or update the rules.
 
-   To be cache friendly on SMP, we arrange them like so:
-   [ n-entries ]
-   ... cache-align padding ...
-   [ n-entries ]
-
    Hence the start of any table is given by get_table() below.  */
 
 /* The table itself */
@@ -108,20 +104,15 @@ struct ip6t_table_info
        unsigned int underflow[NF_IP6_NUMHOOKS];
 
        /* ip6t_entry tables: one per CPU */
-       char entries[0] ____cacheline_aligned;
+       void *entries[NR_CPUS];
 };
 
 static LIST_HEAD(ip6t_target);
 static LIST_HEAD(ip6t_match);
 static LIST_HEAD(ip6t_tables);
+#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
 #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
 
-#ifdef CONFIG_SMP
-#define TABLE_OFFSET(t,p) (SMP_ALIGN((t)->size)*(p))
-#else
-#define TABLE_OFFSET(t,p) 0
-#endif
-
 #if 0
 #define down(x) do { printk("DOWN:%u:" #x "\n", __LINE__); down(x); } while(0)
 #define down_interruptible(x) ({ int __r; printk("DOWNi:%u:" #x "\n", __LINE__); __r = down_interruptible(x); if (__r != 0) printk("ABORT-DOWNi:%u\n", __LINE__); __r; })
@@ -376,8 +367,7 @@ ip6t_do_table(struct sk_buff **pskb,
 
        read_lock_bh(&table->lock);
        IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-       table_base = (void *)table->private->entries
-               + TABLE_OFFSET(table->private, smp_processor_id());
+       table_base = (void *)table->private->entries[smp_processor_id()];
        e = get_entry(table_base, table->private->hook_entry[hook]);
 
 #ifdef CONFIG_NETFILTER_DEBUG
@@ -649,7 +639,8 @@ unconditional(const struct ip6t_ip6 *ipv6)
 /* Figures out from what hook each rule can be called: returns 0 if
    there are loops.  Puts hook bitmask in comefrom. */
 static int
-mark_source_chains(struct ip6t_table_info *newinfo, unsigned int valid_hooks)
+mark_source_chains(struct ip6t_table_info *newinfo,
+                  unsigned int valid_hooks, void *entry0)
 {
        unsigned int hook;
 
@@ -658,7 +649,7 @@ mark_source_chains(struct ip6t_table_info *newinfo, unsigned int valid_hooks)
        for (hook = 0; hook < NF_IP6_NUMHOOKS; hook++) {
                unsigned int pos = newinfo->hook_entry[hook];
                struct ip6t_entry *e
-                       = (struct ip6t_entry *)(newinfo->entries + pos);
+                       = (struct ip6t_entry *)(entry0 + pos);
 
                if (!(valid_hooks & (1 << hook)))
                        continue;
@@ -708,13 +699,13 @@ mark_source_chains(struct ip6t_table_info *newinfo, unsigned int valid_hooks)
                                                goto next;
 
                                        e = (struct ip6t_entry *)
-                                               (newinfo->entries + pos);
+                                               (entry0 + pos);
                                } while (oldpos == pos + e->next_offset);
 
                                /* Move along one */
                                size = e->next_offset;
                                e = (struct ip6t_entry *)
-                                       (newinfo->entries + pos + size);
+                                       (entry0 + pos + size);
                                e->counters.pcnt = pos;
                                pos += size;
                        } else {
@@ -731,7 +722,7 @@ mark_source_chains(struct ip6t_table_info *newinfo, unsigned int valid_hooks)
                                        newpos = pos + e->next_offset;
                                }
                                e = (struct ip6t_entry *)
-                                       (newinfo->entries + newpos);
+                                       (entry0 + newpos);
                                e->counters.pcnt = pos;
                                pos = newpos;
                        }
@@ -941,6 +932,7 @@ static int
 translate_table(const char *name,
                unsigned int valid_hooks,
                struct ip6t_table_info *newinfo,
+               void *entry0,
                unsigned int size,
                unsigned int number,
                const unsigned int *hook_entries,
@@ -961,11 +953,11 @@ translate_table(const char *name,
        duprintf("translate_table: size %u\n", newinfo->size);
        i = 0;
        /* Walk through entries, checking offsets. */
-       ret = IP6T_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+       ret = IP6T_ENTRY_ITERATE(entry0, newinfo->size,
                                check_entry_size_and_hooks,
                                newinfo,
-                               newinfo->entries,
-                               newinfo->entries + size,
+                               entry0,
+                               entry0 + size,
                                hook_entries, underflows, &i);
        if (ret != 0)
                return ret;
@@ -993,27 +985,24 @@ translate_table(const char *name,
                }
        }
 
-       if (!mark_source_chains(newinfo, valid_hooks))
+       if (!mark_source_chains(newinfo, valid_hooks, entry0))
                return -ELOOP;
 
        /* Finally, each sanity check must pass */
        i = 0;
-       ret = IP6T_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+       ret = IP6T_ENTRY_ITERATE(entry0, newinfo->size,
                                check_entry, name, size, &i);
 
        if (ret != 0) {
-               IP6T_ENTRY_ITERATE(newinfo->entries, newinfo->size,
+               IP6T_ENTRY_ITERATE(entry0, newinfo->size,
                                  cleanup_entry, &i);
                return ret;
        }
 
        /* And one copy for every other CPU */
        for_each_cpu(i) {
-               if (i == 0)
-                       continue;
-               memcpy(newinfo->entries + SMP_ALIGN(newinfo->size) * i,
-                      newinfo->entries,
-                      SMP_ALIGN(newinfo->size));
+               if (newinfo->entries[i] && newinfo->entries[i] != entry0)
+                       memcpy(newinfo->entries[i], entry0, newinfo->size);
        }
 
        return ret;
@@ -1029,15 +1018,12 @@ replace_table(struct ip6t_table *table,
 
 #ifdef CONFIG_NETFILTER_DEBUG
        {
-               struct ip6t_entry *table_base;
-               unsigned int i;
+               int cpu;
 
-               for_each_cpu(i) {
-                       table_base =
-                               (void *)newinfo->entries
-                               + TABLE_OFFSET(newinfo, i);
-
-                       table_base->comefrom = 0xdead57ac;
+               for_each_cpu(cpu) {
+                       struct ip6t_entry *table_base = newinfo->entries[cpu];
+                       if (table_base)
+                               table_base->comefrom = 0xdead57ac;
                }
        }
 #endif
@@ -1072,16 +1058,44 @@ add_entry_to_counter(const struct ip6t_entry *e,
        return 0;
 }
 
+static inline int
+set_entry_to_counter(const struct ip6t_entry *e,
+                    struct ip6t_counters total[],
+                    unsigned int *i)
+{
+       SET_COUNTER(total[*i], e->counters.bcnt, e->counters.pcnt);
+
+       (*i)++;
+       return 0;
+}
+
 static void
 get_counters(const struct ip6t_table_info *t,
             struct ip6t_counters counters[])
 {
        unsigned int cpu;
        unsigned int i;
+       unsigned int curcpu;
+
+       /* Instead of clearing (by a previous call to memset())
+        * the counters and using adds, we set the counters
+        * with data used by 'current' CPU
+        * We dont care about preemption here.
+        */
+       curcpu = raw_smp_processor_id();
+
+       i = 0;
+       IP6T_ENTRY_ITERATE(t->entries[curcpu],
+                          t->size,
+                          set_entry_to_counter,
+                          counters,
+                          &i);
 
        for_each_cpu(cpu) {
+               if (cpu == curcpu)
+                       continue;
                i = 0;
-               IP6T_ENTRY_ITERATE(t->entries + TABLE_OFFSET(t, cpu),
+               IP6T_ENTRY_ITERATE(t->entries[cpu],
                                  t->size,
                                  add_entry_to_counter,
                                  counters,
@@ -1098,6 +1112,7 @@ copy_entries_to_user(unsigned int total_size,
        struct ip6t_entry *e;
        struct ip6t_counters *counters;
        int ret = 0;
+       void *loc_cpu_entry;
 
        /* We need atomic snapshot of counters: rest doesn't change
           (other than comefrom, which userspace doesn't care
@@ -1109,13 +1124,13 @@ copy_entries_to_user(unsigned int total_size,
                return -ENOMEM;
 
        /* First, sum counters... */
-       memset(counters, 0, countersize);
        write_lock_bh(&table->lock);
        get_counters(table->private, counters);
        write_unlock_bh(&table->lock);
 
-       /* ... then copy entire thing from CPU 0... */
-       if (copy_to_user(userptr, table->private->entries, total_size) != 0) {
+       /* choose the copy that is on ourc node/cpu */
+       loc_cpu_entry = table->private->entries[raw_smp_processor_id()];
+       if (copy_to_user(userptr, loc_cpu_entry, total_size) != 0) {
                ret = -EFAULT;
                goto free_counters;
        }
@@ -1127,7 +1142,7 @@ copy_entries_to_user(unsigned int total_size,
                struct ip6t_entry_match *m;
                struct ip6t_entry_target *t;
 
-               e = (struct ip6t_entry *)(table->private->entries + off);
+               e = (struct ip6t_entry *)(loc_cpu_entry + off);
                if (copy_to_user(userptr + off
                                 + offsetof(struct ip6t_entry, counters),
                                 &counters[num],
@@ -1196,6 +1211,46 @@ get_entries(const struct ip6t_get_entries *entries,
        return ret;
 }
 
+static void free_table_info(struct ip6t_table_info *info)
+{
+       int cpu;
+       for_each_cpu(cpu) {
+               if (info->size <= PAGE_SIZE)
+                       kfree(info->entries[cpu]);
+               else
+                       vfree(info->entries[cpu]);
+       }
+       kfree(info);
+}
+
+static struct ip6t_table_info *alloc_table_info(unsigned int size)
+{
+       struct ip6t_table_info *newinfo;
+       int cpu;
+
+       newinfo = kzalloc(sizeof(struct ip6t_table_info), GFP_KERNEL);
+       if (!newinfo)
+               return NULL;
+
+       newinfo->size = size;
+
+       for_each_cpu(cpu) {
+               if (size <= PAGE_SIZE)
+                       newinfo->entries[cpu] = kmalloc_node(size,
+                                                       GFP_KERNEL,
+                                                       cpu_to_node(cpu));
+               else
+                       newinfo->entries[cpu] = vmalloc_node(size,
+                                                            cpu_to_node(cpu));
+               if (newinfo->entries[cpu] == NULL) {
+                       free_table_info(newinfo);
+                       return NULL;
+               }
+       }
+
+       return newinfo;
+}
+
 static int
 do_replace(void __user *user, unsigned int len)
 {
@@ -1204,6 +1259,7 @@ do_replace(void __user *user, unsigned int len)
        struct ip6t_table *t;
        struct ip6t_table_info *newinfo, *oldinfo;
        struct ip6t_counters *counters;
+       void *loc_cpu_entry, *loc_cpu_old_entry;
 
        if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
                return -EFAULT;
@@ -1212,13 +1268,13 @@ do_replace(void __user *user, unsigned int len)
        if ((SMP_ALIGN(tmp.size) >> PAGE_SHIFT) + 2 > num_physpages)
                return -ENOMEM;
 
-       newinfo = vmalloc(sizeof(struct ip6t_table_info)
-                         + SMP_ALIGN(tmp.size) *
-                                       (highest_possible_processor_id()+1));
+       newinfo = alloc_table_info(tmp.size);
        if (!newinfo)
                return -ENOMEM;
 
-       if (copy_from_user(newinfo->entries, user + sizeof(tmp),
+       /* choose the copy that is on our node/cpu */
+       loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
+       if (copy_from_user(loc_cpu_entry, user + sizeof(tmp),
                           tmp.size) != 0) {
                ret = -EFAULT;
                goto free_newinfo;
@@ -1229,10 +1285,9 @@ do_replace(void __user *user, unsigned int len)
                ret = -ENOMEM;
                goto free_newinfo;
        }
-       memset(counters, 0, tmp.num_counters * sizeof(struct ip6t_counters));
 
        ret = translate_table(tmp.name, tmp.valid_hooks,
-                             newinfo, tmp.size, tmp.num_entries,
+                             newinfo, loc_cpu_entry, tmp.size, tmp.num_entries,
                              tmp.hook_entry, tmp.underflow);
        if (ret != 0)
                goto free_newinfo_counters;
@@ -1271,8 +1326,9 @@ do_replace(void __user *user, unsigned int len)
        /* Get the old counters. */
        get_counters(oldinfo, counters);
        /* Decrease module usage counts and free resource */
-       IP6T_ENTRY_ITERATE(oldinfo->entries, oldinfo->size, cleanup_entry,NULL);
-       vfree(oldinfo);
+       loc_cpu_old_entry = oldinfo->entries[raw_smp_processor_id()];
+       IP6T_ENTRY_ITERATE(loc_cpu_old_entry, oldinfo->size, cleanup_entry,NULL);
+       free_table_info(oldinfo);
        if (copy_to_user(tmp.counters, counters,
                         sizeof(struct ip6t_counters) * tmp.num_counters) != 0)
                ret = -EFAULT;
@@ -1284,11 +1340,11 @@ do_replace(void __user *user, unsigned int len)
        module_put(t->me);
        up(&ip6t_mutex);
  free_newinfo_counters_untrans:
-       IP6T_ENTRY_ITERATE(newinfo->entries, newinfo->size, cleanup_entry,NULL);
+       IP6T_ENTRY_ITERATE(loc_cpu_entry, newinfo->size, cleanup_entry,NULL);
  free_newinfo_counters:
        vfree(counters);
  free_newinfo:
-       vfree(newinfo);
+       free_table_info(newinfo);
        return ret;
 }
 
@@ -1321,6 +1377,7 @@ do_add_counters(void __user *user, unsigned int len)
        struct ip6t_counters_info tmp, *paddc;
        struct ip6t_table *t;
        int ret = 0;
+       void *loc_cpu_entry;
 
        if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
                return -EFAULT;
@@ -1350,7 +1407,9 @@ do_add_counters(void __user *user, unsigned int len)
        }
 
        i = 0;
-       IP6T_ENTRY_ITERATE(t->private->entries,
+       /* Choose the copy that is on our node */
+       loc_cpu_entry = t->private->entries[smp_processor_id()];
+       IP6T_ENTRY_ITERATE(loc_cpu_entry,
                          t->private->size,
                          add_counter_to_entry,
                          paddc->counters,
@@ -1543,28 +1602,29 @@ int ip6t_register_table(struct ip6t_table *table,
        struct ip6t_table_info *newinfo;
        static struct ip6t_table_info bootstrap
                = { 0, 0, 0, { 0 }, { 0 }, { } };
+       void *loc_cpu_entry;
 
-       newinfo = vmalloc(sizeof(struct ip6t_table_info)
-                         + SMP_ALIGN(repl->size) *
-                                       (highest_possible_processor_id()+1));
+       newinfo = alloc_table_info(repl->size);
        if (!newinfo)
                return -ENOMEM;
 
-       memcpy(newinfo->entries, repl->entries, repl->size);
+       /* choose the copy on our node/cpu */
+       loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
+       memcpy(loc_cpu_entry, repl->entries, repl->size);
 
        ret = translate_table(table->name, table->valid_hooks,
-                             newinfo, repl->size,
+                             newinfo, loc_cpu_entry, repl->size,
                              repl->num_entries,
                              repl->hook_entry,
                              repl->underflow);
        if (ret != 0) {
-               vfree(newinfo);
+               free_table_info(newinfo);
                return ret;
        }
 
        ret = down_interruptible(&ip6t_mutex);
        if (ret != 0) {
-               vfree(newinfo);
+               free_table_info(newinfo);
                return ret;
        }
 
@@ -1593,20 +1653,23 @@ int ip6t_register_table(struct ip6t_table *table,
        return ret;
 
  free_unlock:
-       vfree(newinfo);
+       free_table_info(newinfo);
        goto unlock;
 }
 
 void ip6t_unregister_table(struct ip6t_table *table)
 {
+       void *loc_cpu_entry;
+
        down(&ip6t_mutex);
        LIST_DELETE(&ip6t_tables, table);
        up(&ip6t_mutex);
 
        /* Decrease module usage counts and free resources */
-       IP6T_ENTRY_ITERATE(table->private->entries, table->private->size,
+       loc_cpu_entry = table->private->entries[raw_smp_processor_id()];
+       IP6T_ENTRY_ITERATE(loc_cpu_entry, table->private->size,
                          cleanup_entry, NULL);
-       vfree(table->private);
+       free_table_info(table->private);
 }
 
 /* Returns 1 if the port is matched by the range, 0 otherwise */
@@ -1972,7 +2035,7 @@ static int ip6t_get_matches(char *buffer, char **start, off_t offset, int length
        return pos;
 }
 
-static struct { char *name; get_info_t *get_info; } ip6t_proc_entry[] =
+static const struct { char *name; get_info_t *get_info; } ip6t_proc_entry[] =
 { { "ip6_tables_names", ip6t_get_tables },
   { "ip6_tables_targets", ip6t_get_targets },
   { "ip6_tables_matches", ip6t_get_matches },
index 0cd1d1bd9033ced7e87f26ef5193983e24951159..ae4653bfd65462fe31340bf6cf46324d8cf93385 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/skbuff.h>
+#include <linux/if_arp.h>
 #include <linux/ip.h>
 #include <linux/spinlock.h>
 #include <linux/icmpv6.h>
index dde37793d20b00a2a7dbad7cc374873c43032f5e..268918d5deea174ec27d03e3d96d4d5ea2288a92 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <linux/module.h>
 #include <linux/skbuff.h>
+#include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/types.h>
 #include <net/checksum.h>
index 24bc0cde43a174d4090d4b6d5897c68246e5c966..65937de1b58c5af723a4732e9ee11eb4b611c849 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <linux/module.h>
 #include <linux/skbuff.h>
+#include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/types.h>
 #include <net/checksum.h>
index c0f1da5497a9cdb71e5b51d47c84f8ce8af2ddb5..a7e03cfacd06fc35b8b480cd3d04ac1210771fb0 100644 (file)
@@ -68,8 +68,8 @@ static int icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple,
                [ICMPV6_NI_REPLY - 128]         = ICMPV6_NI_REPLY +1
        };
 
-       __u8 type = orig->dst.u.icmp.type - 128;
-       if (type >= sizeof(invmap) || !invmap[type])
+       int type = orig->dst.u.icmp.type - 128;
+       if (type < 0 || type >= sizeof(invmap) || !invmap[type])
                return 0;
 
        tuple->src.u.icmp.id   = orig->src.u.icmp.id;
@@ -129,12 +129,12 @@ static int icmpv6_new(struct nf_conn *conntrack,
                [ICMPV6_ECHO_REQUEST - 128] = 1,
                [ICMPV6_NI_QUERY - 128] = 1
        };
+       int type = conntrack->tuplehash[0].tuple.dst.u.icmp.type - 128;
 
-       if (conntrack->tuplehash[0].tuple.dst.u.icmp.type - 128 >= sizeof(valid_new)
-           || !valid_new[conntrack->tuplehash[0].tuple.dst.u.icmp.type - 128]) {
+       if (type < 0 || type >= sizeof(valid_new) || !valid_new[type]) {
                /* Can't create a new ICMPv6 `conn' with this. */
-               DEBUGP("icmp: can't create new conn with type %u\n",
-                      conntrack->tuplehash[0].tuple.dst.u.icmp.type);
+               DEBUGP("icmpv6: can't create new conn with type %u\n",
+                      type + 128);
                NF_CT_DUMP_TUPLE(&conntrack->tuplehash[0].tuple);
                return 0;
        }
index c2c52af9e5602c4be485c5f4212c170c4e1b79a6..f3e5ffbd592f9ee4c3bd04c661453fe6ccda64d5 100644 (file)
@@ -98,7 +98,7 @@ struct nf_ct_frag6_queue
 #define FRAG6Q_HASHSZ  64
 
 static struct nf_ct_frag6_queue *nf_ct_frag6_hash[FRAG6Q_HASHSZ];
-static rwlock_t nf_ct_frag6_lock = RW_LOCK_UNLOCKED;
+static DEFINE_RWLOCK(nf_ct_frag6_lock);
 static u32 nf_ct_frag6_hash_rnd;
 static LIST_HEAD(nf_ct_frag6_lru_list);
 int nf_ct_frag6_nqueues = 0;
@@ -371,7 +371,7 @@ nf_ct_frag6_create(unsigned int hash, u32 id, struct in6_addr *src,                            struct
        init_timer(&fq->timer);
        fq->timer.function = nf_ct_frag6_expire;
        fq->timer.data = (long) fq;
-       fq->lock = SPIN_LOCK_UNLOCKED;
+       spin_lock_init(&fq->lock);
        atomic_set(&fq->refcnt, 1);
 
        return nf_ct_frag6_intern(hash, fq);
index 8e9628f1c4c5b4bc4f1b858c339950072ad50c7c..66f1d12ea578319f144044313a6776cefa7090d2 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/icmpv6.h>
 #include <linux/netfilter.h>
 #include <linux/netfilter_ipv6.h>
+#include <linux/skbuff.h>
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
 #include <asm/bug.h>
@@ -433,25 +434,14 @@ out:
        return err;
 
 csum_copy_err:
-       /* Clear queue. */
-       if (flags&MSG_PEEK) {
-               int clear = 0;
-               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_bh(&sk->sk_receive_queue.lock);
-               if (clear)
-                       kfree_skb(skb);
-       }
+       skb_kill_datagram(sk, skb, flags);
 
        /* Error for blocking case is chosen to masquerade
           as some normal condition.
         */
        err = (flags&MSG_DONTWAIT) ? -EAGAIN : -EHOSTUNREACH;
        /* FIXME: increment a raw6 drops counter here */
-       goto out_free;
+       goto out;
 }
 
 static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl,
@@ -748,7 +738,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
        }
        if (opt == NULL)
                opt = np->opt;
-       opt = fl6_merge_options(&opt_space, flowlabel, opt);
+       if (flowlabel)
+               opt = fl6_merge_options(&opt_space, flowlabel, opt);
+       opt = ipv6_fixup_options(&opt_space, opt);
 
        fl.proto = proto;
        rawv6_probe_proto_opt(&fl, msg);
index a7a537b5059537bb7d7fd5291323277333c22cb7..66140f13d1197130c29f5d9fa90c4f10a3bf3819 100644 (file)
@@ -413,11 +413,14 @@ static struct rt6_info *rt6_cow(struct rt6_info *ort, struct in6_addr *daddr,
        rt = ip6_rt_copy(ort);
 
        if (rt) {
-               ipv6_addr_copy(&rt->rt6i_dst.addr, daddr);
-
-               if (!(rt->rt6i_flags&RTF_GATEWAY))
+               if (!(rt->rt6i_flags&RTF_GATEWAY)) {
+                       if (rt->rt6i_dst.plen != 128 &&
+                           ipv6_addr_equal(&rt->rt6i_dst.addr, daddr))
+                               rt->rt6i_flags |= RTF_ANYCAST;
                        ipv6_addr_copy(&rt->rt6i_gateway, daddr);
+               }
 
+               ipv6_addr_copy(&rt->rt6i_dst.addr, daddr);
                rt->rt6i_dst.plen = 128;
                rt->rt6i_flags |= RTF_CACHE;
                rt->u.dst.flags |= DST_HOST;
@@ -829,7 +832,7 @@ int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
        }
 
        rt->u.dst.obsolete = -1;
-       rt->rt6i_expires = clock_t_to_jiffies(rtmsg->rtmsg_info);
+       rt->rt6i_expires = jiffies + clock_t_to_jiffies(rtmsg->rtmsg_info);
        if (nlh && (r = NLMSG_DATA(nlh))) {
                rt->rt6i_protocol = r->rtm_protocol;
        } else {
@@ -1413,7 +1416,9 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
        rt->u.dst.obsolete = -1;
 
        rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
-       if (!anycast)
+       if (anycast)
+               rt->rt6i_flags |= RTF_ANYCAST;
+       else
                rt->rt6i_flags |= RTF_LOCAL;
        rt->rt6i_nexthop = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway);
        if (rt->rt6i_nexthop == NULL) {
index 62c0e5bd931c7aa458083b00e2d81850f8c1b4e0..2947bc56d8a025948b803fabd088cf220ef01c4a 100644 (file)
@@ -48,6 +48,7 @@
 #include <net/tcp.h>
 #include <net/ndisc.h>
 #include <net/inet6_hashtables.h>
+#include <net/inet6_connection_sock.h>
 #include <net/ipv6.h>
 #include <net/transp_v6.h>
 #include <net/addrconf.h>
@@ -59,6 +60,7 @@
 #include <net/addrconf.h>
 #include <net/snmp.h>
 #include <net/dsfield.h>
+#include <net/timewait_sock.h>
 
 #include <asm/uaccess.h>
 
 
 static void    tcp_v6_send_reset(struct sk_buff *skb);
 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, 
+static void    tcp_v6_send_check(struct sock *sk, int len, 
                                  struct sk_buff *skb);
 
 static int     tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
-static int     tcp_v6_xmit(struct sk_buff *skb, int ipfragok);
 
-static struct tcp_func ipv6_mapped;
-static struct tcp_func ipv6_specific;
+static struct inet_connection_sock_af_ops ipv6_mapped;
+static struct inet_connection_sock_af_ops ipv6_specific;
 
-static inline int tcp_v6_bind_conflict(const struct sock *sk,
-                                      const struct inet_bind_bucket *tb)
-{
-       const struct sock *sk2;
-       const struct hlist_node *node;
-
-       /* We must walk the whole port owner list in this case. -DaveM */
-       sk_for_each_bound(sk2, node, &tb->owners) {
-               if (sk != sk2 &&
-                   (!sk->sk_bound_dev_if ||
-                    !sk2->sk_bound_dev_if ||
-                    sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
-                   (!sk->sk_reuse || !sk2->sk_reuse ||
-                    sk2->sk_state == TCP_LISTEN) &&
-                    ipv6_rcv_saddr_equal(sk, sk2))
-                       break;
-       }
-
-       return node != NULL;
-}
-
-/* Grrr, addr_type already calculated by caller, but I don't want
- * to add some silly "cookie" argument to this method just for that.
- * But it doesn't matter, the recalculation is in the rarest path
- * this function ever takes.
- */
 static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
 {
-       struct inet_bind_hashbucket *head;
-       struct inet_bind_bucket *tb;
-       struct hlist_node *node;
-       int ret;
-
-       local_bh_disable();
-       if (snum == 0) {
-               int low = sysctl_local_port_range[0];
-               int high = sysctl_local_port_range[1];
-               int remaining = (high - low) + 1;
-               int rover = net_random() % (high - low) + low;
-
-               do {
-                       head = &tcp_hashinfo.bhash[inet_bhashfn(rover, tcp_hashinfo.bhash_size)];
-                       spin_lock(&head->lock);
-                       inet_bind_bucket_for_each(tb, node, &head->chain)
-                               if (tb->port == rover)
-                                       goto next;
-                       break;
-               next:
-                       spin_unlock(&head->lock);
-                       if (++rover > high)
-                               rover = low;
-               } while (--remaining > 0);
-
-               /* Exhausted local port range during search?  It is not
-                * possible for us to be holding one of the bind hash
-                * locks if this test triggers, because if 'remaining'
-                * drops to zero, we broke out of the do/while loop at
-                * the top level, not from the 'break;' statement.
-                */
-               ret = 1;
-               if (unlikely(remaining <= 0))
-                       goto fail;
-
-               /* OK, here is the one we will use. */
-               snum = rover;
-       } else {
-               head = &tcp_hashinfo.bhash[inet_bhashfn(snum, tcp_hashinfo.bhash_size)];
-               spin_lock(&head->lock);
-               inet_bind_bucket_for_each(tb, node, &head->chain)
-                       if (tb->port == snum)
-                               goto tb_found;
-       }
-       tb = NULL;
-       goto tb_not_found;
-tb_found:
-       if (tb && !hlist_empty(&tb->owners)) {
-               if (tb->fastreuse > 0 && sk->sk_reuse &&
-                   sk->sk_state != TCP_LISTEN) {
-                       goto success;
-               } else {
-                       ret = 1;
-                       if (tcp_v6_bind_conflict(sk, tb))
-                               goto fail_unlock;
-               }
-       }
-tb_not_found:
-       ret = 1;
-       if (tb == NULL) {
-               tb = inet_bind_bucket_create(tcp_hashinfo.bind_bucket_cachep, head, snum);
-               if (tb == NULL)
-                       goto fail_unlock;
-       }
-       if (hlist_empty(&tb->owners)) {
-               if (sk->sk_reuse && sk->sk_state != TCP_LISTEN)
-                       tb->fastreuse = 1;
-               else
-                       tb->fastreuse = 0;
-       } else if (tb->fastreuse &&
-                  (!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
-               tb->fastreuse = 0;
-
-success:
-       if (!inet_csk(sk)->icsk_bind_hash)
-               inet_bind_hash(sk, tb, snum);
-       BUG_TRAP(inet_csk(sk)->icsk_bind_hash == tb);
-       ret = 0;
-
-fail_unlock:
-       spin_unlock(&head->lock);
-fail:
-       local_bh_enable();
-       return ret;
-}
-
-static __inline__ void __tcp_v6_hash(struct sock *sk)
-{
-       struct hlist_head *list;
-       rwlock_t *lock;
-
-       BUG_TRAP(sk_unhashed(sk));
-
-       if (sk->sk_state == TCP_LISTEN) {
-               list = &tcp_hashinfo.listening_hash[inet_sk_listen_hashfn(sk)];
-               lock = &tcp_hashinfo.lhash_lock;
-               inet_listen_wlock(&tcp_hashinfo);
-       } else {
-               unsigned int hash;
-               sk->sk_hash = hash = inet6_sk_ehashfn(sk);
-               hash &= (tcp_hashinfo.ehash_size - 1);
-               list = &tcp_hashinfo.ehash[hash].chain;
-               lock = &tcp_hashinfo.ehash[hash].lock;
-               write_lock(lock);
-       }
-
-       __sk_add_node(sk, list);
-       sock_prot_inc_use(sk->sk_prot);
-       write_unlock(lock);
+       return inet_csk_get_port(&tcp_hashinfo, sk, snum,
+                                inet6_csk_bind_conflict);
 }
 
-
 static void tcp_v6_hash(struct sock *sk)
 {
        if (sk->sk_state != TCP_CLOSE) {
-               struct tcp_sock *tp = tcp_sk(sk);
-
-               if (tp->af_specific == &ipv6_mapped) {
+               if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
                        tcp_prot.hash(sk);
                        return;
                }
                local_bh_disable();
-               __tcp_v6_hash(sk);
+               __inet6_hash(&tcp_hashinfo, sk);
                local_bh_enable();
        }
 }
 
-/*
- * Open request hash tables.
- */
-
-static u32 tcp_v6_synq_hash(const struct in6_addr *raddr, const u16 rport, const u32 rnd)
-{
-       u32 a, b, c;
-
-       a = raddr->s6_addr32[0];
-       b = raddr->s6_addr32[1];
-       c = raddr->s6_addr32[2];
-
-       a += JHASH_GOLDEN_RATIO;
-       b += JHASH_GOLDEN_RATIO;
-       c += rnd;
-       __jhash_mix(a, b, c);
-
-       a += raddr->s6_addr32[3];
-       b += (u32) rport;
-       __jhash_mix(a, b, c);
-
-       return c & (TCP_SYNQ_HSIZE - 1);
-}
-
-static struct request_sock *tcp_v6_search_req(const struct sock *sk,
-                                             struct request_sock ***prevp,
-                                             __u16 rport,
-                                             struct in6_addr *raddr,
-                                             struct in6_addr *laddr,
-                                             int iif)
-{
-       const struct inet_connection_sock *icsk = inet_csk(sk);
-       struct listen_sock *lopt = icsk->icsk_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) {
-               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;
-               }
-       }
-
-       return NULL;
-}
-
 static __inline__ u16 tcp_v6_check(struct tcphdr *th, int len,
                                   struct in6_addr *saddr, 
                                   struct in6_addr *daddr, 
@@ -308,195 +119,12 @@ static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb)
        }
 }
 
-static int __tcp_v6_check_established(struct sock *sk, const __u16 lport,
-                                     struct inet_timewait_sock **twp)
-{
-       struct inet_sock *inet = inet_sk(sk);
-       const struct ipv6_pinfo *np = inet6_sk(sk);
-       const struct in6_addr *daddr = &np->rcv_saddr;
-       const struct in6_addr *saddr = &np->daddr;
-       const int dif = sk->sk_bound_dev_if;
-       const u32 ports = INET_COMBINED_PORTS(inet->dport, lport);
-       unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr, inet->dport);
-       struct inet_ehash_bucket *head = inet_ehash_bucket(&tcp_hashinfo, hash);
-       struct sock *sk2;
-       const struct hlist_node *node;
-       struct inet_timewait_sock *tw;
-
-       prefetch(head->chain.first);
-       write_lock(&head->lock);
-
-       /* Check TIME-WAIT sockets first. */
-       sk_for_each(sk2, node, &(head + tcp_hashinfo.ehash_size)->chain) {
-               const struct tcp6_timewait_sock *tcp6tw = tcp6_twsk(sk2);
-
-               tw = inet_twsk(sk2);
-
-               if(*((__u32 *)&(tw->tw_dport))  == ports        &&
-                  sk2->sk_family               == PF_INET6     &&
-                  ipv6_addr_equal(&tcp6tw->tw_v6_daddr, saddr) &&
-                  ipv6_addr_equal(&tcp6tw->tw_v6_rcv_saddr, daddr)     &&
-                  sk2->sk_bound_dev_if == sk->sk_bound_dev_if) {
-                       const struct tcp_timewait_sock *tcptw = tcp_twsk(sk2);
-                       struct tcp_sock *tp = tcp_sk(sk);
-
-                       if (tcptw->tw_ts_recent_stamp &&
-                           (!twp ||
-                            (sysctl_tcp_tw_reuse &&
-                             xtime.tv_sec - tcptw->tw_ts_recent_stamp > 1))) {
-                               /* See comment in tcp_ipv4.c */
-                               tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2;
-                               if (!tp->write_seq)
-                                       tp->write_seq = 1;
-                               tp->rx_opt.ts_recent       = tcptw->tw_ts_recent;
-                               tp->rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp;
-                               sock_hold(sk2);
-                               goto unique;
-                       } else
-                               goto not_unique;
-               }
-       }
-       tw = NULL;
-
-       /* And established part... */
-       sk_for_each(sk2, node, &head->chain) {
-               if (INET6_MATCH(sk2, hash, saddr, daddr, ports, dif))
-                       goto not_unique;
-       }
-
-unique:
-       BUG_TRAP(sk_unhashed(sk));
-       __sk_add_node(sk, &head->chain);
-       sk->sk_hash = hash;
-       sock_prot_inc_use(sk->sk_prot);
-       write_unlock(&head->lock);
-
-       if (twp) {
-               *twp = tw;
-               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
-       } else if (tw) {
-               /* Silly. Should hash-dance instead... */
-               inet_twsk_deschedule(tw, &tcp_death_row);
-               NET_INC_STATS_BH(LINUX_MIB_TIMEWAITRECYCLED);
-
-               inet_twsk_put(tw);
-       }
-       return 0;
-
-not_unique:
-       write_unlock(&head->lock);
-       return -EADDRNOTAVAIL;
-}
-
-static inline u32 tcpv6_port_offset(const struct sock *sk)
-{
-       const struct inet_sock *inet = inet_sk(sk);
-       const struct ipv6_pinfo *np = inet6_sk(sk);
-
-       return secure_tcpv6_port_ephemeral(np->rcv_saddr.s6_addr32,
-                                          np->daddr.s6_addr32,
-                                          inet->dport);
-}
-
-static int tcp_v6_hash_connect(struct sock *sk)
-{
-       unsigned short snum = inet_sk(sk)->num;
-       struct inet_bind_hashbucket *head;
-       struct inet_bind_bucket *tb;
-       int ret;
-
-       if (!snum) {
-               int low = sysctl_local_port_range[0];
-               int high = sysctl_local_port_range[1];
-               int range = high - low;
-               int i;
-               int port;
-               static u32 hint;
-               u32 offset = hint + tcpv6_port_offset(sk);
-               struct hlist_node *node;
-               struct inet_timewait_sock *tw = NULL;
-
-               local_bh_disable();
-               for (i = 1; i <= range; i++) {
-                       port = low + (i + offset) % range;
-                       head = &tcp_hashinfo.bhash[inet_bhashfn(port, tcp_hashinfo.bhash_size)];
-                       spin_lock(&head->lock);
-
-                       /* Does not bother with rcv_saddr checks,
-                        * because the established check is already
-                        * unique enough.
-                        */
-                       inet_bind_bucket_for_each(tb, node, &head->chain) {
-                               if (tb->port == port) {
-                                       BUG_TRAP(!hlist_empty(&tb->owners));
-                                       if (tb->fastreuse >= 0)
-                                               goto next_port;
-                                       if (!__tcp_v6_check_established(sk,
-                                                                       port,
-                                                                       &tw))
-                                               goto ok;
-                                       goto next_port;
-                               }
-                       }
-
-                       tb = inet_bind_bucket_create(tcp_hashinfo.bind_bucket_cachep, head, port);
-                       if (!tb) {
-                               spin_unlock(&head->lock);
-                               break;
-                       }
-                       tb->fastreuse = -1;
-                       goto ok;
-
-               next_port:
-                       spin_unlock(&head->lock);
-               }
-               local_bh_enable();
-
-               return -EADDRNOTAVAIL;
-
-ok:
-               hint += i;
-
-               /* Head lock still held and bh's disabled */
-               inet_bind_hash(sk, tb, port);
-               if (sk_unhashed(sk)) {
-                       inet_sk(sk)->sport = htons(port);
-                       __tcp_v6_hash(sk);
-               }
-               spin_unlock(&head->lock);
-
-               if (tw) {
-                       inet_twsk_deschedule(tw, &tcp_death_row);
-                       inet_twsk_put(tw);
-               }
-
-               ret = 0;
-               goto out;
-       }
-
-       head = &tcp_hashinfo.bhash[inet_bhashfn(snum, tcp_hashinfo.bhash_size)];
-       tb   = inet_csk(sk)->icsk_bind_hash;
-       spin_lock_bh(&head->lock);
-
-       if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
-               __tcp_v6_hash(sk);
-               spin_unlock_bh(&head->lock);
-               return 0;
-       } else {
-               spin_unlock(&head->lock);
-               /* No definite answer... Walk to established hash table */
-               ret = __tcp_v6_check_established(sk, snum, NULL);
-out:
-               local_bh_enable();
-               return ret;
-       }
-}
-
 static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, 
                          int addr_len)
 {
        struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
-       struct inet_sock *inet = inet_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
+       struct inet_connection_sock *icsk = inet_csk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
        struct in6_addr *saddr = NULL, *final_p = NULL, final;
@@ -571,7 +199,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
         */
 
        if (addr_type == IPV6_ADDR_MAPPED) {
-               u32 exthdrlen = tp->ext_header_len;
+               u32 exthdrlen = icsk->icsk_ext_hdr_len;
                struct sockaddr_in sin;
 
                SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
@@ -583,14 +211,14 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
                sin.sin_port = usin->sin6_port;
                sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
 
-               tp->af_specific = &ipv6_mapped;
+               icsk->icsk_af_ops = &ipv6_mapped;
                sk->sk_backlog_rcv = tcp_v4_do_rcv;
 
                err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
 
                if (err) {
-                       tp->ext_header_len = exthdrlen;
-                       tp->af_specific = &ipv6_specific;
+                       icsk->icsk_ext_hdr_len = exthdrlen;
+                       icsk->icsk_af_ops = &ipv6_specific;
                        sk->sk_backlog_rcv = tcp_v6_do_rcv;
                        goto failure;
                } else {
@@ -643,16 +271,17 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        sk->sk_route_caps = dst->dev->features &
                ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
 
-       tp->ext_header_len = 0;
+       icsk->icsk_ext_hdr_len = 0;
        if (np->opt)
-               tp->ext_header_len = np->opt->opt_flen + np->opt->opt_nflen;
+               icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
+                                         np->opt->opt_nflen);
 
        tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
 
        inet->dport = usin->sin6_port;
 
        tcp_set_state(sk, TCP_SYN_SENT);
-       err = tcp_v6_hash_connect(sk);
+       err = inet6_hash_connect(&tcp_death_row, sk);
        if (err)
                goto late_failure;
 
@@ -758,7 +387,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                } else
                        dst_hold(dst);
 
-               if (tp->pmtu_cookie > dst_mtu(dst)) {
+               if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
                        tcp_sync_mss(sk, dst_mtu(dst));
                        tcp_simple_retransmit(sk);
                } /* else let the usual retransmit timer handle it */
@@ -775,8 +404,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                if (sock_owned_by_user(sk))
                        goto out;
 
-               req = tcp_v6_search_req(sk, &prev, th->dest, &hdr->daddr,
-                                       &hdr->saddr, inet6_iif(skb));
+               req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
+                                          &hdr->saddr, inet6_iif(skb));
                if (!req)
                        goto out;
 
@@ -822,7 +451,7 @@ out:
 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 inet6_request_sock *treq = inet6_rsk(req);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sk_buff * skb;
        struct ipv6_txoptions *opt = NULL;
@@ -888,8 +517,8 @@ done:
 
 static void tcp_v6_reqsk_destructor(struct request_sock *req)
 {
-       if (tcp6_rsk(req)->pktopts)
-               kfree_skb(tcp6_rsk(req)->pktopts);
+       if (inet6_rsk(req)->pktopts)
+               kfree_skb(inet6_rsk(req)->pktopts);
 }
 
 static struct request_sock_ops tcp6_request_sock_ops = {
@@ -901,26 +530,15 @@ static struct request_sock_ops tcp6_request_sock_ops = {
        .send_reset     =       tcp_v6_send_reset
 };
 
-static int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
-{
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       struct inet6_skb_parm *opt = IP6CB(skb);
-
-       if (np->rxopt.all) {
-               if ((opt->hop && (np->rxopt.bits.hopopts || np->rxopt.bits.ohopopts)) ||
-                   ((IPV6_FLOWINFO_MASK & *(u32*)skb->nh.raw) && np->rxopt.bits.rxflow) ||
-                   (opt->srcrt && (np->rxopt.bits.srcrt || np->rxopt.bits.osrcrt)) ||
-                   ((opt->dst1 || opt->dst0) && (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts)))
-                       return 1;
-       }
-       return 0;
-}
-
+static struct timewait_sock_ops tcp6_timewait_sock_ops = {
+       .twsk_obj_size  = sizeof(struct tcp6_timewait_sock),
+       .twsk_unique    = tcp_twsk_unique,
+};
 
-static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len, 
-                             struct sk_buff *skb)
+static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
+       struct tcphdr *th = skb->h.th;
 
        if (skb->ip_summed == CHECKSUM_HW) {
                th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,  0);
@@ -992,13 +610,12 @@ static void tcp_v6_send_reset(struct sk_buff *skb)
        /* sk = NULL, but it is safe for now. RST socket required. */
        if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
 
-               if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0)
+               if (xfrm_lookup(&buff->dst, &fl, NULL, 0) >= 0) {
+                       ip6_xmit(NULL, buff, &fl, NULL, 0);
+                       TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
+                       TCP_INC_STATS_BH(TCP_MIB_OUTRSTS);
                        return;
-
-               ip6_xmit(NULL, buff, &fl, NULL, 0);
-               TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
-               TCP_INC_STATS_BH(TCP_MIB_OUTRSTS);
-               return;
+               }
        }
 
        kfree_skb(buff);
@@ -1057,11 +674,11 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32
        fl.fl_ip_sport = t1->source;
 
        if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
-               if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0)
+               if (xfrm_lookup(&buff->dst, &fl, NULL, 0) >= 0) {
+                       ip6_xmit(NULL, buff, &fl, NULL, 0);
+                       TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
                        return;
-               ip6_xmit(NULL, buff, &fl, NULL, 0);
-               TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
-               return;
+               }
        }
 
        kfree_skb(buff);
@@ -1092,8 +709,9 @@ static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
        struct sock *nsk;
 
        /* Find possible connection requests. */
-       req = tcp_v6_search_req(sk, &prev, th->source, &skb->nh.ipv6h->saddr,
-                               &skb->nh.ipv6h->daddr, inet6_iif(skb));
+       req = inet6_csk_search_req(sk, &prev, th->source,
+                                  &skb->nh.ipv6h->saddr,
+                                  &skb->nh.ipv6h->daddr, inet6_iif(skb));
        if (req)
                return tcp_check_req(sk, skb, req, prev);
 
@@ -1117,23 +735,12 @@ 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 request_sock *req)
-{
-       struct inet_connection_sock *icsk = inet_csk(sk);
-       struct listen_sock *lopt = icsk->icsk_accept_queue.listen_opt;
-       const u32 h = tcp_v6_synq_hash(&tcp6_rsk(req)->rmt_addr, inet_rsk(req)->rmt_port, lopt->hash_rnd);
-
-       reqsk_queue_hash_req(&icsk->icsk_accept_queue, h, req, TCP_TIMEOUT_INIT);
-       inet_csk_reqsk_queue_added(sk, TCP_TIMEOUT_INIT);
-}
-
-
 /* FIXME: this is substantially similar to the ipv4 code.
  * Can some kind of merge be done? -- erics
  */
 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
 {
-       struct tcp6_request_sock *treq;
+       struct inet6_request_sock *treq;
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct tcp_options_received tmp_opt;
        struct tcp_sock *tp = tcp_sk(sk);
@@ -1158,7 +765,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
                goto drop;
 
-       req = reqsk_alloc(&tcp6_request_sock_ops);
+       req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
        if (req == NULL)
                goto drop;
 
@@ -1171,7 +778,7 @@ 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);
 
-       treq = tcp6_rsk(req);
+       treq = inet6_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);
@@ -1197,8 +804,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        if (tcp_v6_send_synack(sk, req, NULL))
                goto drop;
 
-       tcp_v6_synq_add(sk, req);
-
+       inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
        return 0;
 
 drop:
@@ -1213,7 +819,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                                          struct request_sock *req,
                                          struct dst_entry *dst)
 {
-       struct tcp6_request_sock *treq = tcp6_rsk(req);
+       struct inet6_request_sock *treq = inet6_rsk(req);
        struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
        struct tcp6_sock *newtcp6sk;
        struct inet_sock *newinet;
@@ -1248,7 +854,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
                ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
 
-               newtp->af_specific = &ipv6_mapped;
+               inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
                newsk->sk_backlog_rcv = tcp_v4_do_rcv;
                newnp->pktoptions  = NULL;
                newnp->opt         = NULL;
@@ -1262,10 +868,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                 */
 
                /* It is tricky place. Until this moment IPv4 tcp
-                  worked with IPv6 af_tcp.af_specific.
+                  worked with IPv6 icsk.icsk_af_ops.
                   Sync it now.
                 */
-               tcp_sync_mss(newsk, newtp->pmtu_cookie);
+               tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
 
                return newsk;
        }
@@ -1372,10 +978,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                        sock_kfree_s(sk, opt, opt->tot_len);
        }
 
-       newtp->ext_header_len = 0;
+       inet_csk(newsk)->icsk_ext_hdr_len = 0;
        if (newnp->opt)
-               newtp->ext_header_len = newnp->opt->opt_nflen +
-                                       newnp->opt->opt_flen;
+               inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
+                                                    newnp->opt->opt_flen);
 
        tcp_sync_mss(newsk, dst_mtu(dst));
        newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
@@ -1383,7 +989,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
        newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6;
 
-       __tcp_v6_hash(newsk);
+       __inet6_hash(&tcp_hashinfo, newsk);
        inet_inherit_port(&tcp_hashinfo, sk, newsk);
 
        return newsk;
@@ -1680,139 +1286,16 @@ do_time_wait:
        goto discard_it;
 }
 
-static int tcp_v6_rebuild_header(struct sock *sk)
-{
-       int err;
-       struct dst_entry *dst;
-       struct ipv6_pinfo *np = inet6_sk(sk);
-
-       dst = __sk_dst_check(sk, np->dst_cookie);
-
-       if (dst == NULL) {
-               struct inet_sock *inet = inet_sk(sk);
-               struct in6_addr *final_p = NULL, final;
-               struct flowi fl;
-
-               memset(&fl, 0, sizeof(fl));
-               fl.proto = IPPROTO_TCP;
-               ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
-               ipv6_addr_copy(&fl.fl6_src, &np->saddr);
-               fl.fl6_flowlabel = np->flow_label;
-               fl.oif = sk->sk_bound_dev_if;
-               fl.fl_ip_dport = inet->dport;
-               fl.fl_ip_sport = inet->sport;
-
-               if (np->opt && np->opt->srcrt) {
-                       struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
-                       ipv6_addr_copy(&final, &fl.fl6_dst);
-                       ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
-                       final_p = &final;
-               }
-
-               err = ip6_dst_lookup(sk, &dst, &fl);
-               if (err) {
-                       sk->sk_route_caps = 0;
-                       return err;
-               }
-               if (final_p)
-                       ipv6_addr_copy(&fl.fl6_dst, final_p);
-
-               if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
-                       sk->sk_err_soft = -err;
-                       return err;
-               }
-
-               ip6_dst_store(sk, dst, NULL);
-               sk->sk_route_caps = dst->dev->features &
-                       ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
-       }
-
-       return 0;
-}
-
-static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
-{
-       struct sock *sk = skb->sk;
-       struct inet_sock *inet = inet_sk(sk);
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       struct flowi fl;
-       struct dst_entry *dst;
-       struct in6_addr *final_p = NULL, final;
-
-       memset(&fl, 0, sizeof(fl));
-       fl.proto = IPPROTO_TCP;
-       ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
-       ipv6_addr_copy(&fl.fl6_src, &np->saddr);
-       fl.fl6_flowlabel = np->flow_label;
-       IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel);
-       fl.oif = sk->sk_bound_dev_if;
-       fl.fl_ip_sport = inet->sport;
-       fl.fl_ip_dport = inet->dport;
-
-       if (np->opt && np->opt->srcrt) {
-               struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
-               ipv6_addr_copy(&final, &fl.fl6_dst);
-               ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
-               final_p = &final;
-       }
-
-       dst = __sk_dst_check(sk, np->dst_cookie);
-
-       if (dst == NULL) {
-               int err = ip6_dst_lookup(sk, &dst, &fl);
-
-               if (err) {
-                       sk->sk_err_soft = -err;
-                       return err;
-               }
-
-               if (final_p)
-                       ipv6_addr_copy(&fl.fl6_dst, final_p);
-
-               if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
-                       sk->sk_route_caps = 0;
-                       return err;
-               }
-
-               ip6_dst_store(sk, dst, NULL);
-               sk->sk_route_caps = dst->dev->features &
-                       ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
-       }
-
-       skb->dst = dst_clone(dst);
-
-       /* Restore final destination back after routing done */
-       ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
-
-       return ip6_xmit(sk, skb, &fl, np->opt, 0);
-}
-
-static void v6_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
-{
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr;
-
-       sin6->sin6_family = AF_INET6;
-       ipv6_addr_copy(&sin6->sin6_addr, &np->daddr);
-       sin6->sin6_port = inet_sk(sk)->dport;
-       /* We do not store received flowlabel for TCP */
-       sin6->sin6_flowinfo = 0;
-       sin6->sin6_scope_id = 0;
-       if (sk->sk_bound_dev_if &&
-           ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
-               sin6->sin6_scope_id = sk->sk_bound_dev_if;
-}
-
 static int tcp_v6_remember_stamp(struct sock *sk)
 {
        /* Alas, not yet... */
        return 0;
 }
 
-static struct tcp_func ipv6_specific = {
-       .queue_xmit     =       tcp_v6_xmit,
+static struct inet_connection_sock_af_ops ipv6_specific = {
+       .queue_xmit     =       inet6_csk_xmit,
        .send_check     =       tcp_v6_send_check,
-       .rebuild_header =       tcp_v6_rebuild_header,
+       .rebuild_header =       inet6_sk_rebuild_header,
        .conn_request   =       tcp_v6_conn_request,
        .syn_recv_sock  =       tcp_v6_syn_recv_sock,
        .remember_stamp =       tcp_v6_remember_stamp,
@@ -1820,7 +1303,7 @@ static struct tcp_func ipv6_specific = {
 
        .setsockopt     =       ipv6_setsockopt,
        .getsockopt     =       ipv6_getsockopt,
-       .addr2sockaddr  =       v6_addr2sockaddr,
+       .addr2sockaddr  =       inet6_csk_addr2sockaddr,
        .sockaddr_len   =       sizeof(struct sockaddr_in6)
 };
 
@@ -1828,7 +1311,7 @@ static struct tcp_func ipv6_specific = {
  *     TCP over IPv4 via INET6 API
  */
 
-static struct tcp_func ipv6_mapped = {
+static struct inet_connection_sock_af_ops ipv6_mapped = {
        .queue_xmit     =       ip_queue_xmit,
        .send_check     =       tcp_v4_send_check,
        .rebuild_header =       inet_sk_rebuild_header,
@@ -1839,7 +1322,7 @@ static struct tcp_func ipv6_mapped = {
 
        .setsockopt     =       ipv6_setsockopt,
        .getsockopt     =       ipv6_getsockopt,
-       .addr2sockaddr  =       v6_addr2sockaddr,
+       .addr2sockaddr  =       inet6_csk_addr2sockaddr,
        .sockaddr_len   =       sizeof(struct sockaddr_in6)
 };
 
@@ -1878,8 +1361,9 @@ static int tcp_v6_init_sock(struct sock *sk)
 
        sk->sk_state = TCP_CLOSE;
 
-       tp->af_specific = &ipv6_specific;
+       icsk->icsk_af_ops = &ipv6_specific;
        icsk->icsk_ca_ops = &tcp_init_congestion_ops;
+       icsk->icsk_sync_mss = tcp_sync_mss;
        sk->sk_write_space = sk_stream_write_space;
        sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
 
@@ -1901,14 +1385,13 @@ static int tcp_v6_destroy_sock(struct sock *sk)
 static void get_openreq6(struct seq_file *seq, 
                         struct sock *sk, struct request_sock *req, int i, int uid)
 {
-       struct in6_addr *dest, *src;
        int ttd = req->expires - jiffies;
+       struct in6_addr *src = &inet6_rsk(req)->loc_addr;
+       struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
 
        if (ttd < 0)
                ttd = 0;
 
-       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",
@@ -1989,14 +1472,14 @@ static void get_timewait6_sock(struct seq_file *seq,
 {
        struct in6_addr *dest, *src;
        __u16 destp, srcp;
-       struct tcp6_timewait_sock *tcp6tw = tcp6_twsk((struct sock *)tw);
+       struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
        int ttd = tw->tw_ttd - jiffies;
 
        if (ttd < 0)
                ttd = 0;
 
-       dest = &tcp6tw->tw_v6_daddr;
-       src  = &tcp6tw->tw_v6_rcv_saddr;
+       dest = &tw6->tw_v6_daddr;
+       src  = &tw6->tw_v6_rcv_saddr;
        destp = ntohs(tw->tw_dport);
        srcp  = ntohs(tw->tw_sport);
 
@@ -2094,7 +1577,7 @@ struct proto tcpv6_prot = {
        .sysctl_rmem            = sysctl_tcp_rmem,
        .max_header             = MAX_TCP_HEADER,
        .obj_size               = sizeof(struct tcp6_sock),
-       .twsk_obj_size          = sizeof(struct tcp6_timewait_sock),
+       .twsk_prot              = &tcp6_timewait_sock_ops,
        .rsk_prot               = &tcp6_request_sock_ops,
 };
 
@@ -2111,7 +1594,8 @@ static struct inet_protosw tcpv6_protosw = {
        .ops            =       &inet6_stream_ops,
        .capability     =       -1,
        .no_check       =       0,
-       .flags          =       INET_PROTOSW_PERMANENT,
+       .flags          =       INET_PROTOSW_PERMANENT |
+                               INET_PROTOSW_ICSK,
 };
 
 void __init tcpv6_init(void)
index e671153b47b250b9a7d10b2500dc15101c010fc7..d8538dcea8130b0209941ec0f5eb1ab795a49cd0 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/ipv6.h>
 #include <linux/icmpv6.h>
 #include <linux/init.h>
+#include <linux/skbuff.h>
 #include <asm/uaccess.h>
 
 #include <net/sock.h>
@@ -300,20 +301,7 @@ out:
        return err;
 
 csum_copy_err:
-       /* Clear queue. */
-       if (flags&MSG_PEEK) {
-               int clear = 0;
-               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_bh(&sk->sk_receive_queue.lock);
-               if (clear)
-                       kfree_skb(skb);
-       }
-
-       skb_free_datagram(sk, skb);
+       skb_kill_datagram(sk, skb, flags);
 
        if (flags & MSG_DONTWAIT) {
                UDP6_INC_STATS_USER(UDP_MIB_INERRORS);
@@ -771,7 +759,9 @@ do_udp_sendmsg:
        }
        if (opt == NULL)
                opt = np->opt;
-       opt = fl6_merge_options(&opt_space, flowlabel, opt);
+       if (flowlabel)
+               opt = fl6_merge_options(&opt_space, flowlabel, opt);
+       opt = ipv6_fixup_options(&opt_space, opt);
 
        fl->proto = IPPROTO_UDP;
        ipv6_addr_copy(&fl->fl6_dst, daddr);
index cf1d91e74c82a3939ecd2f796ea385fb7eefcff1..69bd957380e7025fe393c720bde30974c4691284 100644 (file)
@@ -214,6 +214,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
                case IPPROTO_UDP:
                case IPPROTO_TCP:
                case IPPROTO_SCTP:
+               case IPPROTO_DCCP:
                        if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) {
                                u16 *ports = (u16 *)exthdr;
 
index 34b3bb86840912da024646f070170f9c933c650e..0dc519b404042c25b1e25a912762ae5ed2d162c0 100644 (file)
@@ -75,7 +75,7 @@ static struct datalink_proto *pEII_datalink;
 static struct datalink_proto *p8023_datalink;
 static struct datalink_proto *pSNAP_datalink;
 
-static struct proto_ops ipx_dgram_ops;
+static const struct proto_ops ipx_dgram_ops;
 
 LIST_HEAD(ipx_interfaces);
 DEFINE_SPINLOCK(ipx_interfaces_lock);
@@ -1884,7 +1884,7 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                rc = -EINVAL;
                break;
        default:
-               rc = dev_ioctl(cmd, argp);
+               rc = -ENOIOCTLCMD;
                break;
        }
 
@@ -1901,7 +1901,7 @@ static struct net_proto_family ipx_family_ops = {
        .owner          = THIS_MODULE,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
        .family         = PF_IPX,
        .owner          = THIS_MODULE,
        .release        = ipx_release,
index 6f92f9c62990ab4854178cc67e72c2a71b2f64f7..fbfa96754417cbf18f3b8bace4577394806b6e9f 100644 (file)
 
 static int irda_create(struct socket *sock, int protocol);
 
-static struct proto_ops irda_stream_ops;
-static struct proto_ops irda_seqpacket_ops;
-static struct proto_ops irda_dgram_ops;
+static const struct proto_ops irda_stream_ops;
+static const struct proto_ops irda_seqpacket_ops;
+static const struct proto_ops irda_dgram_ops;
 
 #ifdef CONFIG_IRDA_ULTRA
-static struct proto_ops irda_ultra_ops;
+static const struct proto_ops irda_ultra_ops;
 #define ULTRA_MAX_DATA 382
 #endif /* CONFIG_IRDA_ULTRA */
 
@@ -1438,8 +1438,9 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock,
                        /*
                         *      POSIX 1003.1g mandates this order.
                         */
-                       if (sk->sk_err)
-                               ret = sock_error(sk);
+                       ret = sock_error(sk);
+                       if (ret)
+                               break;
                        else if (sk->sk_shutdown & RCV_SHUTDOWN)
                                ;
                        else if (noblock)
@@ -1821,7 +1822,7 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                return -EINVAL;
        default:
                IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__);
-               return dev_ioctl(cmd, (void __user *) arg);
+               return -ENOIOCTLCMD;
        }
 
        /*NOTREACHED*/
@@ -2463,7 +2464,7 @@ static struct net_proto_family irda_family_ops = {
        .owner  = THIS_MODULE,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = {
        .family =       PF_IRDA,
        .owner =        THIS_MODULE,
        .release =      irda_release,
@@ -2484,7 +2485,7 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = {
        .sendpage =     sock_no_sendpage,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = {
        .family =       PF_IRDA,
        .owner =        THIS_MODULE,
        .release =      irda_release,
@@ -2505,7 +2506,7 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = {
        .sendpage =     sock_no_sendpage,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = {
        .family =       PF_IRDA,
        .owner =        THIS_MODULE,
        .release =      irda_release,
@@ -2527,7 +2528,7 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = {
 };
 
 #ifdef CONFIG_IRDA_ULTRA
-static struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = {
        .family =       PF_IRDA,
        .owner =        THIS_MODULE,
        .release =      irda_release,
index b8bb78af8b8a2f3de3f521bed6bd6fc6fb55d0d9..254f9074690011a66e0382fbef5f65892e81b32e 100644 (file)
@@ -364,7 +364,7 @@ static void iriap_disconnect_request(struct iriap_cb *self)
 /*
  * Function iriap_getvaluebyclass (addr, name, attr)
  *
- *    Retreive all values from attribute in all objects with given class
+ *    Retrieve all values from attribute in all objects with given class
  *    name
  */
 int iriap_getvaluebyclass_request(struct iriap_cb *self,
index 39031684b65cdac53cd4a3cd0fa6a0b89c973fe1..52efd04cbedbb64ea409e1d81f5d608d8e52caa4 100644 (file)
@@ -113,7 +113,7 @@ static __inline__ void pfkey_unlock_table(void)
 }
 
 
-static struct proto_ops pfkey_ops;
+static const struct proto_ops pfkey_ops;
 
 static void pfkey_insert(struct sock *sk)
 {
@@ -336,6 +336,7 @@ static u8 sadb_ext_min_len[] = {
        [SADB_X_EXT_NAT_T_SPORT]        = (u8) sizeof(struct sadb_x_nat_t_port),
        [SADB_X_EXT_NAT_T_DPORT]        = (u8) sizeof(struct sadb_x_nat_t_port),
        [SADB_X_EXT_NAT_T_OA]           = (u8) sizeof(struct sadb_address),
+       [SADB_X_EXT_SEC_CTX]            = (u8) sizeof(struct sadb_x_sec_ctx),
 };
 
 /* Verify sadb_address_{len,prefixlen} against sa_family.  */
@@ -383,6 +384,55 @@ static int verify_address_len(void *p)
        return 0;
 }
 
+static inline int pfkey_sec_ctx_len(struct sadb_x_sec_ctx *sec_ctx)
+{
+       int len = 0;
+
+       len += sizeof(struct sadb_x_sec_ctx);
+       len += sec_ctx->sadb_x_ctx_len;
+       len += sizeof(uint64_t) - 1;
+       len /= sizeof(uint64_t);
+
+       return len;
+}
+
+static inline int verify_sec_ctx_len(void *p)
+{
+       struct sadb_x_sec_ctx *sec_ctx = (struct sadb_x_sec_ctx *)p;
+       int len;
+
+       if (sec_ctx->sadb_x_ctx_len > PAGE_SIZE)
+               return -EINVAL;
+
+       len = pfkey_sec_ctx_len(sec_ctx);
+
+       if (sec_ctx->sadb_x_sec_len != len)
+               return -EINVAL;
+
+       return 0;
+}
+
+static inline struct xfrm_user_sec_ctx *pfkey_sadb2xfrm_user_sec_ctx(struct sadb_x_sec_ctx *sec_ctx)
+{
+       struct xfrm_user_sec_ctx *uctx = NULL;
+       int ctx_size = sec_ctx->sadb_x_ctx_len;
+
+       uctx = kmalloc((sizeof(*uctx)+ctx_size), GFP_KERNEL);
+
+       if (!uctx)
+               return NULL;
+
+       uctx->len = pfkey_sec_ctx_len(sec_ctx);
+       uctx->exttype = sec_ctx->sadb_x_sec_exttype;
+       uctx->ctx_doi = sec_ctx->sadb_x_ctx_doi;
+       uctx->ctx_alg = sec_ctx->sadb_x_ctx_alg;
+       uctx->ctx_len = sec_ctx->sadb_x_ctx_len;
+       memcpy(uctx + 1, sec_ctx + 1,
+              uctx->ctx_len);
+
+       return uctx;
+}
+
 static int present_and_same_family(struct sadb_address *src,
                                   struct sadb_address *dst)
 {
@@ -438,6 +488,10 @@ static int parse_exthdrs(struct sk_buff *skb, struct sadb_msg *hdr, void **ext_h
                                if (verify_address_len(p))
                                        return -EINVAL;
                        }                               
+                       if (ext_type == SADB_X_EXT_SEC_CTX) {
+                               if (verify_sec_ctx_len(p))
+                                       return -EINVAL;
+                       }
                        ext_hdrs[ext_type-1] = p;
                }
                p   += ext_len;
@@ -586,6 +640,9 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        struct sadb_key *key;
        struct sadb_x_sa2 *sa2;
        struct sockaddr_in *sin;
+       struct sadb_x_sec_ctx *sec_ctx;
+       struct xfrm_sec_ctx *xfrm_ctx;
+       int ctx_size = 0;
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        struct sockaddr_in6 *sin6;
 #endif
@@ -609,6 +666,12 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
                        sizeof(struct sadb_address)*2 + 
                                sockaddr_size*2 +
                                        sizeof(struct sadb_x_sa2);
+
+       if ((xfrm_ctx = x->security)) {
+               ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len);
+               size += sizeof(struct sadb_x_sec_ctx) + ctx_size;
+       }
+
        /* identity & sensitivity */
 
        if ((x->props.family == AF_INET &&
@@ -899,6 +962,20 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
                n_port->sadb_x_nat_t_port_reserved = 0;
        }
 
+       /* security context */
+       if (xfrm_ctx) {
+               sec_ctx = (struct sadb_x_sec_ctx *) skb_put(skb,
+                               sizeof(struct sadb_x_sec_ctx) + ctx_size);
+               sec_ctx->sadb_x_sec_len =
+                 (sizeof(struct sadb_x_sec_ctx) + ctx_size) / sizeof(uint64_t);
+               sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
+               sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi;
+               sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg;
+               sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len;
+               memcpy(sec_ctx + 1, xfrm_ctx->ctx_str,
+                      xfrm_ctx->ctx_len);
+       }
+
        return skb;
 }
 
@@ -909,6 +986,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
        struct sadb_lifetime *lifetime;
        struct sadb_sa *sa;
        struct sadb_key *key;
+       struct sadb_x_sec_ctx *sec_ctx;
        uint16_t proto;
        int err;
        
@@ -993,6 +1071,21 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
                x->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime;
                x->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime;
        }
+
+       sec_ctx = (struct sadb_x_sec_ctx *) ext_hdrs[SADB_X_EXT_SEC_CTX-1];
+       if (sec_ctx != NULL) {
+               struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx);
+
+               if (!uctx)
+                       goto out;
+
+               err = security_xfrm_state_alloc(x, uctx);
+               kfree(uctx);
+
+               if (err)
+                       goto out;
+       }
+
        key = (struct sadb_key*) ext_hdrs[SADB_EXT_KEY_AUTH-1];
        if (sa->sadb_sa_auth) {
                int keysize = 0;
@@ -1720,6 +1813,18 @@ parse_ipsecrequests(struct xfrm_policy *xp, struct sadb_x_policy *pol)
        return 0;
 }
 
+static inline int pfkey_xfrm_policy2sec_ctx_size(struct xfrm_policy *xp)
+{
+  struct xfrm_sec_ctx *xfrm_ctx = xp->security;
+
+       if (xfrm_ctx) {
+               int len = sizeof(struct sadb_x_sec_ctx);
+               len += xfrm_ctx->ctx_len;
+               return PFKEY_ALIGN8(len);
+       }
+       return 0;
+}
+
 static int pfkey_xfrm_policy2msg_size(struct xfrm_policy *xp)
 {
        int sockaddr_size = pfkey_sockaddr_size(xp->family);
@@ -1733,7 +1838,8 @@ static int pfkey_xfrm_policy2msg_size(struct xfrm_policy *xp)
                (sockaddr_size * 2) +
                sizeof(struct sadb_x_policy) +
                (xp->xfrm_nr * (sizeof(struct sadb_x_ipsecrequest) +
-                               (socklen * 2)));
+                               (socklen * 2))) +
+               pfkey_xfrm_policy2sec_ctx_size(xp);
 }
 
 static struct sk_buff * pfkey_xfrm_policy2msg_prep(struct xfrm_policy *xp)
@@ -1757,6 +1863,8 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
        struct sadb_lifetime *lifetime;
        struct sadb_x_policy *pol;
        struct sockaddr_in   *sin;
+       struct sadb_x_sec_ctx *sec_ctx;
+       struct xfrm_sec_ctx *xfrm_ctx;
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        struct sockaddr_in6  *sin6;
 #endif
@@ -1941,6 +2049,21 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
                        }
                }
        }
+
+       /* security context */
+       if ((xfrm_ctx = xp->security)) {
+               int ctx_size = pfkey_xfrm_policy2sec_ctx_size(xp);
+
+               sec_ctx = (struct sadb_x_sec_ctx *) skb_put(skb, ctx_size);
+               sec_ctx->sadb_x_sec_len = ctx_size / sizeof(uint64_t);
+               sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
+               sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi;
+               sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg;
+               sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len;
+               memcpy(sec_ctx + 1, xfrm_ctx->ctx_str,
+                      xfrm_ctx->ctx_len);
+       }
+
        hdr->sadb_msg_len = size / sizeof(uint64_t);
        hdr->sadb_msg_reserved = atomic_read(&xp->refcnt);
 }
@@ -1976,12 +2099,13 @@ out:
 
 static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
 {
-       int err;
+       int err = 0;
        struct sadb_lifetime *lifetime;
        struct sadb_address *sa;
        struct sadb_x_policy *pol;
        struct xfrm_policy *xp;
        struct km_event c;
+       struct sadb_x_sec_ctx *sec_ctx;
 
        if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
                                     ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
@@ -2028,6 +2152,22 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
        if (xp->selector.dport)
                xp->selector.dport_mask = ~0;
 
+       sec_ctx = (struct sadb_x_sec_ctx *) ext_hdrs[SADB_X_EXT_SEC_CTX-1];
+       if (sec_ctx != NULL) {
+               struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx);
+
+               if (!uctx) {
+                       err = -ENOBUFS;
+                       goto out;
+               }
+
+               err = security_xfrm_policy_alloc(xp, uctx);
+               kfree(uctx);
+
+               if (err)
+                       goto out;
+       }
+
        xp->lft.soft_byte_limit = XFRM_INF;
        xp->lft.hard_byte_limit = XFRM_INF;
        xp->lft.soft_packet_limit = XFRM_INF;
@@ -2051,10 +2191,9 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
 
        err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp,
                                 hdr->sadb_msg_type != SADB_X_SPDUPDATE);
-       if (err) {
-               kfree(xp);
-               return err;
-       }
+
+       if (err)
+               goto out;
 
        if (hdr->sadb_msg_type == SADB_X_SPDUPDATE)
                c.event = XFRM_MSG_UPDPOLICY;
@@ -2069,6 +2208,7 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
        return 0;
 
 out:
+       security_xfrm_policy_free(xp);
        kfree(xp);
        return err;
 }
@@ -2078,9 +2218,10 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
        int err;
        struct sadb_address *sa;
        struct sadb_x_policy *pol;
-       struct xfrm_policy *xp;
+       struct xfrm_policy *xp, tmp;
        struct xfrm_selector sel;
        struct km_event c;
+       struct sadb_x_sec_ctx *sec_ctx;
 
        if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
                                     ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
@@ -2109,7 +2250,24 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
        if (sel.dport)
                sel.dport_mask = ~0;
 
-       xp = xfrm_policy_bysel(pol->sadb_x_policy_dir-1, &sel, 1);
+       sec_ctx = (struct sadb_x_sec_ctx *) ext_hdrs[SADB_X_EXT_SEC_CTX-1];
+       memset(&tmp, 0, sizeof(struct xfrm_policy));
+
+       if (sec_ctx != NULL) {
+               struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx);
+
+               if (!uctx)
+                       return -ENOMEM;
+
+               err = security_xfrm_policy_alloc(&tmp, uctx);
+               kfree(uctx);
+
+               if (err)
+                       return err;
+       }
+
+       xp = xfrm_policy_bysel_ctx(pol->sadb_x_policy_dir-1, &sel, tmp.security, 1);
+       security_xfrm_policy_free(&tmp);
        if (xp == NULL)
                return -ENOENT;
 
@@ -2660,6 +2818,7 @@ static struct xfrm_policy *pfkey_compile_policy(u16 family, int opt,
 {
        struct xfrm_policy *xp;
        struct sadb_x_policy *pol = (struct sadb_x_policy*)data;
+       struct sadb_x_sec_ctx *sec_ctx;
 
        switch (family) {
        case AF_INET:
@@ -2709,10 +2868,32 @@ static struct xfrm_policy *pfkey_compile_policy(u16 family, int opt,
            (*dir = parse_ipsecrequests(xp, pol)) < 0)
                goto out;
 
+       /* security context too */
+       if (len >= (pol->sadb_x_policy_len*8 +
+           sizeof(struct sadb_x_sec_ctx))) {
+               char *p = (char *)pol;
+               struct xfrm_user_sec_ctx *uctx;
+
+               p += pol->sadb_x_policy_len*8;
+               sec_ctx = (struct sadb_x_sec_ctx *)p;
+               if (len < pol->sadb_x_policy_len*8 +
+                   sec_ctx->sadb_x_sec_len)
+                       goto out;
+               if ((*dir = verify_sec_ctx_len(p)))
+                       goto out;
+               uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx);
+               *dir = security_xfrm_policy_alloc(xp, uctx);
+               kfree(uctx);
+
+               if (*dir)
+                       goto out;
+       }
+
        *dir = pol->sadb_x_policy_dir-1;
        return xp;
 
 out:
+       security_xfrm_policy_free(xp);
        kfree(xp);
        return NULL;
 }
@@ -2946,7 +3127,7 @@ out:
        return err;
 }
 
-static struct proto_ops pfkey_ops = {
+static const struct proto_ops pfkey_ops = {
        .family         =       PF_KEY,
        .owner          =       THIS_MODULE,
        /* Operations that make no sense on pfkey sockets. */
index c3f0b07834537e3935615e35b7af3078ec975b04..8171c53bc0ed064d1bd199fda3484023a233cf9e 100644 (file)
@@ -36,7 +36,7 @@
 static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
 static u16 llc_ui_sap_link_no_max[256];
 static struct sockaddr_llc llc_ui_addrnull;
-static struct proto_ops llc_ui_ops;
+static const struct proto_ops llc_ui_ops;
 
 static int llc_ui_wait_for_conn(struct sock *sk, long timeout);
 static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
@@ -566,10 +566,9 @@ static int llc_wait_data(struct sock *sk, long timeo)
                /*
                 * POSIX 1003.1g mandates this order.
                 */
-               if (sk->sk_err) {
-                       rc = sock_error(sk);
+               rc = sock_error(sk);
+               if (rc)
                        break;
-               }
                rc = 0;
                if (sk->sk_shutdown & RCV_SHUTDOWN)
                        break;
@@ -960,7 +959,7 @@ out:
 static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
                        unsigned long arg)
 {
-       return dev_ioctl(cmd, (void __user *)arg);
+       return -ENOIOCTLCMD;
 }
 
 /**
@@ -1099,7 +1098,7 @@ static struct net_proto_family llc_ui_family_ops = {
        .owner  = THIS_MODULE,
 };
 
-static struct proto_ops llc_ui_ops = {
+static const struct proto_ops llc_ui_ops = {
        .family      = PF_LLC,
        .owner       = THIS_MODULE,
        .release     = llc_ui_release,
index a84f9221e5f02d4e5d41640f010d0472346dd85f..794c41d19b28bb58896d2a42da5a2ffefc6629cb 100644 (file)
@@ -61,8 +61,8 @@ config NF_CONNTRACK_MARK
          instead of the individual packets.
 
 config NF_CONNTRACK_EVENTS
-       bool "Connection tracking events"
-       depends on NF_CONNTRACK
+       bool "Connection tracking events (EXPERIMENTAL)"
+       depends on EXPERIMENTAL && NF_CONNTRACK
        help
          If this option is enabled, the connection tracking code will
          provide a notifier chain that can be used by other kernel code
index 1da678303d78c5436c4e8bd6e1d76b5d95e43f43..a7c7b490cf226b99a376fdd8a98e25729fc8c9de 100644 (file)
@@ -1383,6 +1383,9 @@ void nf_conntrack_cleanup(void)
                schedule();
                goto i_see_dead_people;
        }
+       /* wait until all references to nf_conntrack_untracked are dropped */
+       while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1)
+               schedule();
 
        for (i = 0; i < NF_CT_F_NUM; i++) {
                if (nf_ct_cache[i].use == 0)
index 5a6fcf349bdfacfadf38e990db70f5422023226a..6035633d82256c5ea9197dbac1205279af3a5886 100644 (file)
@@ -280,9 +280,9 @@ static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sCL -> sCL
  */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
-/*ack*/           { sIV, sIV, sSR, sES, sCW, sCW, sTW, sTW, sCL, sIV },
+/*ack*/           { sIV, sIG, sSR, sES, sCW, sCW, sTW, sTW, sCL, sIV },
 /*
- *     sSS -> sIV      Might be a half-open connection.
+ *     sSS -> sIG      Might be a half-open connection.
  *     sSR -> sSR      Might answer late resent SYN.
  *     sES -> sES      :-)
  *     sFW -> sCW      Normal close request answered by ACK.
@@ -912,8 +912,12 @@ static int tcp_packet(struct nf_conn *conntrack,
 
        switch (new_state) {
        case TCP_CONNTRACK_IGNORE:
-               /* Either SYN in ORIGINAL
-                * or SYN/ACK in REPLY. */
+               /* Ignored packets:
+                *
+                * a) SYN in ORIGINAL
+                * b) SYN/ACK in REPLY
+                * c) ACK in reply direction after initial SYN in original. 
+                */
                if (index == TCP_SYNACK_SET
                    && conntrack->proto.tcp.last_index == TCP_SYN_SET
                    && conntrack->proto.tcp.last_dir != dir
@@ -979,13 +983,20 @@ static int tcp_packet(struct nf_conn *conntrack,
                }
        case TCP_CONNTRACK_CLOSE:
                if (index == TCP_RST_SET
-                   && test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
-                   && conntrack->proto.tcp.last_index == TCP_SYN_SET
+                   && ((test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
+                        && conntrack->proto.tcp.last_index == TCP_SYN_SET)
+                       || (!test_bit(IPS_ASSURED_BIT, &conntrack->status)
+                           && conntrack->proto.tcp.last_index == TCP_ACK_SET))
                    && ntohl(th->ack_seq) == conntrack->proto.tcp.last_end) {
-                       /* RST sent to invalid SYN we had let trough
-                        * SYN was in window then, tear down connection.
+                       /* RST sent to invalid SYN or ACK we had let trough
+                        * at a) and c) above:
+                        *
+                        * a) SYN was in window then
+                        * c) we hold a half-open connection.
+                        *
+                        * Delete our connection entry.
                         * We skip window checking, because packet might ACK
-                        * segments we ignored in the SYN. */
+                        * segments we ignored. */
                        goto in_window;
                }
                /* Just fall trough */
index a60c59b97631abbb51dda4268dc50fa000445fb4..95fdf04f1d88d239b37bdc26e8aeaeee79b0187f 100644 (file)
@@ -162,7 +162,7 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys,
                return -EINVAL;
        }
 
-       min_len = NLMSG_ALIGN(sizeof(struct nfgenmsg));
+       min_len = NLMSG_SPACE(sizeof(struct nfgenmsg));
        if (unlikely(nlh->nlmsg_len < min_len))
                return -EINVAL;
 
@@ -236,8 +236,7 @@ static inline int nfnetlink_rcv_msg(struct sk_buff *skb,
        }
 
        /* All the messages must at least contain nfgenmsg */
-       if (nlh->nlmsg_len < 
-                       NLMSG_LENGTH(NLMSG_ALIGN(sizeof(struct nfgenmsg)))) {
+       if (nlh->nlmsg_len < NLMSG_SPACE(sizeof(struct nfgenmsg))) {
                DEBUGP("received message was too short\n");
                return 0;
        }
index cba63729313d5690ccc724c505e8d967ac544618..e10512e229b60e2c3cc216f01a5550a9ca7ba006 100644 (file)
@@ -151,7 +151,7 @@ instance_create(u_int16_t group_num, int pid)
                goto out_unlock;
 
        INIT_HLIST_NODE(&inst->hlist);
-       inst->lock = SPIN_LOCK_UNLOCKED;
+       spin_lock_init(&inst->lock);
        /* needs to be two, since we _put() after creation */
        atomic_set(&inst->use, 2);
 
index f28460b61e47cd66649044f961011955dff39800..55afdda3d9407af4f1d7bfd4a0bdd7db77c5a8cf 100644 (file)
@@ -148,7 +148,7 @@ instance_create(u_int16_t queue_num, int pid)
        atomic_set(&inst->id_sequence, 0);
        /* needs to be two, since we _put() after creation */
        atomic_set(&inst->use, 2);
-       inst->lock = SPIN_LOCK_UNLOCKED;
+       spin_lock_init(&inst->lock);
        INIT_LIST_HEAD(&inst->queue_list);
 
        if (!try_module_get(THIS_MODULE))
index 8c38ee6d255eb04aa2ddab13b8d3e448b71dec53..7849cac14d3a4ab24d8ab03abd8f959fde19a8f8 100644 (file)
@@ -293,7 +293,7 @@ static inline int nl_pid_hash_dilute(struct nl_pid_hash *hash, int len)
        return 0;
 }
 
-static struct proto_ops netlink_ops;
+static const struct proto_ops netlink_ops;
 
 static int netlink_insert(struct sock *sk, u32 pid)
 {
@@ -476,7 +476,7 @@ static int netlink_autobind(struct socket *sock)
        struct hlist_head *head;
        struct sock *osk;
        struct hlist_node *node;
-       s32 pid = current->pid;
+       s32 pid = current->tgid;
        int err;
        static s32 rover = -4097;
 
@@ -1656,7 +1656,7 @@ int netlink_unregister_notifier(struct notifier_block *nb)
        return notifier_chain_unregister(&netlink_chain, nb);
 }
                 
-static struct proto_ops netlink_ops = {
+static const struct proto_ops netlink_ops = {
        .family =       PF_NETLINK,
        .owner =        THIS_MODULE,
        .release =      netlink_release,
index 287cfcc56951a86d145bd442a5dd7e9229de44e5..3b1378498d50b12647f2ea433a341b16502e1ac9 100644 (file)
@@ -441,7 +441,7 @@ errout:
 }
 
 static struct sk_buff *ctrl_build_msg(struct genl_family *family, u32 pid,
-                                     int seq, int cmd)
+                                     int seq, u8 cmd)
 {
        struct sk_buff *skb;
        int err;
index e5d82d711cae2ea36e1e36e652fdeebd0b5db591..63b0e4afeb3342da4cdda6d63e95c4053872564a 100644 (file)
@@ -63,7 +63,7 @@ static unsigned short circuit = 0x101;
 static HLIST_HEAD(nr_list);
 static DEFINE_SPINLOCK(nr_list_lock);
 
-static struct proto_ops nr_proto_ops;
+static const struct proto_ops nr_proto_ops;
 
 /*
  *     Socket removal during an interrupt is now safe.
@@ -1166,10 +1166,11 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        void __user *argp = (void __user *)arg;
        int ret;
 
-       lock_sock(sk);
        switch (cmd) {
        case TIOCOUTQ: {
                long amount;
+
+               lock_sock(sk);
                amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
                if (amount < 0)
                        amount = 0;
@@ -1180,6 +1181,8 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        case TIOCINQ: {
                struct sk_buff *skb;
                long amount = 0L;
+
+               lock_sock(sk);
                /* These two are safe on a single CPU system as only user tasks fiddle here */
                if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
                        amount = skb->len;
@@ -1188,6 +1191,7 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        }
 
        case SIOCGSTAMP:
+               lock_sock(sk);
                ret = sock_get_timestamp(sk, argp);
                release_sock(sk);
                return ret;
@@ -1202,21 +1206,17 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        case SIOCSIFNETMASK:
        case SIOCGIFMETRIC:
        case SIOCSIFMETRIC:
-               release_sock(sk);
                return -EINVAL;
 
        case SIOCADDRT:
        case SIOCDELRT:
        case SIOCNRDECOBS:
-               release_sock(sk);
                if (!capable(CAP_NET_ADMIN)) return -EPERM;
                return nr_rt_ioctl(cmd, argp);
 
        default:
-               release_sock(sk);
-               return dev_ioctl(cmd, argp);
+               return -ENOIOCTLCMD;
        }
-       release_sock(sk);
 
        return 0;
 }
@@ -1337,7 +1337,7 @@ static struct net_proto_family nr_family_ops = {
        .owner          =       THIS_MODULE,
 };
 
-static struct proto_ops nr_proto_ops = {
+static const struct proto_ops nr_proto_ops = {
        .family         =       PF_NETROM,
        .owner          =       THIS_MODULE,
        .release        =       nr_release,
index 004e8599b8fe595f5b72c92b0b51bb203b99a44d..a7d88b5ad756a85731d97feec43a58193129367c 100644 (file)
@@ -99,7 +99,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
                break;
 
        case NR_RESET:
-               if (sysctl_netrom_reset_circuit);
+               if (sysctl_netrom_reset_circuit)
                        nr_disconnect(sk, ECONNRESET);
                break;
 
@@ -130,7 +130,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
                break;
 
        case NR_RESET:
-               if (sysctl_netrom_reset_circuit);
+               if (sysctl_netrom_reset_circuit)
                        nr_disconnect(sk, ECONNRESET);
                break;
 
@@ -265,7 +265,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
                break;
 
        case NR_RESET:
-               if (sysctl_netrom_reset_circuit);
+               if (sysctl_netrom_reset_circuit)
                        nr_disconnect(sk, ECONNRESET);
                break;
 
index e5241dceaa571d897dfdf2db6c938e6f334af10b..1230f0ae832e9d52bdd50e4411a56e0ebd795510 100644 (file)
 #include <linux/init.h>
 #include <linux/kernel.h>
 
-void __init sock_init(void)
-{
-       printk(KERN_INFO "Linux NoNET1.0 for Linux 2.6\n");
-}
-
 static int sock_no_open(struct inode *irrelevant, struct file *dontcare)
 {
        return -ENXIO;
index 499ae3df4a440b42c0765d1e691bb647c2230050..f69e5ed9bd060b55f29212938d6f97efb27061bf 100644 (file)
@@ -251,10 +251,10 @@ static void packet_sock_destruct(struct sock *sk)
 }
 
 
-static struct proto_ops packet_ops;
+static const struct proto_ops packet_ops;
 
 #ifdef CONFIG_SOCK_PACKET
-static struct proto_ops packet_ops_spkt;
+static const struct proto_ops packet_ops_spkt;
 
 static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,  struct packet_type *pt, struct net_device *orig_dev)
 {
@@ -1521,7 +1521,7 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd,
 #endif
 
                default:
-                       return dev_ioctl(cmd, (void __user *)arg);
+                       return -ENOIOCTLCMD;
        }
        return 0;
 }
@@ -1587,23 +1587,47 @@ static inline struct page *pg_vec_endpage(char *one_pg_vec, unsigned int order)
        return virt_to_page(one_pg_vec + (PAGE_SIZE << order) - 1);
 }
 
-static void free_pg_vec(char **pg_vec, unsigned order, unsigned len)
+static void free_pg_vec(char **pg_vec, unsigned int order, unsigned int len)
 {
        int i;
 
-       for (i=0; i<len; i++) {
-               if (pg_vec[i]) {
-                       struct page *page, *pend;
-
-                       pend = pg_vec_endpage(pg_vec[i], order);
-                       for (page = virt_to_page(pg_vec[i]); page <= pend; page++)
-                               ClearPageReserved(page);
-                       free_pages((unsigned long)pg_vec[i], order);
-               }
+       for (i = 0; i < len; i++) {
+               if (likely(pg_vec[i]))
+                       free_pages((unsigned long) pg_vec[i], order);
        }
        kfree(pg_vec);
 }
 
+static inline char *alloc_one_pg_vec_page(unsigned long order)
+{
+       return (char *) __get_free_pages(GFP_KERNEL | __GFP_COMP | __GFP_ZERO,
+                                        order);
+}
+
+static char **alloc_pg_vec(struct tpacket_req *req, int order)
+{
+       unsigned int block_nr = req->tp_block_nr;
+       char **pg_vec;
+       int i;
+
+       pg_vec = kzalloc(block_nr * sizeof(char *), GFP_KERNEL);
+       if (unlikely(!pg_vec))
+               goto out;
+
+       for (i = 0; i < block_nr; i++) {
+               pg_vec[i] = alloc_one_pg_vec_page(order);
+               if (unlikely(!pg_vec[i]))
+                       goto out_free_pgvec;
+       }
+
+out:
+       return pg_vec;
+
+out_free_pgvec:
+       free_pg_vec(pg_vec, order, block_nr);
+       pg_vec = NULL;
+       goto out;
+}
 
 static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing)
 {
@@ -1617,64 +1641,46 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
 
                /* Sanity tests and some calculations */
 
-               if (po->pg_vec)
+               if (unlikely(po->pg_vec))
                        return -EBUSY;
 
-               if ((int)req->tp_block_size <= 0)
+               if (unlikely((int)req->tp_block_size <= 0))
                        return -EINVAL;
-               if (req->tp_block_size&(PAGE_SIZE-1))
+               if (unlikely(req->tp_block_size & (PAGE_SIZE - 1)))
                        return -EINVAL;
-               if (req->tp_frame_size < TPACKET_HDRLEN)
+               if (unlikely(req->tp_frame_size < TPACKET_HDRLEN))
                        return -EINVAL;
-               if (req->tp_frame_size&(TPACKET_ALIGNMENT-1))
+               if (unlikely(req->tp_frame_size & (TPACKET_ALIGNMENT - 1)))
                        return -EINVAL;
 
                po->frames_per_block = req->tp_block_size/req->tp_frame_size;
-               if (po->frames_per_block <= 0)
+               if (unlikely(po->frames_per_block <= 0))
                        return -EINVAL;
-               if (po->frames_per_block*req->tp_block_nr != req->tp_frame_nr)
+               if (unlikely((po->frames_per_block * req->tp_block_nr) !=
+                            req->tp_frame_nr))
                        return -EINVAL;
-               /* OK! */
-
-               /* Allocate page vector */
-               while ((PAGE_SIZE<<order) < req->tp_block_size)
-                       order++;
 
                err = -ENOMEM;
-
-               pg_vec = kmalloc(req->tp_block_nr*sizeof(char *), GFP_KERNEL);
-               if (pg_vec == NULL)
+               order = get_order(req->tp_block_size);
+               pg_vec = alloc_pg_vec(req, order);
+               if (unlikely(!pg_vec))
                        goto out;
-               memset(pg_vec, 0, req->tp_block_nr*sizeof(char **));
-
-               for (i=0; i<req->tp_block_nr; i++) {
-                       struct page *page, *pend;
-                       pg_vec[i] = (char *)__get_free_pages(GFP_KERNEL, order);
-                       if (!pg_vec[i])
-                               goto out_free_pgvec;
-
-                       pend = pg_vec_endpage(pg_vec[i], order);
-                       for (page = virt_to_page(pg_vec[i]); page <= pend; page++)
-                               SetPageReserved(page);
-               }
-               /* Page vector is allocated */
 
                l = 0;
-               for (i=0; i<req->tp_block_nr; i++) {
+               for (i = 0; i < req->tp_block_nr; i++) {
                        char *ptr = pg_vec[i];
                        struct tpacket_hdr *header;
                        int k;
 
-                       for (k=0; k<po->frames_per_block; k++) {
-                               
-                               header = (struct tpacket_hdr*)ptr;
+                       for (k = 0; k < po->frames_per_block; k++) {
+                               header = (struct tpacket_hdr *) ptr;
                                header->tp_status = TP_STATUS_KERNEL;
                                ptr += req->tp_frame_size;
                        }
                }
                /* Done */
        } else {
-               if (req->tp_frame_nr)
+               if (unlikely(req->tp_frame_nr))
                        return -EINVAL;
        }
 
@@ -1701,7 +1707,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
 
                spin_lock_bh(&sk->sk_receive_queue.lock);
                pg_vec = XC(po->pg_vec, pg_vec);
-               po->frame_max = req->tp_frame_nr-1;
+               po->frame_max = (req->tp_frame_nr - 1);
                po->head = 0;
                po->frame_size = req->tp_frame_size;
                spin_unlock_bh(&sk->sk_receive_queue.lock);
@@ -1728,7 +1734,6 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
 
        release_sock(sk);
 
-out_free_pgvec:
        if (pg_vec)
                free_pg_vec(pg_vec, order, req->tp_block_nr);
 out:
@@ -1755,17 +1760,19 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st
        if (size != po->pg_vec_len*po->pg_vec_pages*PAGE_SIZE)
                goto out;
 
-       atomic_inc(&po->mapped);
        start = vma->vm_start;
-       err = -EAGAIN;
-       for (i=0; i<po->pg_vec_len; i++) {
-               if (remap_pfn_range(vma, start,
-                                    __pa(po->pg_vec[i]) >> PAGE_SHIFT,
-                                    po->pg_vec_pages*PAGE_SIZE,
-                                    vma->vm_page_prot))
-                       goto out;
-               start += po->pg_vec_pages*PAGE_SIZE;
+       for (i = 0; i < po->pg_vec_len; i++) {
+               struct page *page = virt_to_page(po->pg_vec[i]);
+               int pg_num;
+
+               for (pg_num = 0; pg_num < po->pg_vec_pages; pg_num++, page++) {
+                       err = vm_insert_page(vma, start, page);
+                       if (unlikely(err))
+                               goto out;
+                       start += PAGE_SIZE;
+               }
        }
+       atomic_inc(&po->mapped);
        vma->vm_ops = &packet_mmap_ops;
        err = 0;
 
@@ -1777,7 +1784,7 @@ out:
 
 
 #ifdef CONFIG_SOCK_PACKET
-static struct proto_ops packet_ops_spkt = {
+static const struct proto_ops packet_ops_spkt = {
        .family =       PF_PACKET,
        .owner =        THIS_MODULE,
        .release =      packet_release,
@@ -1799,7 +1806,7 @@ static struct proto_ops packet_ops_spkt = {
 };
 #endif
 
-static struct proto_ops packet_ops = {
+static const struct proto_ops packet_ops = {
        .family =       PF_PACKET,
        .owner =        THIS_MODULE,
        .release =      packet_release,
index 829fdbc4400be21af83e3846fd913cd746fdca3b..63090be2315a9c7a0c7ab30bc5d354f7c35a6385 100644 (file)
@@ -1320,7 +1320,7 @@ static int rose_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                return 0;
 
        default:
-               return dev_ioctl(cmd, argp);
+               return -ENOIOCTLCMD;
        }
 
        return 0;
index 8aebe8f6d271b3876e5e6730829c3b4bf1cc4c63..2ce1cb2aa2edbaef72c9a4dcab65c789dd211be8 100644 (file)
@@ -34,7 +34,7 @@
 #include <net/sch_generic.h>
 #include <net/act_api.h>
 
-#if 1 /* control */
+#if 0 /* control */
 #define DPRINTK(format, args...) printk(KERN_DEBUG format, ##args)
 #else
 #define DPRINTK(format, args...)
index cdc8d283791c7d89388d911cf76c344e0ad04ba9..ba528320483743dc0ef028b8e5bf08d981efbbf8 100644 (file)
@@ -25,7 +25,7 @@
 
 #include <net/pkt_sched.h>
 
-#define VERSION "1.1"
+#define VERSION "1.2"
 
 /*     Network Emulation Queuing algorithm.
        ====================================
@@ -65,11 +65,12 @@ struct netem_sched_data {
        u32 jitter;
        u32 duplicate;
        u32 reorder;
+       u32 corrupt;
 
        struct crndstate {
                unsigned long last;
                unsigned long rho;
-       } delay_cor, loss_cor, dup_cor, reorder_cor;
+       } delay_cor, loss_cor, dup_cor, reorder_cor, corrupt_cor;
 
        struct disttable {
                u32  size;
@@ -183,6 +184,23 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                q->duplicate = dupsave;
        }
 
+       /*
+        * Randomized packet corruption.
+        * Make copy if needed since we are modifying
+        * If packet is going to be hardware checksummed, then
+        * do it now in software before we mangle it.
+        */
+       if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) {
+               if (!(skb = skb_unshare(skb, GFP_ATOMIC))
+                   || (skb->ip_summed == CHECKSUM_HW
+                       && skb_checksum_help(skb, 0))) {
+                       sch->qstats.drops++;
+                       return NET_XMIT_DROP;
+               }
+
+               skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8);
+       }
+
        if (q->gap == 0                 /* not doing reordering */
            || q->counter < q->gap      /* inside last reordering gap */
            || q->reorder < get_crandom(&q->reorder_cor)) {
@@ -382,6 +400,20 @@ static int get_reorder(struct Qdisc *sch, const struct rtattr *attr)
        return 0;
 }
 
+static int get_corrupt(struct Qdisc *sch, const struct rtattr *attr)
+{
+       struct netem_sched_data *q = qdisc_priv(sch);
+       const struct tc_netem_corrupt *r = RTA_DATA(attr);
+
+       if (RTA_PAYLOAD(attr) != sizeof(*r))
+               return -EINVAL;
+
+       q->corrupt = r->probability;
+       init_crandom(&q->corrupt_cor, r->correlation);
+       return 0;
+}
+
+/* Parse netlink message to set options */
 static int netem_change(struct Qdisc *sch, struct rtattr *opt)
 {
        struct netem_sched_data *q = qdisc_priv(sch);
@@ -432,13 +464,19 @@ 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;
                }
-       }
 
+               if (tb[TCA_NETEM_CORRUPT-1]) {
+                       ret = get_corrupt(sch, tb[TCA_NETEM_CORRUPT-1]);
+                       if (ret)
+                               return ret;
+               }
+       }
 
        return 0;
 }
@@ -464,7 +502,7 @@ static int tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch)
                        const struct netem_skb_cb *cb
                                = (const struct netem_skb_cb *)skb->cb;
 
-                       if (PSCHED_TLESS(cb->time_to_send, ncb->time_to_send))
+                       if (!PSCHED_TLESS(ncb->time_to_send, cb->time_to_send))
                                break;
                }
 
@@ -564,6 +602,7 @@ static int netem_dump(struct Qdisc *sch, struct sk_buff *skb)
        struct tc_netem_qopt qopt;
        struct tc_netem_corr cor;
        struct tc_netem_reorder reorder;
+       struct tc_netem_corrupt corrupt;
 
        qopt.latency = q->latency;
        qopt.jitter = q->jitter;
@@ -582,6 +621,10 @@ static int netem_dump(struct Qdisc *sch, struct sk_buff *skb)
        reorder.correlation = q->reorder_cor.rho;
        RTA_PUT(skb, TCA_NETEM_REORDER, sizeof(reorder), &reorder);
 
+       corrupt.probability = q->corrupt;
+       corrupt.correlation = q->corrupt_cor.rho;
+       RTA_PUT(skb, TCA_NETEM_CORRUPT, sizeof(corrupt), &corrupt);
+
        rta->rta_len = skb->tail - b;
 
        return skb->len;
index 6cf0342706b5bd489b305085dee76e81d3ce0648..c4a2a8c4c339b38c75d4c67caf10fbcc6ac5d8ca 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/in.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
+#include <linux/if_arp.h>
 #include <linux/if_ether.h>
 #include <linux/inet.h>
 #include <linux/netdevice.h>
index dec68a60477310c700dfdec911cc2ebcd719218b..9d05e13e92f69c8f276db2f8a53bed71988ff1ea 100644 (file)
@@ -110,7 +110,6 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
        asoc->cookie_life.tv_sec = sp->assocparams.sasoc_cookie_life / 1000;
        asoc->cookie_life.tv_usec = (sp->assocparams.sasoc_cookie_life % 1000)
                                        * 1000;
-       asoc->pmtu = 0;
        asoc->frag_point = 0;
 
        /* Set the association max_retrans and RTO values from the
@@ -123,6 +122,25 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
 
        asoc->overall_error_count = 0;
 
+       /* Initialize the association's heartbeat interval based on the
+        * sock configured value.
+        */
+       asoc->hbinterval = msecs_to_jiffies(sp->hbinterval);
+
+       /* Initialize path max retrans value. */
+       asoc->pathmaxrxt = sp->pathmaxrxt;
+
+       /* Initialize default path MTU. */
+       asoc->pathmtu = sp->pathmtu;
+
+       /* Set association default SACK delay */
+       asoc->sackdelay = msecs_to_jiffies(sp->sackdelay);
+
+       /* Set the association default flags controlling
+        * Heartbeat, SACK delay, and Path MTU Discovery.
+        */
+       asoc->param_flags = sp->param_flags;
+
        /* Initialize the maximum mumber of new data packets that can be sent
         * in a burst.
         */
@@ -144,8 +162,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
                = 5 * asoc->rto_max;
 
        asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0;
-       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] =
-               SCTP_DEFAULT_TIMEOUT_SACK;
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay;
        asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] =
                sp->autoclose * HZ;
        
@@ -540,23 +557,46 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
 
        sctp_transport_set_owner(peer, asoc);
 
+       /* Initialize the peer's heartbeat interval based on the
+        * association configured value.
+        */
+       peer->hbinterval = asoc->hbinterval;
+
+       /* Set the path max_retrans.  */
+       peer->pathmaxrxt = asoc->pathmaxrxt;
+
+       /* Initialize the peer's SACK delay timeout based on the
+        * association configured value.
+        */
+       peer->sackdelay = asoc->sackdelay;
+
+       /* Enable/disable heartbeat, SACK delay, and path MTU discovery
+        * based on association setting.
+        */
+       peer->param_flags = asoc->param_flags;
+
        /* Initialize the pmtu of the transport. */
-       sctp_transport_pmtu(peer);
+       if (peer->param_flags & SPP_PMTUD_ENABLE)
+               sctp_transport_pmtu(peer);
+       else if (asoc->pathmtu)
+               peer->pathmtu = asoc->pathmtu;
+       else
+               peer->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
 
        /* If this is the first transport addr on this association,
         * initialize the association PMTU to the peer's PMTU.
         * If not and the current association PMTU is higher than the new
         * peer's PMTU, reset the association PMTU to the new peer's PMTU.
         */
-       if (asoc->pmtu)
-               asoc->pmtu = min_t(int, peer->pmtu, asoc->pmtu);
+       if (asoc->pathmtu)
+               asoc->pathmtu = min_t(int, peer->pathmtu, asoc->pathmtu);
        else
-               asoc->pmtu = peer->pmtu;
+               asoc->pathmtu = peer->pathmtu;
 
        SCTP_DEBUG_PRINTK("sctp_assoc_add_peer:association %p PMTU set to "
-                         "%d\n", asoc, asoc->pmtu);
+                         "%d\n", asoc, asoc->pathmtu);
 
-       asoc->frag_point = sctp_frag_point(sp, asoc->pmtu);
+       asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu);
 
        /* The asoc->peer.port might not be meaningful yet, but
         * initialize the packet structure anyway.
@@ -574,7 +614,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
         *   (for example, implementations MAY use the size of the
         *   receiver advertised window).
         */
-       peer->cwnd = min(4*asoc->pmtu, max_t(__u32, 2*asoc->pmtu, 4380));
+       peer->cwnd = min(4*asoc->pathmtu, max_t(__u32, 2*asoc->pathmtu, 4380));
 
        /* At this point, we may not have the receiver's advertised window,
         * so initialize ssthresh to the default value and it will be set
@@ -585,17 +625,6 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
        peer->partial_bytes_acked = 0;
        peer->flight_size = 0;
 
-       /* By default, enable heartbeat for peer address. */
-       peer->hb_allowed = 1;
-
-       /* Initialize the peer's heartbeat interval based on the
-        * sock configured value.
-        */
-       peer->hb_interval = msecs_to_jiffies(sp->paddrparam.spp_hbinterval);
-
-       /* Set the path max_retrans.  */
-       peer->max_retrans = sp->paddrparam.spp_pathmaxrxt;
-
        /* Set the transport's RTO.initial value */
        peer->rto = asoc->rto_initial;
 
@@ -1155,18 +1184,18 @@ void sctp_assoc_sync_pmtu(struct sctp_association *asoc)
        /* Get the lowest pmtu of all the transports. */
        list_for_each(pos, &asoc->peer.transport_addr_list) {
                t = list_entry(pos, struct sctp_transport, transports);
-               if (!pmtu || (t->pmtu < pmtu))
-                       pmtu = t->pmtu;
+               if (!pmtu || (t->pathmtu < pmtu))
+                       pmtu = t->pathmtu;
        }
 
        if (pmtu) {
                struct sctp_sock *sp = sctp_sk(asoc->base.sk);
-               asoc->pmtu = pmtu;
+               asoc->pathmtu = pmtu;
                asoc->frag_point = sctp_frag_point(sp, pmtu);
        }
 
        SCTP_DEBUG_PRINTK("%s: asoc:%p, pmtu:%d, frag_point:%d\n",
-                         __FUNCTION__, asoc, asoc->pmtu, asoc->frag_point);
+                         __FUNCTION__, asoc, asoc->pathmtu, asoc->frag_point);
 }
 
 /* Should we send a SACK to update our peer? */
@@ -1179,7 +1208,7 @@ static inline int sctp_peer_needs_update(struct sctp_association *asoc)
        case SCTP_STATE_SHUTDOWN_SENT:
                if ((asoc->rwnd > asoc->a_rwnd) &&
                    ((asoc->rwnd - asoc->a_rwnd) >=
-                    min_t(__u32, (asoc->base.sk->sk_rcvbuf >> 1), asoc->pmtu)))
+                    min_t(__u32, (asoc->base.sk->sk_rcvbuf >> 1), asoc->pathmtu)))
                        return 1;
                break;
        default:
index b24ff2c1aef510ce9d4be716b19caa504baf08a9..238f1bffa6845e94b3e0bec1f6d5ad0da4c0e695 100644 (file)
@@ -305,18 +305,36 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
 void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
                           struct sctp_transport *t, __u32 pmtu)
 {
-       if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) {
-               printk(KERN_WARNING "%s: Reported pmtu %d too low, "
-                      "using default minimum of %d\n", __FUNCTION__, pmtu,
-                      SCTP_DEFAULT_MINSEGMENT);
-               pmtu = SCTP_DEFAULT_MINSEGMENT;
-       }
+       if (sock_owned_by_user(sk) || !t || (t->pathmtu == pmtu))
+               return;
 
-       if (!sock_owned_by_user(sk) && t && (t->pmtu != pmtu)) {
-               t->pmtu = pmtu;
+       if (t->param_flags & SPP_PMTUD_ENABLE) {
+               if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) {
+                       printk(KERN_WARNING "%s: Reported pmtu %d too low, "
+                              "using default minimum of %d\n",
+                              __FUNCTION__, pmtu,
+                              SCTP_DEFAULT_MINSEGMENT);
+                       /* Use default minimum segment size and disable
+                        * pmtu discovery on this transport.
+                        */
+                       t->pathmtu = SCTP_DEFAULT_MINSEGMENT;
+                       t->param_flags = (t->param_flags & ~SPP_HB) |
+                               SPP_PMTUD_DISABLE;
+               } else {
+                       t->pathmtu = pmtu;
+               }
+
+               /* Update association pmtu. */
                sctp_assoc_sync_pmtu(asoc);
-               sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
        }
+
+       /* Retransmit with the new pmtu setting.
+        * Normally, if PMTU discovery is disabled, an ICMP Fragmentation
+        * Needed will never be sent, but if a message was sent before
+        * PMTU discovery was disabled that was larger than the PMTU, it
+        * would not be fragmented, so it must be re-transmitted fragmented.     
+        */
+       sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
 }
 
 /*
index fa3be2b8fb5ffcaa88ac19e5919f7703461f90ef..15c05165c905173b49a3e109f109a96cc5d607a9 100644 (file)
@@ -866,7 +866,7 @@ static int sctp_inet6_supported_addrs(const struct sctp_sock *opt,
        return 2;
 }
 
-static struct proto_ops inet6_seqpacket_ops = {
+static const struct proto_ops inet6_seqpacket_ops = {
        .family     = PF_INET6,
        .owner      = THIS_MODULE,
        .release    = inet6_release,
index 9313716334648fa90c7c39c6faaba289cebbe5d7..a40991ef72c92b4d6a59368b67c15ed7ea2c70e7 100644 (file)
@@ -234,8 +234,8 @@ sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet,
                goto finish;
 
        pmtu  = ((packet->transport->asoc) ?
-                (packet->transport->asoc->pmtu) :
-                (packet->transport->pmtu));
+                (packet->transport->asoc->pathmtu) :
+                (packet->transport->pathmtu));
 
        too_big = (psize + chunk_len > pmtu);
 
@@ -482,7 +482,9 @@ int sctp_packet_transmit(struct sctp_packet *packet)
        if (!dst || (dst->obsolete > 1)) {
                dst_release(dst);
                sctp_transport_route(tp, NULL, sctp_sk(sk));
-               sctp_assoc_sync_pmtu(asoc);
+               if (asoc->param_flags & SPP_PMTUD_ENABLE) {
+                       sctp_assoc_sync_pmtu(asoc);
+               }
        }
 
        nskb->dst = dst_clone(tp->dst);
@@ -492,7 +494,10 @@ int sctp_packet_transmit(struct sctp_packet *packet)
        SCTP_DEBUG_PRINTK("***sctp_transmit_packet*** skb len %d\n",
                          nskb->len);
 
-       (*tp->af_specific->sctp_xmit)(nskb, tp, packet->ipfragok);
+       if (tp->param_flags & SPP_PMTUD_ENABLE)
+               (*tp->af_specific->sctp_xmit)(nskb, tp, packet->ipfragok);
+       else
+               (*tp->af_specific->sctp_xmit)(nskb, tp, 1);
 
 out:
        packet->size = packet->overhead;
@@ -577,7 +582,7 @@ static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet,
         *      if ((flightsize + Max.Burst * MTU) < cwnd)
         *              cwnd = flightsize + Max.Burst * MTU
         */
-       max_burst_bytes = asoc->max_burst * asoc->pmtu;
+       max_burst_bytes = asoc->max_burst * asoc->pathmtu;
        if ((transport->flight_size + max_burst_bytes) < transport->cwnd) {
                transport->cwnd = transport->flight_size + max_burst_bytes;
                SCTP_DEBUG_PRINTK("%s: cwnd limited by max_burst: "
@@ -622,7 +627,7 @@ static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet,
                 * data will fit or delay in hopes of bundling a full
                 * sized packet.
                 */
-               if (len < asoc->pmtu - packet->overhead) {
+               if (len < asoc->pathmtu - packet->overhead) {
                        retval = SCTP_XMIT_NAGLE_DELAY;
                        goto finish;
                }
index f775d78aa59d3402ea467331c301e66acfdfd26e..de693b43c8eae08c18db0cbd2adf357a218e8eb3 100644 (file)
@@ -54,6 +54,7 @@
 #include <net/protocol.h>
 #include <net/ip.h>
 #include <net/ipv6.h>
+#include <net/route.h>
 #include <net/sctp/sctp.h>
 #include <net/addrconf.h>
 #include <net/inet_common.h>
@@ -829,7 +830,7 @@ static struct notifier_block sctp_inetaddr_notifier = {
 };
 
 /* Socket operations.  */
-static struct proto_ops inet_seqpacket_ops = {
+static const struct proto_ops inet_seqpacket_ops = {
        .family      = PF_INET,
        .owner       = THIS_MODULE,
        .release     = inet_release,       /* Needs to be wrapped... */
index 823947170a335bac4dd074b654be41fe81a0f2fa..2d7d8a5db2ac5c8c69c793ce1f368e9fb5a756e7 100644 (file)
@@ -157,9 +157,12 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force,
 {
        __u32 ctsn, max_tsn_seen;
        struct sctp_chunk *sack;
+       struct sctp_transport *trans = asoc->peer.last_data_from;
        int error = 0;
 
-       if (force)
+       if (force || 
+           (!trans && (asoc->param_flags & SPP_SACKDELAY_DISABLE)) ||
+           (trans && (trans->param_flags & SPP_SACKDELAY_DISABLE)))
                asoc->peer.sack_needed = 1;
 
        ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
@@ -189,7 +192,22 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force,
        if (!asoc->peer.sack_needed) {
                /* We will need a SACK for the next packet.  */
                asoc->peer.sack_needed = 1;
-               goto out;
+
+               /* Set the SACK delay timeout based on the
+                * SACK delay for the last transport
+                * data was received from, or the default
+                * for the association.
+                */
+               if (trans)
+                       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = 
+                               trans->sackdelay;
+               else
+                       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = 
+                               asoc->sackdelay;
+
+               /* Restart the SACK timer. */
+               sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
+                               SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
        } else {
                if (asoc->a_rwnd > asoc->rwnd)
                        asoc->a_rwnd = asoc->rwnd;
@@ -205,7 +223,7 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force,
                sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
                                SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
        }
-out:
+
        return error;
 nomem:
        error = -ENOMEM;
@@ -415,7 +433,7 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc,
        asoc->overall_error_count++;
 
        if (transport->state != SCTP_INACTIVE &&
-           (transport->error_count++ >= transport->max_retrans)) {
+           (transport->error_count++ >= transport->pathmaxrxt)) {
                SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p",
                                         " transport IP: port:%d failed.\n",
                                         asoc,
index 475bfb4972d9ff9a3a4a610877f847031e48c161..557a7d90b92a1a9f5c31430d81d2ed3a7222d3b5 100644 (file)
@@ -900,7 +900,7 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
         * HEARTBEAT is sent (see Section 8.3).
         */
 
-       if (transport->hb_allowed) {
+       if (transport->param_flags & SPP_HB_ENABLE) {
                if (SCTP_DISPOSITION_NOMEM ==
                                sctp_sf_heartbeat(ep, asoc, type, arg,
                                                  commands))
@@ -1051,7 +1051,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
                return SCTP_DISPOSITION_DISCARD;
        }
 
-       max_interval = link->hb_interval + link->rto;
+       max_interval = link->hbinterval + link->rto;
 
        /* Check if the timestamp looks valid.  */
        if (time_after(hbinfo->sent_at, jiffies) ||
@@ -2691,14 +2691,9 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
         * document allow. However, an SCTP transmitter MUST NOT be
         * more aggressive than the following algorithms allow.
         */
-       if (chunk->end_of_packet) {
+       if (chunk->end_of_packet)
                sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE());
 
-               /* Start the SACK timer.  */
-               sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
-                               SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
-       }
-
        return SCTP_DISPOSITION_CONSUME;
 
 discard_force:
@@ -2721,13 +2716,9 @@ discard_force:
        return SCTP_DISPOSITION_DISCARD;
 
 discard_noforce:
-       if (chunk->end_of_packet) {
+       if (chunk->end_of_packet)
                sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE());
 
-               /* Start the SACK timer.  */
-               sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
-                               SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
-       }
        return SCTP_DISPOSITION_DISCARD;
 consume:
        return SCTP_DISPOSITION_CONSUME;
@@ -3442,9 +3433,6 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
         * send another. 
         */
        sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE());
-       /* Start the SACK timer.  */
-       sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
-                       SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
 
        return SCTP_DISPOSITION_CONSUME;
 
index abab81f3818f1a4c77742b315ad943853ad062ce..fc04d185fa3348d8dabc2387f5465b59d3d81b97 100644 (file)
@@ -156,10 +156,6 @@ static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
                                sizeof(struct sk_buff) +
                                sizeof(struct sctp_chunk);
 
-       sk->sk_wmem_queued += SCTP_DATA_SNDSIZE(chunk) +
-                               sizeof(struct sk_buff) +
-                               sizeof(struct sctp_chunk);
-
        atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
 }
 
@@ -1945,107 +1941,379 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
  * address's parameters:
  *
  *  struct sctp_paddrparams {
- *      sctp_assoc_t            spp_assoc_id;
- *      struct sockaddr_storage spp_address;
- *      uint32_t                spp_hbinterval;
- *      uint16_t                spp_pathmaxrxt;
- *  };
- *
- *   spp_assoc_id    - (UDP style socket) This is filled in the application,
- *                     and identifies the association for this query.
+ *     sctp_assoc_t            spp_assoc_id;
+ *     struct sockaddr_storage spp_address;
+ *     uint32_t                spp_hbinterval;
+ *     uint16_t                spp_pathmaxrxt;
+ *     uint32_t                spp_pathmtu;
+ *     uint32_t                spp_sackdelay;
+ *     uint32_t                spp_flags;
+ * };
+ *
+ *   spp_assoc_id    - (one-to-many style socket) This is filled in the
+ *                     application, and identifies the association for
+ *                     this query.
  *   spp_address     - This specifies which address is of interest.
  *   spp_hbinterval  - This contains the value of the heartbeat interval,
- *                     in milliseconds.  A value of 0, when modifying the
- *                     parameter, specifies that the heartbeat on this
- *                     address should be disabled. A value of UINT32_MAX
- *                     (4294967295), when modifying the parameter,
- *                     specifies that a heartbeat should be sent
- *                     immediately to the peer address, and the current
- *                     interval should remain unchanged.
+ *                     in milliseconds.  If a  value of zero
+ *                     is present in this field then no changes are to
+ *                     be made to this parameter.
  *   spp_pathmaxrxt  - This contains the maximum number of
  *                     retransmissions before this address shall be
- *                     considered unreachable.
+ *                     considered unreachable. If a  value of zero
+ *                     is present in this field then no changes are to
+ *                     be made to this parameter.
+ *   spp_pathmtu     - When Path MTU discovery is disabled the value
+ *                     specified here will be the "fixed" path mtu.
+ *                     Note that if the spp_address field is empty
+ *                     then all associations on this address will
+ *                     have this fixed path mtu set upon them.
+ *
+ *   spp_sackdelay   - When delayed sack is enabled, this value specifies
+ *                     the number of milliseconds that sacks will be delayed
+ *                     for. This value will apply to all addresses of an
+ *                     association if the spp_address field is empty. Note
+ *                     also, that if delayed sack is enabled and this
+ *                     value is set to 0, no change is made to the last
+ *                     recorded delayed sack timer value.
+ *
+ *   spp_flags       - These flags are used to control various features
+ *                     on an association. The flag field may contain
+ *                     zero or more of the following options.
+ *
+ *                     SPP_HB_ENABLE  - Enable heartbeats on the
+ *                     specified address. Note that if the address
+ *                     field is empty all addresses for the association
+ *                     have heartbeats enabled upon them.
+ *
+ *                     SPP_HB_DISABLE - Disable heartbeats on the
+ *                     speicifed address. Note that if the address
+ *                     field is empty all addresses for the association
+ *                     will have their heartbeats disabled. Note also
+ *                     that SPP_HB_ENABLE and SPP_HB_DISABLE are
+ *                     mutually exclusive, only one of these two should
+ *                     be specified. Enabling both fields will have
+ *                     undetermined results.
+ *
+ *                     SPP_HB_DEMAND - Request a user initiated heartbeat
+ *                     to be made immediately.
+ *
+ *                     SPP_PMTUD_ENABLE - This field will enable PMTU
+ *                     discovery upon the specified address. Note that
+ *                     if the address feild is empty then all addresses
+ *                     on the association are effected.
+ *
+ *                     SPP_PMTUD_DISABLE - This field will disable PMTU
+ *                     discovery upon the specified address. Note that
+ *                     if the address feild is empty then all addresses
+ *                     on the association are effected. Not also that
+ *                     SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually
+ *                     exclusive. Enabling both will have undetermined
+ *                     results.
+ *
+ *                     SPP_SACKDELAY_ENABLE - Setting this flag turns
+ *                     on delayed sack. The time specified in spp_sackdelay
+ *                     is used to specify the sack delay for this address. Note
+ *                     that if spp_address is empty then all addresses will
+ *                     enable delayed sack and take on the sack delay
+ *                     value specified in spp_sackdelay.
+ *                     SPP_SACKDELAY_DISABLE - Setting this flag turns
+ *                     off delayed sack. If the spp_address field is blank then
+ *                     delayed sack is disabled for the entire association. Note
+ *                     also that this field is mutually exclusive to
+ *                     SPP_SACKDELAY_ENABLE, setting both will have undefined
+ *                     results.
  */
+int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
+                               struct sctp_transport   *trans,
+                               struct sctp_association *asoc,
+                               struct sctp_sock        *sp,
+                               int                      hb_change,
+                               int                      pmtud_change,
+                               int                      sackdelay_change)
+{
+       int error;
+
+       if (params->spp_flags & SPP_HB_DEMAND && trans) {
+               error = sctp_primitive_REQUESTHEARTBEAT (trans->asoc, trans);
+               if (error)
+                       return error;
+       }
+
+       if (params->spp_hbinterval) {
+               if (trans) {
+                       trans->hbinterval = msecs_to_jiffies(params->spp_hbinterval);
+               } else if (asoc) {
+                       asoc->hbinterval = msecs_to_jiffies(params->spp_hbinterval);
+               } else {
+                       sp->hbinterval = params->spp_hbinterval;
+               }
+       }
+
+       if (hb_change) {
+               if (trans) {
+                       trans->param_flags =
+                               (trans->param_flags & ~SPP_HB) | hb_change;
+               } else if (asoc) {
+                       asoc->param_flags =
+                               (asoc->param_flags & ~SPP_HB) | hb_change;
+               } else {
+                       sp->param_flags =
+                               (sp->param_flags & ~SPP_HB) | hb_change;
+               }
+       }
+
+       if (params->spp_pathmtu) {
+               if (trans) {
+                       trans->pathmtu = params->spp_pathmtu;
+                       sctp_assoc_sync_pmtu(asoc);
+               } else if (asoc) {
+                       asoc->pathmtu = params->spp_pathmtu;
+                       sctp_frag_point(sp, params->spp_pathmtu);
+               } else {
+                       sp->pathmtu = params->spp_pathmtu;
+               }
+       }
+
+       if (pmtud_change) {
+               if (trans) {
+                       int update = (trans->param_flags & SPP_PMTUD_DISABLE) &&
+                               (params->spp_flags & SPP_PMTUD_ENABLE);
+                       trans->param_flags =
+                               (trans->param_flags & ~SPP_PMTUD) | pmtud_change;
+                       if (update) {
+                               sctp_transport_pmtu(trans);
+                               sctp_assoc_sync_pmtu(asoc);
+                       }
+               } else if (asoc) {
+                       asoc->param_flags =
+                               (asoc->param_flags & ~SPP_PMTUD) | pmtud_change;
+               } else {
+                       sp->param_flags =
+                               (sp->param_flags & ~SPP_PMTUD) | pmtud_change;
+               }
+       }
+
+       if (params->spp_sackdelay) {
+               if (trans) {
+                       trans->sackdelay =
+                               msecs_to_jiffies(params->spp_sackdelay);
+               } else if (asoc) {
+                       asoc->sackdelay =
+                               msecs_to_jiffies(params->spp_sackdelay);
+               } else {
+                       sp->sackdelay = params->spp_sackdelay;
+               }
+       }
+
+       if (sackdelay_change) {
+               if (trans) {
+                       trans->param_flags =
+                               (trans->param_flags & ~SPP_SACKDELAY) |
+                               sackdelay_change;
+               } else if (asoc) {
+                       asoc->param_flags =
+                               (asoc->param_flags & ~SPP_SACKDELAY) |
+                               sackdelay_change;
+               } else {
+                       sp->param_flags =
+                               (sp->param_flags & ~SPP_SACKDELAY) |
+                               sackdelay_change;
+               }
+       }
+
+       if (params->spp_pathmaxrxt) {
+               if (trans) {
+                       trans->pathmaxrxt = params->spp_pathmaxrxt;
+               } else if (asoc) {
+                       asoc->pathmaxrxt = params->spp_pathmaxrxt;
+               } else {
+                       sp->pathmaxrxt = params->spp_pathmaxrxt;
+               }
+       }
+
+       return 0;
+}
+
 static int sctp_setsockopt_peer_addr_params(struct sock *sk,
                                            char __user *optval, int optlen)
 {
-       struct sctp_paddrparams params;
-       struct sctp_transport *trans;
+       struct sctp_paddrparams  params;
+       struct sctp_transport   *trans = NULL;
+       struct sctp_association *asoc = NULL;
+       struct sctp_sock        *sp = sctp_sk(sk);
        int error;
+       int hb_change, pmtud_change, sackdelay_change;
 
        if (optlen != sizeof(struct sctp_paddrparams))
-               return -EINVAL;
+               return - EINVAL;
+
        if (copy_from_user(&params, optval, optlen))
                return -EFAULT;
 
-       /*
-        * API 7. Socket Options (setting the default value for the endpoint)
-        * All options that support specific settings on an association by
-        * filling in either an association id variable or a sockaddr_storage
-        * SHOULD also support setting of the same value for the entire endpoint
-        * (i.e. future associations). To accomplish this the following logic is
-        * used when setting one of these options:
-
-        * c) If neither the sockaddr_storage or association identification is
-        *    set i.e. the sockaddr_storage is set to all 0's (INADDR_ANY) and
-        *    the association identification is 0, the settings are a default
-        *    and to be applied to the endpoint (all future associations).
-        */
+       /* Validate flags and value parameters. */
+       hb_change        = params.spp_flags & SPP_HB;
+       pmtud_change     = params.spp_flags & SPP_PMTUD;
+       sackdelay_change = params.spp_flags & SPP_SACKDELAY;
+
+       if (hb_change        == SPP_HB ||
+           pmtud_change     == SPP_PMTUD ||
+           sackdelay_change == SPP_SACKDELAY ||
+           params.spp_sackdelay > 500 ||
+           (params.spp_pathmtu
+           && params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
+               return -EINVAL;
 
-       /* update default value for endpoint (all future associations) */
-       if (!params.spp_assoc_id && 
-           sctp_is_any(( union sctp_addr *)&params.spp_address)) {
-               /* Manual heartbeat on an endpoint is invalid. */
-               if (0xffffffff == params.spp_hbinterval)
+       /* If an address other than INADDR_ANY is specified, and
+        * no transport is found, then the request is invalid.
+        */
+       if (!sctp_is_any(( union sctp_addr *)&params.spp_address)) {
+               trans = sctp_addr_id2transport(sk, &params.spp_address,
+                                              params.spp_assoc_id);
+               if (!trans)
                        return -EINVAL;
-               else if (params.spp_hbinterval)
-                       sctp_sk(sk)->paddrparam.spp_hbinterval =
-                                               params.spp_hbinterval;
-               if (params.spp_pathmaxrxt)
-                       sctp_sk(sk)->paddrparam.spp_pathmaxrxt =
-                                               params.spp_pathmaxrxt;
-               return 0;
        }
 
-       trans = sctp_addr_id2transport(sk, &params.spp_address,
-                                      params.spp_assoc_id);
-       if (!trans)
+       /* Get association, if assoc_id != 0 and the socket is a one
+        * to many style socket, and an association was not found, then
+        * the id was invalid.
+        */
+       asoc = sctp_id2assoc(sk, params.spp_assoc_id);
+       if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP))
                return -EINVAL;
 
-       /* Applications can enable or disable heartbeats for any peer address
-        * of an association, modify an address's heartbeat interval, force a
-        * heartbeat to be sent immediately, and adjust the address's maximum
-        * number of retransmissions sent before an address is considered
-        * unreachable.
-        *
-        * The value of the heartbeat interval, in milliseconds. A value of
-        * UINT32_MAX (4294967295), when modifying the parameter, specifies
-        * that a heartbeat should be sent immediately to the peer address,
-        * and the current interval should remain unchanged.
+       /* Heartbeat demand can only be sent on a transport or
+        * association, but not a socket.
         */
-       if (0xffffffff == params.spp_hbinterval) {
-               error = sctp_primitive_REQUESTHEARTBEAT (trans->asoc, trans);
-               if (error)
-                       return error;
-       } else {
-       /* The value of the heartbeat interval, in milliseconds. A value of 0,
-        * when modifying the parameter, specifies that the heartbeat on this
-        * address should be disabled.
+       if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc)
+               return -EINVAL;
+
+       /* Process parameters. */
+       error = sctp_apply_peer_addr_params(&params, trans, asoc, sp,
+                                           hb_change, pmtud_change,
+                                           sackdelay_change);
+
+       if (error)
+               return error;
+
+       /* If changes are for association, also apply parameters to each
+        * transport.
         */
-               if (params.spp_hbinterval) {
-                       trans->hb_allowed = 1;
-                       trans->hb_interval = 
-                               msecs_to_jiffies(params.spp_hbinterval);
-               } else
-                       trans->hb_allowed = 0;
+       if (!trans && asoc) {
+               struct list_head *pos;
+
+               list_for_each(pos, &asoc->peer.transport_addr_list) {
+                       trans = list_entry(pos, struct sctp_transport,
+                                          transports);
+                       sctp_apply_peer_addr_params(&params, trans, asoc, sp,
+                                                   hb_change, pmtud_change,
+                                                   sackdelay_change);
+               }
        }
 
-       /* spp_pathmaxrxt contains the maximum number of retransmissions
-        * before this address shall be considered unreachable.
-        */
-       if (params.spp_pathmaxrxt)
-               trans->max_retrans = params.spp_pathmaxrxt;
+       return 0;
+}
+
+/* 7.1.24. Delayed Ack Timer (SCTP_DELAYED_ACK_TIME)
+ *
+ *   This options will get or set the delayed ack timer.  The time is set
+ *   in milliseconds.  If the assoc_id is 0, then this sets or gets the
+ *   endpoints default delayed ack timer value.  If the assoc_id field is
+ *   non-zero, then the set or get effects the specified association.
+ *
+ *   struct sctp_assoc_value {
+ *       sctp_assoc_t            assoc_id;
+ *       uint32_t                assoc_value;
+ *   };
+ *
+ *     assoc_id    - This parameter, indicates which association the
+ *                   user is preforming an action upon. Note that if
+ *                   this field's value is zero then the endpoints
+ *                   default value is changed (effecting future
+ *                   associations only).
+ *
+ *     assoc_value - This parameter contains the number of milliseconds
+ *                   that the user is requesting the delayed ACK timer
+ *                   be set to. Note that this value is defined in
+ *                   the standard to be between 200 and 500 milliseconds.
+ *
+ *                   Note: a value of zero will leave the value alone,
+ *                   but disable SACK delay. A non-zero value will also
+ *                   enable SACK delay.
+ */
+
+static int sctp_setsockopt_delayed_ack_time(struct sock *sk,
+                                           char __user *optval, int optlen)
+{
+       struct sctp_assoc_value  params;
+       struct sctp_transport   *trans = NULL;
+       struct sctp_association *asoc = NULL;
+       struct sctp_sock        *sp = sctp_sk(sk);
+
+       if (optlen != sizeof(struct sctp_assoc_value))
+               return - EINVAL;
+
+       if (copy_from_user(&params, optval, optlen))
+               return -EFAULT;
 
+       /* Validate value parameter. */
+       if (params.assoc_value > 500)
+               return -EINVAL;
+
+       /* Get association, if assoc_id != 0 and the socket is a one
+        * to many style socket, and an association was not found, then
+        * the id was invalid.
+        */
+       asoc = sctp_id2assoc(sk, params.assoc_id);
+       if (!asoc && params.assoc_id && sctp_style(sk, UDP))
+               return -EINVAL;
+
+       if (params.assoc_value) {
+               if (asoc) {
+                       asoc->sackdelay =
+                               msecs_to_jiffies(params.assoc_value);
+                       asoc->param_flags = 
+                               (asoc->param_flags & ~SPP_SACKDELAY) |
+                               SPP_SACKDELAY_ENABLE;
+               } else {
+                       sp->sackdelay = params.assoc_value;
+                       sp->param_flags = 
+                               (sp->param_flags & ~SPP_SACKDELAY) |
+                               SPP_SACKDELAY_ENABLE;
+               }
+       } else {
+               if (asoc) {
+                       asoc->param_flags = 
+                               (asoc->param_flags & ~SPP_SACKDELAY) |
+                               SPP_SACKDELAY_DISABLE;
+               } else {
+                       sp->param_flags = 
+                               (sp->param_flags & ~SPP_SACKDELAY) |
+                               SPP_SACKDELAY_DISABLE;
+               }
+       }
+
+       /* If change is for association, also apply to each transport. */
+       if (asoc) {
+               struct list_head *pos;
+
+               list_for_each(pos, &asoc->peer.transport_addr_list) {
+                       trans = list_entry(pos, struct sctp_transport,
+                                          transports);
+                       if (params.assoc_value) {
+                               trans->sackdelay =
+                                       msecs_to_jiffies(params.assoc_value);
+                               trans->param_flags = 
+                                       (trans->param_flags & ~SPP_SACKDELAY) |
+                                       SPP_SACKDELAY_ENABLE;
+                       } else {
+                               trans->param_flags = 
+                                       (trans->param_flags & ~SPP_SACKDELAY) |
+                                       SPP_SACKDELAY_DISABLE;
+                       }
+               }
+       }
        return 0;
 }
 
@@ -2338,7 +2606,7 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optl
        /* Update the frag_point of the existing associations. */
        list_for_each(pos, &(sp->ep->asocs)) {
                asoc = list_entry(pos, struct sctp_association, asocs);
-               asoc->frag_point = sctp_frag_point(sp, asoc->pmtu); 
+               asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu); 
        }
 
        return 0;
@@ -2495,6 +2763,10 @@ SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname,
                retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen);
                break;
 
+       case SCTP_DELAYED_ACK_TIME:
+               retval = sctp_setsockopt_delayed_ack_time(sk, optval, optlen);
+               break;
+
        case SCTP_INITMSG:
                retval = sctp_setsockopt_initmsg(sk, optval, optlen);
                break;
@@ -2719,8 +2991,13 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk)
        /* Default Peer Address Parameters.  These defaults can
         * be modified via SCTP_PEER_ADDR_PARAMS
         */
-       sp->paddrparam.spp_hbinterval = jiffies_to_msecs(sctp_hb_interval);
-       sp->paddrparam.spp_pathmaxrxt = sctp_max_retrans_path;
+       sp->hbinterval  = jiffies_to_msecs(sctp_hb_interval);
+       sp->pathmaxrxt  = sctp_max_retrans_path;
+       sp->pathmtu     = 0; // allow default discovery
+       sp->sackdelay   = sctp_sack_timeout;
+       sp->param_flags = SPP_HB_ENABLE |
+                         SPP_PMTUD_ENABLE |
+                         SPP_SACKDELAY_ENABLE;
 
        /* If enabled no SCTP message fragmentation will be performed.
         * Configure through SCTP_DISABLE_FRAGMENTS socket option.
@@ -2869,7 +3146,7 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
        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;
+       status.sstat_primary.spinfo_mtu = transport->pathmtu;
 
        if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
                status.sstat_primary.spinfo_state = SCTP_ACTIVE;
@@ -2928,7 +3205,7 @@ static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
        pinfo.spinfo_cwnd = transport->cwnd;
        pinfo.spinfo_srtt = transport->srtt;
        pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
-       pinfo.spinfo_mtu = transport->pmtu;
+       pinfo.spinfo_mtu = transport->pathmtu;
 
        if (pinfo.spinfo_state == SCTP_UNKNOWN)
                pinfo.spinfo_state = SCTP_ACTIVE;
@@ -3090,69 +3367,227 @@ out:
  * address's parameters:
  *
  *  struct sctp_paddrparams {
- *      sctp_assoc_t            spp_assoc_id;
- *      struct sockaddr_storage spp_address;
- *      uint32_t                spp_hbinterval;
- *      uint16_t                spp_pathmaxrxt;
- *  };
- *
- *   spp_assoc_id    - (UDP style socket) This is filled in the application,
- *                     and identifies the association for this query.
+ *     sctp_assoc_t            spp_assoc_id;
+ *     struct sockaddr_storage spp_address;
+ *     uint32_t                spp_hbinterval;
+ *     uint16_t                spp_pathmaxrxt;
+ *     uint32_t                spp_pathmtu;
+ *     uint32_t                spp_sackdelay;
+ *     uint32_t                spp_flags;
+ * };
+ *
+ *   spp_assoc_id    - (one-to-many style socket) This is filled in the
+ *                     application, and identifies the association for
+ *                     this query.
  *   spp_address     - This specifies which address is of interest.
  *   spp_hbinterval  - This contains the value of the heartbeat interval,
- *                     in milliseconds.  A value of 0, when modifying the
- *                     parameter, specifies that the heartbeat on this
- *                     address should be disabled. A value of UINT32_MAX
- *                     (4294967295), when modifying the parameter,
- *                     specifies that a heartbeat should be sent
- *                     immediately to the peer address, and the current
- *                     interval should remain unchanged.
+ *                     in milliseconds.  If a  value of zero
+ *                     is present in this field then no changes are to
+ *                     be made to this parameter.
  *   spp_pathmaxrxt  - This contains the maximum number of
  *                     retransmissions before this address shall be
- *                     considered unreachable.
+ *                     considered unreachable. If a  value of zero
+ *                     is present in this field then no changes are to
+ *                     be made to this parameter.
+ *   spp_pathmtu     - When Path MTU discovery is disabled the value
+ *                     specified here will be the "fixed" path mtu.
+ *                     Note that if the spp_address field is empty
+ *                     then all associations on this address will
+ *                     have this fixed path mtu set upon them.
+ *
+ *   spp_sackdelay   - When delayed sack is enabled, this value specifies
+ *                     the number of milliseconds that sacks will be delayed
+ *                     for. This value will apply to all addresses of an
+ *                     association if the spp_address field is empty. Note
+ *                     also, that if delayed sack is enabled and this
+ *                     value is set to 0, no change is made to the last
+ *                     recorded delayed sack timer value.
+ *
+ *   spp_flags       - These flags are used to control various features
+ *                     on an association. The flag field may contain
+ *                     zero or more of the following options.
+ *
+ *                     SPP_HB_ENABLE  - Enable heartbeats on the
+ *                     specified address. Note that if the address
+ *                     field is empty all addresses for the association
+ *                     have heartbeats enabled upon them.
+ *
+ *                     SPP_HB_DISABLE - Disable heartbeats on the
+ *                     speicifed address. Note that if the address
+ *                     field is empty all addresses for the association
+ *                     will have their heartbeats disabled. Note also
+ *                     that SPP_HB_ENABLE and SPP_HB_DISABLE are
+ *                     mutually exclusive, only one of these two should
+ *                     be specified. Enabling both fields will have
+ *                     undetermined results.
+ *
+ *                     SPP_HB_DEMAND - Request a user initiated heartbeat
+ *                     to be made immediately.
+ *
+ *                     SPP_PMTUD_ENABLE - This field will enable PMTU
+ *                     discovery upon the specified address. Note that
+ *                     if the address feild is empty then all addresses
+ *                     on the association are effected.
+ *
+ *                     SPP_PMTUD_DISABLE - This field will disable PMTU
+ *                     discovery upon the specified address. Note that
+ *                     if the address feild is empty then all addresses
+ *                     on the association are effected. Not also that
+ *                     SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually
+ *                     exclusive. Enabling both will have undetermined
+ *                     results.
+ *
+ *                     SPP_SACKDELAY_ENABLE - Setting this flag turns
+ *                     on delayed sack. The time specified in spp_sackdelay
+ *                     is used to specify the sack delay for this address. Note
+ *                     that if spp_address is empty then all addresses will
+ *                     enable delayed sack and take on the sack delay
+ *                     value specified in spp_sackdelay.
+ *                     SPP_SACKDELAY_DISABLE - Setting this flag turns
+ *                     off delayed sack. If the spp_address field is blank then
+ *                     delayed sack is disabled for the entire association. Note
+ *                     also that this field is mutually exclusive to
+ *                     SPP_SACKDELAY_ENABLE, setting both will have undefined
+ *                     results.
  */
 static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
-                                               char __user *optval, int __user *optlen)
+                                           char __user *optval, int __user *optlen)
 {
-       struct sctp_paddrparams params;
-       struct sctp_transport *trans;
+       struct sctp_paddrparams  params;
+       struct sctp_transport   *trans = NULL;
+       struct sctp_association *asoc = NULL;
+       struct sctp_sock        *sp = sctp_sk(sk);
 
        if (len != sizeof(struct sctp_paddrparams))
                return -EINVAL;
+
        if (copy_from_user(&params, optval, len))
                return -EFAULT;
 
-       /* If no association id is specified retrieve the default value
-        * for the endpoint that will be used for all future associations
+       /* If an address other than INADDR_ANY is specified, and
+        * no transport is found, then the request is invalid.
         */
-       if (!params.spp_assoc_id &&
-           sctp_is_any(( union sctp_addr *)&params.spp_address)) {
-               params.spp_hbinterval = sctp_sk(sk)->paddrparam.spp_hbinterval;
-               params.spp_pathmaxrxt = sctp_sk(sk)->paddrparam.spp_pathmaxrxt;
-
-               goto done;
+       if (!sctp_is_any(( union sctp_addr *)&params.spp_address)) {
+               trans = sctp_addr_id2transport(sk, &params.spp_address,
+                                              params.spp_assoc_id);
+               if (!trans) {
+                       SCTP_DEBUG_PRINTK("Failed no transport\n");
+                       return -EINVAL;
+               }
        }
 
-       trans = sctp_addr_id2transport(sk, &params.spp_address,
-                                      params.spp_assoc_id);
-       if (!trans)
+       /* Get association, if assoc_id != 0 and the socket is a one
+        * to many style socket, and an association was not found, then
+        * the id was invalid.
+        */
+       asoc = sctp_id2assoc(sk, params.spp_assoc_id);
+       if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) {
+               SCTP_DEBUG_PRINTK("Failed no association\n");
                return -EINVAL;
+       }
 
-       /* The value of the heartbeat interval, in milliseconds. A value of 0,
-        * when modifying the parameter, specifies that the heartbeat on this
-        * address should be disabled.
-        */
-       if (!trans->hb_allowed)
-               params.spp_hbinterval = 0;
-       else
-               params.spp_hbinterval = jiffies_to_msecs(trans->hb_interval);
+       if (trans) {
+               /* Fetch transport values. */
+               params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval);
+               params.spp_pathmtu    = trans->pathmtu;
+               params.spp_pathmaxrxt = trans->pathmaxrxt;
+               params.spp_sackdelay  = jiffies_to_msecs(trans->sackdelay);
+
+               /*draft-11 doesn't say what to return in spp_flags*/
+               params.spp_flags      = trans->param_flags;
+       } else if (asoc) {
+               /* Fetch association values. */
+               params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval);
+               params.spp_pathmtu    = asoc->pathmtu;
+               params.spp_pathmaxrxt = asoc->pathmaxrxt;
+               params.spp_sackdelay  = jiffies_to_msecs(asoc->sackdelay);
+
+               /*draft-11 doesn't say what to return in spp_flags*/
+               params.spp_flags      = asoc->param_flags;
+       } else {
+               /* Fetch socket values. */
+               params.spp_hbinterval = sp->hbinterval;
+               params.spp_pathmtu    = sp->pathmtu;
+               params.spp_sackdelay  = sp->sackdelay;
+               params.spp_pathmaxrxt = sp->pathmaxrxt;
+
+               /*draft-11 doesn't say what to return in spp_flags*/
+               params.spp_flags      = sp->param_flags;
+       }
 
-       /* spp_pathmaxrxt contains the maximum number of retransmissions
-        * before this address shall be considered unreachable.
-        */
-       params.spp_pathmaxrxt = trans->max_retrans;
+       if (copy_to_user(optval, &params, len))
+               return -EFAULT;
+
+       if (put_user(len, optlen))
+               return -EFAULT;
+
+       return 0;
+}
+
+/* 7.1.24. Delayed Ack Timer (SCTP_DELAYED_ACK_TIME)
+ *
+ *   This options will get or set the delayed ack timer.  The time is set
+ *   in milliseconds.  If the assoc_id is 0, then this sets or gets the
+ *   endpoints default delayed ack timer value.  If the assoc_id field is
+ *   non-zero, then the set or get effects the specified association.
+ *
+ *   struct sctp_assoc_value {
+ *       sctp_assoc_t            assoc_id;
+ *       uint32_t                assoc_value;
+ *   };
+ *
+ *     assoc_id    - This parameter, indicates which association the
+ *                   user is preforming an action upon. Note that if
+ *                   this field's value is zero then the endpoints
+ *                   default value is changed (effecting future
+ *                   associations only).
+ *
+ *     assoc_value - This parameter contains the number of milliseconds
+ *                   that the user is requesting the delayed ACK timer
+ *                   be set to. Note that this value is defined in
+ *                   the standard to be between 200 and 500 milliseconds.
+ *
+ *                   Note: a value of zero will leave the value alone,
+ *                   but disable SACK delay. A non-zero value will also
+ *                   enable SACK delay.
+ */
+static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len,
+                                           char __user *optval,
+                                           int __user *optlen)
+{
+       struct sctp_assoc_value  params;
+       struct sctp_association *asoc = NULL;
+       struct sctp_sock        *sp = sctp_sk(sk);
+
+       if (len != sizeof(struct sctp_assoc_value))
+               return - EINVAL;
+
+       if (copy_from_user(&params, optval, len))
+               return -EFAULT;
+
+       /* Get association, if assoc_id != 0 and the socket is a one
+        * to many style socket, and an association was not found, then
+        * the id was invalid.
+        */
+       asoc = sctp_id2assoc(sk, params.assoc_id);
+       if (!asoc && params.assoc_id && sctp_style(sk, UDP))
+               return -EINVAL;
+
+       if (asoc) {
+               /* Fetch association values. */
+               if (asoc->param_flags & SPP_SACKDELAY_ENABLE)
+                       params.assoc_value = jiffies_to_msecs(
+                               asoc->sackdelay);
+               else
+                       params.assoc_value = 0;
+       } else {
+               /* Fetch socket values. */
+               if (sp->param_flags & SPP_SACKDELAY_ENABLE)
+                       params.assoc_value  = sp->sackdelay;
+               else
+                       params.assoc_value  = 0;
+       }
 
-done:
        if (copy_to_user(optval, &params, len))
                return -EFAULT;
 
@@ -3425,7 +3860,7 @@ static int sctp_copy_laddrs_to_user_old(struct sock *sk, __u16 port, int max_add
 }
 
 static int sctp_copy_laddrs_to_user(struct sock *sk, __u16 port,
-                                   void * __user *to, size_t space_left)
+                                   void __user **to, size_t space_left)
 {
        struct list_head *pos;
        struct sctp_sockaddr_entry *addr;
@@ -4019,6 +4454,10 @@ SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
                retval = sctp_getsockopt_peer_addr_params(sk, len, optval,
                                                          optlen);
                break;
+       case SCTP_DELAYED_ACK_TIME:
+               retval = sctp_getsockopt_delayed_ack_time(sk, len, optval,
+                                                         optlen);
+               break;
        case SCTP_INITMSG:
                retval = sctp_getsockopt_initmsg(sk, len, optval, optlen);
                break;
@@ -4426,7 +4865,7 @@ cleanup:
  * tcp_poll().  Note that, based on these implementations, we don't
  * lock the socket in this function, even though it seems that,
  * ideally, locking or some other mechanisms can be used to ensure
- * the integrity of the counters (sndbuf and wmem_queued) used
+ * the integrity of the counters (sndbuf and wmem_alloc) used
  * in this place.  We assume that we don't need locks either until proven
  * otherwise.
  *
@@ -4743,11 +5182,6 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
        struct sk_buff *skb;
        long timeo;
 
-       /* Caller is allowed not to check sk->sk_err before calling.  */
-       error = sock_error(sk);
-       if (error)
-               goto no_packet;
-
        timeo = sock_rcvtimeo(sk, noblock);
 
        SCTP_DEBUG_PRINTK("Timeout: timeo: %ld, MAX: %ld.\n",
@@ -4774,6 +5208,11 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
                if (skb)
                        return skb;
 
+               /* Caller is allowed not to check sk->sk_err before calling. */
+               error = sock_error(sk);
+               if (error)
+                       goto no_packet;
+
                if (sk->sk_shutdown & RCV_SHUTDOWN)
                        break;
 
@@ -4833,10 +5272,6 @@ static void sctp_wfree(struct sk_buff *skb)
                                sizeof(struct sk_buff) +
                                sizeof(struct sctp_chunk);
 
-       sk->sk_wmem_queued -= SCTP_DATA_SNDSIZE(chunk) +
-                               sizeof(struct sk_buff) +
-                               sizeof(struct sctp_chunk);
-
        atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
 
        sock_wfree(skb);
@@ -4920,7 +5355,7 @@ void sctp_write_space(struct sock *sk)
 
 /* Is there any sndbuf space available on the socket?
  *
- * Note that wmem_queued is the sum of the send buffers on all of the
+ * Note that sk_wmem_alloc is the sum of the send buffers on all of the
  * associations on the same socket.  For a UDP-style socket with
  * multiple associations, it is possible for it to be "unwriteable"
  * prematurely.  I assume that this is acceptable because
@@ -4933,7 +5368,7 @@ static int sctp_writeable(struct sock *sk)
 {
        int amt = 0;
 
-       amt = sk->sk_sndbuf - sk->sk_wmem_queued;
+       amt = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
        if (amt < 0)
                amt = 0;
        return amt;
index 6bc27200e6cafc8251ebc50b3bac6521a943abf6..68d73e2dd155e33c2ca06e7bbd283b5a66738609 100644 (file)
@@ -86,10 +86,13 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
        peer->init_sent_count = 0;
 
        peer->state = SCTP_ACTIVE;
-       peer->hb_allowed = 0;
+       peer->param_flags = SPP_HB_DISABLE |
+                           SPP_PMTUD_ENABLE |
+                           SPP_SACKDELAY_ENABLE;
+       peer->hbinterval  = 0;
 
        /* Initialize the default path max_retrans.  */
-       peer->max_retrans = sctp_max_retrans_path;
+       peer->pathmaxrxt  = sctp_max_retrans_path;
        peer->error_count = 0;
 
        INIT_LIST_HEAD(&peer->transmitted);
@@ -229,10 +232,10 @@ void sctp_transport_pmtu(struct sctp_transport *transport)
        dst = transport->af_specific->get_dst(NULL, &transport->ipaddr, NULL);
 
        if (dst) {
-               transport->pmtu = dst_mtu(dst);
+               transport->pathmtu = dst_mtu(dst);
                dst_release(dst);
        } else
-               transport->pmtu = SCTP_DEFAULT_MAXSEGMENT;
+               transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
 }
 
 /* Caches the dst entry and source address for a transport's destination
@@ -254,16 +257,20 @@ void sctp_transport_route(struct sctp_transport *transport,
                af->get_saddr(asoc, dst, daddr, &transport->saddr);
 
        transport->dst = dst;
+       if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {
+               return;
+       }
        if (dst) {
-               transport->pmtu = dst_mtu(dst);
+               transport->pathmtu = dst_mtu(dst);
 
                /* Initialize sk->sk_rcv_saddr, if the transport is the
                 * association's active path for getsockname().
                 */ 
                if (asoc && (transport == asoc->peer.active_path))
-                       af->to_sk_saddr(&transport->saddr, asoc->base.sk);
+                       opt->pf->af->to_sk_saddr(&transport->saddr,
+                                                asoc->base.sk);
        } else
-               transport->pmtu = SCTP_DEFAULT_MAXSEGMENT;
+               transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
 }
 
 /* Hold a reference to a transport.  */
@@ -368,7 +375,7 @@ void sctp_transport_raise_cwnd(struct sctp_transport *transport,
 
        ssthresh = transport->ssthresh;
        pba = transport->partial_bytes_acked;
-       pmtu = transport->asoc->pmtu;
+       pmtu = transport->asoc->pathmtu;
 
        if (cwnd <= ssthresh) {
                /* RFC 2960 7.2.1, sctpimpguide-05 2.14.2 When cwnd is less
@@ -440,8 +447,8 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
                 *      partial_bytes_acked = 0
                 */
                transport->ssthresh = max(transport->cwnd/2,
-                                         4*transport->asoc->pmtu);
-               transport->cwnd = transport->asoc->pmtu;
+                                         4*transport->asoc->pathmtu);
+               transport->cwnd = transport->asoc->pathmtu;
                break;
 
        case SCTP_LOWER_CWND_FAST_RTX:
@@ -458,7 +465,7 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
                 *      partial_bytes_acked = 0
                 */
                transport->ssthresh = max(transport->cwnd/2,
-                                         4*transport->asoc->pmtu);
+                                         4*transport->asoc->pathmtu);
                transport->cwnd = transport->ssthresh;
                break;
 
@@ -478,7 +485,7 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
                if ((jiffies - transport->last_time_ecne_reduced) >
                    transport->rtt) {
                        transport->ssthresh = max(transport->cwnd/2,
-                                                 4*transport->asoc->pmtu);
+                                                 4*transport->asoc->pathmtu);
                        transport->cwnd = transport->ssthresh;
                        transport->last_time_ecne_reduced = jiffies;
                }
@@ -495,7 +502,7 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
                 */
                if ((jiffies - transport->last_time_used) > transport->rto)
                        transport->cwnd = max(transport->cwnd/2,
-                                                4*transport->asoc->pmtu);
+                                                4*transport->asoc->pathmtu);
                break;
        };
 
@@ -510,7 +517,7 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
 unsigned long sctp_transport_timeout(struct sctp_transport *t)
 {
        unsigned long timeout;
-       timeout = t->hb_interval + t->rto + sctp_jitter(t->rto);
+       timeout = t->hbinterval + t->rto + sctp_jitter(t->rto);
        timeout += jiffies;
        return timeout;
 }
index 3145103cdf5471b1d688b0593e04237cadc5dd2e..06fa217f58a99cb93b72b28ca99e85b7dc3739cd 100644 (file)
@@ -640,154 +640,150 @@ static void sock_aio_dtor(struct kiocb *iocb)
        kfree(iocb->private);
 }
 
-/*
- *     Read data from a socket. ubuf is a user mode pointer. We make sure the user
- *     area ubuf...ubuf+size-1 is writable before asking the protocol.
- */
-
-static ssize_t sock_aio_read(struct kiocb *iocb, char __user *ubuf,
-                        size_t size, loff_t pos)
+static ssize_t sock_sendpage(struct file *file, struct page *page,
+                            int offset, size_t size, loff_t *ppos, int more)
 {
-       struct sock_iocb *x, siocb;
        struct socket *sock;
        int flags;
 
-       if (pos != 0)
-               return -ESPIPE;
-       if (size==0)            /* Match SYS5 behaviour */
-               return 0;
+       sock = file->private_data;
 
-       if (is_sync_kiocb(iocb))
-               x = &siocb;
-       else {
-               x = kmalloc(sizeof(struct sock_iocb), GFP_KERNEL);
-               if (!x)
-                       return -ENOMEM;
+       flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
+       if (more)
+               flags |= MSG_MORE;
+
+       return sock->ops->sendpage(sock, page, offset, size, flags);
+}
+
+static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb,
+               char __user *ubuf, size_t size, struct sock_iocb *siocb)
+{
+       if (!is_sync_kiocb(iocb)) {
+               siocb = kmalloc(sizeof(*siocb), GFP_KERNEL);
+               if (!siocb)
+                       return NULL;
                iocb->ki_dtor = sock_aio_dtor;
        }
-       iocb->private = x;
-       x->kiocb = iocb;
-       sock = iocb->ki_filp->private_data; 
 
-       x->async_msg.msg_name = NULL;
-       x->async_msg.msg_namelen = 0;
-       x->async_msg.msg_iov = &x->async_iov;
-       x->async_msg.msg_iovlen = 1;
-       x->async_msg.msg_control = NULL;
-       x->async_msg.msg_controllen = 0;
-       x->async_iov.iov_base = ubuf;
-       x->async_iov.iov_len = size;
-       flags = !(iocb->ki_filp->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
+       siocb->kiocb = iocb;
+       siocb->async_iov.iov_base = ubuf;
+       siocb->async_iov.iov_len = size;
 
-       return __sock_recvmsg(iocb, sock, &x->async_msg, size, flags);
+       iocb->private = siocb;
+       return siocb;
 }
 
+static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
+               struct file *file, struct iovec *iov, unsigned long nr_segs)
+{
+       struct socket *sock = file->private_data;
+       size_t size = 0;
+       int i;
 
-/*
- *     Write data to a socket. We verify that the user area ubuf..ubuf+size-1
- *     is readable by the user process.
- */
+        for (i = 0 ; i < nr_segs ; i++)
+                size += iov[i].iov_len;
 
-static ssize_t sock_aio_write(struct kiocb *iocb, const char __user *ubuf,
-                         size_t size, loff_t pos)
+       msg->msg_name = NULL;
+       msg->msg_namelen = 0;
+       msg->msg_control = NULL;
+       msg->msg_controllen = 0;
+       msg->msg_iov = (struct iovec *) iov;
+       msg->msg_iovlen = nr_segs;
+       msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
+
+       return __sock_recvmsg(iocb, sock, msg, size, msg->msg_flags);
+}
+
+static ssize_t sock_readv(struct file *file, const struct iovec *iov,
+                         unsigned long nr_segs, loff_t *ppos)
 {
-       struct sock_iocb *x, siocb;
-       struct socket *sock;
-       
+       struct kiocb iocb;
+       struct sock_iocb siocb;
+       struct msghdr msg;
+       int ret;
+
+        init_sync_kiocb(&iocb, NULL);
+       iocb.private = &siocb;
+
+       ret = do_sock_read(&msg, &iocb, file, (struct iovec *)iov, nr_segs);
+       if (-EIOCBQUEUED == ret)
+               ret = wait_on_sync_kiocb(&iocb);
+       return ret;
+}
+
+static ssize_t sock_aio_read(struct kiocb *iocb, char __user *ubuf,
+                        size_t count, loff_t pos)
+{
+       struct sock_iocb siocb, *x;
+
        if (pos != 0)
                return -ESPIPE;
-       if(size==0)             /* Match SYS5 behaviour */
+       if (count == 0)         /* Match SYS5 behaviour */
                return 0;
 
-       if (is_sync_kiocb(iocb))
-               x = &siocb;
-       else {
-               x = kmalloc(sizeof(struct sock_iocb), GFP_KERNEL);
-               if (!x)
-                       return -ENOMEM;
-               iocb->ki_dtor = sock_aio_dtor;
-       }
-       iocb->private = x;
-       x->kiocb = iocb;
-       sock = iocb->ki_filp->private_data; 
-
-       x->async_msg.msg_name = NULL;
-       x->async_msg.msg_namelen = 0;
-       x->async_msg.msg_iov = &x->async_iov;
-       x->async_msg.msg_iovlen = 1;
-       x->async_msg.msg_control = NULL;
-       x->async_msg.msg_controllen = 0;
-       x->async_msg.msg_flags = !(iocb->ki_filp->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
-       if (sock->type == SOCK_SEQPACKET)
-               x->async_msg.msg_flags |= MSG_EOR;
-       x->async_iov.iov_base = (void __user *)ubuf;
-       x->async_iov.iov_len = size;
-       
-       return __sock_sendmsg(iocb, sock, &x->async_msg, size);
+       x = alloc_sock_iocb(iocb, ubuf, count, &siocb);
+       if (!x)
+               return -ENOMEM;
+       return do_sock_read(&x->async_msg, iocb, iocb->ki_filp,
+                       &x->async_iov, 1);
 }
 
-static ssize_t sock_sendpage(struct file *file, struct page *page,
-                            int offset, size_t size, loff_t *ppos, int more)
+static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
+               struct file *file, struct iovec *iov, unsigned long nr_segs)
 {
-       struct socket *sock;
-       int flags;
+       struct socket *sock = file->private_data;
+       size_t size = 0;
+       int i;
 
-       sock = file->private_data;
+        for (i = 0 ; i < nr_segs ; i++)
+                size += iov[i].iov_len;
 
-       flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
-       if (more)
-               flags |= MSG_MORE;
+       msg->msg_name = NULL;
+       msg->msg_namelen = 0;
+       msg->msg_control = NULL;
+       msg->msg_controllen = 0;
+       msg->msg_iov = (struct iovec *) iov;
+       msg->msg_iovlen = nr_segs;
+       msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
+       if (sock->type == SOCK_SEQPACKET)
+               msg->msg_flags |= MSG_EOR;
 
-       return sock->ops->sendpage(sock, page, offset, size, flags);
+       return __sock_sendmsg(iocb, sock, msg, size);
 }
 
-static int sock_readv_writev(int type,
-                            struct file * file, const struct iovec * iov,
-                            long count, size_t size)
+static ssize_t sock_writev(struct file *file, const struct iovec *iov,
+                          unsigned long nr_segs, loff_t *ppos)
 {
        struct msghdr msg;
-       struct socket *sock;
+       struct kiocb iocb;
+       struct sock_iocb siocb;
+       int ret;
 
-       sock = file->private_data;
+       init_sync_kiocb(&iocb, NULL);
+       iocb.private = &siocb;
 
-       msg.msg_name = NULL;
-       msg.msg_namelen = 0;
-       msg.msg_control = NULL;
-       msg.msg_controllen = 0;
-       msg.msg_iov = (struct iovec *) iov;
-       msg.msg_iovlen = count;
-       msg.msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
+       ret = do_sock_write(&msg, &iocb, file, (struct iovec *)iov, nr_segs);
+       if (-EIOCBQUEUED == ret)
+               ret = wait_on_sync_kiocb(&iocb);
+       return ret;
+}
 
-       /* read() does a VERIFY_WRITE */
-       if (type == VERIFY_WRITE)
-               return sock_recvmsg(sock, &msg, size, msg.msg_flags);
+static ssize_t sock_aio_write(struct kiocb *iocb, const char __user *ubuf,
+                         size_t count, loff_t pos)
+{
+       struct sock_iocb siocb, *x;
 
-       if (sock->type == SOCK_SEQPACKET)
-               msg.msg_flags |= MSG_EOR;
+       if (pos != 0)
+               return -ESPIPE;
+       if (count == 0)         /* Match SYS5 behaviour */
+               return 0;
 
-       return sock_sendmsg(sock, &msg, size);
-}
+       x = alloc_sock_iocb(iocb, (void __user *)ubuf, count, &siocb);
+       if (!x)
+               return -ENOMEM;
 
-static ssize_t sock_readv(struct file *file, const struct iovec *vector,
-                         unsigned long count, loff_t *ppos)
-{
-       size_t tot_len = 0;
-       int i;
-        for (i = 0 ; i < count ; i++)
-                tot_len += vector[i].iov_len;
-       return sock_readv_writev(VERIFY_WRITE,
-                                file, vector, count, tot_len);
-}
-       
-static ssize_t sock_writev(struct file *file, const struct iovec *vector,
-                          unsigned long count, loff_t *ppos)
-{
-       size_t tot_len = 0;
-       int i;
-        for (i = 0 ; i < count ; i++)
-                tot_len += vector[i].iov_len;
-       return sock_readv_writev(VERIFY_READ,
-                                file, vector, count, tot_len);
+       return do_sock_write(&x->async_msg, iocb, iocb->ki_filp,
+                       &x->async_iov, 1);
 }
 
 
@@ -904,6 +900,13 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
                        break;
                default:
                        err = sock->ops->ioctl(sock, cmd, arg);
+
+                       /*
+                        * If this ioctl is unknown try to hand it down
+                        * to the NIC driver.
+                        */
+                       if (err == -ENOIOCTLCMD)
+                               err = dev_ioctl(cmd, argp);
                        break;
        }
        return err;
@@ -2036,7 +2039,7 @@ int sock_unregister(int family)
        return 0;
 }
 
-void __init sock_init(void)
+static int __init sock_init(void)
 {
        /*
         *      Initialize sock SLAB cache.
@@ -2044,12 +2047,10 @@ void __init sock_init(void)
         
        sk_init();
 
-#ifdef SLAB_SKB
        /*
         *      Initialize skbuff SLAB cache 
         */
        skb_init();
-#endif
 
        /*
         *      Initialize the protocols module. 
@@ -2058,15 +2059,19 @@ void __init sock_init(void)
        init_inodecache();
        register_filesystem(&sock_fs_type);
        sock_mnt = kern_mount(&sock_fs_type);
-       /* The real protocol initialization is performed when
-        *  do_initcalls is run.  
+
+       /* The real protocol initialization is performed in later initcalls.
         */
 
 #ifdef CONFIG_NETFILTER
        netfilter_init();
 #endif
+
+       return 0;
 }
 
+core_initcall(sock_init);      /* early initcall */
+
 #ifdef CONFIG_PROC_FS
 void socket_seq_show(struct seq_file *seq)
 {
index f44f46f1d8e053c0d330b442c2f3788cf4073dd4..8d782282ec194c6f682fd71b2a100c25141c45c0 100644 (file)
@@ -638,7 +638,7 @@ gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)
                                gss_msg);
                atomic_inc(&gss_msg->count);
                gss_unhash_msg(gss_msg);
-               if (msg->errno == -ETIMEDOUT || msg->errno == -EPIPE) {
+               if (msg->errno == -ETIMEDOUT) {
                        unsigned long now = jiffies;
                        if (time_after(now, ratelimit)) {
                                printk(KERN_WARNING "RPC: AUTH_GSS upcall timed out.\n"
@@ -786,7 +786,9 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int taskflags)
        cred->gc_flags = 0;
        cred->gc_base.cr_ops = &gss_credops;
        cred->gc_service = gss_auth->service;
-       err = gss_create_upcall(gss_auth, cred);
+       do {
+               err = gss_create_upcall(gss_auth, cred);
+       } while (err == -EAGAIN);
        if (err < 0)
                goto out_err;
 
index 81e00a6c19def97230e09f0302029c5ef04f82e9..16a2458f38f7055d889548289945cae243c5d844 100644 (file)
@@ -39,23 +39,26 @@ static kmem_cache_t *rpc_inode_cachep __read_mostly;
 #define RPC_UPCALL_TIMEOUT (30*HZ)
 
 static void
-__rpc_purge_upcall(struct inode *inode, int err)
+__rpc_purge_list(struct rpc_inode *rpci, struct list_head *head, int err)
 {
-       struct rpc_inode *rpci = RPC_I(inode);
        struct rpc_pipe_msg *msg;
+       void (*destroy_msg)(struct rpc_pipe_msg *);
 
-       while (!list_empty(&rpci->pipe)) {
-               msg = list_entry(rpci->pipe.next, struct rpc_pipe_msg, list);
-               list_del_init(&msg->list);
-               msg->errno = err;
-               rpci->ops->destroy_msg(msg);
-       }
-       while (!list_empty(&rpci->in_upcall)) {
-               msg = list_entry(rpci->pipe.next, struct rpc_pipe_msg, list);
+       destroy_msg = rpci->ops->destroy_msg;
+       while (!list_empty(head)) {
+               msg = list_entry(head->next, struct rpc_pipe_msg, list);
                list_del_init(&msg->list);
                msg->errno = err;
-               rpci->ops->destroy_msg(msg);
+               destroy_msg(msg);
        }
+}
+
+static void
+__rpc_purge_upcall(struct inode *inode, int err)
+{
+       struct rpc_inode *rpci = RPC_I(inode);
+
+       __rpc_purge_list(rpci, &rpci->pipe, err);
        rpci->pipelen = 0;
        wake_up(&rpci->waitq);
 }
@@ -115,6 +118,7 @@ rpc_close_pipes(struct inode *inode)
        down(&inode->i_sem);
        if (rpci->ops != NULL) {
                rpci->nreaders = 0;
+               __rpc_purge_list(rpci, &rpci->in_upcall, -EPIPE);
                __rpc_purge_upcall(inode, -EPIPE);
                rpci->nwriters = 0;
                if (rpci->ops->release_pipe)
@@ -170,7 +174,7 @@ rpc_pipe_release(struct inode *inode, struct file *filp)
                goto out;
        msg = (struct rpc_pipe_msg *)filp->private_data;
        if (msg != NULL) {
-               msg->errno = -EPIPE;
+               msg->errno = -EAGAIN;
                list_del_init(&msg->list);
                rpci->ops->destroy_msg(msg);
        }
@@ -179,7 +183,7 @@ rpc_pipe_release(struct inode *inode, struct file *filp)
        if (filp->f_mode & FMODE_READ)
                rpci->nreaders --;
        if (!rpci->nreaders)
-               __rpc_purge_upcall(inode, -EPIPE);
+               __rpc_purge_upcall(inode, -EAGAIN);
        if (rpci->ops->release_pipe)
                rpci->ops->release_pipe(inode);
 out:
index c6a51911e71e082a232f73444b3c36deb42a0d08..d68eba481291fd1bb1467c0c526e7f3e0e445b49 100644 (file)
@@ -758,7 +758,7 @@ svc_tcp_accept(struct svc_sock *svsk)
        struct svc_serv *serv = svsk->sk_server;
        struct socket   *sock = svsk->sk_sock;
        struct socket   *newsock;
-       struct proto_ops *ops;
+       const struct proto_ops *ops;
        struct svc_sock *newsvsk;
        int             err, slen;
 
index 0a51fd46a848d03d81a57b81383d0309d7f4fa30..77e8800d412799c088bb14d25538093216e27232 100644 (file)
@@ -990,6 +990,7 @@ static void xs_udp_connect_worker(void *args)
                sk->sk_data_ready = xs_udp_data_ready;
                sk->sk_write_space = xs_udp_write_space;
                sk->sk_no_check = UDP_CSUM_NORCV;
+               sk->sk_allocation = GFP_ATOMIC;
 
                xprt_set_connected(xprt);
 
@@ -1074,6 +1075,7 @@ static void xs_tcp_connect_worker(void *args)
                sk->sk_data_ready = xs_tcp_data_ready;
                sk->sk_state_change = xs_tcp_state_change;
                sk->sk_write_space = xs_tcp_write_space;
+               sk->sk_allocation = GFP_ATOMIC;
 
                /* socket options */
                sk->sk_userlocks |= SOCK_BINDPORT_LOCK;
index acc73ba8bade52770d1babc0bbf19e8abfe1cbef..5f6ae79b8b1627db8a71be971712b2a6ace18de4 100644 (file)
 int sysctl_unix_max_dgram_qlen = 10;
 
 struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1];
-DEFINE_RWLOCK(unix_table_lock);
+DEFINE_SPINLOCK(unix_table_lock);
 static atomic_t unix_nr_socks = ATOMIC_INIT(0);
 
 #define unix_sockets_unbound   (&unix_socket_table[UNIX_HASH_SIZE])
@@ -130,7 +130,7 @@ static atomic_t unix_nr_socks = ATOMIC_INIT(0);
 
 /*
  *  SMP locking strategy:
- *    hash table is protected with rwlock unix_table_lock
+ *    hash table is protected with spinlock unix_table_lock
  *    each socket state is protected by separate rwlock.
  */
 
@@ -214,16 +214,16 @@ static void __unix_insert_socket(struct hlist_head *list, struct sock *sk)
 
 static inline void unix_remove_socket(struct sock *sk)
 {
-       write_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
        __unix_remove_socket(sk);
-       write_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
 }
 
 static inline void unix_insert_socket(struct hlist_head *list, struct sock *sk)
 {
-       write_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
        __unix_insert_socket(list, sk);
-       write_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
 }
 
 static struct sock *__unix_find_socket_byname(struct sockaddr_un *sunname,
@@ -250,11 +250,11 @@ static inline struct sock *unix_find_socket_byname(struct sockaddr_un *sunname,
 {
        struct sock *s;
 
-       read_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
        s = __unix_find_socket_byname(sunname, len, type, hash);
        if (s)
                sock_hold(s);
-       read_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
        return s;
 }
 
@@ -263,7 +263,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i)
        struct sock *s;
        struct hlist_node *node;
 
-       read_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
        sk_for_each(s, node,
                    &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) {
                struct dentry *dentry = unix_sk(s)->dentry;
@@ -276,7 +276,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i)
        }
        s = NULL;
 found:
-       read_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
        return s;
 }
 
@@ -473,7 +473,7 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *,
 static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
                                  struct msghdr *, size_t);
 
-static struct proto_ops unix_stream_ops = {
+static const struct proto_ops unix_stream_ops = {
        .family =       PF_UNIX,
        .owner =        THIS_MODULE,
        .release =      unix_release,
@@ -494,7 +494,7 @@ static struct proto_ops unix_stream_ops = {
        .sendpage =     sock_no_sendpage,
 };
 
-static struct proto_ops unix_dgram_ops = {
+static const struct proto_ops unix_dgram_ops = {
        .family =       PF_UNIX,
        .owner =        THIS_MODULE,
        .release =      unix_release,
@@ -515,7 +515,7 @@ static struct proto_ops unix_dgram_ops = {
        .sendpage =     sock_no_sendpage,
 };
 
-static struct proto_ops unix_seqpacket_ops = {
+static const struct proto_ops unix_seqpacket_ops = {
        .family =       PF_UNIX,
        .owner =        THIS_MODULE,
        .release =      unix_release,
@@ -564,7 +564,7 @@ static struct sock * unix_create1(struct socket *sock)
        u         = unix_sk(sk);
        u->dentry = NULL;
        u->mnt    = NULL;
-       rwlock_init(&u->lock);
+       spin_lock_init(&u->lock);
        atomic_set(&u->inflight, sock ? 0 : -1);
        init_MUTEX(&u->readsem); /* single task reading lock */
        init_waitqueue_head(&u->peer_wait);
@@ -642,12 +642,12 @@ retry:
        addr->len = sprintf(addr->name->sun_path+1, "%05x", ordernum) + 1 + sizeof(short);
        addr->hash = unix_hash_fold(csum_partial((void*)addr->name, addr->len, 0));
 
-       write_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
        ordernum = (ordernum+1)&0xFFFFF;
 
        if (__unix_find_socket_byname(addr->name, addr->len, sock->type,
                                      addr->hash)) {
-               write_unlock(&unix_table_lock);
+               spin_unlock(&unix_table_lock);
                /* Sanity yield. It is unusual case, but yet... */
                if (!(ordernum&0xFF))
                        yield();
@@ -658,7 +658,7 @@ retry:
        __unix_remove_socket(sk);
        u->addr = addr;
        __unix_insert_socket(&unix_socket_table[addr->hash], sk);
-       write_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
        err = 0;
 
 out:   up(&u->readsem);
@@ -791,7 +791,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                addr->hash = UNIX_HASH_SIZE;
        }
 
-       write_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
 
        if (!sunaddr->sun_path[0]) {
                err = -EADDRINUSE;
@@ -814,7 +814,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        __unix_insert_socket(list, sk);
 
 out_unlock:
-       write_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
 out_up:
        up(&u->readsem);
 out:
@@ -1063,10 +1063,12 @@ restart:
        /* Set credentials */
        sk->sk_peercred = other->sk_peercred;
 
-       sock_hold(newsk);
-       unix_peer(sk)   = newsk;
        sock->state     = SS_CONNECTED;
        sk->sk_state    = TCP_ESTABLISHED;
+       sock_hold(newsk);
+
+       smp_mb__after_atomic_inc();     /* sock_hold() does an atomic_inc() */
+       unix_peer(sk)   = newsk;
 
        unix_state_wunlock(sk);
 
@@ -1414,7 +1416,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
        } else {
                sunaddr = NULL;
                err = -ENOTCONN;
-               other = unix_peer_get(sk);
+               other = unix_peer(sk);
                if (!other)
                        goto out_err;
        }
@@ -1476,7 +1478,6 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
                other->sk_data_ready(other, size);
                sent+=size;
        }
-       sock_put(other);
 
        scm_destroy(siocb->scm);
        siocb->scm = NULL;
@@ -1491,8 +1492,6 @@ pipe_err:
                send_sig(SIGPIPE,current,0);
        err = -EPIPE;
 out_err:
-        if (other)
-               sock_put(other);
        scm_destroy(siocb->scm);
        siocb->scm = NULL;
        return sent ? : err;
@@ -1860,7 +1859,7 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                }
 
                default:
-                       err = dev_ioctl(cmd, (void __user *)arg);
+                       err = -ENOIOCTLCMD;
                        break;
        }
        return err;
@@ -1917,7 +1916,7 @@ static struct sock *unix_seq_idx(int *iter, loff_t pos)
 
 static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
 {
-       read_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
        return *pos ? unix_seq_idx(seq->private, *pos - 1) : ((void *) 1);
 }
 
@@ -1932,7 +1931,7 @@ static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
 static void unix_seq_stop(struct seq_file *seq, void *v)
 {
-       read_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
 }
 
 static int unix_seq_show(struct seq_file *seq, void *v)
index 6ffc64e1712d291f40723109db1a774e507c738c..411802bd4d37e604fe7a337bff2c7becaf84fccb 100644 (file)
@@ -182,7 +182,7 @@ void unix_gc(void)
        if (down_trylock(&unix_gc_sem))
                return;
 
-       read_lock(&unix_table_lock);
+       spin_lock(&unix_table_lock);
 
        forall_unix_sockets(i, s)
        {
@@ -301,7 +301,7 @@ void unix_gc(void)
                }
                u->gc_tree = GC_ORPHAN;
        }
-       read_unlock(&unix_table_lock);
+       spin_unlock(&unix_table_lock);
 
        /*
         *      Here we are. Hitlist is filled. Die.
index 59fec59b2132df1ab43e782d2a469a84bf373dd0..7a43ae4721edd95fd6748974f68b8cf40c2f5e7b 100644 (file)
@@ -181,7 +181,7 @@ struct wanpipe_opt
 #endif
 
 static int sk_count;
-extern struct proto_ops wanpipe_ops;
+extern const struct proto_ops wanpipe_ops;
 static unsigned long find_free_critical;
 
 static void wanpipe_unlink_driver(struct sock *sk);
@@ -1839,7 +1839,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
 #endif
 
                default:
-                       return dev_ioctl(cmd,(void __user *) arg);
+                       return -ENOIOCTLCMD;
        }
        /*NOTREACHED*/
 }
@@ -2546,7 +2546,7 @@ static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr
        return 0;
 }
 
-struct proto_ops wanpipe_ops = {
+const struct proto_ops wanpipe_ops = {
        .family =       PF_WANPIPE,
        .owner =        THIS_MODULE,
        .release =      wanpipe_release,
index 020d73cc8414916f6a0bf65b2fbe675ec5759ead..16459c7f54b2c71123cbcd05fd49f8ad0d786de5 100644 (file)
@@ -64,7 +64,7 @@ int sysctl_x25_ack_holdback_timeout    = X25_DEFAULT_T2;
 HLIST_HEAD(x25_list);
 DEFINE_RWLOCK(x25_list_lock);
 
-static struct proto_ops x25_proto_ops;
+static const struct proto_ops x25_proto_ops;
 
 static struct x25_address null_x25_address = {"               "};
 
@@ -1378,7 +1378,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                }
 
                default:
-                       rc = dev_ioctl(cmd, argp);
+                       rc = -ENOIOCTLCMD;
                        break;
        }
 
@@ -1391,7 +1391,7 @@ static struct net_proto_family x25_family_ops = {
        .owner  =       THIS_MODULE,
 };
 
-static struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = {
+static const struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = {
        .family =       AF_X25,
        .owner =        THIS_MODULE,
        .release =      x25_release,
index 0db9e57013fdfaf738b608d688ea44b1d5e7cfe6..64a447375fdb7a976e4fabe58da292d3c5817d31 100644 (file)
@@ -10,7 +10,7 @@
  *     YOSHIFUJI Hideaki
  *             Split up af-specific portion
  *     Derek Atkins <derek@ihtfp.com>          Add the post_input processor
- *     
+ *
  */
 
 #include <asm/bug.h>
@@ -256,6 +256,7 @@ void __xfrm_policy_destroy(struct xfrm_policy *policy)
        if (del_timer(&policy->timer))
                BUG();
 
+       security_xfrm_policy_free(policy);
        kfree(policy);
 }
 EXPORT_SYMBOL(__xfrm_policy_destroy);
@@ -346,10 +347,12 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl)
        struct xfrm_policy *pol, **p;
        struct xfrm_policy *delpol = NULL;
        struct xfrm_policy **newpos = NULL;
+       struct dst_entry *gc_list;
 
        write_lock_bh(&xfrm_policy_lock);
        for (p = &xfrm_policy_list[dir]; (pol=*p)!=NULL;) {
-               if (!delpol && memcmp(&policy->selector, &pol->selector, sizeof(pol->selector)) == 0) {
+               if (!delpol && memcmp(&policy->selector, &pol->selector, sizeof(pol->selector)) == 0 &&
+                   xfrm_sec_ctx_match(pol->security, policy->security)) {
                        if (excl) {
                                write_unlock_bh(&xfrm_policy_lock);
                                return -EEXIST;
@@ -381,21 +384,49 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl)
                xfrm_pol_hold(policy);
        write_unlock_bh(&xfrm_policy_lock);
 
-       if (delpol) {
+       if (delpol)
                xfrm_policy_kill(delpol);
+
+       read_lock_bh(&xfrm_policy_lock);
+       gc_list = NULL;
+       for (policy = policy->next; policy; policy = policy->next) {
+               struct dst_entry *dst;
+
+               write_lock(&policy->lock);
+               dst = policy->bundles;
+               if (dst) {
+                       struct dst_entry *tail = dst;
+                       while (tail->next)
+                               tail = tail->next;
+                       tail->next = gc_list;
+                       gc_list = dst;
+
+                       policy->bundles = NULL;
+               }
+               write_unlock(&policy->lock);
+       }
+       read_unlock_bh(&xfrm_policy_lock);
+
+       while (gc_list) {
+               struct dst_entry *dst = gc_list;
+
+               gc_list = dst->next;
+               dst_free(dst);
        }
+
        return 0;
 }
 EXPORT_SYMBOL(xfrm_policy_insert);
 
-struct xfrm_policy *xfrm_policy_bysel(int dir, struct xfrm_selector *sel,
-                                     int delete)
+struct xfrm_policy *xfrm_policy_bysel_ctx(int dir, struct xfrm_selector *sel,
+                                         struct xfrm_sec_ctx *ctx, int delete)
 {
        struct xfrm_policy *pol, **p;
 
        write_lock_bh(&xfrm_policy_lock);
        for (p = &xfrm_policy_list[dir]; (pol=*p)!=NULL; p = &pol->next) {
-               if (memcmp(sel, &pol->selector, sizeof(*sel)) == 0) {
+               if ((memcmp(sel, &pol->selector, sizeof(*sel)) == 0) &&
+                   (xfrm_sec_ctx_match(ctx, pol->security))) {
                        xfrm_pol_hold(pol);
                        if (delete)
                                *p = pol->next;
@@ -410,7 +441,7 @@ struct xfrm_policy *xfrm_policy_bysel(int dir, struct xfrm_selector *sel,
        }
        return pol;
 }
-EXPORT_SYMBOL(xfrm_policy_bysel);
+EXPORT_SYMBOL(xfrm_policy_bysel_ctx);
 
 struct xfrm_policy *xfrm_policy_byid(int dir, u32 id, int delete)
 {
@@ -491,7 +522,7 @@ EXPORT_SYMBOL(xfrm_policy_walk);
 
 /* Find policy to apply to this flow. */
 
-static void xfrm_policy_lookup(struct flowi *fl, u16 family, u8 dir,
+static void xfrm_policy_lookup(struct flowi *fl, u32 sk_sid, u16 family, u8 dir,
                               void **objp, atomic_t **obj_refp)
 {
        struct xfrm_policy *pol;
@@ -505,9 +536,12 @@ static void xfrm_policy_lookup(struct flowi *fl, u16 family, u8 dir,
                        continue;
 
                match = xfrm_selector_match(sel, fl, family);
+
                if (match) {
-                       xfrm_pol_hold(pol);
-                       break;
+                       if (!security_xfrm_policy_lookup(pol, sk_sid, dir)) {
+                               xfrm_pol_hold(pol);
+                               break;
+                       }
                }
        }
        read_unlock_bh(&xfrm_policy_lock);
@@ -515,15 +549,37 @@ static void xfrm_policy_lookup(struct flowi *fl, u16 family, u8 dir,
                *obj_refp = &pol->refcnt;
 }
 
-static struct xfrm_policy *xfrm_sk_policy_lookup(struct sock *sk, int dir, struct flowi *fl)
+static inline int policy_to_flow_dir(int dir)
+{
+       if (XFRM_POLICY_IN == FLOW_DIR_IN &&
+           XFRM_POLICY_OUT == FLOW_DIR_OUT &&
+           XFRM_POLICY_FWD == FLOW_DIR_FWD)
+               return dir;
+       switch (dir) {
+       default:
+       case XFRM_POLICY_IN:
+               return FLOW_DIR_IN;
+       case XFRM_POLICY_OUT:
+               return FLOW_DIR_OUT;
+       case XFRM_POLICY_FWD:
+               return FLOW_DIR_FWD;
+       };
+}
+
+static struct xfrm_policy *xfrm_sk_policy_lookup(struct sock *sk, int dir, struct flowi *fl, u32 sk_sid)
 {
        struct xfrm_policy *pol;
 
        read_lock_bh(&xfrm_policy_lock);
        if ((pol = sk->sk_policy[dir]) != NULL) {
-               int match = xfrm_selector_match(&pol->selector, fl,
+               int match = xfrm_selector_match(&pol->selector, fl,
                                                sk->sk_family);
+               int err = 0;
+
                if (match)
+                 err = security_xfrm_policy_lookup(pol, sk_sid, policy_to_flow_dir(dir));
+
+               if (match && !err)
                        xfrm_pol_hold(pol);
                else
                        pol = NULL;
@@ -596,6 +652,10 @@ static struct xfrm_policy *clone_policy(struct xfrm_policy *old, int dir)
 
        if (newp) {
                newp->selector = old->selector;
+               if (security_xfrm_policy_clone(old, newp)) {
+                       kfree(newp);
+                       return NULL;  /* ENOMEM */
+               }
                newp->lft = old->lft;
                newp->curlft = old->curlft;
                newp->action = old->action;
@@ -707,22 +767,6 @@ xfrm_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int nx,
        return err;
 }
 
-static inline int policy_to_flow_dir(int dir)
-{
-       if (XFRM_POLICY_IN == FLOW_DIR_IN &&
-           XFRM_POLICY_OUT == FLOW_DIR_OUT &&
-           XFRM_POLICY_FWD == FLOW_DIR_FWD)
-               return dir;
-       switch (dir) {
-       default:
-       case XFRM_POLICY_IN:
-               return FLOW_DIR_IN;
-       case XFRM_POLICY_OUT:
-               return FLOW_DIR_OUT;
-       case XFRM_POLICY_FWD:
-               return FLOW_DIR_FWD;
-       };
-}
 
 static int stale_bundle(struct dst_entry *dst);
 
@@ -741,19 +785,20 @@ int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,
        int err;
        u32 genid;
        u16 family = dst_orig->ops->family;
+       u8 dir = policy_to_flow_dir(XFRM_POLICY_OUT);
+       u32 sk_sid = security_sk_sid(sk, fl, dir);
 restart:
        genid = atomic_read(&flow_cache_genid);
        policy = NULL;
        if (sk && sk->sk_policy[1])
-               policy = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl);
+               policy = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl, sk_sid);
 
        if (!policy) {
                /* To accelerate a bit...  */
                if ((dst_orig->flags & DST_NOXFRM) || !xfrm_policy_list[XFRM_POLICY_OUT])
                        return 0;
 
-               policy = flow_cache_lookup(fl, family,
-                                          policy_to_flow_dir(XFRM_POLICY_OUT),
+               policy = flow_cache_lookup(fl, sk_sid, family, dir,
                                           xfrm_policy_lookup);
        }
 
@@ -934,16 +979,20 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
 {
        struct xfrm_policy *pol;
        struct flowi fl;
+       u8 fl_dir = policy_to_flow_dir(dir);
+       u32 sk_sid;
 
        if (_decode_session(skb, &fl, family) < 0)
                return 0;
 
+       sk_sid = security_sk_sid(sk, &fl, fl_dir);
+
        /* First, check used SA against their selectors. */
        if (skb->sp) {
                int i;
 
                for (i=skb->sp->len-1; i>=0; i--) {
-                 struct sec_decap_state *xvec = &(skb->sp->x[i]);
+                       struct sec_decap_state *xvec = &(skb->sp->x[i]);
                        if (!xfrm_selector_match(&xvec->xvec->sel, &fl, family))
                                return 0;
 
@@ -958,11 +1007,10 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
 
        pol = NULL;
        if (sk && sk->sk_policy[dir])
-               pol = xfrm_sk_policy_lookup(sk, dir, &fl);
+               pol = xfrm_sk_policy_lookup(sk, dir, &fl, sk_sid);
 
        if (!pol)
-               pol = flow_cache_lookup(&fl, family,
-                                       policy_to_flow_dir(dir),
+               pol = flow_cache_lookup(&fl, sk_sid, family, fl_dir,
                                        xfrm_policy_lookup);
 
        if (!pol)
@@ -1014,13 +1062,12 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family)
 }
 EXPORT_SYMBOL(__xfrm_route_forward);
 
-/* Optimize later using cookies and generation ids. */
-
 static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
 {
-       if (!stale_bundle(dst))
-               return dst;
-
+       /* If it is marked obsolete, which is how we even get here,
+        * then we have purged it from the policy bundle list and we
+        * did that for a good reason.
+        */
        return NULL;
 }
 
@@ -1104,6 +1151,16 @@ int xfrm_flush_bundles(void)
        return 0;
 }
 
+static int always_true(struct dst_entry *dst)
+{
+       return 1;
+}
+
+void xfrm_flush_all_bundles(void)
+{
+       xfrm_prune_bundles(always_true);
+}
+
 void xfrm_init_pmtu(struct dst_entry *dst)
 {
        do {
index 7cf48aa6c95bdb48a9438c6c4a3159fefe403869..e12d0be5f9762f7fe595c6645a1d1f34dffeaac8 100644 (file)
@@ -10,7 +10,7 @@
  *             Split up af-specific functions
  *     Derek Atkins <derek@ihtfp.com>
  *             Add UDP Encapsulation
- *     
+ *
  */
 
 #include <linux/workqueue.h>
@@ -70,6 +70,7 @@ static void xfrm_state_gc_destroy(struct xfrm_state *x)
                x->type->destructor(x);
                xfrm_put_type(x->type);
        }
+       security_xfrm_state_free(x);
        kfree(x);
 }
 
@@ -343,7 +344,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
                              selector.
                         */
                        if (x->km.state == XFRM_STATE_VALID) {
-                               if (!xfrm_selector_match(&x->sel, fl, family))
+                               if (!xfrm_selector_match(&x->sel, fl, family) ||
+                                   !xfrm_sec_ctx_match(pol->security, x->security))
                                        continue;
                                if (!best ||
                                    best->km.dying > x->km.dying ||
@@ -354,7 +356,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
                                acquire_in_progress = 1;
                        } else if (x->km.state == XFRM_STATE_ERROR ||
                                   x->km.state == XFRM_STATE_EXPIRED) {
-                               if (xfrm_selector_match(&x->sel, fl, family))
+                               if (xfrm_selector_match(&x->sel, fl, family) &&
+                                   xfrm_sec_ctx_match(pol->security, x->security))
                                        error = -ESRCH;
                        }
                }
@@ -431,6 +434,8 @@ void xfrm_state_insert(struct xfrm_state *x)
        spin_lock_bh(&xfrm_state_lock);
        __xfrm_state_insert(x);
        spin_unlock_bh(&xfrm_state_lock);
+
+       xfrm_flush_all_bundles();
 }
 EXPORT_SYMBOL(xfrm_state_insert);
 
@@ -478,6 +483,9 @@ out:
        spin_unlock_bh(&xfrm_state_lock);
        xfrm_state_put_afinfo(afinfo);
 
+       if (!err)
+               xfrm_flush_all_bundles();
+
        if (x1) {
                xfrm_state_delete(x1);
                xfrm_state_put(x1);
index 0cdd9a07e043714615a42d448bd79bbdf8eed514..92e2b804c6061a9442b951b99b0d99f8067a657a 100644 (file)
@@ -7,7 +7,7 @@
  *     Kazunori MIYAZAWA @USAGI
  *     Kunihiro Ishiguro <kunihiro@ipinfusion.com>
  *             IPv6 support
- *     
+ *
  */
 
 #include <linux/module.h>
@@ -88,6 +88,34 @@ static int verify_encap_tmpl(struct rtattr **xfrma)
        return 0;
 }
 
+
+static inline int verify_sec_ctx_len(struct rtattr **xfrma)
+{
+       struct rtattr *rt = xfrma[XFRMA_SEC_CTX - 1];
+       struct xfrm_user_sec_ctx *uctx;
+       int len = 0;
+
+       if (!rt)
+               return 0;
+
+       if (rt->rta_len < sizeof(*uctx))
+               return -EINVAL;
+
+       uctx = RTA_DATA(rt);
+
+       if (uctx->ctx_len > PAGE_SIZE)
+               return -EINVAL;
+
+       len += sizeof(struct xfrm_user_sec_ctx);
+       len += uctx->ctx_len;
+
+       if (uctx->len != len)
+               return -EINVAL;
+
+       return 0;
+}
+
+
 static int verify_newsa_info(struct xfrm_usersa_info *p,
                             struct rtattr **xfrma)
 {
@@ -145,6 +173,8 @@ static int verify_newsa_info(struct xfrm_usersa_info *p,
                goto out;
        if ((err = verify_encap_tmpl(xfrma)))
                goto out;
+       if ((err = verify_sec_ctx_len(xfrma)))
+               goto out;
 
        err = -EINVAL;
        switch (p->mode) {
@@ -209,6 +239,30 @@ static int attach_encap_tmpl(struct xfrm_encap_tmpl **encapp, struct rtattr *u_a
        return 0;
 }
 
+
+static inline int xfrm_user_sec_ctx_size(struct xfrm_policy *xp)
+{
+       struct xfrm_sec_ctx *xfrm_ctx = xp->security;
+       int len = 0;
+
+       if (xfrm_ctx) {
+               len += sizeof(struct xfrm_user_sec_ctx);
+               len += xfrm_ctx->ctx_len;
+       }
+       return len;
+}
+
+static int attach_sec_ctx(struct xfrm_state *x, struct rtattr *u_arg)
+{
+       struct xfrm_user_sec_ctx *uctx;
+
+       if (!u_arg)
+               return 0;
+
+       uctx = RTA_DATA(u_arg);
+       return security_xfrm_state_alloc(x, uctx);
+}
+
 static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p)
 {
        memcpy(&x->id, &p->id, sizeof(x->id));
@@ -253,6 +307,9 @@ static struct xfrm_state *xfrm_state_construct(struct xfrm_usersa_info *p,
        if (err)
                goto error;
 
+       if ((err = attach_sec_ctx(x, xfrma[XFRMA_SEC_CTX-1])))
+               goto error;
+
        x->km.seq = p->seq;
 
        return x;
@@ -272,11 +329,11 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
        int err;
        struct km_event c;
 
-       err = verify_newsa_info(p, (struct rtattr **) xfrma);
+       err = verify_newsa_info(p, (struct rtattr **)xfrma);
        if (err)
                return err;
 
-       x = xfrm_state_construct(p, (struct rtattr **) xfrma, &err);
+       x = xfrm_state_construct(p, (struct rtattr **)xfrma, &err);
        if (!x)
                return err;
 
@@ -390,6 +447,19 @@ static int dump_one_state(struct xfrm_state *x, int count, void *ptr)
        if (x->encap)
                RTA_PUT(skb, XFRMA_ENCAP, sizeof(*x->encap), x->encap);
 
+       if (x->security) {
+               int ctx_size = sizeof(struct xfrm_sec_ctx) +
+                               x->security->ctx_len;
+               struct rtattr *rt = __RTA_PUT(skb, XFRMA_SEC_CTX, ctx_size);
+               struct xfrm_user_sec_ctx *uctx = RTA_DATA(rt);
+
+               uctx->exttype = XFRMA_SEC_CTX;
+               uctx->len = ctx_size;
+               uctx->ctx_doi = x->security->ctx_doi;
+               uctx->ctx_alg = x->security->ctx_alg;
+               uctx->ctx_len = x->security->ctx_len;
+               memcpy(uctx + 1, x->security->ctx_str, x->security->ctx_len);
+       }
        nlh->nlmsg_len = skb->tail - b;
 out:
        sp->this_idx++;
@@ -603,6 +673,18 @@ static int verify_newpolicy_info(struct xfrm_userpolicy_info *p)
        return verify_policy_dir(p->dir);
 }
 
+static int copy_from_user_sec_ctx(struct xfrm_policy *pol, struct rtattr **xfrma)
+{
+       struct rtattr *rt = xfrma[XFRMA_SEC_CTX-1];
+       struct xfrm_user_sec_ctx *uctx;
+
+       if (!rt)
+               return 0;
+
+       uctx = RTA_DATA(rt);
+       return security_xfrm_policy_alloc(pol, uctx);
+}
+
 static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
                           int nr)
 {
@@ -681,7 +763,10 @@ static struct xfrm_policy *xfrm_policy_construct(struct xfrm_userpolicy_info *p,
        }
 
        copy_from_user_policy(xp, p);
-       err = copy_from_user_tmpl(xp, xfrma);
+
+       if (!(err = copy_from_user_tmpl(xp, xfrma)))
+               err = copy_from_user_sec_ctx(xp, xfrma);
+
        if (err) {
                *errp = err;
                kfree(xp);
@@ -700,10 +785,13 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
        int excl;
 
        err = verify_newpolicy_info(p);
+       if (err)
+               return err;
+       err = verify_sec_ctx_len((struct rtattr **)xfrma);
        if (err)
                return err;
 
-       xp = xfrm_policy_construct(p, (struct rtattr **) xfrma, &err);
+       xp = xfrm_policy_construct(p, (struct rtattr **)xfrma, &err);
        if (!xp)
                return err;
 
@@ -761,6 +849,27 @@ rtattr_failure:
        return -1;
 }
 
+static int copy_to_user_sec_ctx(struct xfrm_policy *xp, struct sk_buff *skb)
+{
+       if (xp->security) {
+               int ctx_size = sizeof(struct xfrm_sec_ctx) +
+                               xp->security->ctx_len;
+               struct rtattr *rt = __RTA_PUT(skb, XFRMA_SEC_CTX, ctx_size);
+               struct xfrm_user_sec_ctx *uctx = RTA_DATA(rt);
+
+               uctx->exttype = XFRMA_SEC_CTX;
+               uctx->len = ctx_size;
+               uctx->ctx_doi = xp->security->ctx_doi;
+               uctx->ctx_alg = xp->security->ctx_alg;
+               uctx->ctx_len = xp->security->ctx_len;
+               memcpy(uctx + 1, xp->security->ctx_str, xp->security->ctx_len);
+       }
+       return 0;
+
+ rtattr_failure:
+       return -1;
+}
+
 static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr)
 {
        struct xfrm_dump_info *sp = ptr;
@@ -782,6 +891,8 @@ static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr
        copy_to_user_policy(xp, p, dir);
        if (copy_to_user_tmpl(xp, skb) < 0)
                goto nlmsg_failure;
+       if (copy_to_user_sec_ctx(xp, skb))
+               goto nlmsg_failure;
 
        nlh->nlmsg_len = skb->tail - b;
 out:
@@ -852,8 +963,25 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
 
        if (p->index)
                xp = xfrm_policy_byid(p->dir, p->index, delete);
-       else
-               xp = xfrm_policy_bysel(p->dir, &p->sel, delete);
+       else {
+               struct rtattr **rtattrs = (struct rtattr **)xfrma;
+               struct rtattr *rt = rtattrs[XFRMA_SEC_CTX-1];
+               struct xfrm_policy tmp;
+
+               err = verify_sec_ctx_len(rtattrs);
+               if (err)
+                       return err;
+
+               memset(&tmp, 0, sizeof(struct xfrm_policy));
+               if (rt) {
+                       struct xfrm_user_sec_ctx *uctx = RTA_DATA(rt);
+
+                       if ((err = security_xfrm_policy_alloc(&tmp, uctx)))
+                               return err;
+               }
+               xp = xfrm_policy_bysel_ctx(p->dir, &p->sel, tmp.security, delete);
+               security_xfrm_policy_free(&tmp);
+       }
        if (xp == NULL)
                return -ENOENT;
 
@@ -1224,6 +1352,8 @@ static int build_acquire(struct sk_buff *skb, struct xfrm_state *x,
 
        if (copy_to_user_tmpl(xp, skb) < 0)
                goto nlmsg_failure;
+       if (copy_to_user_sec_ctx(xp, skb))
+               goto nlmsg_failure;
 
        nlh->nlmsg_len = skb->tail - b;
        return skb->len;
@@ -1241,6 +1371,7 @@ static int xfrm_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *xt,
 
        len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
        len += NLMSG_SPACE(sizeof(struct xfrm_user_acquire));
+       len += RTA_SPACE(xfrm_user_sec_ctx_size(xp));
        skb = alloc_skb(len, GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
@@ -1324,6 +1455,8 @@ static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp,
        copy_to_user_policy(xp, &upe->pol, dir);
        if (copy_to_user_tmpl(xp, skb) < 0)
                goto nlmsg_failure;
+       if (copy_to_user_sec_ctx(xp, skb))
+               goto nlmsg_failure;
        upe->hard = !!hard;
 
        nlh->nlmsg_len = skb->tail - b;
@@ -1341,6 +1474,7 @@ static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, struct km_eve
 
        len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
        len += NLMSG_SPACE(sizeof(struct xfrm_user_polexpire));
+       len += RTA_SPACE(xfrm_user_sec_ctx_size(xp));
        skb = alloc_skb(len, GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
index 591309d855186bc56f70ffa57671e916bdc09d3f..1a2e39b8e3e5be20db687ace9d0ff05a17d502a9 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * binoffset.c
- * (C) 2002 Randy Dunlap <rddunlap@osdl.org>
+ * (C) 2002 Randy Dunlap <rdunlap@xenotime.net>
 
 #   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
index df10db662eb1d510c7811c8d31c29d398ca8da9c..9f84e562318d68983c4cf4f6a9fb69670b7f3b3f 100755 (executable)
@@ -3,7 +3,7 @@
 # checkversion find uses of LINUX_VERSION_CODE, KERNEL_VERSION, or
 # UTS_RELEASE without including <linux/version.h>, or cases of
 # including <linux/version.h> that don't need it.
-# Copyright (C) 2003, Randy Dunlap <rddunlap@osdl.org>
+# Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net>
 
 $| = 1;
 
index 55bf95531f2f6a91212dc18a89bd8defaa79c752..3d7f1ac9e00ce89e881673142ef8ca517ca3010a 100644 (file)
@@ -130,8 +130,8 @@ endif
 HOSTCFLAGS_lex.zconf.o := -I$(src)
 HOSTCFLAGS_zconf.tab.o := -I$(src)
 
-HOSTLOADLIBES_qconf    = -L$(QTLIBPATH) -Wl,-rpath,$(QTLIBPATH) -l$(LIBS_QT) -ldl
-HOSTCXXFLAGS_qconf.o   = -I$(QTDIR)/include -D LKC_DIRECT_LINK
+HOSTLOADLIBES_qconf    = $(KC_QT_LIBS) -ldl
+HOSTCXXFLAGS_qconf.o   = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
 
 HOSTLOADLIBES_gconf    = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --libs`
 HOSTCFLAGS_gconf.o     = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --cflags` \
@@ -140,40 +140,50 @@ HOSTCFLAGS_gconf.o        = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --cflags` \
 $(obj)/qconf.o: $(obj)/.tmp_qtcheck
 
 ifeq ($(qconf-target),1)
-MOC = $(QTDIR)/bin/moc
-QTLIBPATH = $(QTDIR)/lib
+$(obj)/.tmp_qtcheck: $(src)/Makefile
 -include $(obj)/.tmp_qtcheck
 
 # QT needs some extra effort...
 $(obj)/.tmp_qtcheck:
-       @set -e; for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do \
-         if [ -f $$d/include/qconfig.h ]; then DIR=$$d; break; fi; \
-       done; \
-       if [ -z "$$DIR" ]; then \
-         echo "*"; \
-         echo "* Unable to find the QT installation. Please make sure that the"; \
-         echo "* QT development package is correctly installed and the QTDIR"; \
-         echo "* environment variable is set to the correct location."; \
-         echo "*"; \
-         false; \
-       fi; \
-       LIBPATH=$$DIR/lib; LIB=qt; \
-       if [ -f $$QTLIB/libqt-mt.so ] ; then \
-               LIB=qt-mt; \
-               LIBPATH=$$QTLIB; \
+       @set -e; echo "  CHECK   qt"; dir=""; pkg=""; \
+       pkg-config --exists qt 2> /dev/null && pkg=qt; \
+       pkg-config --exists qt-mt 2> /dev/null && pkg=qt-mt; \
+       if [ -n "$$pkg" ]; then \
+         cflags="\$$(shell pkg-config $$pkg --cflags)"; \
+         libs="\$$(shell pkg-config $$pkg --libs)"; \
+         moc="\$$(shell pkg-config $$pkg --variable=prefix)/bin/moc"; \
+         dir="$$(pkg-config $$pkg --variable=prefix)"; \
        else \
-               $(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 && \
-               LIBPATH=$$DIR/lib/$$($(HOSTCXX) -print-multi-os-directory); \
-               if [ -f $$LIBPATH/libqt-mt.so ]; then LIB=qt-mt; fi; \
+         for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do \
+           if [ -f $$d/include/qconfig.h ]; then dir=$$d; break; fi; \
+         done; \
+         if [ -z "$$dir" ]; then \
+           echo "*"; \
+           echo "* Unable to find the QT installation. Please make sure that"; \
+           echo "* the QT development package is correctly installed and"; \
+           echo "* either install pkg-config or set the QTDIR environment"; \
+           echo "* variable to the correct location."; \
+           echo "*"; \
+           false; \
+         fi; \
+         libpath=$$dir/lib; lib=qt; osdir=""; \
+         $(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 && \
+           osdir=x$$($(HOSTCXX) -print-multi-os-directory); \
+         test -d $$libpath/$$osdir && libpath=$$libpath/$$osdir; \
+         test -f $$libpath/libqt-mt.so && lib=qt-mt; \
+         cflags="-I$$dir/include"; \
+         libs="-L$$libpath -Wl,-rpath,$$libpath -l$$lib"; \
+         moc="$$dir/bin/moc"; \
        fi; \
-       echo "QTDIR=$$DIR" > $@; echo "QTLIBPATH=$$LIBPATH" >> $@; \
-       echo "LIBS_QT=$$LIB" >> $@; \
-       if [ ! -x $$DIR/bin/moc -a -x /usr/bin/moc ]; then \
+       if [ ! -x $$dir/bin/moc -a -x /usr/bin/moc ]; then \
          echo "*"; \
-         echo "* Unable to find $$DIR/bin/moc, using /usr/bin/moc instead."; \
+         echo "* Unable to find $$dir/bin/moc, using /usr/bin/moc instead."; \
          echo "*"; \
-         echo "MOC=/usr/bin/moc" >> $@; \
-       fi
+         moc="/usr/bin/moc"; \
+       fi; \
+       echo "KC_QT_CFLAGS=$$cflags" > $@; \
+       echo "KC_QT_LIBS=$$libs" >> $@; \
+       echo "KC_QT_MOC=$$moc" >> $@
 endif
 
 $(obj)/gconf.o: $(obj)/.tmp_gtkcheck
@@ -211,7 +221,7 @@ $(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h
 $(obj)/gconf.o: $(obj)/lkc_defs.h
 
 $(obj)/%.moc: $(src)/%.h
-       $(MOC) -i $< -o $@
+       $(KC_QT_MOC) -i $< -o $@
 
 $(obj)/lkc_defs.h: $(src)/lkc_proto.h
        sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
index a711007ebe30240849467571c9336fd94a62ef7b..656d2c87d6614f13c9a23fc861cce0f356aba25e 100644 (file)
@@ -101,7 +101,7 @@ void str_printf(struct gstr *gs, const char *fmt, ...)
        va_end(ap);
 }
 
-/* Retreive value of growable string */
+/* Retrieve value of growable string */
 const char *str_get(struct gstr *gs)
 {
        return gs->s;
index f2d47ca9c8facb232bc41263d87bdaa667fc1292..67e4b1868e500dcd7331265ffd5027ee52703d3b 100755 (executable)
@@ -45,7 +45,7 @@
 # update usage message;
 # fix some whitespace damage;
 # be smarter about stopping when current version is larger than requested;
-#      Randy Dunlap <rddunlap@osdl.org>, 2004-AUG-18.
+#      Randy Dunlap <rdunlap@xenotime.net>, 2004-AUG-18.
 #
 # Add better support for (non-incremental) 2.6.x.y patches;
 # If an ending version number if not specified, the script automatically
@@ -56,7 +56,7 @@
 # patch-kernel does not normally support reverse patching, but does so when
 # applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z
 # is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z).
-#      Randy Dunlap <rddunlap@osdl.org>, 2005-APR-08.
+#      Randy Dunlap <rdunlap@xenotime.net>, 2005-APR-08.
 
 PNAME=patch-kernel
 
index 64d3f1e9ca85e4a925b2c38680af74c70dc27a53..34f593410d57cb12070a154bc0fa0b272467dfeb 100644 (file)
@@ -54,6 +54,19 @@ config SECURITY_NETWORK
          implement socket and networking access controls.
          If you are unsure how to answer this question, answer N.
 
+config SECURITY_NETWORK_XFRM
+       bool "XFRM (IPSec) Networking Security Hooks"
+       depends on XFRM && SECURITY_NETWORK
+       help
+         This enables the XFRM (IPSec) networking security hooks.
+         If enabled, a security module can use these hooks to
+         implement per-packet access controls based on labels
+         derived from IPSec policy.  Non-IPSec communications are
+         designated as unlabelled, and only sockets authorized
+         to communicate unlabelled data can send without using
+         IPSec.
+         If you are unsure how to answer this question, answer N.
+
 config SECURITY_CAPABILITIES
        tristate "Default Linux Capabilities"
        depends on SECURITY
index 3ca5f2b828a0d84780c8ec223b1a62e954a7ff10..a15c54709fdefe69defdd67c49340e2485d65006 100644 (file)
@@ -776,8 +776,42 @@ static inline int dummy_sk_alloc_security (struct sock *sk, int family, gfp_t pr
 static inline void dummy_sk_free_security (struct sock *sk)
 {
 }
+
+static unsigned int dummy_sk_getsid(struct sock *sk, struct flowi *fl, u8 dir)
+{
+       return 0;
+}
 #endif /* CONFIG_SECURITY_NETWORK */
 
+#ifdef CONFIG_SECURITY_NETWORK_XFRM
+static int dummy_xfrm_policy_alloc_security(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx)
+{
+       return 0;
+}
+
+static inline int dummy_xfrm_policy_clone_security(struct xfrm_policy *old, struct xfrm_policy *new)
+{
+       return 0;
+}
+
+static void dummy_xfrm_policy_free_security(struct xfrm_policy *xp)
+{
+}
+
+static int dummy_xfrm_state_alloc_security(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx)
+{
+       return 0;
+}
+
+static void dummy_xfrm_state_free_security(struct xfrm_state *x)
+{
+}
+
+static int dummy_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir)
+{
+       return 0;
+}
+#endif /* CONFIG_SECURITY_NETWORK_XFRM */
 static int dummy_register_security (const char *name, struct security_operations *ops)
 {
        return -EINVAL;
@@ -970,7 +1004,16 @@ void security_fixup_ops (struct security_operations *ops)
        set_to_dummy_if_null(ops, socket_getpeersec);
        set_to_dummy_if_null(ops, sk_alloc_security);
        set_to_dummy_if_null(ops, sk_free_security);
-#endif /* CONFIG_SECURITY_NETWORK */
+       set_to_dummy_if_null(ops, sk_getsid);
+ #endif        /* CONFIG_SECURITY_NETWORK */
+#ifdef  CONFIG_SECURITY_NETWORK_XFRM
+       set_to_dummy_if_null(ops, xfrm_policy_alloc_security);
+       set_to_dummy_if_null(ops, xfrm_policy_clone_security);
+       set_to_dummy_if_null(ops, xfrm_policy_free_security);
+       set_to_dummy_if_null(ops, xfrm_state_alloc_security);
+       set_to_dummy_if_null(ops, xfrm_state_free_security);
+       set_to_dummy_if_null(ops, xfrm_policy_lookup);
+#endif /* CONFIG_SECURITY_NETWORK_XFRM */
 #ifdef CONFIG_KEYS
        set_to_dummy_if_null(ops, key_alloc);
        set_to_dummy_if_null(ops, key_free);
index c7a0ab1cfda35aacd868504c3033417c58c9e9e7..4e9fa8be44b8e7071c75cb9f03ea5c2cb6d819bd 100644 (file)
@@ -526,7 +526,7 @@ key_ref_t __keyring_search_one(key_ref_t keyring_ref,
                            (!key->type->match ||
                             key->type->match(key, description)) &&
                            key_permission(make_key_ref(key, possessed),
-                                          perm) < 0 &&
+                                          perm) == 0 &&
                            !test_bit(KEY_FLAG_REVOKED, &key->flags)
                            )
                                goto found;
index b038cd0fae2e09f3f1917cad3da24056828858e4..06d54d9d20a5049e25911e33668dc3ed1a2dd9c4 100644 (file)
@@ -8,5 +8,7 @@ selinux-y := avc.o hooks.o selinuxfs.o netlink.o nlmsgtab.o
 
 selinux-$(CONFIG_SECURITY_NETWORK) += netif.o
 
+selinux-$(CONFIG_SECURITY_NETWORK_XFRM) += xfrm.o
+
 EXTRA_CFLAGS += -Isecurity/selinux/include
 
index fc774436a264d0f21c1b07f142d96331372014f2..3d496eae1b47ee1ce6a5950f2ffe770c495da705 100644 (file)
@@ -73,6 +73,7 @@
 #include "avc.h"
 #include "objsec.h"
 #include "netif.h"
+#include "xfrm.h"
 
 #define XATTR_SELINUX_SUFFIX "selinux"
 #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
@@ -3349,6 +3350,10 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
                err = avc_has_perm(sock_sid, port_sid,
                                   sock_class, recv_perm, &ad);
        }
+
+       if (!err)
+               err = selinux_xfrm_sock_rcv_skb(sock_sid, skb);
+
 out:   
        return err;
 }
@@ -3401,6 +3406,24 @@ static void selinux_sk_free_security(struct sock *sk)
        sk_free_security(sk);
 }
 
+static unsigned int selinux_sk_getsid_security(struct sock *sk, struct flowi *fl, u8 dir)
+{
+       struct inode_security_struct *isec;
+       u32 sock_sid = SECINITSID_ANY_SOCKET;
+
+       if (!sk)
+               return selinux_no_sk_sid(fl);
+
+       read_lock_bh(&sk->sk_callback_lock);
+       isec = get_sock_isec(sk);
+
+       if (isec)
+               sock_sid = isec->sid;
+
+       read_unlock_bh(&sk->sk_callback_lock);
+       return sock_sid;
+}
+
 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
 {
        int err = 0;
@@ -3536,6 +3559,11 @@ static unsigned int selinux_ip_postroute_last(unsigned int hooknum,
                                   send_perm, &ad) ? NF_DROP : NF_ACCEPT;
        }
 
+       if (err != NF_ACCEPT)
+               goto out;
+
+       err = selinux_xfrm_postroute_last(isec->sid, skb);
+
 out:
        return err;
 }
@@ -4380,6 +4408,16 @@ static struct security_operations selinux_ops = {
        .socket_getpeersec =            selinux_socket_getpeersec,
        .sk_alloc_security =            selinux_sk_alloc_security,
        .sk_free_security =             selinux_sk_free_security,
+       .sk_getsid =                    selinux_sk_getsid_security,
+#endif
+
+#ifdef CONFIG_SECURITY_NETWORK_XFRM
+       .xfrm_policy_alloc_security =   selinux_xfrm_policy_alloc,
+       .xfrm_policy_clone_security =   selinux_xfrm_policy_clone,
+       .xfrm_policy_free_security =    selinux_xfrm_policy_free,
+       .xfrm_state_alloc_security =    selinux_xfrm_state_alloc,
+       .xfrm_state_free_security =     selinux_xfrm_state_free,
+       .xfrm_policy_lookup =           selinux_xfrm_policy_lookup,
 #endif
 };
 
@@ -4491,6 +4529,7 @@ static int __init selinux_nf_ip_init(void)
                panic("SELinux: nf_register_hook for IPv6: error %d\n", err);
 
 #endif /* IPV6 */
+
 out:
        return err;
 }
index 1deb59e1b76257dab1129f0050ce0f727aceeb30..71aeb12f07c8d78cc1a2a21bbad97ce180b28576 100644 (file)
    S_(SECCLASS_NSCD, NSCD__SHMEMHOST, "shmemhost")
    S_(SECCLASS_ASSOCIATION, ASSOCIATION__SENDTO, "sendto")
    S_(SECCLASS_ASSOCIATION, ASSOCIATION__RECVFROM, "recvfrom")
+   S_(SECCLASS_ASSOCIATION, ASSOCIATION__RELABELFROM, "relabelfrom")
+   S_(SECCLASS_ASSOCIATION, ASSOCIATION__RELABELTO, "relabelto")
index a78b5d59c9fc008f638200a1764c3a1e2e7a646e..d1d0996049e3636f271e36add8c9506eeb5b401c 100644 (file)
 
 #define ASSOCIATION__SENDTO                       0x00000001UL
 #define ASSOCIATION__RECVFROM                     0x00000002UL
+#define ASSOCIATION__RELABELFROM                  0x00000004UL
+#define ASSOCIATION__RELABELTO                    0x00000008UL
 
 #define NETLINK_KOBJECT_UEVENT_SOCKET__IOCTL      0x00000001UL
 #define NETLINK_KOBJECT_UEVENT_SOCKET__READ       0x00000002UL
diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h
new file mode 100644 (file)
index 0000000..8e87996
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * SELinux support for the XFRM LSM hooks
+ *
+ * Author : Trent Jaeger, <jaegert@us.ibm.com>
+ */
+#ifndef _SELINUX_XFRM_H_
+#define _SELINUX_XFRM_H_
+
+int selinux_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx);
+int selinux_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new);
+void selinux_xfrm_policy_free(struct xfrm_policy *xp);
+int selinux_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx);
+void selinux_xfrm_state_free(struct xfrm_state *x);
+int selinux_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir);
+
+/*
+ * Extract the security blob from the sock (it's actually on the socket)
+ */
+static inline struct inode_security_struct *get_sock_isec(struct sock *sk)
+{
+       if (!sk->sk_socket)
+               return NULL;
+
+       return SOCK_INODE(sk->sk_socket)->i_security;
+}
+
+
+static inline u32 selinux_no_sk_sid(struct flowi *fl)
+{
+       /* NOTE: no sock occurs on ICMP reply, forwards, ... */
+       /* icmp_reply: authorize as kernel packet */
+       if (fl && fl->proto == IPPROTO_ICMP) {
+               return SECINITSID_KERNEL;
+       }
+
+       return SECINITSID_ANY_SOCKET;
+}
+
+#ifdef CONFIG_SECURITY_NETWORK_XFRM
+int selinux_xfrm_sock_rcv_skb(u32 sid, struct sk_buff *skb);
+int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb);
+#else
+static inline int selinux_xfrm_sock_rcv_skb(u32 isec_sid, struct sk_buff *skb)
+{
+       return 0;
+}
+
+static inline int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb)
+{
+       return NF_ACCEPT;
+}
+#endif
+
+#endif /* _SELINUX_XFRM_H_ */
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c
new file mode 100644 (file)
index 0000000..c4d87d4
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ *  NSA Security-Enhanced Linux (SELinux) security module
+ *
+ *  This file contains the SELinux XFRM hook function implementations.
+ *
+ *  Authors:  Serge Hallyn <sergeh@us.ibm.com>
+ *           Trent Jaeger <jaegert@us.ibm.com>
+ *
+ *  Copyright (C) 2005 International Business Machines Corporation
+ *
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License version 2,
+ *     as published by the Free Software Foundation.
+ */
+
+/*
+ * USAGE:
+ * NOTES:
+ *   1. Make sure to enable the following options in your kernel config:
+ *     CONFIG_SECURITY=y
+ *     CONFIG_SECURITY_NETWORK=y
+ *     CONFIG_SECURITY_NETWORK_XFRM=y
+ *     CONFIG_SECURITY_SELINUX=m/y
+ * ISSUES:
+ *   1. Caching packets, so they are not dropped during negotiation
+ *   2. Emulating a reasonable SO_PEERSEC across machines
+ *   3. Testing addition of sk_policy's with security context via setsockopt
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/security.h>
+#include <linux/types.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter_ipv4.h>
+#include <linux/netfilter_ipv6.h>
+#include <linux/ip.h>
+#include <linux/tcp.h>
+#include <linux/skbuff.h>
+#include <linux/xfrm.h>
+#include <net/xfrm.h>
+#include <net/checksum.h>
+#include <net/udp.h>
+#include <asm/semaphore.h>
+
+#include "avc.h"
+#include "objsec.h"
+#include "xfrm.h"
+
+
+/*
+ * Returns true if an LSM/SELinux context
+ */
+static inline int selinux_authorizable_ctx(struct xfrm_sec_ctx *ctx)
+{
+       return (ctx &&
+               (ctx->ctx_doi == XFRM_SC_DOI_LSM) &&
+               (ctx->ctx_alg == XFRM_SC_ALG_SELINUX));
+}
+
+/*
+ * Returns true if the xfrm contains a security blob for SELinux
+ */
+static inline int selinux_authorizable_xfrm(struct xfrm_state *x)
+{
+       return selinux_authorizable_ctx(x->security);
+}
+
+/*
+ * LSM hook implementation that authorizes that a socket can be used
+ * with the corresponding xfrm_sec_ctx and direction.
+ */
+int selinux_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir)
+{
+       int rc = 0;
+       u32 sel_sid = SECINITSID_UNLABELED;
+       struct xfrm_sec_ctx *ctx;
+
+       /* Context sid is either set to label or ANY_ASSOC */
+       if ((ctx = xp->security)) {
+               if (!selinux_authorizable_ctx(ctx))
+                       return -EINVAL;
+
+               sel_sid = ctx->ctx_sid;
+       }
+
+       rc = avc_has_perm(sk_sid, sel_sid, SECCLASS_ASSOCIATION,
+                         ((dir == FLOW_DIR_IN) ? ASSOCIATION__RECVFROM :
+                          ((dir == FLOW_DIR_OUT) ?  ASSOCIATION__SENDTO :
+                           (ASSOCIATION__SENDTO | ASSOCIATION__RECVFROM))),
+                         NULL);
+
+       return rc;
+}
+
+/*
+ * Security blob allocation for xfrm_policy and xfrm_state
+ * CTX does not have a meaningful value on input
+ */
+static int selinux_xfrm_sec_ctx_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_user_sec_ctx *uctx)
+{
+       int rc = 0;
+       struct task_security_struct *tsec = current->security;
+       struct xfrm_sec_ctx *ctx;
+
+       BUG_ON(!uctx);
+       BUG_ON(uctx->ctx_doi != XFRM_SC_ALG_SELINUX);
+
+       if (uctx->ctx_len >= PAGE_SIZE)
+               return -ENOMEM;
+
+       *ctxp = ctx = kmalloc(sizeof(*ctx) +
+                             uctx->ctx_len,
+                             GFP_KERNEL);
+
+       if (!ctx)
+               return -ENOMEM;
+
+       ctx->ctx_doi = uctx->ctx_doi;
+       ctx->ctx_len = uctx->ctx_len;
+       ctx->ctx_alg = uctx->ctx_alg;
+
+       memcpy(ctx->ctx_str,
+              uctx+1,
+              ctx->ctx_len);
+       rc = security_context_to_sid(ctx->ctx_str,
+                                    ctx->ctx_len,
+                                    &ctx->ctx_sid);
+
+       if (rc)
+               goto out;
+
+       /*
+        * Does the subject have permission to set security or permission to
+        * do the relabel?
+        * Must be permitted to relabel from default socket type (process type)
+        * to specified context
+        */
+       rc = avc_has_perm(tsec->sid, tsec->sid,
+                         SECCLASS_ASSOCIATION,
+                         ASSOCIATION__RELABELFROM, NULL);
+       if (rc)
+               goto out;
+
+       rc = avc_has_perm(tsec->sid, ctx->ctx_sid,
+                         SECCLASS_ASSOCIATION,
+                         ASSOCIATION__RELABELTO, NULL);
+       if (rc)
+               goto out;
+
+       return rc;
+
+out:
+       *ctxp = 0;
+       kfree(ctx);
+       return rc;
+}
+
+/*
+ * LSM hook implementation that allocs and transfers uctx spec to
+ * xfrm_policy.
+ */
+int selinux_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *uctx)
+{
+       int err;
+
+       BUG_ON(!xp);
+
+       err = selinux_xfrm_sec_ctx_alloc(&xp->security, uctx);
+       return err;
+}
+
+
+/*
+ * LSM hook implementation that copies security data structure from old to
+ * new for policy cloning.
+ */
+int selinux_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new)
+{
+       struct xfrm_sec_ctx *old_ctx, *new_ctx;
+
+       old_ctx = old->security;
+
+       if (old_ctx) {
+               new_ctx = new->security = kmalloc(sizeof(*new_ctx) +
+                                                 old_ctx->ctx_len,
+                                                 GFP_KERNEL);
+
+               if (!new_ctx)
+                       return -ENOMEM;
+
+               memcpy(new_ctx, old_ctx, sizeof(*new_ctx));
+               memcpy(new_ctx->ctx_str, old_ctx->ctx_str, new_ctx->ctx_len);
+       }
+       return 0;
+}
+
+/*
+ * LSM hook implementation that frees xfrm_policy security information.
+ */
+void selinux_xfrm_policy_free(struct xfrm_policy *xp)
+{
+       struct xfrm_sec_ctx *ctx = xp->security;
+       if (ctx)
+               kfree(ctx);
+}
+
+/*
+ * LSM hook implementation that allocs and transfers sec_ctx spec to
+ * xfrm_state.
+ */
+int selinux_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *uctx)
+{
+       int err;
+
+       BUG_ON(!x);
+
+       err = selinux_xfrm_sec_ctx_alloc(&x->security, uctx);
+       return err;
+}
+
+/*
+ * LSM hook implementation that frees xfrm_state security information.
+ */
+void selinux_xfrm_state_free(struct xfrm_state *x)
+{
+       struct xfrm_sec_ctx *ctx = x->security;
+       if (ctx)
+               kfree(ctx);
+}
+
+/*
+ * LSM hook that controls access to unlabelled packets.  If
+ * a xfrm_state is authorizable (defined by macro) then it was
+ * already authorized by the IPSec process.  If not, then
+ * we need to check for unlabelled access since this may not have
+ * gone thru the IPSec process.
+ */
+int selinux_xfrm_sock_rcv_skb(u32 isec_sid, struct sk_buff *skb)
+{
+       int i, rc = 0;
+       struct sec_path *sp;
+
+       sp = skb->sp;
+
+       if (sp) {
+               /*
+                * __xfrm_policy_check does not approve unless xfrm_policy_ok
+                * says that spi's match for policy and the socket.
+                *
+                *  Only need to verify the existence of an authorizable sp.
+                */
+               for (i = 0; i < sp->len; i++) {
+                       struct xfrm_state *x = sp->x[i].xvec;
+
+                       if (x && selinux_authorizable_xfrm(x))
+                               goto accept;
+               }
+       }
+
+       /* check SELinux sock for unlabelled access */
+       rc = avc_has_perm(isec_sid, SECINITSID_UNLABELED, SECCLASS_ASSOCIATION,
+                         ASSOCIATION__RECVFROM, NULL);
+       if (rc)
+               goto drop;
+
+accept:
+       return 0;
+
+drop:
+       return rc;
+}
+
+/*
+ * POSTROUTE_LAST hook's XFRM processing:
+ * If we have no security association, then we need to determine
+ * whether the socket is allowed to send to an unlabelled destination.
+ * If we do have a authorizable security association, then it has already been
+ * checked in xfrm_policy_lookup hook.
+ */
+int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb)
+{
+       struct dst_entry *dst;
+       int rc = 0;
+
+       dst = skb->dst;
+
+       if (dst) {
+               struct dst_entry *dst_test;
+
+               for (dst_test = dst; dst_test != 0;
+                    dst_test = dst_test->child) {
+                       struct xfrm_state *x = dst_test->xfrm;
+
+                       if (x && selinux_authorizable_xfrm(x))
+                               goto accept;
+               }
+       }
+
+       rc = avc_has_perm(isec_sid, SECINITSID_UNLABELED, SECCLASS_ASSOCIATION,
+                         ASSOCIATION__SENDTO, NULL);
+       if (rc)
+               goto drop;
+
+accept:
+       return NF_ACCEPT;
+
+drop:
+       return NF_DROP;
+}
index 129abab5ce98a42fcd3a96fc587abe0da6e31ec9..e4b8959dd4bba4ff75f2617bdc76b843ff51b41c 100644 (file)
@@ -197,6 +197,7 @@ void *snd_malloc_pages(size_t size, gfp_t gfp_flags)
 
        snd_assert(size > 0, return NULL);
        snd_assert(gfp_flags != 0, return NULL);
+       gfp_flags |= __GFP_COMP;        /* compound page lets parts be mapped */
        pg = get_order(size);
        if ((res = (void *) __get_free_pages(gfp_flags, pg)) != NULL) {
                mark_pages(virt_to_page(res), pg);
@@ -241,6 +242,7 @@ static void *snd_malloc_dev_pages(struct device *dev, size_t size, dma_addr_t *d
        snd_assert(dma != NULL, return NULL);
        pg = get_order(size);
        gfp_flags = GFP_KERNEL
+               | __GFP_COMP    /* compound page lets parts be mapped */
                | __GFP_NORETRY /* don't trigger OOM-killer */
                | __GFP_NOWARN; /* no stack trace print - this call is non-critical */
        res = dma_alloc_coherent(dev, PAGE_SIZE << pg, dma, gfp_flags);
index 6b46a8a4b1ccb49fbcc88a816e081802a6b461ef..b963c550dae6b50f069ffd52e38ece70b7360ba7 100644 (file)
@@ -578,17 +578,15 @@ set_recv_slots(int num_channels)
        } while ((stat & PSC_AC97STAT_DR) == 0);
 }
 
+/* Hold spinlock for both start_dac() and start_adc() calls */
 static void
 start_dac(struct au1550_state *s)
 {
        struct dmabuf  *db = &s->dma_dac;
-       unsigned long   flags;
 
        if (!db->stopped)
                return;
 
-       spin_lock_irqsave(&s->lock, flags);
-
        set_xmit_slots(db->num_channels);
        au_writel(PSC_AC97PCR_TC, PSC_AC97PCR);
        au_sync();
@@ -598,8 +596,6 @@ start_dac(struct au1550_state *s)
        au1xxx_dbdma_start(db->dmanr);
 
        db->stopped = 0;
-
-       spin_unlock_irqrestore(&s->lock, flags);
 }
 
 static void
@@ -718,7 +714,6 @@ prog_dmabuf_dac(struct au1550_state *s)
 }
 
 
-/* hold spinlock for the following */
 static void
 dac_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
@@ -726,6 +721,8 @@ dac_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        struct dmabuf  *db = &s->dma_dac;
        u32     ac97c_stat;
 
+       spin_lock(&s->lock);
+
        ac97c_stat = au_readl(PSC_AC97STAT);
        if (ac97c_stat & (AC97C_XU | AC97C_XO | AC97C_TE))
                pr_debug("AC97C status = 0x%08x\n", ac97c_stat);
@@ -747,6 +744,8 @@ dac_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        /* wake up anybody listening */
        if (waitqueue_active(&db->wait))
                wake_up(&db->wait);
+
+       spin_unlock(&s->lock);
 }
 
 
@@ -758,6 +757,8 @@ adc_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        u32     obytes;
        char    *obuf;
 
+       spin_lock(&s->lock);
+
        /* Pull the buffer from the dma queue.
        */
        au1xxx_dbdma_get_dest(dp->dmanr, (void *)(&obuf), &obytes);
@@ -765,6 +766,7 @@ adc_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        if ((dp->count + obytes) > dp->dmasize) {
                /* Overrun. Stop ADC and log the error
                */
+               spin_unlock(&s->lock);
                stop_adc(s);
                dp->error++;
                err("adc overrun");
@@ -787,6 +789,7 @@ adc_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        if (waitqueue_active(&dp->wait))
                wake_up(&dp->wait);
 
+       spin_unlock(&s->lock);
 }
 
 static loff_t
@@ -1048,9 +1051,9 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
                /* wait for samples in ADC dma buffer
                */
                do {
+                       spin_lock_irqsave(&s->lock, flags);
                        if (db->stopped)
                                start_adc(s);
-                       spin_lock_irqsave(&s->lock, flags);
                        avail = db->count;
                        if (avail <= 0)
                                __set_current_state(TASK_INTERRUPTIBLE);
@@ -1570,15 +1573,19 @@ au1550_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                if (get_user(val, (int *) arg))
                        return -EFAULT;
                if (file->f_mode & FMODE_READ) {
-                       if (val & PCM_ENABLE_INPUT)
+                       if (val & PCM_ENABLE_INPUT) {
+                               spin_lock_irqsave(&s->lock, flags);
                                start_adc(s);
-                       else
+                               spin_unlock_irqrestore(&s->lock, flags);
+                       } else
                                stop_adc(s);
                }
                if (file->f_mode & FMODE_WRITE) {
-                       if (val & PCM_ENABLE_OUTPUT)
+                       if (val & PCM_ENABLE_OUTPUT) {
+                               spin_lock_irqsave(&s->lock, flags);
                                start_dac(s);
-                       else
+                               spin_unlock_irqrestore(&s->lock, flags);
+                       } else
                                stop_dac(s);
                }
                return 0;
index 09ab138646a641471321d1bd3ebff27877986f3a..ef022a846b06b602878b90a5f7758f30cdd727bb 100644 (file)
@@ -1,7 +1,7 @@
 # ALSA Sparc drivers
 
 menu "ALSA Sparc devices"
-       depends on SND!=n && (SPARC32 || SPARC64)
+       depends on SND!=n && SPARC
 
 config SND_SUN_AMD7930
        tristate "Sun AMD7930"
index 99dae024b640bfd9f3ddadbf4de227cd5daca95c..22f8bb612bffb2599bb8a88103008623e55cceb1 100644 (file)
@@ -1996,7 +1996,6 @@ static struct usb_device_id usb_audio_ids [] = {
 MODULE_DEVICE_TABLE (usb, usb_audio_ids);
 
 static struct usb_driver usb_audio_driver = {
-       .owner =        THIS_MODULE,
        .name =         "snd-usb-audio",
        .probe =        usb_audio_probe,
        .disconnect =   usb_audio_disconnect,
index cf77313c609d9d85dbd69d66dbc9479c620f41f3..a3967f72ab4efc2c5c3a5acb187c989c21a76bfb 100644 (file)
@@ -409,7 +409,6 @@ static void snd_usX2Y_disconnect(struct usb_interface *intf)
 
 MODULE_DEVICE_TABLE(usb, snd_usX2Y_usb_id_table);
 static struct usb_driver snd_usX2Y_usb_driver = {
-       .owner =        THIS_MODULE,
        .name =         "snd-usb-usx2y",
        .probe =        snd_usX2Y_probe,
        .disconnect =   snd_usX2Y_disconnect,
index 0dc828ff9e94dea68e8aea8fed84370d37dbd6f8..c9136a98755fa0c396fb6b4e4ea79ae97a749147 100644 (file)
@@ -691,6 +691,7 @@ static struct page * snd_usX2Y_hwdep_pcm_vm_nopage(struct vm_area_struct *area,
        snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_OOM);
        vaddr = (char*)((usX2Ydev_t*)area->vm_private_data)->hwdep_pcm_shm + offset;
        page = virt_to_page(vaddr);
+       get_page(page);
 
        if (type)
                *type = VM_FAULT_MINOR;